Hadoop分布式集群部署安装
1 Hadoop分布式集群部署安装
在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步activenamenode的状态,以便能够在它失败时快速进行切换。
hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当ActiveNameNode挂掉了,会自动切换Standby NameNode为active状态。
1.1 Hadoop分布式集群工作原理图
1.2 集群规划
主机名 IP 安装软件 运行进程
ha1 192.168.137.171 Jdk、Scala、Zookeep、Hadoop、Spark NameNode、DataNode、JournalNode、QuorumPeerMain、DFSZKFailoverController、ResourceManager、NodeManager、Spark Worker
ha2 192.168.137.172 Jdk、Scala、Zookeep、Hadoop、Spark NameNode、DataNode、JournalNode、QuorumPeerMain、DFSZKFailoverController、NodeManager、Spark Worker
ha3 192.168.137.173 Jdk、Scala、Zookeep、Hadoop、Spark DataNode、JournalNode、QuorumPeerMain、ResourceManager、NodeManager、Spark Master、Spark Worker
1.3 相关软件
1、jdk-8u131-linux-x64.tar.gz
2、hadoop-2.6.4.tar.gz
3、zookeeper-3.4.5.tar.gz
4、scala-2.10.4.tgz
5、spark-1.6.1-bin-hadoop2.6.tgz
1.4 修改主机名称配置hosts文件
修改主机名
修改ha1虚拟机主机名:
执行命令: vi /etc/sysconfig/network
修改里面的HOSTNAME=ha1.ry600.com
同理,修改ha2为 ha2.ry600.com
同理,修改ha3为 ha3.ry600.com
配置ha1服务器,执行命令:vi /etc/hosts
127.0.0.1 localhost
192.168.137.171 ha1.ry600.com
192.168.137.172 ha2.ry600.com
192.168.137.173 ha3.ry600.com
其它服务器scp命令进行复制:
scp /etc/hosts 192.168.137.172:/etc/
scp /etc/hosts 192.168.137.173:/etc/
1.5 配置ssh免密码登录
产生密钥,执行命令:ssh-keygen -t rsa
按4回车,密钥文件位于~/.ssh文件
在ha1上生产一对钥匙,将公钥拷贝到其他节点,包括自己,执行命令:
ssh-copy-id ha1.ry600.com
ssh-copy-id ha2.ry600.com
ssh-copy-id ha3.ry600.com
(备选:还可以继续在ha2,ha3上生成密钥拷贝到其他节点)
1.6 关闭防火墙
关闭命令: service iptables stop
永久关闭防火墙:chkconfig iptables off
两个命令同时运行,运行完成后查看防火墙关闭状态
service iptables status
1.7 上传服务器
ha1服务器创建hasoft目录后,
命令: mkdir /hasoft
再将相关软件进行上传
命令: cd /hasoft
解压JDK:
执行命令:tar -zxvf jdk-8u131-linux-x64.tar.gz
解压:Hadoop:
执行命令:tar -zxvf hadoop-2.6.4.tar.gz
解压Zookeeper:
执行命令:tar -zxvf zookeeper-3.4.5.tar.gz
解压Scala:
执行命令:tar -zxvf scala-2.10.4.tgz
解压Spark:
执行命令:tar -zxvf spark-1.6.1-bin-hadoop2.6.tgz
1.8 设置环境变量
ha1修改profilie文件:
执行命令:vi /etc/profile
在文件尾端添加:
export JAVA_HOME=/hasoft/jdk1.8.0_131
export SCALA_HOME=/hasoft/scala-2.10.4
export HADOOP_HOME=/hasoft/hadoop-2.6.4
export SPARK_HOME=/hasoft/spark-1.6.1-bin-hadoop2.6
export PATH=${JAVA_HOME}/bin:${SCALA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${SPARK_HOME}/bin:${SPARK_HOME}/sbin:$PATH
1.9 Zookeeper集群配置:
1、ha1修改zoo.cfg文件:
执行命令:
cd /hasoft/zookeeper-3.4.5/conf
cp zoo_sample.cfg zoo.cfg
修改内容,执行命令: vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/hasoft/zookeeper-3.4.6/data
dataLogDir=/hasoft/zookeeper-3.4.6/logs
server.1 = ha1.ry600.com:2888:3888
server.2 = ha2.ry600.com:2888:3888
server.3 = ha3.ry600.com:2888:3888
2、服务器标识配置
创建文件夹,
命令: cd /hasoft/zookeeper-3.4.5
命令:mkdir data
命令i
(相当于创建myid文件,内容为服务器标识:1)。
1.10 hadoop配置文件(ha1):
1、修改hadoop-env.sh配置文件:
执行命令:
vi /hasoft/hadoop-2.6.4/etc/hadoop/hadoop-env.sh
修改内容:
export JAVA_HOME=/hasoft/jdk1.8.0_131
2、切换目录
执行命令:cd /hasoft/hadoop-2.6.4/etc/hadoop
3、修改core-site.xml配置文件:
执行命令:
vi core-site.xml
修改内容:
<configuration>
<!--指定hdfs的nameService1节点URL地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- Hadoop的运行时文件存放路径,如果不存在此目录需要格式化 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/hasoft/hadoop-2.6.4/tmp</value>
</property>
<!-- Zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>ha1.ry600.com:2181,ha2.ry600.com:2181,ha3.ry600.com:2181</value>
</property>
</configuration>
4、修改hdfs-site.xml配置文件:
执行命令:
vi hdfs-site.xml
修改内容:
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>ha1.ry600.com:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>ha1.ry600.com:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>ha2.ry600.com:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>ha2.ry600.com:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://ha1.ry600.com:8485;ha2.ry600.com:8485;ha3.ry600.com:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hasoft/hadoop-2.6.4/journal</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
5、修改mapred-site.xml配置文件:
执行复制命令:cp mapred-site.xml.template mapred-site.xml
修改文件:vi mapred-site.xml
修改内容:
<configuration>
<!-- 指定Hadoop的MapReduce运行在YARN环境 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
6、修改yarn-site.xml配置文件:
执行命令:
vi yarn-site.xml
修改内容:
<configuration>
<!-- 开启RM高可靠 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>YarnCluster</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>ha1.ry600.com</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>ha3.ry600.com</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>ha1.ry600.com:2181,ha2.ry600.com:2181,ha3.ry600.com:2181</value>
</property>
<!-- NodeManager获取数据方式:shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
7、修改slaves配置文件:
执行命令:vi slaves
修改内容为:
ha1.ry600.com
ha2.ry600.com
ha3.ry600.com
1.11 Spark配置文件(ha1)
1 配置spark-env.sh
执行命令: cd /hasoft/spark-1.6.1-bin-hadoop2.6/conf
执行命令:cp spark-env.sh.template spark-env.sh
执行命令: vi spark-env.sh
在spark-env.sh文件中添加如下内容:
export JAVA_HOME=/hasoft/jdk1.8.0_131
export SCALA_HOME=/hasoft/scala-2.10.4
export HADOOP_CONF_DIR=/hasoft/hadoop-2.6.4/etc/hadoop
2 配置slaves
执行命令: cp slaves.template slaves
执行命令: vi slaves
slaves文件内容修改如下:
# A Spark Worker will be started on each of the machines listed below.
ha1.ry600.com
ha2.ry600.com
ha3.ry600.com
1.12 ha1 拷贝程序及配置文件到其它服务器(ha2、ha3)
1 复制文件
执行命令:scp -r /etc/profile ha2.ry600.com:/etc/
执行命令:scp -r /etc/profile ha3.ry600.com:/etc/
执行命令:scp -r /hasoft ha2.ry600.com:/
执行命令:scp -r /hasoft ha3.ry600.com:/
2 修改配置文件
执行命令:vi /hasoft/zookeeper-3.4.6/data/myid
将ha2的myid内容修改为2
将ha3的myid内容修改为3
3 刷新环境变量
执行命令:source /etc/profile 刷新环境变量
1.13 启动Zookeeper:
1 分别在ha1、ha2、ha3启动zookeeper
执行命令:/hasoft/zookeeper-3.4.6/bin/zkServer.sh start
2 所有机器启动完毕,查看启动状态
执行命令:/hasoft/zookeeper-3.4.6/bin/zkServer.sh status
1.14 启动journalnode:
分别在ha1、ha2、ha3上启动journalnode,注意:是调用的hadoop-daemon.sh这个脚本:
分别执行命令:/hasoft/hadoop-2.7.3/sbin/hadoop-daemon.sh start journalnode
1.15 格式化文件系统:
在ha1服务器上进行:HDFS文件系统进行格式化,执行命令:
hdfs namenode -format
验证:提示如下信息表示成功:
INFO common.Storage: Storage directory/usr/local/software/hadoop_2.7.1/tmp/dfs/name has been successfully formatted.
Hadoop的运行时文件存放路径为:tmp目录,ha1需要和ha2一致,进行拷贝(nameNode元数据):
执行命令:scp -r /hasoft/hadoop-2.7.3/tmp ha2.ry600.com:/hasoft/hadoop-2.7.3/
1.16 格式化formatZK:
只需要在ha1上进行执行命名即可:
执行命令:hdfs zkfc -formatZK
验证:
打开ha1服务器zookeeper客户端,查看是否存在hadoop-ha节点
执行命令:/hasoft/zookeeper-3.4.6/bin/zkCli.sh
查看节点命令:ls /
1.17 启动HDFS:
1、只需要在ha1上启动HDFS,
执行命令:/hasoft/hadoop-2.7.3/sbin/start-dfs.sh
验证启动HDFS:
Java Jps:JDK提供查看当前进程的小工具。
NameNode:它是Hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问。
DFSZKFailoverController会定期通过该rpc调用proxy.monitorHealth()来监测NN的健康状况。
1.18 启动YARN:
1、只需要在ha1上启动YARN,
执行命令:/hasoft/hadoop-2.7.3/sbin/start-yarn.sh
2、验证启动YARN:
Jps:JDK提供查看当前java进程的小工具。
ResourceManager:接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM)。
1.19 启动Spark
ha1执行命令: /hasoft/spark-2.2.0-bin-hadoop2.7/sbin/start-all.sh
1.20 访问服务页面:
访问地址验证启动服务,访问地址:
HDFS管理界面:http://192.168.137.171:50070/
YARN管理界面:http://192.168.137.171:8088/
http://192.168.137.171:8080/SPARK管理界面: :
1.21 验证HDFS - HA主备切换:
1、验证ha1服务器NameNode和ha2服务器NameNode数据文件是否可以共享:
在ha1上传文件hosts文件:
执行命令:hadoop fs -put /etc/hosts /
杀掉ha1 NameNode进程,执行命令:
查看进程:jps
Kill -9 6068
验证成功
2、启动ha1上的NameNode进程,将ha2服务器进行强制关机,验证是否可以激活ha1:
启动ha1服务器NameNode进程:
执行命令:/hasoft/hadoop-2.6.4/sbin/hadoop-daemon.sh start namenode
将ha2服务进行关机处理:
主备切换对比图:
1.22 日常启动步骤:
分别在ha1、ha2、ha3启动zookeeper
执行命令:/hasoft/zookeeper-3.4.5/bin/zkServer.sh start
只需要在ha1或ha2上启动HDFS,
执行命令:/hasoft/hadoop-2.6.4/sbin/start-dfs.sh
只需要在ha1或ha3上启动YARN,
执行命令:/hasoft/hadoop-2.6.4/sbin/start-yarn.sh
启动另外一台机器的ResourceManager
执行命令: /hasoft/hadoop-2.6.4/sbin/yarn-daemon.sh start resourcemanager
只需要在ha1或ha2或ha3启动Spark:
执行命令: /hasoft/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh