Skip to content

Hadoop3.x 高可用安装

基础配置

配置主机名

根据机器不同,设置不同的主机名,命令:

bash
$ hostnamectl set-hostname xxx

配置hosts

修改所有节点的 /etc/hosts,添加以下内容

bash
xxx.xxx.xxx.xx1 hadoop01
xxx.xxx.xxx.xx2 hadoop02
xxx.xxx.xxx.xx3 hadoop03
... 更多节点以此类推

配置免密

伪分布式,也必须要先生成 authorized_keys 文件!!!

注意hadoop或其他用户执行时root需要换成对应用户

bash
# 生成自己个公钥 【每个节点】
$ ssh-keygen -t rsa # 或 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

# 在 【第一个节点】 执行, 作用:将第一个节点自身的密钥信息加入文件中,以实现对自身的免密登陆
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

# 在 【除第一个节点外】 的节点执行, 作用:将执行节点的公钥发给第一个节点
$ sh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop01

# 在 【第一个节点】 执行, 作用:将完整的授权信息更新到每个节点
$ scp ~/.ssh/authorized_keys root@hadoop02:/root/.ssh
$ scp ~/.ssh/authorized_keys root@hadoop03:/root/.ssh
# scp ~/.ssh/authorized_keys root@xxxx:/root/.ssh  # 更多节点以此类推

# 给authorized_keys添加权限【每个节点】
chmod 644 ~/.ssh/authorized_keys

测试是否可以免密连接

bash
$ ssh root@hadoop02

关闭防火墙

依次执行下列命令,最后查看防火墙状态

bash
$ systemctl stop firewalld.service            # 停止firewall
$ systemctl disable firewalld.service         # 禁止firewall开机启动
$ systemctl status firewalld.service          # 查看firewall状态

关闭selinux

修改文件 /etc/sysconfig/selinux,将 SELINUX=enforcing 改为 SELINUX=disabled。然后重启后用 sestatus 命令查看状态

bash
$ sestatus
SELinux status:                 disabled

安装net-tools

bash
$ yum -y install net-tools

# 验证安装是否成功
$ netstat -nltp

配置hadoop用户

本次安装计划在hadoop用户下,安装和使用hadoop集群 。命令如下:

bash
# 首先创建用户
$ useradd hadoop
# 配置密码
$ passwd hadoop  # 方式1
$ echo "hadoop:password" | chpasswd  # 方式2
# 配置sudo权限
$ vi /etc/sudoers
# 在101行左右,添加一行:
hadoop  ALL=(ALL)       NOPASSWD:ALL

基本目录信息

bash
程序目录: /data/software
数据目录: /data/soft_data
日志目录: /data/soft_logs
bash
$ mkdir -p /data/software /data/soft_data /data/soft_logs
$ chown -R hadoop: /data/software /data/soft_data /data/soft_logs

时钟同步

编辑时间服务配置文件: vi /etc/ntp.conf

shell
# 此处:xxx.xxx.xxx.xxx为时钟服务器地址/域名
server xxx.xxx.xxx.xxx
fudge xxx.xxx.xxx.xxx stratum 10

启动ntpd服务并设置开机启动

bash
$ service ntpd start
$ systemctl enable ntpd
$ systemctl enable ntpdate
$ systemctl is-enabled ntpd

jdk

使用jdk1.8

Java Downloads | Oracle | Java Downloads | Oracle

安装zookeeper

下载、解压、改名【每个zk节点】

https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz

bash
# 解压改名 这里在/data/software目录
$ tar -zxf apache-zookeeper-3.6.3-bin.tar.gz
$ mv apache-zookeeper-3.6.3-bin zookeeper

建立相关的目录,存放数据和日志【每个zk节点】

bash
$ mkdir -p /data/soft_data/zookeeper/data
$ mkdir -p /data/soft_logs/zookeeper/logs

为每台服务器在data目录下,生成myid文件,不同服务器myid内值不能相同。从1开始,依次增加【节点多的话,一般3个/5个节点即可】

bash
$ echo 1 > /data/soft_data/zookeeper/data/myid # 节点1
$ echo 2 > /data/soft_data/zookeeper/data/myid # 节点2
$ echo 3 > /data/soft_data/zookeeper/data/myid # 节点3

修改zookeeper的配置文件,复制zoo_sample.cfg为zoo.cfg【每个zk节点】

bash
$ cd /data/software/zookeeper/conf
$ cp zoo_sample.cfg zoo.cfg

# 修改zoo.cfg,以下为配置信息
dataDir=/data/soft_data/zookeeper/data
dataLogsDir=/data/soft_logs/zookeeper/logs
# 副本数
autopurge.snapRetainCount=3
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
4lw.commands.whitelist=*

配置环境变量

bash
$ cat > /etc/profile.d/zookeeper-env.sh <<"EOF"
export ZOOKEEPER_HOME=/data/software/zookeeper
export PATH=${ZOOKEEPER_HOME}/bin:$PATH
EOF

$ source /etc/profile

启动关闭

bash
$ zkServer.sh start
$ zkServer.sh stop
$ zkServer.sh status

安装Hadoop

https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz 【以3.2.2为例】

https://archive.apache.org/dist/hadoop/common/hadoop-3.3.3/hadoop-3.3.3.tar.gz

解压

在/data/software目录

所有配置所有节点均执行

bash
$ tar zxvf hadoop-3.2.2.tar.gz
$ mv hadoop-3.2.2 hadoop

配置 HDFS

此下面的所有配置所有节点均执行

配置core-site.xml

xml
<!-- HDFS主入口,hacluster仅是作为集群的逻辑名称,可随意更改但务必与hdfs-site.xml中dfs.nameservices值保持一致 -->
<property>
 <name>fs.defaultFS</name>
 <value>hdfs://hacluster</value>
</property>

<!-- 默认的hadoop.tmp.dir指向的是/tmp目录,将导致namenode与datanode数据全都保存在易失目录中,此处进行修改 -->
<property>
 <name>hadoop.tmp.dir</name>
 <value>/data/soft_data/hadoop/tmp</value>
</property>

<!-- 用户角色配置,不配置此项会导致web页面报错(不能操作数据) -->
<property>
 <name>hadoop.http.staticuser.user</name>
 <value>hadoop</value>
</property>

<!-- zookeeper集群地址,如是集群以逗号进行分隔 -->
<property>
 <name>ha.zookeeper.quorum</name>
 <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>

<!-- 权限配置 hadoop.proxyuser.{填写自己的用户名}.hosts-->
<property>
 <name>hadoop.proxyuser.hadoop.hosts</name>
 <value>*</value>
</property>
<property>
 <name>hadoop.proxyuser.hadoop.groups</name>
 <value>*</value>
</property>

<!-- 可以不加,有需要再加上 -->
<!-- 解决journalnode连接不上,导致namenode启动问题 -->
<!-- 也有可能是网络的问题,参考该文章:https://blog.csdn.net/tototuzuoquan/article/details/89644127 -->
<!-- 在dev环境中出现连不上journalnode问题,添加该配置,以增加重试次数和间隔 -->
<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>

<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>

配置hadoop-env.sh

bash
export JAVA_HOME=/data/software/java
export HDFS_NAMENODE_USER="hadoop"
export HDFS_DATANODE_USER="hadoop"
export HDFS_ZKFC_USER="hadoop"
export HDFS_JOURNALNODE_USER="hadoop"

配置hdfs-site.xml

xml
<!-- 副本数配置 -->
<property>
 <name>dfs.replication</name>
 <value>2</value>
</property>

<!-- 集群名称,此值在接下来的配置中将多次出现务必注意同步修改 -->
<property>
 <name>dfs.nameservices</name>
 <value>hacluster</value>
</property>
<!-- 所有的namenode列表,此处也只是逻辑名称,非namenode所在的主机名称 -->
<property>
 <name>dfs.ha.namenodes.hacluster</name>
 <value>nn1,nn2</value>
</property>

<!-- namenode之间用于RPC通信的地址,value填写namenode所在的主机地址 -->
<!-- 默认端口8020,注意hacluster与nn1要和上文的配置一致 -->
<property>
 <name>dfs.namenode.rpc-address.hacluster.nn1</name>
 <value>hadoop01:8020</value>
</property>
<property>
 <name>dfs.namenode.rpc-address.hacluster.nn2</name>
 <value>hadoop02:8020</value>
</property>

<!-- namenode的web访问地址,默认端口9870 -->
<property>
 <name>dfs.namenode.http-address.hacluster.nn1</name>
 <value>hadoop01:9870</value>
</property>
<property>
 <name>dfs.namenode.http-address.hacluster.nn2</name>
 <value>hadoop02:9870</value>
</property>

<!-- journalnode主机地址,最少三台,默认端口8485 -->
<!-- 格式为 qjournal://jn1:port;jn2:port;jn3:port/${nameservices} -->
<!-- a shared edits dir must not be specified if HA is not enabled -->
<!-- 伪分布式时,取消该配置 -->
<property>
 <name>dfs.namenode.shared.edits.dir</name>
 <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hacluster</value>
</property>

<!-- 故障时自动切换的实现类,照抄即可 -->
<property>
 <name>dfs.client.failover.proxy.provider.hacluster</name>
 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 故障时相互操作方式(namenode要切换active和standby),这里我们选ssh方式 -->
<property>
 <name>dfs.ha.fencing.methods</name>
 <value>sshfence</value>
</property>
<!-- 修改为自己用户的ssh key存放地址 -->
<property>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <value>/home/hadoop/.ssh/id_rsa</value>
</property>

<!-- namenode日志文件输出路径,即journalnode读取变更的位置 -->
<property>
 <name>dfs.journalnode.edits.dir</name>
 <value>/data/soft_logs/hadoop/journalnode</value>
</property>

<!-- 启用自动故障转移 -->
<property>
 <name>dfs.ha.automatic-failover.enabled</name>
 <value>true</value>
</property>

<property>
 <name>dfs.webhdfs.enabled</name>
 <value>true</value>
</property>

<!-- 解决 DataXceiver error processing WRITE_BLOCK operation src -->
<property>
 <name>dfs.datanode.max.transfer.threads</name>
 <value>8192</value>
 <description
     Specifies the maximum number of threads to use for transferring data
     in and out of the DN. 
 </description>
</property>

配置workers

填入所有datanode的主机名称,不能留有空格

bash
hadoop01
hadoop02
hadoop03

配置环境变量

bash
$ cat > /etc/profile.d/hadoop-env.sh <<"EOF"
export HADOOP_HOME=/data/software/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
EOF

$ source /etc/profile

修改进程最大文件打开数

bash
$ vi /etc/security/limits.conf

*               -      nofile          1000000
*               -      nproc           1000000

首次启动集群

bash
【启动journalnode】> 【格式化并启动namenode】—>【同步namenode信息】—>【格式化zk】—>【启动HDFS】

启动JournalNode

所有JournalNode节点执行

bash
$ hdfs --daemon start journalnode

初始化NameNode

在 【任意NameNode节点】 上执行格式化命令,出现successfully formated即为执行成功

仅在一个NameNode节点执行,不要重复执行!!!

bash
$ hdfs namenode -format

出现 Unable to check if JNs are ready for formatting.

bash
# 删除所有节点 /data/soft_data/hadoop/journalnode/hacluster 目录下的文件
rm -rf /data/soft_data/hadoop/journalnode/hacluster/{in_use.lock,current,edits.sync}

也有可能是网络问题

xml
# 也有可能是网络的问题,参考该文章:https://blog.csdn.net/tototuzuoquan/article/details/89644127
# 在dev环境中出现连不上journalnode问题,添加该配置,以增加重试次数和间隔
<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>

<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>

启动NameNode

在初始化的节点执行

bash
$ hdfs --daemon start namenode

其他NameNode节点同步信息

伪分布式没有此步骤

在除了初始化NameNode节点外的NameNode执行

bash
$ hdfs namenode -bootstrapStandby

格式化zookeeper节点

伪分布式没有此步骤

在初始化NameNode的节点执行

出现Successfully created即为成功

bash
$ hdfs zkfc -formatZKssh

启动hdfs集群

在初始化NameNode的节点执行

bash
$ start-dfs.sh

查看各个节点的进程

日常启停HDFS

bash
$ start-dfs.sh
$ stop-dfs.sh

# 若报错:publickey,gssapi-keyex,gssapi-with-mic,password
# 是因为ssh配置问题,需要生成~/.ssh/authorized_keys文件

WEB页面查看

访问: http:///NameNode节点IP:9870 会有一个active和一个standby

配置 YARN及其HA

配置目录:/data/software/hadoop/etc/hadoop

使用yarn来管理HDFS集群的资源分配

配置hadoop-env.sh

因为Hadoop3限制必须要声明角色运行进程,所以在配置文件中加以说明

bash
export YARN_NODEMANAGER_USER="hadoop"
export YARN_RESOURCEMANAGER_USER="hadoop"

配置mapred-site.xml

xml
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

<property>
    <name>mapreduce.application.classpath</name>
    <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>

<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop02:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop02:19888</value>
</property>

<!-- mapred-site.xml中设置Map和Reduce任务的内存配置如下:(value中实际配置的内存需要根据自己机器内存大小及应用情况进行修改) -->
<property>
    <name>mapreduce.map.memory.mb</name>
    <value>1024</value>
</property>
<property>
    <name>mapreduce.map.java.opts</name>
    <value>-Xmx1024M</value>
</property>
<property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>1024</value>
</property>
<property>
    <name>mapreduce.reduce.java.opts</name>
    <value>-Xmx1024M</value>
</property>

配置yarn-site.xml

xml
<!-- 指定MR走shuffle -->
<property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
</property>
<!-- 固定写法 -->
<property>
 <name>yarn.nodemanager.env-whitelist</name>
 <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>

<!-- yarn的集群id -->
<property>
 <name>yarn.resourcemanager.cluster-id</name>
 <value>yarncluster</value>
</property>

<!-- 启用HA -->
<!-- 伪分布式时,请设置为false,会出现  -->
<property>
 <name>yarn.resourcemanager.ha.enabled</name>
 <value>true</value>
</property>

<property>
 <name>yarn.resourcemanager.ha.rm-ids</name>
 <value>rm1,rm2</value>
</property>

<property>
 <name>yarn.resourcemanager.hostname.rm1</name>
 <value>hadoop01</value>
</property>

<property>
 <name>yarn.resourcemanager.hostname.rm2</name>
 <value>hadoop03</value>
</property>

<!-- webapp的地址务必要配置,不然yarn可以启动但是无法执行map任务,大坑 -->
<property>
 <name>yarn.resourcemanager.webapp.address.rm1</name>
 <value>hadoop01:8088</value>
</property>

<property>
 <name>yarn.resourcemanager.webapp.address.rm2</name>
 <value>hadoop03:8088</value>
</property>

<property>
 <name>hadoop.zk.address</name>
 <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>

<!-- 启用自动恢复 -->
<property>
 <name>yarn.resourcemanager.recovery.enabled</name>
 <value>true</value>
</property>

<!-- 持久化方式,既然启用了ZK那就把信息存储到ZK里面 -->
<property>
 <name>yarn.resourcemanager.store.class</name>
 <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

<!-- 自动检测硬件配置,视机器配置酌情开启,默认关闭 -->
<property>
 <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
 <value>false</value>
</property>

<!-- 开启日志聚集功能 -->
<property>
 <name>yarn.log-aggregation-enable</name>
 <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>  
 <name>yarn.log.server.url</name>
 <value>http://hadoop02:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
 <name>yarn.log-aggregation.retain-seconds</name>
 <value>604800</value>
</property>

<!-- 配置yarn资源,要根据实际情况配置,避免各种问题-->
<!-- 每个节点可用内存,单位MB,一般为实际内存*0.8 -->
<property>
 <name>yarn.nodemanager.resource.memory-mb</name>
 <value>4096</value>
</property>
<property>
 <name>yarn.nodemanager.resource.cpu-vcores</name>
 <value>4</value>
</property>
<property>
 <name>yarn.nodemanager.vmem-check-enabled</name>
 <value>true</value>
 <description>Whether virtual memory limits will be enforced for containers</description>
</property>
<property>
 <name>yarn.nodemanager.vemem-pmem-ration</name>
 <value>2.1</value>
 <description>Ration between virtual memory to physical memory when setting memoery limits for containers</description>
</property>
<property>
 <name>yarn.nodemanager.pmem-check-enabled</name>
 <value>true</value>
</property>
<property>
 <name>yarn.scheduler.minimum-allocation-mb</name>
 <value>1024</value>
</property>
<property>
 <name>yarn.scheduler.maximum-allocation-mb</name>
 <value>4096</value>
</property>

<!-- 参考配置,暂不配置 -->
<!--
<property>
 <name>yarn.app.mapreduce.am.resource.mb</name>
 <value>2048</value>
</property>
<property>
 <name>yarn.app.mapreduce.am.resource.cpu-vcores</name>
 <value>1</value>
</property>
-->

启动yarn

bash
$ start-yarn.sh

web页面查看

访问: http:///ResourceManager节点IP:8088

配置 历史服务器

配置目录:/data/software/hadoop/etc/hadoop

为了查看程序的历史运行情况,需要配置一下历史服务器

配置mapred-site.xml

xml
<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop02:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop02:19888</value>
</property>

启动历史服务器

bash
$ mapred --daemon start historyserver
# 关闭
$ mapred --daemon stop historyserver

日志聚集

配置目录:/data/software/hadoop/etc/hadoop

每个yarn节点

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上

配置yarn-site.xml

xml
<!-- 开启日志聚集功能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
    <name>yarn.log.server.url</name>
    <value>http://hadoop02:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>

其他

bash
# 查看集群可用空间等
hdfs dfsadmin -report

# 查看空间使用情况
hadoop fs -du -h /

# 查看namenode是否处于只读模式下
hdfs dfsadmin -safemode get