1 集群搭建准备工作
1.1 集群环境
主机名称 | 主机IP | Hadoop账号 | NN | DN | ZK | ZKFC | JN |
RM |
NM |
node1 | 192.168.100.21 | deng | √ | √ | √ | √ | √ | √ | |
node2 | 192.168.100.22 | deng | √ | √ | √ | √ | √ | √ | √ |
node3 | 192.168.100.23 | deng | √ | √ | √ | √ | √ |
1.2 修改host文件
我们希望三个主机之间都能够使用主机名称的方式相互访问而不是IP,我们需要在hosts中配置其他主机的host。因此我们在三个主机的/etc/hosts下均进行如下配置:
1. 打开hosts文件
[root@node1 ~]# vi /etc/hosts
2. 配置主机host
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.100.21 node1 192.168.100.22 node2 192.168.100.23 node3
3. 将配置发送到其他主机(同时在其他主机上配置)
[root@node1 ~]# scp /etc/hosts root@node2:/etc/hosts [root@node1 ~]# scp /etc/hosts root@node3:/etc/hosts
4. 测试
[root@node1 ~]# ping node1 [root@node1 ~]# ping node2 [root@node1 ~]# ping node3
1.3 建立hadoop用户账号
我们在所有的主机下均建立一个grid账号用来运行hadoop ,并将其添加至sudoers中
创建deng账号的命令如下
[root@node1 ~]# useradd deng 添加用户通过手动输入修改密码 [root@node1 ~]# passwd --stdin deng 更改用户 deng 的密码 123456 passwd: 所有的身份验证令牌已经成功更新。
添加deng组到sudo中,在其中添加下面一行:
[root@node1 ~]# visudo 添加 deng ALL=(ALL) ALL
改行意思为,组:deng内的用户允许免密码使用sudo命令
测试:
[root@node1 root]$ su deng [deng@node1 root]$ sudo
1.4 配置yum源
yum install wget -y #安装wget mv /etc/yum.repos.d /etc/yum.repos.d.backup4comex #备份当前的yum源 mkdir /etc/yum.repos.d #新建空的yum源设置目录 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo #下载阿里云的yum源配置 yum clean all #重建缓存 yum makecache
1.5 卸载每台节点原有jdk,安装jdk1.8
[deng@node1 ~]# rpm -qa|grep java #查询是否安装java软件: [deng@node1 ~]# rpm -e –nodeps 软件包 #如果安装的版本低于1.7,卸载该jdk [root@node1 opt]# mkdir module [root@node1 opt]# mkdir tools 在线安装 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz 这里使用本地下载然后 xftp上传到 /opt/tools/ 下 [root@node1 tools]# tar zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/ [root@node1 module]# mv jdk1.8.0_144 jdk1.8 设置JAVA_HOME vi /etc/profile export JAVA_HOME=/opt/module/jdk1.8 export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/sbin source /etc/profile 向其他节点复制jdk [root@node1 ~]# scp -r /opt/module/jdk1.8 root@node2:`pwd` [root@node1 ~]# scp -r /opt/module/jdk1.8 root@node3:`pwd` 配置各个主机下jdk的环境变量,由于我的电脑上linux都是新安装的,环境变量相同,因此直接复制到了其他主机上。如果不同的主机的环境变量不同,请手动设置 [root@node1 ~]# scp /etc/profile root@node2:/etc/profile [root@node1 ~]# scp /etc/profile root@node3:/etc/profile 在每个主机上都重新编译一下/etc/profile [root@node1]# source /etc/profile 测试 java -version
1.6 设置SSH免密码登陆
关于ssh免密码的设置,要求每两台主机之间设置免密码,自己的主机与自己的主机之间也要求设置免密码。 这项操作我们需要在deng用户下执行。
[root@node1 ~]# su deng [root@node1 ~]# ssh-keygen -t rsa [root@node1 ~]# ssh-copy-id node1 [root@node1 ~]# ssh-copy-id node2 [root@node1 ~]# ssh-copy-id node3
node1与node2为namenode节点要相互免秘钥 HDFS的HA
[root@node2 ~]# ssh-keygen -t rsa [root@node2 ~]# ssh-copy-id node2 [root@node2 ~]# ssh-copy-id node1 [root@node2 ~]# ssh-copy-id node3
node2与node3为yarn节点要相互免秘钥 YARN的HA
[root@node3 ~]# ssh-keygen -t rsa [root@node3 ~]# ssh-copy-id node3 [root@node3 ~]# ssh-copy-id node1 [root@node3 ~]# ssh-copy-id node2
2 下载解压安装配置hadoop
2.1 配置zookeeper集群
[root@node1 tools]# tar zxvf zookeeper-3.4.12.tar.gz -C /opt/module/ 配置环境变量 vi /etc/profile export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.12 export PATH=$PATH:$ZOOKEEPER_HOME/bin 编译生效 source /etc/profile 修改配置文件zookeeper-3.4.12/conf/ [root@node1 conf]# cp zoo_sample.cfg zoo.cfg 修改zk数据目录 [root@node1 conf]# vi zoo.cfg dataDir=/opt/module/zookeeper-3.4.12/zkDa 文件尾追加 server.1=192.168.100.21:2888:3888 server.2=192.168.100.22:2888:3888 server.3=192.168.100.23:2888:3888 创建节点数据目录 [root@node1 ~]# mkdir -p /opt/module/zookeeper-3.4.12/zkDate [root@node1 ~]# echo 1 > /opt/module/zookeeper-3.4.12/zkDate/myid 分发zookeeper-3.4.12 到 node2 node3 节点上 配置环境变量 [root@node1 module]# scp -r zookeeper-3.4.12 node2:`pwd` [root@node1 module]# scp -r zookeeper-3.4.12 node3:`pwd` 修改node2 node3 节点myid的值 [root@node2 tools]# mkdir -p /opt/module/zookeeper-3.4.12/zkDate [root@node2 tools]# echo 2 > /opt/module/zookeeper-3.4.12/zkDate/myid [root@node3 tools]# mkdir -p /opt/module/zookeeper-3.4.12/zkDate [root@node3 tools]# echo 3 > /opt/module/zookeeper-3.4.12/zkDate/myid 分别启动 zookeeper [root@node1 module]# zkServer.sh start [root@node2 module]# zkServer.sh start [root@node3 module]# zkServer.sh start 分别查看启动状态 zookeeper [root@node1 module]# zkServer.sh status
2.2 下载解压hadoop,配置HDFS-HA集群,修改etc下配置文件
[root@node1 tools]# tar zxvf hadoop-2.7.6.tar.gz -C /opt/module/ vi /etc/profile export HADOOP_HOME=/opt/module/hadoop-2.7.6 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 编译生效 . /etc/profile
注意:在hadoop2.x中配置文件是放在etc下的
1. 修改配置文件 hadooop-env.sh
[root@node1 hadoop]# vi /opt/module/hadoop-2.7.6/etc/hadoop/hadoop-env.sh 修改 export JAVA_HOME=/opt/module/jdk1.8
2. 修改配置文件 core-site.xml
[root@node1 hadoop]# vi /opt/module/hadoop-2.7.6/etc/hadoop/core-site.xml <configuration> <!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.6/data/tmp</value> </property> <!-- 指定hadoop运行时zookeeper集群节点 --> <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> </configuration>
3. 修改配置文件 hdfs-site.xml
[root@node1 hadoop]# vi /opt/module/hadoop-2.7.6/etc/hadoop/hdfs-site.xml <configuration> <!-- 设置dfs副本,默认是3个 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 完全分布式集群名称 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 集群中NameNode节点都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node1:8020</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node2:8020</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node1:50070</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node2:50070</value> </property> <!-- 指定NameNode元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> </property> <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔离机制时需要ssh无秘钥登录--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 声明journalnode服务器存储目录--> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/module/hadoop-2.7.6/data/jn</value> </property> <!-- 关闭权限检查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置自动故障转移--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
4. 修改配置文件 slaves 这个配置文件是datanode所在的节点
[root@node1 hadoop]# vi slaves node1 node2 node3
5. 修改配置文件 mapred-env.sh
#export JAVA_HOME=/home/y/libexec/jdk1.6.0/ export JAVA_HOME=/opt/module/jdk1.8
6. 修改配置文件 mapred-site.xml
root@node1 hadoop]# mv mapred-site.xml.template mapred-site.xml root@node1 hadoop]# vi mapred-site.xml <configuration> <!-- 指定mr运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
7. 修改配置文件 yarn-env.sh
修改JAVA_HOME的路径 默认注释掉了 打开注释大概在第20行左右 export JAVA_HOME=/opt/module/jdk1.8
8. 修改配置文件 yarn-site.xml
[root@node1 ~]# vi /opt/module/hadoop-2.7.6/etc/hadoop/yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--启用resourcemanager ha--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--声明两台resourcemanager的地址--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node3</value> </property> <!--指定zookeeper集群的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <!--启用自动恢复--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的状态信息存储在zookeeper集群--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>
2.3 向各节点复制分发hadoop安装包,配置hadoop环境变量
[root@node1 module]# scp -r hadoop-2.7.6/ root@node2:`pwd` [root@node1 module]# scp -r hadoop-2.7.6/ root@node3:`pwd` 配置node2,node3节点hadoop的环境变量
2.4 格式化namenode
[root@node1 ~]# hdfs namenode -format
3 启动hadoop
3.1 启动命令
[root@node1 ~]# start-dfs.sh
3.2 测试jps查看进程
4 集群简单操作