Hadoop原理

大数据平台底层都是采用Hadoop作为框架,Hadoop包含底层的分布式文件系统和资源调度框架Yarn;当然,算上计算框架还有MapReduce。这里重点总结一下HDFS和其资源调度框架Yarn的原理。

HDFS

系统架构


这块就不用怎么介绍了,主要是NameNode和DataNode,一个用于存储数据块和文件映射、文件属性信息,另一个用来存放真正的业务数据; 重点要说下NameNode。

  • NameNode

EditLog事务日志文件记录每一个对文件系统元数据的改变,如在HDFS中创建一个新的文件,名称节点将会在EditLog中插入一条记录来记录这个改变。整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等等都存放在Fslmage文件中。

  • NameNode HA

NameNode用于存储FsImage与EditLog,其高可用支持两种解决方案,其本质都是实现存储的高可用:

  1. 运行多个NameNode,并使用类似于NFS之类的共享文件存储;
  2. 运行多个NameNode,同时使用journalNode用来存储数据。

一个NameNode处于Active状态,另一个处于Standby状态。Active NameNode对外提供服务,Standby NameNode仅通过JournalNode同步Active NameNode的状态,以便能够在它失败时快速进行切换(使用ZooKeeper)。

每个Journal节点暴露RPC接口,允许NameNode读取和写入数据,数据存放在Journal节点的本地磁盘。当Active NameNode写入 EditLog时,它向集群的所有JournalNode发送写入请求,当多数节点回复确认成功写入之后, EditLog就认为是成功写入。

  • SecondaryNameNode

由于每次nameNode启动时,都需要先加载FsImage,再加载EditLog,在合并后写入到FsImage中。如果当文件较大时,该操作较耗时。因此,增加了secondaryNameNode角色,用于按照EditLog文件大小阈值或周期性时间触发的方式来执行FsImage与EditLog的merge操作。

数据流

基本概念

  • block
    文件上传前需要分块,这个块就是block,一般为128MB,可以调整。

    块太小:寻址时间占比过高;
    块太大:Map任务数太少,作业执行速度变慢。

  • packet
    packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB

  • chunk
    chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte

写入流程

  1. 客户端请求NameNode上传数据,NameNode检查是否已存在文件、检查权限;通过后为其分配资源,并写入EditLog返回stream;
  2. HDFSStream会有一个chunk buff,客户端每写满一个chunk后,会计算校验和;
  3. 带有校验和的chunk被写入packet,当客户端一个packet满后被发送到服务端,服务端packet会进入dataQueue队列;
  4. 其他机架的DataNode从服务端dataQueue获取client端上传的packet,并存储;
  5. 一个DataNode成功存储一个packet后之后就会返回一个ack packet,放入ack Queue中;
  6. client写完数据后,关闭stream,发送完成信号给NameNode将元数据刷到FsImage。

读取流程

  1. client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,并返回输入流对象;
  2. client基于返回的列表,就近挑选一台DataNode,请求建立输入流;
  3. DataNode向输入流中写数据,以packet为单位来校验;
  4. client关闭输入流。

其他

如果文件小于块大小(128M),会占用一个块资源,但是在硬盘上大小依然是文件的大小。块的概念是为了切分大文件,同时便于对map按照块来操作数据。

Yarn

架构

包含以下组件:

  • Resource Manager
    • Application Manager
    • Yarn Scheduler
  • Node Manager
  • Application Master
  • Container

任务创建流程

  1. 用户向YARN中提交应用,其中包括Application Master程序、启动Application Master的命令、用户程序等;
  2. Resource Manager内部包含了Application ManagerYarn Scheduler,RM为应用分配第一个Container,并要求Node Manager在Container中启动应用程序的Application Master
  3. Application Master向Resource Manager注册自己,这样用户就可以通过Resource Manager感知应用的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7;
  4. Application Master基于应用中任务内容,向Resource Manager申请资源;
  5. 申请到资源后,AM与分配到的Node Manager通信,要求它启动任务;
  6. Node Manager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;
  7. 各任务向Application Master汇报状态和进度,在任务失败时重新启动任务;
  8. 应用程序运行完成后,Application Master向Resource Manager注销并关闭自己。

操作实践

安装包

1
2
3
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gzhadoop-3.3.0.tar.gz

tar -xzvf hadoop-3.3.0.tar.gz

配置

配置文件

  • etc/hadoop/core-site.xml

    把下面的{root}换成代理账户,比如你mac的登录账户名。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
    </property>
    <property>
    <name>hadoop.proxyuser.{root}.hosts</name>
    <value>*</value>
    </property>
    <property>
    <name>hadoop.proxyuser.{root}.groups</name>
    <value>*</value>
    </property>
    </configuration>
  • etc/hadoop/hdfs-site.xml

    1
    2
    3
    4
    5
    6
    <configuration>
    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>
    </configuration>
  • etc/hadoop/yarn-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <configuration>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.nodemanager.env-whitelist</name>
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
    </configuration>

配置远程登录

mac上需要打开 共享 中的 远程登录 功能,然后执行以下配置,保障 ssh localhost 不再要求输入密码。

1
2
3
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

格式化HDFS文件

1
$HADOOP_HOME/bin/hdfs namenode -format

配置变量

在start-dfs.sh中:

1
2
3
4
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

在start-yarn.sh中

1
2
3
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

hadoop-env.sh

1
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk

启动脚本

使用命令启动hdfs和yarn:

1
2
3
4
5
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

$HADOOP_HOME/bin/hdfs dfs -mkdir /user
$HADOOP_HOME/bin/hdfs dfs -mkdir /user/ljchen

查看各角色运行状态:

1
2
3
4
5
6
7
[root@aliyun-vm ~]# jps
6882 NodeManager
6754 ResourceManager
4164 SecondaryNameNode
3814 NameNode
3946 DataNode
7021 Jps

访问节点

节点类型 访问地址
HDFS NameNode http://localhost:9870
Yarn http://localhost:8088
0%