封尘网

让学习成为一种习惯!

Hadoop HA环境搭建

本文搭建环境以普通用户运行Hadoop集群环境,同时为了保留软件版本号,方便日后升级,所有解压目录都创建软连接,同时在环境变量/etc/profile或~/.bash_profile文件中引用的路径都为软连接路径,这样升级方便:

1、环境分配:【打钩的表示该主机上运行该功能】

  • NN:表示NameNode,和SecondNameDode,这里的Spark-master主NameNode、SecondNameDode在Spark-slave1主机上。
  • DN:表示DataNode,有三个节点分别在Slave【1、2、3】上。
  • ZK:表示ZeeKeeper ,以单节点数。【可1、或3、5等】。
  • ZKFC:NameNode在哪ZKFC就在哪。【必须】
  • JN:journalnode作为共享,集群有高可用。
  • RM:Mapreduce主程序,ResourceManager放到NameNode上【选择少服务的主机】。
  • DM:最好跟DataNode在同一节点上。【为Mapreduce分配任务】

2、软件版本:

jdk-7u79-linux-x64.gz、hadoop-2.5.2.tar.gz、hadoop-native-64-2.4.0.tar

注:hadoop-native-64-2.4.0.tar 是为了解决运行dfs时的一个WARN 提示:

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

用法:把它解压到hadoop的/lib/目录下即可。【适合2.5.2,其它版本未测试过】

3、建立用户:

useradd swper
echo “123456”|passwd --stdin swper

切换到swper用户目录下,并上软件到主目录下,并在主目录下建立一个安装所需软件的目录。

su swper
mkdir /app

解压软件到/app目录下,并创建对应的软连接:

tar xf hadoop-2.5.2.tar.gz app/
tar xf jdk-7u79-linux-x64.gz  app/

建立软连接:

cd app/
ln -s hadoop-2.5.2/ hadoop
ln -s jdk1.7.0_79/ java

配置环境变量:可修改~/.bash_profile或者/etc/profile文件:

#HDFS configuration at 20160411
#JAVA configuration
export JAVA_HOME=/home/swper/app/java
export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin

#Hadoop configuration
export HADOOP_HOME=/home/swper/app/hadoop
export YARN_HOME=$HADOOP_HOME

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

4、修改配置文件:进入目录:cd app/hadoop/etc/hadoop/

建立目录:mkdir /home/swper/app/hadoop/tmp

1)core-site.xml

<configuration>
    <property>
       <name>ha.zookeeper.quorum</name>
       <value>spark-master:2181,spark-slave1:2181,spark-slave2:2181</value>
     </property>

    <property>
       <name>hadoop.tmp.dir</name>
       <value>/home/swper/app/hadoop/tmp</value>
     </property>

</configuration>

2)hdfs-site.xml

<configuration>
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>spark-master:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>spark-slave1:8020</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>spark-master:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>spark-slave1:50070</value>
    </property>
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://spark-slave1:8485;spark-slave2:8485;spark-slave3:8485/mycluster</value>
    </property>
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/swper/.ssh/id_rsa</value>
    </property>
    <property>
       <name>dfs.ha.automatic-failover.enabled</name>
       <value>true</value>
     </property>
</configuration>

3)安装zookeeper-3.4.6

tar xf zookeeper-3.4.6.tar.gz -C /home/swper/app/
cd /home/swper/app/
ln -s zookeeper-3.4.6/ zookeeper
cd zookeeper/conf/

建立目录:

mkdir -p /home/swper/app/zookeeper/data

【复制一份zoo_sample.cfg改名为zoo.cfg】

修改下面配置:【由于上面的规则,zk_server只在以下三台机器运行】


dataDir=/home/swper/app/zookeeper/data
server.1=spark-master:2888:3888
server.2=spark-slave1:2888:3888
server.3=spark-slave2:2888:3888

注:修改完后要在dataDir目录下建立一个文件名叫:myid 并根据上面配置填ID。每个节点都要对应,根据主机名和前面的ID相对应。

创建完后,先在每个节点上启动zkServer,进入bin目录:【上面三台节点都要启动】

./zkServer.sh start

4)hadoop-env.sh和yarn-env.sh都要加入JAVA的路径:

export JAVA_HOME=/home/swper/app/java

5)slaves #【填上运行DataNode的的主机名】

spark-slave1
spark-slave2
spark-slave3

完成上面的配置后接下来按顺序启动:

1、启动journalnode:在spark-slave1、spark-slave2、spark-slave3 【根据上面的规则,三台机都要启动】

/home/swper/app/hadoop/sbin/hadoop-daemon.sh start journalnode

2、格式化zk不然下边启动dfs时会报错,进入随便一个NameNode主机上,执行以下命令:

cd /home/swper/app/hadoop/bin
./hdfs zkfc -formatZK

格式化zk,只需在其中一台NameNode主机上执行命令:

3、格式化第一个NameNode,查看提示是否成功,并检查是否创建了NameNode的元数据。

并且启动第一个格式化的NameNode,因为要把元数据同步到第二个NameNode;

4、回到另一台NameNode主机上执行命令:

cd /home/swper/app/hadoop/bin
./hdfs namenode -bootstrapStandby

如下截图:

5、完成后可以把所有服务停止:./stop-all.sh

然后,再次启动所有服务:./start-dfs.sh

可以成功看到各节点已经启动起来了,详情查看截图:

提醒:本文最后更新于 2720 天前,文中所描述的信息可能已发生改变,请谨慎使用。