Hadoop 生产环境规格的配置

原创 hadoop

节点规划

hd-node1/192.190.20.13 hd-node2/192.190.20.14 hd-node3/192.190.20.15 hd-node4/192.190.20.16 hd-node5/192.190.20.17
namenode
datanode
resourcemanager
journalnode
zookeeper

Journalnode 和 ZooKeeper 保持奇数个,这点大家要有个概念,最少不少于 3 个节点。

软件规划

软件 版本 位数 说明
jdk 1.8 64位 最新稳定版
centos centos7(1611) 64位
zookeeper Apache zookeeper3.4.10 稳定版本
hadoop hadoop-2.6.0-cdh5.10.0 稳定版本

用户规划

节点名称 用户组 用户
hd-node1 hadoop hadoop
hd-node2 hadoop hadoop
hd-node3 hadoop hadoop
hd-node4 hadoop hadoop
hd-node5 hadoop hadoop

目录规划

用途 路径
所有软件目录 /home/hadoop/app/
所有数据和日志目录 /home/hadoop/data/

时钟同步

所有节点的系统时间要与当前时间保持一致。查看当前系统时间:

[root@hd-node1 ~]# date
Tue Dec 11 00:52:35 CST 2018
[root@hd-node1 ~]#

如果系统时间与当前时间不一致,进行以下操作,将所有主机的时区调整一致。

[root@hd-node1 ~]# cd /usr/share/zoneinfo/
[root@hd-node1 zoneinfo]# ls // 找到 Asia
[root@hd-node1 zoneinfo]# cd Asia/
[root@hd-node1 Asia]# ls // 找到 Shanghai
[root@hd-node1 Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime // 当前时区替换为上海

我们可以同步当前系统时间和日期与 NTP(网络时间协议)一致。

[root@hd-node1 Asia]# yum install ntp      // 如果ntp命令不存在,在线安装ntp
[root@hd-node1 Asia]# ntpdate pool.ntp.org // 执行此命令同步日期时间
[root@hd-node1 Asia]# date                 // 查看当前系统时间

其它细节可以参考 《CentOS NTP 时间同步服务安装和局域网同步》

hosts 文件检查

所有节点的 hosts 文件都要配置静态 ip 与 hostname 之间的对应关系。

[root@hd-node1 ~]# vim /etc/hosts
192.190.20.13    hd-node1
192.190.20.14    hd-node2
192.190.20.15    hd-node3
192.190.20.16    hd-node4
192.190.20.17    hd-node5

禁用防火墙

所有节点的防火墙都要关闭,查看防火墙状态:

[root@hd-node1 ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@hd-node1 ~]#

如果不是上面的关闭状态,则需要关闭防火墙。

[root@hd-node1 ~]# systemctl disable firewalld // 永久关闭fanghuoq
[root@hd-node1 ~]# systemctl stop firewalld    // 关闭,停止防火墙运行

创建 hadoop 用户

为所有主机创建 hadoop 普通用户。

[root@hd-node1 ~]# groupadd hadoop // 创建用户组
[root@hd-node1 ~]# useradd -g hadoop hadoop // 新建 hadoop 用户并增加到 hadoop 工作组
[root@hd-node1 ~]# passwd hadoop    // 设置密码

配置 SSH 免密码通信

这里简单说一下,不清楚的可以参考前面的 《CentOS7 搭建 Hadoop 2.6.0 集群》,本章的安装包也可以在里面找到。

[root@hd-node1 ~]# su hadoop // 切换到 hadoop 用户下
[hadoop@hd-node1 root]$ cd   // 切换到 hadoop 用户目录
[hadoop@hd-node1 ~]$ ssh-keygen -t rsa // 执行命令,一路回车,不要输入密码,生成秘钥
[hadoop@hd-node1 ~]$ cd .ssh
[hadoop@hd-node1 .ssh]$ ls
id_rsa  id_rsa.pub
[hadoop@hd-node1 .ssh]$ cat id_rsa.pub >> authorized_keys  // 将公钥保存到 authorized_keys 认证文件中
[hadoop@hd-node1 .ssh]$ ls
authorized_keys  id_rsa  id_rsa.pub
[hadoop@hd-node1 .ssh]$ cd ..
[hadoop@hd-node1 ~]$ chmod 700 .ssh     // 给目录和文件赋权限,否则有些时候免密不生效
[hadoop@hd-node1 ~]$ chmod 600 .ssh/*
[hadoop@hd-node1 ~]$ ssh hd-node1 // 第一次执行需要输入 yes
[hadoop@hd-node1 ~]$ ssh hd-node1

每个节点都执行上面同样的操作,然后将所有节点中的公钥 id_rsa.pub 拷贝到 hd-node1 节点中的 authorized_keys 文件中,分别在 hd-node 2-5 上执行:

[hadoop@hd-node1 .ssh]$ cat ~/.ssh/id_rsa.pub | ssh hadoop@hd-node1 'cat - >> ~/.ssh/authorized_keys'

然后在 hd-node1 上查看 authorized_keys 文件:

[hadoop@hd-node1 ~]$ cat ~/.ssh/authorized_keys
ssh-rsa ...... hadoop@hd-node1
ssh-rsa ...... hadoop@hd-node2
ssh-rsa ...... hadoop@hd-node3
ssh-rsa ...... hadoop@hd-node4
ssh-rsa ...... hadoop@hd-node5

免密认证文件做好了,然后将 hd-node1 中的 authorized_keys 文件分发到所有节点上面。

[hadoop@hd-node1 .ssh]$ scp -r authorized_keys hadoop@hd-node2:~/.ssh/
[hadoop@hd-node1 .ssh]$ scp -r authorized_keys hadoop@hd-node3:~/.ssh/
[hadoop@hd-node1 .ssh]$ scp -r authorized_keys hadoop@hd-node4:~/.ssh/
[hadoop@hd-node1 .ssh]$ scp -r authorized_keys hadoop@hd-node5:~/.ssh/

在主机间通过 ssh 相互访问,如果都能无密码访问,代表 ssh 配置成功。(记得登录上对方主机后使用 logout 退出登录,防止操作混乱)

脚本工具

在 hd-node1 节点上创建 /home/hadoop/tools 目录。

[hadoop@hd-node1 ~]$ mkdir /home/hadoop/tools
[hadoop@hd-node1 ~]$ cd /home/hadoop/tools

将本地脚本文件上传至 /home/hadoop/tools 目录下。这些脚本大家如果能看懂也可以自己写,如果看不懂直接使用就可以。其中 deploy.sh 脚本可以将主节点配置好的安装包分发到其它主机,runRemoteCmd.sh 脚本可以在其它主机上执行命令。deploy.conf 配置文件中把集群的节点按第一节 “节点规划” 中进程分了几个类别,因为有些命令并不是要在所有主机上执行的。

[hadoop@hd-node1 tools]$ rz deploy.conf
[hadoop@hd-node1 tools]$ rz deploy.sh
[hadoop@hd-node1 tools]$ rz runRemoteCmd.sh
[hadoop@hd-node1 tools]$ ls
deploy.conf  deploy.sh  runRemoteCmd.sh

先给脚本增加执行权限,

[hadoop@hd-node1 tools]$ chmod u+x deploy.sh
[hadoop@hd-node1 tools]$ chmod u+x runRemoteCmd.sh

同时我们需要将 /home/hadoop/tools 目录配置到 PATH 环境变量中,方便全局调用。

[hadoop@hd-node1 tools]$ su root
Password:
[root@hd-node1 tools]# vim /etc/profile
export PATH=$PATH:/home/hadoop/tools

[root@hd-node1 tools]# logout
[hadoop@hd-node1 tools]$ source /etc/profile

尝试使用脚本 runRemoteCmd.sh "mkdir -p /home/hadoop/app" all 在所有节点上创建规划的包安装目录。

deploy.conf

配置说明:比如在执行 runRemoteCmd.sh 脚本的时候,最后一个参数为 all,则代表在所有节点执行;如果是 slave,则在 hd-node2、hd-node3、hd-node4 和 hd-node5 执行命令,以此类推。

hd-node1,all,namenode,zookeeper,resourcemanager,
hd-node2,all,slave,namenode,zookeeper,resourcemanager,
hd-node3,all,slave,datanode,zookeeper,
hd-node4,all,slave,datanode,zookeeper,
hd-node5,all,slave,datanode,zookeeper,

deploy sh

分发文件脚本,用法:deploy.sh 源文件(夹) 目标文件(夹) 主机分类,最后的主机分类参数见上面说明。

#!/bin/bash

#set -x
if [ $# -lt 3 ]
then
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag"
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile"
  exit
fi
src=$1
dest=$2
tag=$3
if [ 'a'$4'a' == 'aa' ]
then
  confFile=/home/hadoop/tools/deploy.conf
else
  confFile=$4
fi
if [ -f $confFile ]
then
  if [ -f $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
    do
       scp $src $server":"${dest}
    done
  elif [ -d $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
    do
       scp -r $src $server":"${dest}
    done
  else
      echo "Error: No source file exist"
  fi
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

runRemoteCmd sh

用法:runRemoteCmd.sh "命令" 主机分类

#!/bin/bash

#set -x
if [ $# -lt 2 ]
then
  echo "Usage: ./runRemoteCmd.sh Command MachineTag"
  echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile"
  exit
fi
cmd=$1
tag=$2
if [ 'a'$3'a' == 'aa' ]
then
  confFile=/home/hadoop/tools/deploy.conf
else
  confFile=$3
fi
if [ -f $confFile ]
then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
    do
       echo "*******************$server***************************"
       ssh $server "source /etc/profile; $cmd"
    done
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

以上三个文件,方便我们搭建 hadoop 分布式集群。具体如何使用看后面如何操作。

jdk 安装

将本地下载好的 jdk-8u112-linux-x64.tar.gz,上传至 hd-node1 节点下的 /home/hadoop/app 目录。

[root@hd-node1 tools]# su hadoop
[hadoop@hd-node1 tools]$ cd /home/hadoop/app/
[hadoop@hd-node1 app]$ rz  // 选择本地的下载好的 jdk-8u112-linux-x64.tar.gz
[hadoop@hd-node1 app]$ ls
jdk-8u112-linux-x64.tar.gz
[hadoop@hd-node1 app]$ tar -zxvf jdk-8u112-linux-x64.tar.gz    // 解压
[hadoop@hd-node1 app]$ ls
jdk1.8.0_112 jdk-8u112-linux-x64.tar.gz
[hadoop@hd-node1 app]$ rm -f jdk-8u112-linux-x64.tar.gz        // 删除安装包

添加 jdk 环境变量。

[hadoop@hd-node1 app]$ su root
Password:
[root@hd-node1 app]# vim /etc/profile
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_112
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
[root@hd-node1 app]# logout
[hadoop@hd-node1 app]$ source /etc/profile  // 使配置文件生效

查看 jdk 是否安装成功。

[hadoop@hd-node1 app]$ java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)
[hadoop@hd-node1 app]$

出现以上结果就说明 hd-node1 节点上的 jdk 安装成功。然后将 hd-node1 下的 jdk 安装包复制到其他节点上。

[hadoop@hd-node1 app]$ deploy.sh jdk1.8.0_112 /home/hadoop/app/ slave

hd-node2,hd-node3,hd-node4,hd-node5 节点重复 hd-node1 节点上的 jdk 配置环境变量即可。

Zookeeper 安装

将本地下载好的 zookeeper-3.4.10.tar.gz 安装包,上传至 hd-node1 节点下的 /home/hadoop/app 目录下。

[hadoop@hd-node1 app]$ rz           // 选择本地下载好的 zookeeper-3.4.10.tar.gz
[hadoop@hd-node1 app]$ ls
jdk1.8.0_112 zookeeper-3.4.10.tar.gz
[hadoop@hd-node1 app]$ tar -zxvf zookeeper-3.4.10.tar.gz                 // 解压
[hadoop@hd-node1 app]$ ls
jdk1.8.0_112 zookeeper-3.4.10.tar.gz zookeeper-3.4.10
[hadoop@hd-node1 app]$ rm -f zookeeper-3.4.10.tar.gz               // 删除 zookeeper-3.4.10.tar.gz 安装包
[hadoop@hd-node1 app]$ mv zookeeper-3.4.10 zookeeper            // 重命名

修改 Zookeeper 中的配置文件。

[hadoop@hd-node1 app]$ cd /home/hadoop/app/zookeeper/conf/
[hadoop@hd-node1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[hadoop@hd-node1 conf]$ cp zoo_sample.cfg zoo.cfg              // 复制一个zoo.cfg文件
[hadoop@hd-node1 conf]$ vi zoo.cfg
dataDir=/home/hadoop/data/zookeeper/zkdata          // 数据文件目录
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog             // 日志目录

# the port at which the clients will connect
clientPort=2181           // 默认端口号

# server.服务编号=主机名称:Zookeeper不同节点之间同步和通信的端口:选举端口(选举leader)
server.1=hd-node1:2888:3888
server.2=hd-node2:2888:3888
server.3=hd-node3:2888:3888
server.4=hd-node4:2888:3888
server.5=hd-node5:2888:3888

zoo-cfg.jpg

通过远程命令 deploy.sh 将 Zookeeper 安装目录拷贝到其他节点上面:

[hadoop@hd-node1 app]$ deploy.sh zookeeper /home/hadoop/app  slave

通过远程命令 runRemoteCmd.sh 在所有的节点上面创建目录:

[hadoop@hd-node1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdata" all   // 创建数据目录
[hadoop@hd-node1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdatalog" all   // 创建日志目录

然后分别在 hd-node1,hd-node2,hd-node3,hd-node4,hd-node5 上面,进入 zkdata 目录下,创建文件 myid,里面的内容分别填充为:1、2、3、4、5,这里我们以 hd-node1 为例。

[hadoop@hd-node1 app]$ cd /home/hadoop/data/zookeeper/zkdata
[hadoop@hd-node1 zkdata]$ vim myid // 输入数字 1
1

配置 Zookeeper 环境变量:

[hadoop@hd-node1 zkdata]$ su root
Password: 
[root@hd-node1 zkdata]# vim /etc/profile

# zookeeper
export ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

[root@hd-node1 zkdata]# logout
[hadoop@hd-node1 zkdata]$ source /etc/profile  // 使配置文件生效

测试一下 zookeeper 安装,先启动所有节点上的 zookeeper 服务,使用 jps 查看服务进程,然后再关闭服务。

[hadoop@hd-node1 ~]$ runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
*******************hd-node1***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
*******************hd-node2***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
*******************hd-node3***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
*******************hd-node4***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
*******************hd-node5***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@hd-node1 ~]$
[hadoop@hd-node1 ~]$
[hadoop@hd-node1 ~]$ runRemoteCmd.sh "jps" all
*******************hd-node1***************************
44333 QuorumPeerMain
44445 Jps
*******************hd-node2***************************
47792 QuorumPeerMain
47890 Jps
*******************hd-node3***************************
41219 Jps
41111 QuorumPeerMain
*******************hd-node4***************************
16964 QuorumPeerMain
17064 Jps
*******************hd-node5***************************
14546 Jps
14454 QuorumPeerMain
[hadoop@hd-node1 ~]$
[hadoop@hd-node1 ~]$
[hadoop@hd-node1 ~]$ runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh stop" zookeeper
*******************hd-node1***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
*******************hd-node2***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
*******************hd-node3***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
*******************hd-node4***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
*******************hd-node5***************************
ZooKeeper JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[hadoop@hd-node1 ~]$

hadoop 集群环境搭建

将下载好的 hadoop-2.6.0-cdh5.10.0.tar 安装包,上传至 hd-node1 节点下的 /home/hadoop/app 目录下。

[hadoop@hd-node1 app]$ rz  // 将本地的 hadoop-2.6.0-cdh5.10.0.tar 安装包上传至当前目录
[hadoop@hd-node1 app]$ ls
hadoop-2.6.0-cdh5.10.0.tar jdk1.8.0_112  zookeeper
[hadoop@hd-node1 app]$ tar zxvf hadoop-2.6.0.tar.gz            //解压
[hadoop@hd-node1 app]$ ls
hadoop-2.6.0-cdh5.10.0 hadoop-2.6.0-cdh5.10.0.tar jdk1.8.0_112  zookeeper
[hadoop@hd-node1 app]$ rm -f hadoop-2.6.0-cdh5.10.0.tar        //删除安装包
[hadoop@hd-node1 app]$ mv hadoop-2.6.0-cdh5.10.0 hadoop        //重命名

切换到 /home/hadoop/app/hadoop/etc/hadoop/ 目录下,修改配置文件。

[hadoop@hd-node1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/

配置 HDFS

配置 hadoop-env.sh

[hadoop@hd-node1 hadoop]$ vim hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_112

配置 core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://cluster1</value>
        <!-- 这里的值指的是默认的 HDFS 路径 ,取名为 cluster1 -->
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/data/tmp</value>
        <!-- hadoop 的临时目录,如果需要配置多个目录,需要逗号隔开,data 目录需要我们自己创建 -->
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hd-node1:2181,hd-node2:2181,hd-node3:2181,hd-node4:2181,hd-node5:2181</value>
        <!-- 配置 Zookeeper 管理 HDFS -->
    </property>
</configuration>

配置 hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
        <!-- 我们有 3 个 datanode, 数据块副本数为3 -->
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
    <!-- 权限默认配置为 false -->
    <property>
        <name>dfs.nameservices</name>
        <value>cluster1</value>
        <!-- 命名空间,它的值与 fs.defaultFS 的值要对应,namenode 高可用之后有两个 namenode,cluster1 是对外提供的统一入口 -->
    </property>
    <property>
        <name>dfs.ha.namenodes.cluster1</name>
        <value>hd-node1,hd-node2</value>
        <!-- 指定 nameService 是 cluster1 时的 nameNode 有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可 -->
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster1.hd-node1</name>
        <value>hd-node1:9000</value>
        <!-- hd-node1 rpc 地址 -->
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster1.hd-node1</name>
        <value>hd-node1:50070</value>
        <!-- hd-node1 http 地址 -->
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster1.hd-node2</name>
        <value>hd-node2:9000</value>
        <!-- hd-node2 rpc 地址 -->
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster1.hd-node2</name>
        <value>hd-node2:50070</value>
        <!-- hd-node2 http 地址 -->
    </property>
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
        <!-- 启动故障自动恢复 -->
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hd-node1:8485;hd-node2:8485;hd-node3:8485;hd-node4:8485;hd-node5:8485/cluster1</value>
        <!-- 指定 journal -->
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.cluster1</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <!-- 指定 cluster1 出故障时,哪个实现类负责执行故障切换 -->
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/data/journaldata/jn</value>
        <!-- 指定 JournalNode 集群在对 nameNode 的目录进行共享时,自己存储数据的磁盘路径 -->
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>shell(/bin/true)</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>10000</value>
    </property>
    <!-- 脑裂默认配置 -->
    <property>
        <name>dfs.namenode.handler.count</name>
        <value>100</value>
    </property>
</configuration>

配置 slave

[hadoop@hd-node1 hadoop]$ vim slaves
hd-node3
hd-node4
hd-node5

YARN 安装配置

配置 mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <!-- 指定运行 mapreduce 的环境是 Yarn,与 hadoop1 不同的地方 -->
    </property>
</configuration>

配置 yarn-site.xml

<configuration>
    <property>
        <name>yarn.resourcemanager.connect.retry-interval.ms</name>
        <value>2000</value>
        <!-- 超时的周期 -->
    </property>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
        <!-- 打开高可用 -->
    </property>
    <property>
        <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
        <value>true</value>
        <!-- 启动故障自动恢复 -->
    </property>
    <property>
        <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
        <value>true</value>
        <!-- failover使用内部的选举算法 -->
    </property>
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-rm-cluster</value>
        <!-- 给 yarn cluster 取个名字 yarn-rm-cluster -->
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
        <!-- 给 ResourceManager 取个名字 rm1,rm2 -->
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hd-node1</value>
        <!-- 配置 ResourceManager rm1 hostname -->
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hd-node2</value>
        <!-- 配置 ResourceManager rm2 hostname -->
    </property>
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
        <!-- 启用resourcemanager 自动恢复 -->
    </property>
    <property>
        <name>yarn.resourcemanager.zk.state-store.address</name>
        <value>hd-node1:2181,hd-node2:2181,hd-node3:2181,hd-node4:2181,hd-node5:2181</value>
        <!-- 配置Zookeeper地址 -->
    </property>
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hd-node1:2181,hd-node2:2181,hd-node3:2181,hd-node4:2181,hd-node5:2181</value>
        <!-- 配置Zookeeper地址 -->
    </property>
    <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>hd-node1:8032</value>
        <!-- rm1 端口号 -->
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>hd-node1:8034</value>
        <!-- rm1调度器的端口号 -->
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hd-node1:8088</value>
        <!-- rm1 webapp端口号 -->
    </property>
    <property>
        <name>yarn.resourcemanager.address.rm2</name>
        <value>hd-node2:8032</value>
        <!-- rm2端口号 -->
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>hd-node2:8034</value>
        <!-- rm2调度器的端口号 -->
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hd-node2:8088</value>
        <!-- rm2 webapp端口号 -->
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        <!-- 执行 MapReduce 需要配置的 shuffle 过程 -->
    </property>
</configuration>

向所有节点分发 hadoop 安装包。

[hadoop@hd-node1 app]$ deploy.sh hadoop /home/hadoop/app/ slave

向集群其它节点分发安装包,需要一点时间。

启动集群

  1. 启动所有 Zookeeper
[hadoop@hd-node1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
  1. 启动所有节点的 journalnode
[hadoop@hd-node1 ~]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all
*******************hd-node1***************************
starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node1.out
*******************hd-node2***************************
starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node2.out
*******************hd-node3***************************
starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node3.out
*******************hd-node4***************************
starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node4.out
*******************hd-node5***************************
starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node5.out
[hadoop@hd-node1 ~]$
  1. 主节点执行格式化

NameNode hd-node1 上格式化操作。

[hadoop@hd-node1 hadoop]$ bin/hdfs namenode -format // namenode 格式化
[hadoop@hd-node1 hadoop]$ bin/hdfs zkfc -formatZK // 格式化高可用
[hadoop@hd-node1 hadoop]$ bin/hdfs namenode // 启动 namenode
  1. 备节点执行

在 hd-node2 上同步主节点的元数据。

[hadoop@hd-node2 zkdata]$ hdfs namenode -bootstrapStandby
18/12/10 23:04:57 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   user = hadoop
STARTUP_MSG:   host = hd-node2/192.190.20.14
STARTUP_MSG:   args = [-bootstrapStandby]
STARTUP_MSG:   version = 2.6.0-cdh5.10.0
STARTUP_MSG:   classpath = ...
...
STARTUP_MSG:   build = http://github.com/cloudera/hadoop -r 307b3de961d083f6e8ee80ddba589f22cacd3662; compiled by 'jenkins' on 2017-01-20T20:09Z
STARTUP_MSG:   java = 1.8.0_112
************************************************************/
18/12/10 23:04:57 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
18/12/10 23:04:57 INFO namenode.NameNode: createNameNode [-bootstrapStandby]
18/12/10 23:04:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
=====================================================
About to bootstrap Standby ID hd-node2 from:
           Nameservice ID: cluster1
        Other Namenode ID: hd-node1
  Other NN's HTTP address: http://hd-node1:50070
  Other NN's IPC  address: hd-node1/192.190.20.13:9000
             Namespace ID: 1340338484
            Block pool ID: BP-1704877251-192.190.20.13-1544454003304
               Cluster ID: CID-ea278424-1c90-4594-980c-5dcd95edda74
           Layout version: -60
       isUpgradeFinalized: true
=====================================================
18/12/10 23:04:58 INFO common.Storage: Storage directory /home/hadoop/data/tmp/dfs/name has been successfully formatted.
18/12/10 23:04:58 INFO namenode.FSEditLog: Edit logging is async:false
18/12/10 23:04:59 INFO namenode.TransferFsImage: Opening connection to http://hd-node1:50070/imagetransfer?getimage=1&txid=0&storageInfo=-60:1340338484:0:CID-ea278424-1c90-4594-980c-5dcd95edda74&bootstrapstandby=true
18/12/10 23:04:59 INFO namenode.TransferFsImage: Image Transfer timeout configured to 60000 milliseconds
18/12/10 23:04:59 INFO namenode.TransferFsImage: Transfer took 0.01s at 0.00 KB/s
18/12/10 23:04:59 INFO namenode.TransferFsImage: Downloaded file fsimage.ckpt_0000000000000000000 size 323 bytes.
18/12/10 23:04:59 INFO util.ExitUtil: Exiting with status 0
18/12/10 23:04:59 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hd-node2/192.190.20.14
************************************************************/
[hadoop@hd-node2 zkdata]$ 
  1. 停掉 hadoop,在 hd-node1 按下 ctrl+c 结束 namenode,
^C18/12/10 23:12:00 ERROR namenode.NameNode: RECEIVED SIGNAL 2: SIGINT
18/12/10 23:12:00 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hd-node1/192.190.20.13
************************************************************/
[hadoop@hd-node1 ~]$

然后停掉各节点的 journalnode。

[hadoop@hd-node1 ~]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh stop journalnode" all
*******************hd-node1***************************
stopping journalnode
*******************hd-node2***************************
stopping journalnode
*******************hd-node3***************************
stopping journalnode
*******************hd-node4***************************
stopping journalnode
*******************hd-node5***************************
stopping journalnode
[hadoop@hd-node1 ~]$
  1. 一键启动 hdfs 相关进程
[hadoop@hd-node1 hadoop]$ ./sbin/start-dfs.sh 
18/12/10 23:14:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [hd-node2 hd-node1]
hd-node1: starting namenode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-namenode-hd-node1.out
hd-node2: starting namenode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-namenode-hd-node2.out
hd-node3: starting datanode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-datanode-hd-node3.out
hd-node4: starting datanode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-datanode-hd-node4.out
hd-node5: starting datanode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-datanode-hd-node5.out
Starting journal nodes [hd-node1 hd-node2 hd-node3 hd-node4 hd-node5]
hd-node3: starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node3.out
hd-node1: starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node1.out
hd-node2: starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node2.out
hd-node4: starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node4.out
hd-node5: starting journalnode, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-journalnode-hd-node5.out
18/12/10 23:14:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting ZK Failover Controllers on NN hosts [hd-node2 hd-node1]
hd-node1: starting zkfc, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-zkfc-hd-node1.out
hd-node2: starting zkfc, logging to /home/hadoop/app/hadoop/logs/hadoop-hadoop-zkfc-hd-node2.out
[hadoop@hd-node1 hadoop]$
  1. 在 hd-node1 节点上执行。
[hadoop@hd-node1 hadoop]$ ./sbin/start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/app/hadoop/logs/yarn-hadoop-resourcemanager-hd-node1.out
hd-node3: starting nodemanager, logging to /home/hadoop/app/hadoop/logs/yarn-hadoop-nodemanager-hd-node3.out
hd-node4: starting nodemanager, logging to /home/hadoop/app/hadoop/logs/yarn-hadoop-nodemanager-hd-node4.out
hd-node5: starting nodemanager, logging to /home/hadoop/app/hadoop/logs/yarn-hadoop-nodemanager-hd-node5.out
[hadoop@hd-node1 hadoop]$
  1. 在 hd-node2 节点上面执行。
[hadoop@hd-node2 hadoop]$ ./sbin/yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /home/hadoop/app/hadoop/logs/yarn-hadoop-resourcemanager-hd-node2.out
[hadoop@hd-node2 hadoop]$
  1. 验证 namenode:
http://hd-node1:50070
http://hd-node2:50070
  1. 验证 yarn:
http://hd-node1:8088
http://hd-node2:8088
如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论