1-HDFS+MapReduce

Hadoop的框架最核心的设计就是:HDFS,MapReduce(mr)

HDFS1.0

  1. hdfs: 分布式文件系统,主要用于存储海量数据
    MapReduce: 用户海量数据的计算

  2. hdfs 本身是一个master slave 架构 namenode(nn) 是主 datanode(dn) 是从
    SecondaryNameNode(snn) 并不是nn的一个备份

  3. namenode 是一个进程, 在某一个节点上维护了一块内存区域
    内存中维护2份重要的数据(namenode 和 datanode 通过心跳机制进行通讯的)
    (1) 文件名->block数据块的映射关系(mapping关系)
    (2) block->datanode 节点的映射关系
    本质:通过block数据库找到数据真正的位置

  4. 数据块的副本数:3个

  5. hadoop 集群不适合存储大量的小文件
    (1) 对于集群而言硬盘资源存在严重的浪费
    (2) nn内存资源有限,造成nn 内存压力
    (3) 如果存储过大的文件,启动mr 的时候,并发能力不够,导致MR任务执行过慢

  6. 1.0中只有一个nn

  7. 什么情况下使用机架感知?
    hadoop 集群规模很大的时候
    目的:希望不同节点之间的通讯能够发生在同一个机架之内,而不是跨机架(节省网络传输的IO和带宽)
    为了提高容错能力

  8. 数据完整性: 检测数据是否损坏
    crc32算法产生校验和(校验码)
    (1) client写校验和,dn 来校验
    (2) dn存在后台进程DataBlockScanner : 定期检查

  9. hdfs可靠性
    (1) 心跳 dn-nn
    (2) 数据完整性 crc32
    (3) 副本-数据冗余
    (4) 空间回收机制 -skipTrash
    (5) SNN

  10. hdfs 不适合场景
    (1) 存储小文件
    (2) 文件被修改
    (3) 大量随机读

MR1.0

  1. mr在1.0中 包括主(jobtracker) 从(tasktracker)
    主:分配任务 从: 具体干活
    hdfs 存储集群 mr 计算集群
    主:namenode -> jobtracker
    从: datanode -> tasktracker
    就近原则:本地化 数据不移动,任务(代码逻辑)移动

  2. 介绍一下mr执行框架的过程? 你对shuffle过程的理解?

    • map端
      数据经过切片(input split) -> 每一个切片都会使用一个map进行处理 -> map输出的结果存到内存缓冲区中(该缓冲区大小默认为100M,当达到80M的时候,会在本地创建一个溢写文件,再将缓冲区数据写入到该文件) -> 涉及数据(排序【快速排序】,合并 目的:①减少写入磁盘的数据量 ②减少数据传输到下一个阶段的数据量)-> reduce 通过jobtracker维护整个集群的宏观信息,找到对应的map输出位置即可

      hash理解: 数据分到哪个reduce中?

    • reduce 端
      reduce 本身也会维护一块内存缓冲区 阈值是80M-> 生成一个spil文件-> 会有后台线程不断将小文件合并为有序的大文件, 合并和排序【归并排序】-> 将合并的数据交给reduce , 作为reduce文件的输入 -> 执行业务逻辑代码 -> 将最终结果生成到本地/hdfs中

    • shuffle阶段: map任务的输出到reduce任务的输入整个过程
      本质:①尽可能减少数据传输量 ②优化内存使用,减少磁盘IO操作
      在shuffle阶段最致命的问题: 网络带宽 !!!!

  3. blcok是hdfs基本数据存储单位,但是map是不能直接读取的, 需要将block 转换为内部可以识别的record (block->record)
    record reader 实际就是一个split 解决问题:解决跨block的问题

  4. 为什么hdfs中块不能设置过大,或者也不能设置过小?

    • 过大
      map一次只处理一个块中的数据,过大运行速度较慢
      过大会导致网络传输中时间增长,卡顿等问题,并且失败恢复成本较高

    • 过小
      存放大量小文件会占用NN的内存,增加内存压力
      频繁进行文件传输,会严重占用网络/CPU资源

HDFS2.0

  1. HA来解决单节点故障问题(使用两个NN 一个是 activate NN 一个是standbyNN)

  2. 数据一致性如何保证?
    (1) 共享文件系统
    (2) dn 向两个NN发送心跳

  3. 故障转移: 利用zookeeper来保证的

  4. JN: 利用了NFS, 保证机器个数为2n+1
    优点:便于选举,投票,达到数据统一存储
    QJM: 少数服从多数
    (1)不用做额外的共享配置,节约成本
    (2)系统配置很灵活(自动支持的)

  5. 集群部署
    (1)NN和JN 配置在不同的节点上
    (2)FC和NN在相同的节点上
    (3)hadoop 2.0中 RM(相当于jobtracker)和NN在相同的节点上
    (4)NM (相当于tasktracker)和DN在相同的节点上 就近原则
    (5)zookeeper 独立维护一套集群

  6. 联邦机制
    本质:突破NN本身内存资源的瓶颈,不在受某一个NN 内存的限制
    解决的问题:(1)高可用 (2)内存资源不足
    关键点:每个NN共享所有的DN

  7. 快照 数据备份,灾备

  8. ACL

YARN(MR2.0)

  1. Hadoop 1.0 jobtracker tasktracker jobid
    Hadoop 2.0 ResourceManager(RM) ApplicationMaster(AM) NodeManager(NM) applicationid

  2. Yarn定位:操作系统 作用:进行资源整合,并且让系统资源最大化,同一套硬件上面可以跑多种类型多个任务(mr spark flink...)
    负责集群的资源管理和任务的调度

    • 1.0中 jobtraker(主) 负责资源管理和任务调度, 相当于是集两大功能于一身
      tasktracker(从) 真正做事情的

    • 2.0中 RM:只是jobtracker 中的"资源管理"的角色,负责运行中程序各种资源的分配,但是不负责应用程序的监控或者状态跟踪
      本质: 是一个进程

    • AM:只是jobtracker中的"任务调度"的角色, AM本质是一个container 是一个特殊的container, 注意AM不是一致处于启动状态的,提价任务的时候AM启动,当任务执行完之后,AM消失
      AM是一个任务的主

    • NM:相当于是1.0中 tasktracker的角色, 接受RM的请求,分配container 资源,并且通过心跳机制和RM进行通讯
      NM:节点的主

    • container: 是个进程,是由NM启动的 作用是:真正执行任务的地方

  3. RM和AM本质山就是对jobtracker权利的肢解

  4. container

    • hadoop 1.0中 slot就是资源, map由map的 slot reduce有reduce 的slot, 二者资源是不可通用的
      slot 理解为小区的车位,进行了严格的限制
      slot 决定cpu和内存的大小

      假设:一个slot 代表2G内存和1个CPU
      一个任务只需要1G内存,一个CPU, 出现资源碎片,资源利用率低
      一个任务需要3G内存, 集群利用率过高

    • Hadoop 2.0中没有slot 的概念,container
      一个机器有多少个container ?
      container 的数量 = min(2cores, 1.8disks, 总内存/最小容量)

  5. Yarn容错
    -- RM挂断怎么办? 主备切换
    -- NM挂掉怎么办? NM上有AM:整个任务挂掉
    NM上没有AM:整个任务不会受到影响
    -- AM挂掉怎么办? RM上有一个RMApplicationMaster 来负责重启AM

集群搭建(可以忽略)

一、集群配置 16G+512G

虚拟机内存 master slave1 slave2 2 1 1
虚拟机硬盘 master slave1 slave2 30G 25G 25G
192.168.172.101 master
192.168.172.102 slave1
192.168.172.103 slave2

二、安装步骤

1、保证java安装 /usr/local/src/jdk1.8.0_111
2、解压安装包:

tar -zxvf hadoop-2.6.1.tar.gz

3、修改hadoop 配置文件

vim /usr/local/src/hadoop-2.6.1/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/src/jdk1.8.0_111

vim /usr/local/src/hadoop-2.6.1/etc/hadoop/yarn-env.sh
export JAVA_HOME=/usr/local/src/jdk1.8.0_111

vim slaves
slave1
slave2
vim /usr/local/src/hadoop-2.6.1/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/src/hadoop-2.6.1/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/src/hadoop-2.6.1/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>

vim /usr/local/src/hadoop-2.6.1/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/src/hadoop-2.6.1/tmp</value>
</property>
</configuration>

cp mapred-site.xml.template mapred-site.xml

vim /usr/local/src/hadoop-2.6.1/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<property>
  <name>mapreduce.map.memory.mb</name>
  <value>1536</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx1024M</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>3072</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx2560M</value>
</property>
</configuration>

vim /usr/local/src/hadoop-2.6.1/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8035</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    <description>Whether virtual memory limits will be enforced for containers</description>
</property>
</configuration>

4、配置环境变量

vim ~/.bashrc  #用户级别的

vim /etc/profile  #全局生效的
export HADOOP_HOME=/usr/local/src/hadoop-2.6.1
export JAVA_HOME=/usr/local/src/jdk1.8.0_111
export PATH=$PATH:$JAVA_HOME/bin

# 刷新环境变量
source ~/.bashrc
bash

# master 节点的环境变量拷贝到slave(两两之间进行免密登录)
scp -rp ~/.bashrc root@slave1:/root/.bashrc
scp -rp ~/.bashrc root@slave2:/root/.bashrc

5、拷贝安装包

scp -rp /usr/local/src/hadoop-2.6.1 root@slave1:/usr/local/src
scp -rp /usr/local/src/hadoop-2.6.1 root@slave2:/usr/local/src

6、启动集群

# 初始化namenode
hadoop namenode -format

sh start-all.sh
sh stop-all.sh

7、观察
master
8086 SecondaryNameNode
8230 ResourceManager
7896 NameNode

slave
7185 DataNode
7273 NodeManager

通过命令测试 hadoop fs -ls /

浏览器观察 master:8088

posted @ 2022-05-26 00:58  python_ceph  阅读(87)  评论(0)    收藏  举报