Hadoop + Spark生态系统操作与实战指南
上QQ阅读APP看书,第一时间看更新

2.4 Apache版本Hadoop集群搭建

Apache版本的所有需要安装的软件全部放在/usr/app目录下。

1. Zookeeper安装

以下是ZooKeeper的安装步骤:

(1)上传zk安装包。

(2)解压。

    tar –zxvf  zookeeper-3.4.6.tar.gz  /usr/app/

(3)配置(先在一台节点上配置)。

添加一个zoo.cfg配置文件:

    cd zookeeper-3.4.6/conf/
    cp -r zoo_sample.cfg zoo.cfg

修改配置文件(zoo.cfg):

    mkdir /usr/app/zookeeper-3.4.6/data
    dataDir=/usr/app/zookeeper-3.4.6/data(the directory where the
    snapshot is stored.)

在最后一行添加:

    server.1=hadoop11:2888:3888
    server.2=hadoop12:2888:3888
    server.3=hadoop13:2888:3888

在(dataDir=/usr/app/zookeeper-3.4.5/data)创建一个myid文件,里面内容是server.N中的N(server.2里面内容为2)。

    echo "1" >myid

将配置好的zk复制到其他节点。

    scp  -r  /usr/app/zookeeper-3.4.6/    root@hadoop12:/usr/app
    scp  -r  /usr/app/zookeeper-3.4.6/    root@hadoop13:/usr/app

注意:在其他节点上一定要修改myid的内容。

在hadoop12应该把myid的内容改为2(echo "2" >myid)。

在hadoop13应该把myid的内容改为3(echo "3" >myid)。

(4)启动ZooKeeper集群。

三台机器上面分别启动ZooKeeper,启动和关闭命令如下:

    /usr/app/zookeeper-3.4.6/bin/./zkServer.sh start
    /usr/app/zookeeper-3.4.6/bin/./zkServer.sh stop

每台机器分别启动zk,如图2-24所示。

图2-24 每台机器分别启动zk

    ./zkServer.sh start

(5)查看启动状态。

    /usr/app/zookeeper-3.4.6/bin/./zkServer.sh status

每台ZooKeeper会选出leader或者follower。ZooKeeper的follwer状态如图2-25所示,ZooKeeper的leader状态如图2-26所示。

图2-25 ZooKeeper的follwer状态

图2-26 ZooKeeper的leader状态

2.安装Hadoop

下载hadoop-2.6.0.tar.gz压缩包。

(1)解压hadoop-2.6.0.tar.gz压缩包。

    tar -xzvf hadoop-2.6.0.tar.gz

(2)配置环境变量:vi /etc/profile。

    export JAVA_HOME=/usr/app/jdk1.7
    export HADOOP_HOME=/usr/app/hadoop-2.6.0
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

(3)配置hadoop-env.sh文件,修改JAVA_HOME。

/usr/app/hadoop-2.6.0/etc/hadoop

    # The java implementation to use.
    export JAVA_HOME=/usr/app/jdk1.7

(4)配置slaves文件,增加slave节点。

/usr/app/hadoop-2.6.0/etc/hadoop

    hadoop11
    hadoop12
    hadoop13

(5)配置core-site.xml文件

core-site.xml

    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://ns1</value>
    </property>
    【这里的值指的是默认的HDFS路径。当有多个HDFS集群同时工作时,集群名称在这里指
    定!该值来自于hdfs-site.xml中的配置】
@@@
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/app/hadoop-2.6.0/tmp</value>
    </property>
    【这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户
    也可以自己单独指定这三类节点的目录。】
@@@
    <property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop11:2181, hadoop12:2181, hadoop13:2181</value>
    </property>
    【这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点】
    </configuration>

(6)配置hdfs-site.xml文件

hdfs-site.xml

    <configuration>
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    【指定DataNode存储block的副本数量。默认值是3个,我们现在有4个DataNode,该值
    不大于4即可。】
@@@
    <property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
    </property>
    【使用federation时,HDFS集群别名。名字可以随便起,多个集群时相互不重复即可】
@@@
    <property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1, nn2</value>
    </property>
    【指定该集群的namenode的机器】
    <property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>hadoop11:9000</value>
    </property>
    【指定hadoop100的RPC地址】
@@@
    <property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>hadoop11:50070</value>
    </property>
    【指定hadoop100的http地址】
@@@
    <property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>hadoop12:9000</value>
    </property>
    【指定hadoop101的RPC地址】
@@@
    <property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>hadoop12:50070</value>
    </property>
    【指定hadoop101的http地址】
@@@
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop11:8485; hadoop12:8485; hadoop13:8485/ns1
    </value>
    </property>
    【指定该集群的两个NameNode共享edits文件目录时,使用的JournalNode集群信息】
@@@
    <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/usr/app/hadoop-2.6.0/journaldata</value>
    </property>
    【指定该集群是否启动自动故障恢复,即当NameNode出故障时,是否自动切换到另一台
    NameNode】
@@@
    <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
    </property>
    【指定该集群出故障时,哪个实现类负责执行故障切换】
@@@
    <property>
    <name>dfs.client.failover.proxy.provider.ns1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.Configured
    FailoverProxyProvider</value>
    </property>
    【client的failover代理配置】
@@@
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
    </property>
    【一旦需要NameNode切换,使用ssh方式进行操作】
@@@
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
    </property>
    【如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置】
@@@
    <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
    </property>
    【connect-timeout连接超时】
    </configuration>

(7)配置mapred-site.xml文件

mapred-site.xml

    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
     【指定运行mapreduce的环境是yarn,与hadoop1截然不同的地方】
    </configuration>

(8)配置yarn-site.xml文件

yarn-site.xml

    <configuration>
    <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
    </property>
    【启动HA高可用性】
@@@
    <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yrc</value>
    </property>
    【指定resourcemanager的名字】
@@@
    <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1, rm2</value>
    </property>
    【使用了2个resourcemanager,分别指定Resourcemanager的地址】
@@@
    <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>hadoop11</value>
    </property>
    【自定ResourceManager1的地址】
@@@
    <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>hadoop12</value>
    </property>
    【自定ResourceManager2的地址】
@@@
    <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>hadoop11:2181, hadoop12:2181, hadoop13:2181</value>
    </property>
    【制定ZooKeeper机器】
@@@
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    【默认】
    </configuration>

(9)将配置好的Hadoop文件复制到另一台slave机器上。

    [root@hadoop11 app]# scp -r hadoop-2.6.0  root@hadoop13:/usr/app

(10)启动journalnode(分别在hadoop11、hadoop12、hadoop13上执行)。

    cd /usr/app/hadoop-2.6
        sbin/hadoop-daemon.sh start  journalnode

运行jps命令检验,hadoop11、hadoop12、hadoop13上多了JournalNode进程。

(11)格式化HDFS。

在hadoop11的/usr/app/hadoop-2.6.0/bin执行命令:

    hdfs  namenode  -format

格式化后会根据core-site.xml中的hadoop.tmp.dir配置生成文件,这里作者配置的是/usr/app/hadoop-2.6/tmp,然后将/hadoop-2.6/tmp复制到hadoop12的/hadoop-2.4.1/下。

    scp  -r  /usr/app/hadoop-2.6/tmp/  hadoop12:/usr/app/hadoop-2.6/

也可以这样,在hadoop12上执行命令:

    hdfs  namenode  -bootstrap  Standby

HDFS格式化成功,如图2-27所示。

图2-27 HDFS格式化成功

(12)格式化ZKFC(在hadoop11上执行即可)

ZooKeeper格式化命令:hdfs zkfc -formatZK。ZooKeeper格式化成功,如图2-28所示。

图2-28 ZooKeeper格式化成功

(13)启动HDFS(在hadoop11上执行)。

启动HDFS命令:sbin/start-dfs.sh。HDFS目录界面如图2-29所示

图2-29 HDFS目录界面

(14)启动YARN。注意:是在hadoop11上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以就要分别在不同的机器上启动。

启动YARN的命令:sbin/start-yarn.sh。YARN界面如图2-30所示。

图2-30 YARN界面

(15)验证HDFS HA

查看HDFS:http://hadoop11:50070/

查看RM:http://hadoop11:8088/

首先向HDFS上传一个文件。

    hadoop fs -put /etc/profile /
    hadoop fs -ls /

然后再kill掉active的NameNode。

    kill -9 <pid of NN>

通过浏览器访问:http://192.168.200.12:50070

    NameNode hadoop12:9000' (active)这个时候hadoop12上的NameNode变成了active。

执行命令:

    hadoop fs -ls /
    -rw-r--r--    3 root supergroup        19262017-02-06 15:36 /profile

刚才上传的文件依然存在!! !

手动启动那个挂掉的NameNode。

    sbin/hadoop-daemon.sh start namenode

通过浏览器访问:http://192.168.200.11:50070

    NameNode hadoop12:9000' (standby)

(16)验证YARN:

运行一下hadoop提供的demo中的WordCount程序:

    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-
    2.4.1.jar wordcount /profile /out

OK,大功告成!! !