一、理论部分知识
1、HDFS :Hadoop DIstributed File System简写。
易于扩展的分布式文件系统
运行在大量普通廉价机器上(成本低) ,提供容错的机制(可靠性高)
2、HDFS优点:
高容错性
适合大数据批处理(移动计算不移动数据、数据位置暴露给计算框架、存储量大、百万规模以上的文件数量、10k节点规模)
流式文件访问(一次写入,多次读取,保证数据一致性)
构建成本低、安全可靠(构建在廉价机器上、通过多副本提高可靠性、提供容错和恢复机制)
3、HDFS缺点:
不适合低延迟数据访问(毫秒级不支持)
不适合大量小文件存储(占用NameNode大量内存空间:会导致Namenode不可用、磁盘寻道时间超过读取时间)
不适合并发写入(一个文件只能一个写入者:多线程同时写一个不行,只有一个能成功,其他都会报异常)
不提供文件随机修改(只支持追加)
4、HDFS设计需求
1)超大文件2)流式数据访问3)低成本4)数据一致性5)高吞吐率6)易扩展7)高容错
5、HDFS 架构图
若想有更高的容错,可以复制多个副本数。
6、HDFS核心概念:
Active NameNode
1)主Master(只有一个)
2)管理HDFS文件系统命名空间
3)管理副本策略(默认3个副本)
4)处理客户端读写请求
Standby NameNode: Active NameNode的热备节点
1)NameNode 元数据文件
edits:编辑日志
fsimage: 文件系统元数据检查点镜像文件,保存文件系统中所有目录和文件信息
2)NameNode 内存中保存一份最新的镜像信息
3)NameNode定期将edits+fsimage合并保存到磁盘
DataNode
1)slave工作节点,可以启动多个
2)存储数据库和数据校验和
3)执行客户端读写请求操作
4)通过心跳机制定期向NameNode 汇报运行状态和块列表信息
5)集群启动时向NameNode 提供存储的块列表信息
Block数据块
1)文件写入到HDFS会被切分成若干个Block块
2)数据块大小固定,默认大小128MB,可自定义修改
3)HDFS最小存储单元
4)若一个块的大小小于设置的数据块大小,则不会占用整个块的空间
5)默认情况下每个Block有三个副本
Client
1)文件切分
2)与NameNode交互获取元数据信息
3)与DataNode,读取/写入数据
4)管理HDFS
7、HDFS为什么不适合存储小文件?
元数据信息存储在NameNode内存中,内存大小有限
NameNode存储BLock数据有限
一个Block元数据消耗大约150byte内存
如果存储一亿个block,大约需要20G内存
如果一个文件为10K,则1亿个文件大小只有1TB,却消耗了20G内存
8、HDFS高可用原理
JournalNode一般部署奇数个,3台最多允许1台挂掉,否则集群不可用
对于ActiveNode,写请求时阻塞,元数据同时写入edit ,还同时写入所有的JournalNode ,都写入完成后,会在内存中写一个文件,更新内存中的目录数。元数据信息会定期的更新到fsimage ,fsimage相当于一个镜像文件
对于Standby Node,定期从JournalNode中同步元数据信息到内存中,然后定期的更新到fsimage。
9、YARN核心组件
ResourceManage:整个集群只有一个Master
NodeManage :每个节点只有一个,集群上会有多个,一般与DataNode一一对应,在相同的集群上部署。
ApplicationManage:每个应用程序只有一个,负责应用程序的管理,资源申请和任务调度。
Container:任务运行环境的抽象,只有在分配任务的时候才会抽象出一个Container。
二、Hadoop分布式安装
1、使用hadoop用户解压并安装到apps路径下
1.1使用hadoop用户进入到在/home/hadoop/apps目录下
cd /home/hadoop/apps
注意:如果没有/home/hadoop/apps路径,自行在/home/hadoop路径下创建apps文件夹:
mkdir /home/Hadoop/apps
1.2使用rz将本机的hadoop安装包上传到/home/hadoop/apps目录下
1.3解压安装文件
tar -zxvf hadoop-2.7.4.tar.gz
1.4使用root用户创建软链接
ln -s /home/hadoop/apps/hadoop-2.7.4 /usr/local/hadoop
1.5使用root用户修改软链接属主
chown -R hadoop:hadoop /usr/local/hadoop
1.6使用root用户将hadoop相关内容添加到环境变量中
注意:Hadoop配置文件路径是/usr/local/hadoop/etc/hadoop
vim /etc/profile
添加内容如下:
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_HOME=$HADOOP_HOME
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
1.7使用root用户重新编译环境变量使配置生效
source /etc/profile
2. 配置HDFS
2.1使用hadoop用户进入到Hadoop配置文件路径
cd /usr/local/hadoop/etc/hadoop
2.2修改hadoo-env.sh
修改JDK路径export JAVA_HOME=/usr/local/jdk
2.3 配置core-site.xml
2.4 配置hdfs-site.xml
3. 配置YARN
3.1 修改yarn-site.xml
3.2 修改mapred-site.xml
3.3 在/usr/local/hadoop路径下创建hdpdata文件夹
cd /usr/local/hadoop
mkdir hdpdata
4. 修改slaves文件,设置datanode和nodemanager启动节点主机名称
在slaves文件中添加节点的主机名称
node03
node04
node05
注意:node03,node04,node05是我的虚拟机主机名称,在这三台机器上启动datanode和nodemanager,同学根据自己集群主机名称情况自行修改。
5. 配置hadoop用户免密码登陆
配置node01到node01、node02、node03、node04、node05的免密码登陆
在node01上生产一对钥匙
ssh-keygen -t rsa
将公钥拷贝到其他节点,包括自己本机
ssh-copy-id -i node01
ssh-copy-id -i node02
ssh-copy-id -i node03
ssh-copy-id -i node04
ssh-copy-id -i node05
注意:两个namenode之间要配置ssh免密码登陆
6. 将配置好的hadoop拷贝到其他节点
scp -r hadoop-2.7.4 hadoop@node02:/home/hadoop/apps
scp -r hadoop-2.7.4 hadoop@node03:/home/hadoop/apps
scp -r hadoop-2.7.4 hadoop@node04:/home/hadoop/apps
scp -r hadoop-2.7.4 hadoop@node05:/home/hadoop/apps
在每个节点分别执行如下四步操作
第一步:使用root用户创建软链接
ln -s /home/hadoop/apps/hadoop-2.7.4 /usr/local/hadoop
第二步:使用root用户修改软链接属主
chown -R hadoop:hadoop /usr/local/hadoop
第三步:使用root用户添加环境变量
vim /etc/profile
添加内容:
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_HOME=$HADOOP_HOME
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
第四步:使用root用户重新编译环境变量使配置生效
source /etc/profile
集群启动步骤(注意使用hadoop用户启动,严格按照顺序启动)
su hadoop
1. 启动journalnode(分别在node03、node04、node05上执行启动)
/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
运行jps命令检验,node03、node04、node05上多了JournalNode进程
2. 格式化HDFS
在node01上执行命令:
hdfs namenode -format
格式化成功之后会在core-site.xml中的hadoop.tmp.dir指定的路径下生成dfs文件夹,将该文件夹拷贝到node02的相同路径下
scp -r hdpdata hadoop@node02:/usr/local/hadoop
3. 在node01上执行格式化ZKFC操作
hdfs zkfc -formatZK
执行成功,日志输出如下信息
INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK
4. 在node01上启动HDFS
sbin/start-dfs.sh
5. 在node02上启动YARN
sbin/start-yarn.sh
在node01单独启动一个ResourceManger作为备份节点
sbin/yarn-daemon.sh start resourcemanager
6. 在node02上启动JobHistoryServer
sbin/mr-jobhistory-daemon.sh start historyserver
启动完成node02会增加一个JobHistoryServer进程
7. hadoop安装启动完成
HDFS HTTP访问地址
NameNode (active):http://192.168.183.100:50070
NameNode (standby):http://192.168.183.101:50070
ResourceManager HTTP访问地址
ResourceManager :http://192.168.183.101:8088
历史日志HTTP访问地址
JobHistoryServer:http://192.168.183.101:19888
三、hadoop集群验证
1. 验证HDFS 是否正常工作及HA高可用
首先向hdfs上传一个文件
hadoop fs -put /usr/local/hadoop/README.txt /
在active节点手动关闭active的namenode
sbin/hadoop-daemon.sh stop namenode
通过HTTP 50070端口查看standby namenode的状态是否转换为active
手动启动上一步关闭的namenode
sbin/hadoop-daemon.sh start namenode
2.验证YARN是否正常工作及ResourceManager HA高可用
运行测试hadoop提供的demo中的WordCount程序:
hadoop fs -mkdir /wordcount
hadoop fs -mkdir /wordcount/input
hadoop fs -mv /README.txt /wordcount/input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /wordcount/input /wordcount/output
验证ResourceManager HA
手动关闭node02的ResourceManager
sbin/yarn-daemon.sh stop resourcemanager
通过HTTP 8088端口访问node01的ResourceManager查看状态
手动启动node02 的ResourceManager
sbin/yarn-daemon.sh start resourcemanager
四、Hadoop集群搭建常见问题记录
问题1 : 启动hadoop集群后访问node02的resouremanage 无激活的Nodes 如下图所示?
解决方法,是虚拟机内存不够,需要修改yarn-site.xml配置文件
修改yarn-site.xml配置文件添加如下内容:
把这两项配置添加到yarn-site.xml里,所有机器都要改,保持配置文件一直然后关闭yarn :sbin/stop-yarn.sh
关闭之后启动: sbin/start-yarn.sh
课上老师答疑记录
问题1:假如说datanode挂了 硬件没有问题的情况下能恢复么?
答:可以恢复,DataNode挂了,会通过NameNode副本恢复,然后DataNode重启后,数据块就删除了。
问题2:JN里面写的是操作日志还是数据文件?
答:JN里面写的是操作日志
问题3:zookeeper、yarn、hdfs、hadoop 关系?
答:hadoop包括hdfs、yarn; zookeeper是充当nadenode ,resoursemanage选主过程,老师绘制草图如下:
当nn1挂掉,临时节点就会被删除,nn2变为active、
同理rm1挂掉,临时节点被删除,rm2再去请求,变为active