您的位置:首页 > 运维架构

Hadoop2.6.0 + zookeeper集群环境搭建

2015-04-08 11:15 549 查看
前提:已安装好centos6.5操作系统

hadoop HA(QJM)集群配置规划

IP
Hostname
备注
192.168.100.101
h1m1
NN(active)、RM、ZKFC
192.168.100.102
h1m2
NN(standby)、RM、ZKFC
192.168.100.103
h1s1
DN、NM、JN、QPM
192.168.100.104
h1s2
DN、NM、JN、QPM
192.168.100.105
h1s3
DN、NM、JN、QPM
192.168.100.106
h1s4
DN、NM、JN、QPM
192.168.100.107
h1s5
DN、NM、JN、QPM
说明:

NN: NameNode

RM: ResourceManager

ZKFC: DFSZKFailoverController

DN: DataNode

NM: NodeManager

JN: JournalNode

QPM: QuorumPeerMain

1. 系统环境设置(先配置master节点h1m1)

1.1修改主机名

# vim /etc/sysconfig/network

1 NETWORKING=yes

2 HOSTNAME=h1m1

3 NTPSERVERARGS=iburst



1.2 修改IP地址

进入Linux图形界面 -> 右键点击右上方的网络连接->点击“编辑连接…” ->添加一个新网络“主机连接” ->选择IPv4 ->方法选择为手动 ->点击添加按钮 ->添加IP:192.168.100.101子网掩码:255.255.255.0网关:192.168.100.254 ->应用



1.3修改主机名和IP的映射关系(hosts)

# vim/etc/hosts

添加:192.168.100.100 h1m1~192.168.100.107 h1s5

1.4关闭防火墙

# service iptables status //查看防火墙状态

# service iptables stop //关闭防火墙

# chkconfig iptables --list //查看防火墙开机启动状态

# chkconfig iptables off //关闭防火墙开机启动

1.5重启系统

# reboot

2.安装jdk

下载地址:http://pan.baidu.com/s/1i34B3JB

2.1上传

2.2解压jdk

# mkdir /usr/lib/jdk //创建目录

# tar -zxvf jdk-8u40-linux-x64.tar.gz //解压

# mv jdk1.8.0_40 /usr/lib/jdk

2.3将java添加到环境变量中

# vim /etc/profile

//在文件最后添加

export JAVA_HOME=/usr/java/jdk1.8.0_40

export PATH=.:$JAVA_HOME/bin:$PATH

# source /etc/profile //刷新配置

# java -version

3. 配置ssh免登陆

# cd ~ //进入到我的home目录

# ssh-keygen -t rsa -P ''(四个回车)

执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

将公钥拷贝到要免登陆的机器上

# ssh-copy-id h1m1 (或# cat ~/.ssh/id_rsa.pub>> ~/.ssh/ authorized_keys)

# cat ~/.ssh/authorized_keys //查看rsa



注:为方便在集群中针对多节点执行命令,在此提供一个简单脚本供大家使用:

#!/usr/bin/env bash

doCommand() {
hosts=`sed -n '/^[^#]/p' hostlist`
for host in $hosts
do
echo ""
echo HOST $host
ssh $host "$@"
done
return 0
}

if [ $# -lt 1 ]; then
echo "$0 cmd"
exit
fi

doCommand "$@"
echo "return from doCommand"


用法:将本脚本保存并修改权限(chmod 775 doCommand.sh). 在脚本目录下创建一个hostlist文件,其中保存要执行命令的host主机列表.

使用命令:./doCommand.sh “<command>”

e.g. ./doCommand.sh “ls”

4.在h1m1上安装hadoop2.6.0(注:为方便操作,使用xshell远程登录到linux)

按安装java方式把hadoop解压到/usr/lib/hadoop

4.1配置hadoop

将hadoop添加到环境变量中

# vim /etc/profile

export JAVA_HOME=/usr/java/jdk1.8.0_40

export HADOOP_HOME=/usr/lib/hadoop

export PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH

4.1.1 配置hadoop-env.sh

# cd /usr/lib/hadoop

# vim etc/hadoop/hadoop-env.sh(注意,此处不是系统的etc目录)

将JAVA_HOME修改为刚才配置的位置



4.1.2配置core-site.xml

# vim etc/hadoop/core-site.xml

添加以下内容:

<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>

<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/lib/hadoop/tmp</value>
</property>

<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>h1s1:2181,h1s2:2181,h1s3:2181,h1s4:2181,h1s5:2181</value>
</property>
</configuration>


4.1.3 配置hdfs-site.xml

HA主要配置是在本文件中,参考官网:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

# vim etc/hadoop/hdfs-site.xml

添加以下内容:

<configuration>
<!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>

<!-- mycluster下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>

<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>h1m1:9000</value>
</property>

<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>h1m1:50070</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>h1m2:9000</value>
</property>

<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>h1m2:50070</value>
</property>

<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://h1s1:8485;h1s2:8485;h1s3:8485;h1s4:8485;h1s5:8485/mycluster</value>
</property>

<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/lib/hadoop/journal</value>
</property>

<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</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
shell(/bin/true)
</value>
</property>

<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>

<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>


4.1.4配置mapred-site.xml

# cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml

# vim etc/hadoop/mapred-site.xml

添加以下内容:

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>
</configuration>


4.1.5配置yarn-site.xml

# vim etc/hadoop/yarn-site.xml

添加以下内容:

<configuration>
<!-- 开启RM高可靠 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>

<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>

<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>

<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>h1m1</value>
</property>

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

<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>h1s1:2181,h1s2:2181,h1s3:2181,h1s4:2181,h1s5:2181</value>
</property>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>


4.2 修改slaves

slaves是指定子节点的位置,因为要在h1m1上启动HDFS、yarn,所以h1m1上的slaves文件指定的是datanode的位置和nodemanager的位置

# vim /usr/lib/hadoop/etc/hadoop/slaves

h1s1

h1s2

h1s3

h1s4

h1s5

4.3 配置免密码登陆

#配置h1m1到h1m2、h1s1、h1s2、h1s3、h1s4、h1s5的免密码登陆

#在h1m1上生产一对钥匙

ssh-keygen -t rsa -P ''

#将公钥拷贝到其他节点,包括自己

ssh-coyp-id h1m1

ssh-coyp-id h1m2

ssh-coyp-id h1s1

ssh-coyp-id h1s2

ssh-coyp-id h1s3

ssh-coyp-id h1s4

ssh-coyp-id h1s5

5. 安装zookeeper

5.1 下载安装zookeeper

下载地址:http://pan.baidu.com/s/1hq2BEBi

安装过程参考hadoop

5.2 配置zookeeper

添加一个zoo.cfg配置文件

# cd /usr/lib/zookeeper/conf

# mv zoo_sample.cfg zoo.cfg

修改配置文件(zoo.cfg)

dataDir=/usr/lib/zookeeper/data

server.3=h1s1:2888:3888

server.4=h1s2:2888:3888

server.5=h1s3:2888:3888

server.6=h1s4:2888:3888

server.7=h1s5:2888:3888

在(/usr/lib/zookeeper/data)创建一个myid文件,里面内容是server.N中的N(server.3里面内容为3)

# echo "3" > myid

将配置好的zk拷贝到其他节点

# scp -r /usr/lib/zookeeper/ h1s2:/usr/lib/

# scp -r /usr/lib/zookeeper/ h1s3:/usr/lib/

# scp -r /usr/lib/zookeeper/ h1s4:/usr/lib/

# scp -r /usr/lib/zookeeper/ h1s5:/usr/lib/

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

在h1s2应该讲myid的内容改为4 (# echo "4" > myid)

在h1s3应该讲myid的内容改为5 (# echo "5" > myid)

在h1s4应该讲myid的内容改为6 (# echo "6" > myid)

在h1s5应该讲myid的内容改为7 (# echo "7" > myid)

6. 启动集群

6.1 启动zookeeper集群(分别在h1s1、h1s2、h1s3、h1s4、h1s5上启动zk)

# cd /usr/lib/zookeeper/bin/

# ./zkServer.sh start

# ./zkServer.sh status #查看状态:一个leader,四个follower

6.2 启动journalnode(分别在h1s1、h1s2、h1s3、h1s4、h1s5上执行)

# cd /usr/lib/hadoop

# sbin/hadoop-daemon.sh start journalnode #运行jps命令检验,h1s1、h1s2、h1s3、h1s4、h1s5上多了JournalNode进程

6.3 格式化HDFS

# hdfs namenode -format #在h1m1上执行命令:

# scp -r tmp/ h1m2:/usr/lib/hadoop/ #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/lib/hadoop/tmp,然后将/usr/lib/hadoop/tmp拷贝到h1m2的/usr/lib/hadoop/下。

6.4 格式化ZK(在h1m1上执行即可)

# hdfs zkfc -formatZK

6.5 启动HDFS(在h1m1上执行)

# sbin/start-dfs.sh



6.6 启动YARN

在此我们是在h1m1上配置RM,所以在h1m1执行

# sbin/start-yarn.sh



到此,hadoop-2.6.0配置完毕,可以统计浏览器访问:
http://h1m1:50070
NameNode 'h1m1:9000' (active)
http://h1m2:50070
NameNode 'h1m2:9000' (standby)

验证HDFS HA

首先向hdfs上传一个文件

hadoop fs -put /etc/profile /profile

hadoop fs -ls /

然后再kill掉active的NameNode

kill -9 <pid of NN>

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

NameNode 'h1m2:9000' (active)

这个时候h1m2上的NameNode变成了active

在执行命令:

hadoop fs -ls /

-rw-r--r-- 3 root supergroup 1926 2015-05-14 15:36 /profile

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

手动启动那个挂掉的NameNode

sbin/hadoop-daemon.sh start namenode

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

NameNode 'h1m1:9000' (standby)

验证YARN:

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

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

OK,大功告成!!!


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