您的位置:首页 > 大数据 > Hadoop

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

2019-01-15 14:47 106 查看
版权声明:未经博主同意不得转载 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

一、前期准备

0.配置/etc/hosts(非重点——赘述)

这里特别强调一点,如果你使用的是Ubuntu系统,一定要将/etc/hosts目录中的127.0.1.1这一行删除,切记。本人这个坑踩过两边,切记切记!!!

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

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

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

见我另一篇博客 https://www.geek-share.com/detail/2759914370.html

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_131export PATH=$PATH:$JAVA_HOME/bin
# 重新加载/etc/profile文件
source /etc/profile

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

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(非重点——赘述)

见我另一篇博客 https://blog.csdn.net/weixin_42003671/article/details/88686454

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>
<!-- 开启回收功能,并设置垃圾删除间隔(分钟) -->
<property>
<name>fs.trash.interval</name>
<value>360</value>
<description>Trash deletion interval in minutes.If zero, the trash feature is disabled.</description>
</property>
<!-- 设置垃圾检查点间隔(分钟),不设置的话默认和fs.trash.interval一样 -->
<property>
<name>fs.trash.checkpoint.interval</name>
<value>60</value>
<description>Trash checkpoint interval in minutes.If zero, the deletion interval is used.</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>
<!-- 取消向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>
<!------------------------------------------------------------------>
<!-----------以下参数可以不必设置。如若设置,必须更具自己集群情况调整-------->
<!------------------------------------------------------------------>
<!-- 该nodemanager节点上YARN可使用的物理内存总量,默认是8192(MB) -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</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>20480</value>
</property>
<!-- 取消虚拟内存检查 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>

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模式的安装

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: