- 大数据集群之虚拟机集群
- 大数据集群之Hadoop集群(HA)
基本知识回顾
Hadoop大致是由三部分的组件组成的,分别为HDFS,MapReduce,yarn。
HDFS本质上是文件管理系统,HDFS大致又可以分为两个部分,NameNode(NN),DataNode(DN),NameNode为主节点或者说是Master节点,负责管理DataNode,NameNode同时只能有一个在工作,否则就会发生‘脑裂’。而DataNode则是具体存储数据的节点,DataNode可以是很多,数据是以块保存的,Hadoop2.x默认为128MB一块。
MapReduce为Hadoop的运算框架。
yarn为Hadoop的资源管理模块,负责资源分配和任务调度。yarn在dataNode节点上会有一个NodeManager线程,还自己配置的Master节点ResourceManager。
安装前提需要
- Linux集群,本章用的是我上一篇文章搭建的虚拟机集群,如果是云服务器集群可以参照我以前写的,但是会和本章有所不同,本章搭建的是基于2.x的HA集群。云服务器(阿里云,百度云,华为云,腾讯云)搭建Hadoop(Nameode,SecondaryNamenode,datanode)
- Hadoop2.x的版本,本章用的是2.9.2的版本,不同版本有些许不同,具体还要看官方文档是怎么说的。
- zookeeper,本章使用的是3.3.6版本。
配置目标
集群拓扑图
补充:
- JN代替了原来SecondaryNamenode的功能,并且成了集群,容错性提高了
- ZK是指zookeeper,用于集群管理。
- ZKFC是指Hadoop在HA中NN的监听程序。
集群原理示意图
具体原理这里就不详细解释了,不然更让人‘秃’。
设置免密钥登陆
集群之间的数据交互很频繁,但是不同机器之间要连接就需要密码,设置免密钥登陆可以使集群之间登陆免密登陆。
先用Xshell或其他方法连接上所有虚拟机。
在每个节点上运行以下代码:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 生成密钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 将密钥加入到密钥库
在Node1上:
将自己的公钥传给其他节点
scp ~/.ssh/id_rsa.pub node2:/tmp
scp ~/.ssh/id_rsa.pub node3:/tmp
scp ~/.ssh/id_rsa.pub node4:/tmp
在Node2,Node3,Node4上运行:
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys # 将传来的公钥加入到密钥库
参照上面的方法把其他节点上将自身的公钥传给其他节点,最好按上面步骤来,注意/tmp下被公钥覆盖的问题。
都传完之后测试Node1测试:
cd /
ssh node1
exit # 退出当前登陆
ssh node2
exit # 退出当前登陆
ssh node3
exit # 退出当前登陆
ssh node4
exit # 退出当前登陆
如果路径发生了变化则说明当前节点配置成功,
参照以上方法在其他的节点上进行测试
安装zookeeper
在node1,node2,node3上安装zookeeper
使用Xftp或其他方法将zookeeper-3.3.6.tar.gz上传至node1:/usr/software/
目录下,运行:
cd :/usr/software
tar -zxvf zookeeper-3.3.6
mv zookeeper-3.3.6 zk336
mv zk336 /usr/local
cd /usr/local/zk366/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
server.X=A:B:C X代表server序号 A代表主机名 B:代表follower与leader通信端口 c:代表选举leader端口
在dataDir指定的文件中创建一个myid文件,写入这个服务器的id,即上面zoo.cfg中server后的数字
cd /opt
mkdir zookeeper
cd zookeeper
vi myid
写入1 保存退出, 在其他节点上同样 只要将myid中的值改为对应节点的值。
将这个安装好的zk同步到node2,node3下
scp -r /usr/local/zk336/ node2:/usr/local/
scp -r /usr/local/zk336/ node3:/usr/local/
在每个节点中添加环境变量
vim /etc/profile # 添加环境变量
source /etc/profile # 让修改后的环境变量立即生效
需要添加的环境变量
关闭所有节点的防火墙
systemctl stop firewalld # 停止运行
systemctl disable firewalld # 禁用,禁止开机启动
在node1,node2,node3节点启动zk服务
zkServer.sh start # 启动zk服务
zkServer.sh stop # 关闭zk服务
zkCil.sh # 在当前节点启动客服端
启动后 jps 查看是否有zk线程,如何如下图则成功。
如果出现无法连接的情况可能是因为无法访问端口的错误,请关闭防火墙
安装Hadoop
将hadoop-2.9.2.tar.gz 上传到node1:/usr/software/
目录下
具体配置信息参阅官方文档
cd /usr/software
tar -zxvf hadoop-2.9.2.tar.gz
mv hadoop-2.9.2 hadoop292
mv hadoop292 /usr/local/
cd /usr/local/hadoop292/etc/hadoop
vim hadoop-env.sh
添加配置JAVA_HOME
配置 core-site.xml
添加以下配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoopdata</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
配置 hdfs-site.xml
添加以下配置
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node2:8485;node3:8485;node4:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/journal/node/local/data</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>
</configuration>
指定DataNode vim slaves
在slaves添加如下三个节点
配置 yarn-site.xml 添加以下配置
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yc2yarn</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node4</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>node3:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>node4:8088</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
添加环境变量
vim /etc/profile
source /etc/profile
将node1配置好的Hadoop发送给其他节点
scp -r /usr/local/hadoop292 node2:/usr/local
scp -r /usr/local/hadoop292 node3:/usr/local
scp -r /usr/local/hadoop292 node4:/usr/local
将其他节点环境变量设置好
在node2,node3,node4 节点上云行JN
hadoop-daemon.sh start journalnode
在node1上运行
hdfs namenode -forma # 格式化namenode
hadoop-daemon.sh start namenode # 启动当前节点
在node2上运行
hdfs namenode -bootstrapStandby # 同步node1nameNode节点的数据
在任意一个NN节点上运行
hdfs zkfc -formatZK # 格式化zk,这将在ZooKeeper中创建一个znode
zkCli.sh
ls / # 查看是否注册成功
quit # 退出客服端
启动集群
start-all.sh # 一键启动hdfs和yarn
stop-all.sh # 一键关闭
start-dfs.sh # 启动hdfs
start-yarn.sh # 启动yarn
yarn的resourcemanager需要手动去启动,在node3,node4中运行
yarn-daemon.sh start resourcemanager
检查各个节点是否成功启动
运行 jps
node1结果
node2结果
node3结果
node4结果
在浏览器地址栏中输入 http://192.168.36.100:50070
在浏览器地址栏中输入 http://192.168.36.101:50070
两个nameNode节点一个是active状态,一个是standby状态。
测试HA
在node1节点运行
hadoop-daemon.sh stop namenode
刷新 http://192.168.36.101:50070, node2节点的nameNode变成active。
到此 Hadoop 集群完成,下一篇如何使用Hadoop。