CDH4 HA搭建手册V1.2
一、 机器情况
ocdata17 | 10.1.253.27 |
ocdata18 | 10.1.253.28 |
ocdata19 | 10.1.253.29 |
我们有两台NAMENODE机器 分别部署在ocdata19和ocdata18上
我们有两台Jobtracker机器 分别部署在ocdata19和ocdata18上
同时有三台journalnode用来存储namenode元数据
有三台zookeeper组成的集群用来管理namenode的状态(active或者standby)
当active的namnode出现问题时,standby节点立刻投入使用
有一台datanode节点,部署在ocdata17上
有一台tasktracker节点,部署在ocdata17上
二、 HDFS部署文档
1.建立用户
每台机器 登录root 用户
adduser cdh4ha;
passwd cdh4ha; 输入密码
2.建立ssh联接
登录ocdata17
mkdir .ssh
ssh-keygen -t rsa –f~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
将.shh文件分发到ocdata18和ocdata19上
并将三台机器文件夹授权
chmod 711 .ssh
chmod 644 .ssh/authorized_keys
保证三台机器无需密码即可切换用户
3. 搭建zookeeper
上传zookeeper.
复制conf/zoo_sample.cfg >>>conf/zoo.cfg
修改cfg : dataDir=/home/cdh4ha/zoodata --zookeeper用来存放数据的位置
添加 : server.1=ocdata19:2898:3898 --3台zookeeper机器构建一个集群
server.2=ocdata17:2898:3898
server.3=ocdata18:2898:3898
修改clientPort=2183
分发zookeeper到集群。
在各个机器中建立文件/home/cdh4ha/zoodata/myid --myid中的数字代表当前机器在集群中的编号
ocdata17 中输入2 --要和上面对应
ocdata18 中输入3
ocdata19 中输入1
启动每台机器的zookeeper服务
./bin/zkServer.sh start
检查各个机器的启动情况
echo ruok | nc ocdata192181
echo ruok | nc ocdata172181
echo ruok | ncocdata18 2181
如果都返回imok 则代表zookeeper搭建成功
4. 上传hadoop
a) 修改 core-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>副本数目,由于只有一个DATANODE设置为1</description>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
<description>mycluster下拥有两个namenode节点</description>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>ocdata19:8020</value>
<description>节点NN1的RPC地址</description>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>ocdata18:8020</value>
<description>节点NN2的RPC地址</description>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>ocdata19:50072</value>
<description>节点NN1的HTTP地址</description>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>ocdata18:50072</value>
<description>节点NN2的HTTP地址</description>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://ocdata19:8485;ocdata17:8485;ocdata18:8485/mycluster</value>
<description>我们采用3个journalnode节点存储元数据,这是他们的IP与端口</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/cdh4ha/journaldata/jn</value>
<description>journaldata的存储路径</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>该类用来判断哪个namenode处于生效状态</description>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</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/cdh4ha/.ssh/id_rsa</value>
</property>
-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>打开自动切换namenode的功能</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>ocdata19:2183,ocdata17:2183,ocdata18:2183</value>
<description>3个zookeeper节点</description>
</property>
</configuration>
b) 修改slaves
添加一行 ocdata17
分发hadoop到各个机器
5. 启动JournalNode服务
下面的所有hadoop命令都必须以./xxx的形式执行。否则会报错。(应该和shell解释器有关)。
进入bin目录 ./hdfs journalnode --启动journalnode服务
每台机器都如此执行。
访问web页面 ocdata19:8480,ocdata17:8480,ocdata18:8480
检查服务是否正常 --启动后可能会抛异常,没关系,格式化namenode后就好了
6. 启动hadoop
a) 进入ocdata19 hadoop/bin目录
执行 ./hdfs namenode -format
执行 ./hdfs zkfc -formatZK --在zookeeper集群中建立znode节点
执行 ./hdfsnamenode --启动namenode
b) 进入ocdata18 hadoop/bin目录
执行 ./hdfsnamenode -bootstrapStandby --主要是同步namenode元数据,最好在选举服务启动之前同步
执行 ./hdfs namenode
c) 进入 ocdata17 hadoop/bin目录
执行 ./hdfs datanode --启动datanode
d) 每台NAMENODE节点都要执行以下命令启动自动选举服务
执行 ./hdfs zkfc --启动自动选举服务
查看页面 ocdata19:50070 ocdata18:50070 应该一个处于standby状态 一个处于active状态 。并有一个datanode节点。
三、 MR1部署文档
1. 上传hadoop-mr1
a) 将HDFS的core-site copy过来
b) 将HDFS的hdfs-site copy过来
c) 修改mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>logicaljt</value>
</property>
<property>
<name>mapred.jobtrackers.logicaljt</name>
<value>jt1,jt2</value>
<description>Comma-separatedlist of JobTracker IDs.</description>
</property>
<property>
<name>mapred.jobtracker.rpc-address.logicaljt.jt1</name>
<value>ocdata19:8021</value>
</property>
<property>
<name>mapred.jobtracker.rpc-address.logicaljt.jt2</name>
<value>ocdata18:8022</value>
</property>
<property>
<name>mapred.job.tracker.http.address.logicaljt.jt1</name>
<value>ocdata19:50010</value>
</property>
<property>
<name>mapred.job.tracker.http.address.logicaljt.jt2</name>
<value>ocdata18:50012</value>
</property>
<property>
<name>mapred.ha.jobtracker.rpc-address.logicaljt.jt1</name>
<value>ocdata19:8023</value>
</property>
<property>
<name>mapred.ha.jobtracker.rpc-address.logicaljt.jt2</name>
<!-- RPCaddress for jt2 HA daemon -->
<value>ocdata18:8024</value>
</property>
<property>
<name>mapred.ha.jobtracker.http-redirect-address.logicaljt.jt1</name>
<!-- HTTPredirect address for jt1 -->
<value>ocdata19:50010</value>
</property>
<property>
<name>mapred.ha.jobtracker.http-redirect-address.logicaljt.jt2</name>
<!-- HTTPredirect address for jt2 -->
<value>ocdata18:50012</value>
</property>
<property>
<name>mapred.task.tracker.http.address</name>
<value>0.0.0.0:50033</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/cdh4ha/mr1data</value>
</property>
<property>
<name>mapred.jobtracker.restart.recover</name>
<value>true</value>
</property>
<property>
<name>mapred.job.tracker.persist.jobstatus.active</name>
<value>true</value>
</property>
<property>
<name>mapred.job.tracker.persist.jobstatus.hours</name>
<value>1</value>
</property>
<property>
<name>mapred.job.tracker.persist.jobstatus.dir</name>
<value>/home/cdh4ha/mr1data/jobtracker/jobsInfo</value>
</property>
<property>
<name>mapred.client.failover.proxy.provider.logicaljt</name>
<value>org.apache.hadoop.mapred.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>mapred.client.failover.max.attempts</name>
<value>15</value>
</property>
<property>
<name>mapred.client.failover.sleep.base.millis</name>
<value>500</value>
</property>
<property>
<name>mapred.client.failover.sleep.max.millis</name>
<value>1500</value>
</property>
<property>
<name>mapred.client.failover.connection.retries</name>
<value>0</value>
</property>
<property>
<name>mapred.client.failover.connection.retries.on.timeouts</name>
<value>0</value>
</property>
<property>
<name>mapred.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>mapred.ha.zkfc.port</name>
<value>8018</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>ocdata19:2183,ocdata17:2183,ocdata18:2183</value>
<!-- ZKensemble addresses -->
</property>
<property>
<name>mapred.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
</configuration>
2. 启动hadoop
a) ./hadoop mrzkfc –formatZK --在zookeeper节点上建立znode
b) 在每台jobtracker节点上执行以下命令
./hadoop jobtrackerha
./hadoop mrzkfc
c) 在ocdata17上执行
./hadooptasktracker
四、 HIVE部署
a) 将HADOOP_HOME指向mr1的文件夹。
b) ./hiveserver2 启动hiveserver即可。
五、 测试流程
a) 进入ocdata16的bin目录下
创建文件test.py
logfile = open("org","w")
for i in range(9999999) :
for i in range(10) :
logfile.write("abc");
logfile.close();
运行python test.py
该脚本用来创建一个名为org的文件,大小在300MB左右。
b) 创建文件a.sh
for i in 1 2 3 4 5 6 7 8 9 10
do
./hadoop fs -copyFromLocal org /org${i} &
Done
用来并发上传文件10次。
运用上面两个脚本可执行如下测试用例,主要用来测试集群的稳定性
机器情况如下:
ocdata19 namenode(active) jobtracker(active)
ocdata18 namenode(standby) jobtracker(standby) hiveserver
ocdata17 datanode tasktracker
1. ocdata16上传文件org>>> kill ocdata16 namenode>>>上传成功 ocdata17 变为active 后台日志开始报错提醒ocdata16 down掉>> 启动ocdata16 namenode >>ocdata16 变为standby
2. ocdata16上并发上传文件10个 >>kill ocdata17 namenode >>ocdata16 namenode 变为acitve >>文件上传成功>> 启动ocdata17 namenode>>ocdata17 变为standby
3. ocdata16上并发上传文件10个 >>kill ocdata17 journalnode >>文件上传成功>>日志开始报错提醒journalnodedown掉 >> 重启journalnode
4. 集成测试:
ocdata18 上分别部署了一台hiveserver.
我们创建了6 张表格,分别为table1-6
其中table1和table2 各自有1亿条数据,接下来我们通过JDBC执行下列语句
insert overwrite table table3 select t1.* from table1 t1join table2 t2 on t1.userid=t2.userid
insert overwrite table table4 select t1.* from table1 t1join table2 t2 on t1.userid=t2.userid
insert overwrite table table5 select t1.* from table1 t1 jointable2 t2 on t1.userid=t2.userid
insert overwrite table table6 select t1.* from table1 t1join table2 t2 on t1.userid=t2.userid
在执行的过程中 ,重启ocdata19机器。
这个操作相当于 :
a) Kill掉当前active的namnode
b) Kill掉当前active的jobtracker
c) Kill掉一个journalnode节点
d) Kill掉一个zookeeper节点
结果: 语句顺利执行完毕。表明我们的HA集群已经可以投入基本的使用