Hadoop2.0 HA安装完整版——Hadoop2.7.3

版权声明:未经博主同意不得转载,请尊重知识敬畏技术 https://blog.csdn.net/weixin_42003671/article/details/86478544

@羲凡——只为了更好的活着

Hadoop2.0 HA安装完整版——Hadoop2.7.3

Hadoop从2008年发布,到现在已经11个年头了。Hadoop安装是任何一个大数据开发或运维人员都必须掌握的。本文尽可能详细的介绍hadoop 高可用的安装并对参数做一定的介绍(用 deplab 用户安装)。hadoop的安装都非常类似,无论是hadoop2.0版本还是hadoop3.0版本。此文中选择Hadoop2.7.3作为示范!

我用5台机器集群规划如下

hostname NameNode DataNode JournalNode ResourceManager ZooKeeper
deptest1
deptest2
deptest3
deptest4
deptest5

一、前期准备

1.配置免密登录(非重点——赘述)

a.先在 deptest1 机器上操作,如果存在 ~/.ssh ,先删除。然后在任意目录下输入 ssh-keygen 按三下 Enter ,就生成新的 ~/.ssh 文件夹。
b.在任意目录下输入 ssh-copy-id deptest1 ,则生成 ~/.ssh/authorized_keys
c.在其他几台机器上重复操作a和操作b,再将 authorized_keys 文件相互追加到彼此的authorized_keys 文件 中即可

2.配置时间同步(非重点——赘述)

a.全部机器都要安装ntp

sudo apt-get install ntp

b.修改被同步机器(本例为deptest1)的/etc/ntp.conf文件(最好用whereis ntp查找路径)
在第24行左右添加以下三列(192.168.2.0)

restrict 192.168.2.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

c.关闭需要同步时间机器的ntp(除deptest1的其他机器)

sudo service ntp stop

d.同步时间(除deptest1的其他机器都要执行)

sudo ntpdate deptest1

e.在除deptest1的其他机器,将同步时间的命令放在crontab中(切换到root用户下操作)

crontab -e # 打开crontab
0 8 * * * ntpdate deptest1 #需要添加的命令,每天早上八点同步一次

3.下载并安装Java(五台机器都要安装)

最好使用1.8版本的,因为如果你以后肯定会用到hadoop生态圈中其他的组件,而这些组件的新版本可能需要Java1.8版本。本文使用 jdk1.8.0_131
配置 /etc/profile

sudo vi /etc/profile
	# JAVA_HOME
	export JAVA_HOME=/usr/local/package/jdk1.8.0_131
	export PATH=$PATH:$JAVA_HOME/bin
# 重新加载/etc/profile文件
source /etc/profile 

在任意界面输入 java -version,出现如下内容,则说明成功

扫描二维码关注公众号,回复: 5038972 查看本文章
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

4.下载并安装ZooKeeper

a.下载地址如下:
https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/
在这里插入图片描述
b.安装步骤如下
第1步:在deptest3 机器的 /usr/local/package 目录下解压 zookeeper-3.4.6.tar.gz

tar -zxf zookeeper-3.4.6.tar.gz -C ./

第2步:配置 /etc/profile

sudo vi /etc/profile
	# ZOOKEEPER_HOME
	export ZOOKEEPER_HOME=/usr/local/package/zookeeper-3.4.6
	export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 重新加载/etc/profile文件
source /etc/profile 

第3步:修改 $ZOOKEEPER_HOME/conf/zoo.cfg 文件

# 先将zoo_sample.cfg重命名为zoo.cfg
mv $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
# 修改参数
sudo vi $ZOOKEEPER_HOME/conf/zoo.cfg 
	dataDir=/usr/local/package/zookeeper-3.4.6/zkData
	# 2181是默认端口,如果端口占用可以改成别的,比如21810等
	clientPort=2181 
	server.1=deptest3:2888:3888
	server.2=deptest4:2888:3888   
	server.3=deptest5:2888:3888

第4步:创建 zoo.cfg 配置文件中的 dataDir目录,并在zkData目录下创建myid文件,编辑myid文件,内容是此台server的zk的id号,与 zoo.cfg 中的server.1/server.2/server.3保持一致,即 deptest3myid 文件对应 1deptest4myid 文件对应 2deptest5myid 文件对应 3
第5步:将 zookeeper-3.4.6 这个安装包分发到其他两台机器上

# 将dataDir/myid 修改为 2
scp -r /usr/local/package/zookeeper-3.4.6 deptest4:/usr/local/package/  
# 将dataDir/myid 修改为 3
scp -r /usr/local/package/zookeeper-3.4.6 deptest5:/usr/local/package/ 

第6步:启动并检验是否成功

# 此为启动命令,在任意目录下输入
zkServer.sh start
# 此为检验zk状态命令,在任意目录下输入
zkServer.sh status

如果 zk 启动正常则一台为 leader两台为 follower,如下

JMX enabled by default
Using config: /usr/local/package/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
JMX enabled by default
Using config: /usr/local/package/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

5.下载Hadoop

下载地址如下:
https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/
在这里插入图片描述

二、hadoop安装

$HADOOP_HOME/etc/hadoop 目录下存放所有hadoop的配置文件,包括hadoop-env.shmapred-env.shyarn-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlslaves

0.解压并配置/etc/profile

tar -zxf hadoop-2.7.3.tar.gz -C ./ # 解压到当前文件夹
sudo vi /etc/profile
	# HADOOP_HOME
	export HADOOP_HOME=/usr/local/package/hadoop-2.7.3
	export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 重新加载/etc/profile文件
source /etc/profile 

1.配置三个环境文件

将三个文件hadoop-env.shmapred-env.shyarn-env.sh中添加 JAVA_HOME 修改为自己下载的jdk地址

export JAVA_HOME=/usr/local/package/jdk1.8.0_131

2.配置core-site.xml文件

<configuration>
<!-- 指定hdfs的nameservice为ns -->
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://ns</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/usr/local/package/hadoop-2.7.3/tmp</value>
</property>
<!-- 指定zk -->
<property>
	<name>ha.zookeeper.quorum</name>
	<value>deptest3:2181,deptest4:2181,deptest5:2181</value>
</property>
<!-- Namenode向JournalNode发起的ipc连接请求的重试最大次数 -->
<property>
	<name>ipc.client.connect.max.retries</name>
	<value>100</value>
	<description>Indicates the number of retries a client will make to establish a server connection.
	</description>
</property>
<!-- Namenode向JournalNode发起的ipc连接请求的重试间隔时间 -->
<property>
	<name>ipc.client.connect.retry.interval</name>
	<value>10000</value>
	<description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.
	</description>
</property>
<!-- 下面的两个参数是配置oozie时使用的 -->
<property>
	<name>hadoop.proxyuser.deplab.groups</name>
	<value>*</value>
</property>
<property>
	<name>hadoop.proxyuser.deplab.hosts</name>
	<value>*</value>
</property>
</configuration>

3.配置hdfs-site.xml文件

<configuration>
<!-- hdfs的存放目录,集群中挂载硬盘的目录最好一致 -->
<property>
	<name>dfs.datanode.data.dir</name>
	<value>/data0/dfs/data,/data1/dfs/data,/data2/dfs/data,/data3/dfs/data</value>
	<final>true</final>
</property>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
	<name>dfs.nameservices</name>
	<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
	<name>dfs.ha.namenodes.ns</name>
	<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址,8020端口换成9000端口也行 -->
<property>
	<name>dfs.namenode.rpc-address.ns.nn1</name>
	<value>deptest1:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
	<name>dfs.namenode.http-address.ns.nn1</name>
	<value>deptest1:50070</value>
</property>
<!-- nn2的RPC通信地址,8020端口换成9000端口也行 -->
<property>
	<name>dfs.namenode.rpc-address.ns.nn2</name>
	<value>deptest2:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
	<name>dfs.namenode.http-address.ns.nn2</name>
	<value>deptest2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
	<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://deptest3:8485;deptest4:8485;deptest5:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/usr/local/package/hadoop-2.7.3/hdf_journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
	<name>dfs.client.failover.proxy.provider.ns</name>
	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<property>
	<name>dfs.ha.fencing.methods</name>
	<value>
		sshfence
		shell(/bin/true)
	</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
	<name>dfs.ha.fencing.ssh.private-key-files</name>
	<value>/home/deplab/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>  
	<name>dfs.ha.fencing.ssh.connect-timeout</name>  
	<value>30000</value>  
</property> 
<!-- hdfs 元数据所在文件夹 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/package/hadoop-2.7.3/hdf_name</value>
<final>true</final>
</property>
<!-- hdfs 文件备份数量,默认是3个 -->
<property>  
	<name>dfs.replication</name>  
	<value>3</value>  
</property>  
<!-- 开启webhdfs服务 -->
<property>  
	<name>dfs.webhdfs.enabled</name>  
	<value>true</value>  
</property> 
<!-- datanode可以忍受的磁盘损坏的个数 --> 
<property>
	<name>dfs.datanode.failed.volumes.tolerated</name>
	<value>1</value>
</property>
<!-- 取消向hdfs上写数据的用户权限设置 -->
<property>
	<name>dfs.permissions.enabled</name>
	<value>false</value>
</property>
<!-- 此参数用于动态添加删除datanode节点 -->
<property>
	<name>dfs.hosts.exclude</name>
	<value>/usr/local/package/hadoop-2.7.3/etc/hadoop/excludes</value>
</property>
</configuration>

4.配置mapred-site.xml文件

# 将mapred-site.xml.template文件重命名为mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
<configuration>
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>
<!-- 配置日志聚合 -->
<property>
	<name>mapreduce.jobhistory.address</name>
	<value>deptest1:10020</value>
</property>
<property>
	<name>mapreduce.jobhistory.webapp.address</name>
	<value>deptest1:19888</value>
</property>
</configuration>

5.配置yarn-site.xml文件

<configuration>
<property> 
	<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> 
	<value>org.apache.mapred.ShuffleHandler</value> 
</property>
<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>
<property>
	<name>yarn.resourcemanager.cluster-id</name>
	<value>rmcluster</value>
</property>
<property>
	<name>yarn.resourcemanager.ha.rm-ids</name>
	<value>rm1,rm2</value>
</property>
<property>
	<name>yarn.resourcemanager.hostname.rm1</name>
	<value>deptest1</value>
</property>
<property>
	<name>yarn.resourcemanager.hostname.rm2</name>
	<value>deptest3</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
	<name>yarn.resourcemanager.zk-address</name>
	<value>deptest3:2181,deptest4:2181,deptest5: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>
<!--启用日志聚合功能-->
<property>
	<name>yarn.log-aggregation-enable</name>
	<value>true</value>
</property>
<property>
	<name>yarn.log.server.url</name>
	<value>http://deptest1:19888/jobhistory/job/</value>
</property>
<!--日志保存时间-->
<property>
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>
</configuration>
<!------------------------------------------------------------------>
<!-----------以下参数可以不必设置。如若设置,必须更具自己集群情况调整-------->
<!------------------------------------------------------------------>
<!-- 该nodemanager节点上YARN可使用的物理内存总量,默认是8192(MB) -->
<property>
	<name>yarn.nodemanager.resource.memory-mb</name>
	<value>10240</value>
</property>
<!-- 该nodemanager节点上YARN可使用的虚拟CPU个数,默认是8 -->
<property>
	<name>yarn.nodemanager.resource.cpu-vcores</name>
	<value>24</value>
</property>
<!-- 单个任务可申请的最少物理内存量,默认是1024(MB) -->
<property>
	<name>yarn.scheduler.minimum-allocation-mb</name>
	<value>2048</value>
</property>
<!-- 单个任务可申请的物理内存量上限 -->
<property>
	<name>yarn.scheduler.maximum-allocation-mb</name>
	<value>30720</value>
</property>
<!-- 取消虚拟内存检查 -->
<property>
	<name>yarn.nodemanager.vmem-check-enabled</name>
	<value>false</value>
</property>

6.配置slaves文件

deptest1
deptest2
deptest3
deptest4
deptest5

7.分发hadoop-2.7.3到其他四台机器上

scp -r /usr/local/package/hadoop-2.7.3 deptest2:/usr/local/package/
scp -r /usr/local/package/hadoop-2.7.3 deptest3:/usr/local/package/
scp -r /usr/local/package/hadoop-2.7.3 deptest4:/usr/local/package/
scp -r /usr/local/package/hadoop-2.7.3 deptest5:/usr/local/package/

8.hadoop启动

a.重启 zk (deptest3/deptest4/deptest5)

zkServer.sh stop
zkServer.sh start

b.启动 JournalNode (deptest3/deptest4/deptest5)
dfs.namenode.shared.edits.dir 参数指定的机器上启动 JournalNode ,特别强调 JournalNode 必须设置 奇数

hadoop-daemon.sh start journalnode

journalnode启动成功,用 jps 可以看到名为 JournalNode的守护进程

c.格式化HDFS并启动namenode(只在deptest1上)

# 格式化HDFS命令
hdfs namenode -format
# 启动 namenode 
hadoop-daemon.sh start namenode 

如果 namenode 启动成功,用 jps 可以看到名为 NameNode的守护进程
如果格式化成功,在倒数第七行出现 Storage directory /usr/local/package/hadoop-2.7.3/hdf_name has been successfully formatted,如下图
在这里插入图片描述
d.nn2 同步 nn1 的元数据信息(只在deptest2上)

# 同步nn1 元数据的命令
hdfs namenode -bootstrapStandby
# 启动 namenode
hadoop-daemon.sh start namenode

如果同步成功,在最后几行出现 Storage directory /usr/local/package/hadoop-2.7.3/hdf_name has been successfully formatted,如下图
在这里插入图片描述
此时目前两个namenode都是standby(可以查看50070界面),可以在其中一台机器上输入 如下命令,强制将nn2变成active

hdfs haadmin -transitionToActive --forcemanual nn2

此时查看50070界面,一个是active,一个standby

e.初始化zkfc服务(注意先后顺序哦)

# 关闭hdfs和重启zk
stop-dfs.sh #(deptest1)
zkServer.sh stop  #(deptest3/deptest4/deptest5)
zkServer.sh start #(deptest3/deptest4/deptest5)
# 初始化zkfc
hdfs zkfc -formatZK #(deptest1)

初始化zkfc成功,会显示如下信息
在这里插入图片描述
f.启动hdfs和yarn

# 启动hdfs
start-dfs.sh
# 启动yarn
start-yarn.sh #(deptest1)
#deptest3上启动另一个ResourceManager
yarn-daemon.sh start resourcemanager #(deptest3)

启动后在各台机器上的 jps 的结果如下表

hostname 1 2 3 4 5
deptest1 NameNode DataNode NodeManager ResourceManager
deptest2 NameNode DataNode NodeManager
deptest3 QuorumPeerMain DataNode NodeManager JournalNode ResourceManager
deptest4 QuorumPeerMain DataNode NodeManager JournalNode
deptest5 QuorumPeerMain DataNode NodeManager JournalNode

g.查看状态并测试

hdfs haadmin -getServiceState nn1 #查看nn1状态命令
hdfs haadmin -getServiceState nn2 #查看nn2状态命令
yarn rmadmin -getServiceState rm1 #查看rm1的状态命令
yarn rmadmin -getServiceState rm2 #查看rm2的状态命令

如果 deptest1 上的 resourcemanageractive,则 访问deptest3 上的 resourcemanager 会自动跳转到 deptest1的web界面

测试命令如下

yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar pi 2 20

测试的结果

Estimated value of Pi is 3.50000000000000000000

三、总结重点

1.要细心,必须要细心
2.基础环境必须要配好,比如免密登录、时间同步、防火墙关闭等设置
3.namenode只能格式化一次,如果不成功,必须要将name和journalnode所在的路径删除
4.必须初始化zkfc,否者不能实现高可用
5.要细心,必须要细心

若对博客中有任何问题,欢迎留言交流

恭喜您已经完成hadoop 的HA模式的安装
恭喜您已经完成hadoop 的HA模式的安装
恭喜您已经完成hadoop 的HA模式的安装

@羲凡——只为了更好的活着

猜你喜欢

转载自blog.csdn.net/weixin_42003671/article/details/86478544
今日推荐