1、什么是Hadoop
Hadoop是一种分析和处理大数据的软件平台(包括分布式存储和计算)。
Hadoop包括三个核心组成部分,分别是Hbase、MapReduce、HDFS。
Hbase:一种分布式数据存储系统,用来处理海量数据的非关系型数据库。
MapReduce:MapReduce编程模型,用于大规模数据集(大于1TB)的并行分析计算。
HDFS:分布式文件存储系统,用于存储海量数据的专用文件系统。
1.1、HDFS架构
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
NameNode:Hadoop2.0以后有两个NameNode,状态分别是active和standby,其用来管理文件系统的名字空间(namespace)以及客户端对文件系统的访问。
OS/HW:操作系统/硬件。
FailoverController:一个从NameNode中抽离出来的deamon进程(只与操作系统相关,与其他进程无关),其状态有active和standby,用于监控NameNode的健康状态,向ZK定期发送心跳,使自己可以被选举。当FailoverController被ZK选为主时,active FailoverController通过RPC调用使相应的NameNode转换为active。
JournalNodes:一组独立的进程,用于两个NameNode进行数据同步。
DataNode:数据存储节点,一般一台存储服务器就是一个节点,用来负责处理文件系统客户端的读写请求。
SecondaryNameNode:在Hadoop1.0中存在,其作用是合并fsimage和edits文件,不是作为NameNode的备用节点,只是为了减少NameNode节点重启时间。
Replication:数据复制备份,数据进入大数据平台后会有个数据备份过程。
Client:客户端,用于提交用户的读写请求,其namenode之间的通信是rpc通信,其与datanode之间的通信是简单的socket通信。
Block:物理磁盘中有块的概念,磁盘的物理Block是磁盘操作最小的单元,读写操作均以Blcok为最小单元,一般为512Byte,文件系统在物理Block之上抽象了另一层概念,文件系统Block是物理磁盘Block的整数倍,通常为几KB。而HDFS的Block块比一般单机文件系统大得多,默认为128M。
Packet:packet是第二大的单位,它是client端向DataNode,或DataNode的pipline之间传数据的基本单位,默认64KB。
Chunk:chunk是最小的单位,它是Clinet向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk写入packet的大小为516Byte。由此可见真实数据与校验值数据的比值约为128 : 1
1.2、HDFS读写流程
1.2.1、HDFS的写流程
1、客户端创建一个Distributed FileSystem对象。
2、Distributed FileSystem对象会发起对namenode的一个RPC连接,请求创建一个文件,不包含关于block块的请求。namenode会执行各种各样的检查,确保要创建的文件不存在(不允许覆盖),并且客户端有创建文件的权限。如果检查通过,namenode会创建一个临时文件file.copying(在edits中),否则创建失败,客户端抛异常IOException。
3、NameNode触发副本放置策略,如果客户端在集群内的某一台机器,那么副本第一块放置在该服务器上,然后再另外挑两台服务器;如果在集群外,namenode会根据机架感知策略(从距离client最近的节点所在的机架)先找一个机架选出一个datanode,然后再从另外的机架选出另外两个datanode,然后namenode会将选出的三个datanode按距离组建一个顺序,然后将顺序返回给客户端。
4、DistributedFileSystem返回一个FSDataOutputStream对象给客户端用于写数据。FSDataOutputStream封装了一个DFSOutputStream对象负责客户端跟datanode以及namenode的通信。
5、FSDataOutputStream对象将数据切分为小的数据包(64kb),并写入到一个内部队列(“数据队列”)。DataStreamer会读取其中内容,并请求namenode返回一个datanode列表来存储当前block副本。列表中的datanode和client会形成管线(pipline,也即是socket连接),DataStreamer将数据包发送给管线中的第一个datanode,第一个datanode将接收到的数据发送给第二个datanode,第二个发送给第三个。
6、DFSOutputStream维护着一个数据包(客户端将block切分成package)的队列,这的数据包是需要写入到datanode中的,该队列称为确认队列。当一个数据包在管线中所有datanode中写入完成,就从ack队列中移除该数据包。队列是在客户端维护的。
7、由DataNode完成接收block块后,block的metadata(MD5校验用)通过一个心跳将信息汇报给NameNode。
8、如果在pipeline传输中,任意节点失败,上游节点直接连接失败节点的下游节点继续传输,最终在第七步汇报后,NameNode会发现副本数不足,一定会出发DataNode复制更多副本,客户端Client副本透明。
9、client一直重复以上操作,逐一将block块上传,同时DataNode汇报block的位置信息,时间线重叠。
10、最终,如果NameNode收到了DataNode汇报的所有块的信息,将文件的.copying去掉,文件可用。
1.2.2、HDFS的读流程
1、客户端和NameNode建立连接,获取文件block的位置信息(fileBlockLocations)。
2、客户端根据自己想要获取的数据位置挑选需要连接的DataNode(如果全文下载,从0开始;如果是从某一位置开始,客户端需要给出)需要用inputstream.seek(long)//从什么位置开始读取,和哪个DataNode开始连接获取block。
3、距离的概念:只有文件系统在读流程中附加距离优先的概念,计算层才能够被动实现计算向数据移动,距离有以下三种:
(1)本地,最近的距离;
(2)同机架,次之的距离;
(3)other(数据中心),最远的距离;
4、客户端下载完成block后会验证DataNode中的MD5,保证块数据的完整性。
1.3、HDFS的HA机制
- 所谓HA(high available),即高可用(7*24小时不中断服务)。
- 实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。
- Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。 4)NameNode主要在以下两个方面影响HDFS集群 NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启 NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
1.4、YARN的HA机制
ResourceManager中基于zookeeper的ActiveStandbyElector来选举哪个RM作为active RM。Active RM关闭或故障时自动选举standby状态的RM作为新的active RM接管active RM的工作。
2、Hadoop集群安装步骤
2.1、解压安装包
进入安装了hadoop安装包的文件夹路径下,我这里是/opt/software
cd /opt/software
tar -zxvf hadoop-2.7.2.tar.gz
2.2、修改配置文件
1、创建hadoop的log日志存储位置的文件夹(worker1,worker2,worker3节点都要执行)
mkdir /log/
mkdir /log/hadoop/
2、修改hadoop-env.sh,yarn-env.sh文件(worker1上修改,后面直接将hadoop文件夹发送到worker2和worker3上即可,下面涉及到hadoop配置文件修改的都是一样。)
vim /opt/software/hadoop/etc/hadoop/hadoop-env.sh
在最下面加上
export HADOOP_LOG_DIR="/log/hadoop/"
接着修改yarn-env.sh文件
vim /opt/software/hadoop/etc/hadoop/yarn-env.sh
最下面加上这句
YARN_LOG_DIR="/home/hadoop/log/yarn"
3、配置core-site.xml
vim /opt/software/hadoop/etc/hadoop/core-site.xml
修改这些地方
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://worker1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value> /home/hadoop_files/hadoop_tmp/hadoop/data/tmp</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>worker1:2181,worker2:2181,worker3:2181</value>
</property>
</configuration>
第一个配置对应hadoop的namenode。第二个配置是用于储存hadoop执行过程中的临时文件。第三个配置是hfds文件在垃圾站中保留的时间,超过这个时间就会被永久删除数据。第四个配置是为后面配置HA指定zookeeper。
4、配置hdfs-site.xml
vim /opt/software/hadoop/etc/hadoop/hdfs-site.xml
修改这些地方
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop_files/hadoop_data/hadoop/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop_files/hadoop_data/hadoop/datanode</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>worker1:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
第一个配置是指定hdfs元数据存储的路径,第二个配置是指定hdfs数据存储的路径(对应的也就是问题1的文件夹路径/home/hadoop_files),第三个配置是指定第二个secondarynamenode的端口,因为是一台机器配置了namenode和secondarynode,所以配置不同端口。第四个配置是数据备份的个数。第五个配置是关闭hadoop的权限认证,这里我们暂时不考虑这方面为了方便。第六个配置是开启WebHDFS功能。
5、配置mapred_site.xml
vim /opt/software/hadoop/etc/hadoop/mapred_site.xml
修改这些地方
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>worker1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>worker1:19888</value>
</property>
</configuration>
第一个配置是指定计算框架yarn,第二个配置是指定jobhistory server的rpc地址,第三个配置是指定jobhistory server的http地址。
6、配置yarn-site.xml
vim /opt/software/hadoop/etc/hadoop/yarn_site.xml
修改这些地方
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>worker2:8888</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/home/hadoop_files/hadoop_logs/yarn</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>worker1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>worker1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>worker1:8031</value>
</property>
<!-- Site specific YARN configuration properties -->
</configuration>
第一个参数配置只有配置成mapreduce_shuffle才可运行MapReduce程序。第二个配置是配置Web Application Proxy安全代理(防止yarn被攻击)。第三个配置是开启日志。第四个配置是配置日志删除时间,单位为秒,默认-1表示禁用。
7、配置slaves
vim /opt/software/hadoop/etc/hadoop/slaves
修改这些地方
worker1
worker2
worker3
8、创建配置文件中涉及的目录(在所有结点上)
mkdir -p /home/hadoop_files/hadoop_data/hadoop/namenode
mkdir -p /home/hadoop_files/hadoop_data/hadoop/datanode
mkdir -p /home/hadoop_files/hadoop_tmp/hadoop/data/tmp
mkdir -p /home/hadoop_files/hadoop_logs/yarn
9、将 worker1配置好的hadoop工作目录同步到集群其它节点(worker1执行)
scp -r /opt/software/hadoop worker2:/opt/software/
scp -r /opt/software/hadoop worker3:/opt/software/
10、修改环境变量(所有节点)
vim /etc/profile
修改内容如下:
export HADOOP_HOME=/opt/software/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
使修改后的环境变量生效。
source /etc/profile
启动zookeeper集群(所有节点)
zkServer.sh start
11、格式化
启动 journalnode(在所有datanode上执行,即worker1, worker2, worker3)
hadoop-daemon.sh start journalnode
启动后使用 jps 命令可以看到 JournalNode 进程
格式化 HDFS(在worker1上执行)
hdfs namenode -format
格式化完毕后可关闭 journalnode(在所有 datanode 上执行)
hadoop-daemon.sh stop journalnode
2.3、运行hadoop
在worker1上启动 HDFS
start-dfs.sh
启动后在worker1上使用 jps 命令可以看到 NameNode, DataNode, SecondaryNameNode
worker2和worker3 上可以看到DataNode
在worker1上启动 YARN
start-yarn.sh
启动后在worker1上使用jps命令可以看到 NodeManager, ResourceManager
worker2和worker3 上可以看到 NodeManager。
成功启动HDFS和YARN后的界面如下所示:
关闭YARN和HDFS命令如下
关闭 YARN 的命令(worker1上)
stop-yarn.sh
关闭 HDFS 的命令(worker1上)
stop-dfs.sh
3、问题记录
- 执行start-hdfs.sh后,datanode开了一会自动关了,原因极有可能是多次格式化hdfs数据文件导致的,可以先删掉前面建立的数据文件夹后重新建后再执行格式化就没有问题了
4、参考链接
https://zhuanlan.zhihu.com/p/54994736
https://zhuanlan.zhihu.com/p/66051354
https://zhuanlan.zhihu.com/p/61888562
https://blog.csdn.net/SlimShadyKe/article/details/89763113
https://cloud.tencent.com/developer/article/1395077