【前言】由于运气不错在学校机房申请得到了几台PC机用于尝试部署真实环境下的hadoop集群,花了几个小时的时间终于大功告成,现在将安装部署的详细步骤记录如下,希望对大家有所帮助!
一、机房环境描述:
1.1、PC配置:
4G内存 i3-2130处理器 主频:3.40GHz 硬盘:500GB
PC共9台(两个用于namenode结点(HA:高可靠)配置的自动切换HA而不是手工切换)
1.2、操作系统:
centos6.5 64位版本(充分模拟企业集群环境)(其中为后期调试方便,9台机器中一台安装的是软件开发平台模式,其余的均安装的basic server模式,为了充分腾出内存和硬盘资源给应用程序使用和数据存储)
二、配置细则
2.1、linux系统安装
依然采用的U盘模式安装(简单快捷),后期需要设置每台机器自动开机时间,然集群自动开启和方便远程关闭
个磁盘上的磁盘信息:
nn1和nn2上的磁盘信息:
d1~d7节点上的磁盘信息:
2.2、用户和用户组:
为了方便集群管理在每台机器上创建hadoop用户组和grid用户,用户密码:
创建命令:groupadd hadoop //添加用户组
useradd –g hadoop –G root grid //添加用户,主组:hadoop 附属组:root
2.3、网络配置
为了方便后期能在校内网访问,这次配置全部使用的校内网IP,因为经过前面的验证,即使使用校内的IP地址,由于机房的电脑是出于同一个局域网中的,所以数据的传输还是在局域网内传输。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
网络配置方法:
修改/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 HWADDR=74:27:EA:18:2E:DF TYPE=Ethernet UUID=941f8064-cc11-4348-bf2a-17a694d3577f ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=10.106.0.200 NETMASK=255.255.0.0 GATEWAY=10.106.1.254 DNS1=10.4.1.30 DNS2=10.4.1.31
这些信息在linux下的查询方式:
在dhcp条件下,查看下网关、DNS,查看命令:
Route –n 查看网关
查看文件/etc/resolv.conf查看DNS
2.4、设置hostname与ip绑定
2.5、关闭iptables防火墙服务
chkconfig–level 2345 iptables off 关闭2、3、4、5运行级别的防火墙服务然后重启即可
2.6、(重启后)配置免密码nn1和nn2到其余结点的免密码访问
(1)执行命令ssh-keygen-t rsa产生公钥私钥文件,产生的文件位于~/.ssh目录下
(2)执行命令ssh-copy-id-i 主机名 复制公钥文件到对方 主机名 中authorized_keys中去了。(主节点到每个节点都是做一样的操作,后面考虑使用shell脚本来完成,当机器多了之后)
(3)执行ssh 主机名(上面操作过的主机),就可以实现真正的免密码登录了。
只需要实现主节点(chaoren1)到从节点(chaoren3\chaoren4\chaoren5)的免密码登录即可,不必要实现从节点到主节点的免密码登录。
(注:这里本来写了个脚本的,但是因为是在root下进行设置,所以每次还要输入root的密码,显得比较麻烦)
2.7、jdk安装
将下载好的linux 32版本的jdk1.7复制到/usr/目录下,用vi打开/etc/profile文件,添加
exportJAVA_HOME=/usr/jdk1.8.0_11
exportCLASS_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH= $JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
这里可以使用脚本一次写入,然后分发
2.8、hadoop2安装和配置
下载和解压hadoop-2.4.1到/home/grid目录下,然后建立软连接:ln –s hadoop-2.4.1 hadoop2
shell暂时还没有配置
2.9、hadoop配置文件配置(包含自动切换HA的配置)
(1)搭建zookeeper集群,并启动
(zookeeper占用资源是非常少的,只要不部署在像namenode、resourcemanager这样的节点上都问题不大)zookeeper简单的说就是实现数据共享的,能保证数据传输到集群后,客户端访问的时候的唯一性
(1.1)在d1 机器上的/home/grid上解压缩,重命名为zookeeper,把conf/zoo_sample.cfg重命名为conf/zoo.cfg(使用mv 命令即可)
(1.2)修改文件conf/zoo.cfg
(1.2.1)dataDir=/home/grid/zookeeper/data //这个data文件夹是没有的
(1.2.2)增加以下内容(直接在末尾加就行)
server.1=d1:2888:3888 server后面的点后面是对集群起名一个标识
server.2=d2:2888:3888
server.3=d3:2888:3888
将zookeeper文件夹拷贝到其他的两个节点上
scp -rq zookeeper
(1.2.3)创建目录mkdirzookeeper/data
再将zookeeper标识写进去即可(每个节点都需要这么弄,可以写shell脚本来做这个事情)
(1.2.4)写入文件echo 1 >zookeeper/data/myid(注意路径根据具体情况来写)
(1.2.5)复制zookeeper文件夹到d2、d3上
scp -rq zookeeper d2:/home/grid/
scp -rq zookeeper d3:/home/grid/
在d2上执行命令echo 2zookeeper/data/myid
在d3上执行命令echo 3zookeeper/data/myid
(1.3)启动
在d1、d2、d3上,分别执行命令zookeeper/bin/zkServer.sh start(这一步一定要先有,才能继续下面的步骤,前面有点着急了,才启动了一个就继续下面的步骤,然后就出问题了)
(1.4)验证
执行命令zookeeper/bin/zkCli.sh 观察welcome tozookeeper
进入后执行ls / 可以看到zookeeper节点,默认的
(2)配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slaves)
2.1、hadoop-env.sh
exportJAVA_HOME=/usr/jdk1.8.0_11
2.2、core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://cluster1</value> //这里就是给集群起了个名字,如果配置 </property> <property> <name>hadoop.tmp.dir</name> <value>/home/grid/hadoop-2.4.1/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>d1:2181,d2:2181,d3:2181</value> </property>
2.3hdfs-site.xml
<property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.nameservices</name> <value>cluster1</value> </property> <property> <name>dfs.ha.namenodes.cluster1</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.cluster1.nn1</name> <value>nn1:9000</value> </property> <property> <name>dfs.namenode.http-address.cluster1.nn1</name> <value>nn1:50070</value> </property> <property> <name>dfs.namenode.rpc-address.cluster1.nn2</name> <value>nn2:9000</value> </property> <property> <name>dfs.namenode.http-address.cluster1.nn2</name> <value>nn2:50070</value> </property> <property> <name>dfs.ha.automatic-failover.enabled.cluster1</name> <value>true</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://d4:8485;d5:8485;d6:8485/cluster1</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/grid/hadoop-2.4.1/tmp/journal</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/grid/.ssh/id_rsa</value> </property> <property> <name>dfs.client.failover.proxy.provider.cluster1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>
2.4yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>nn1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
2.5mapred-site.xml
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
2.6slaves
d1 d2 d3 d4 d5 d6 d7
(3)删除其他节点的hadoop-2.4.1文件夹,然后把nn1上的hadoop-2.4.1文件夹复制到nn2、d1、d2、d3、。。。节点(4)格式化zk集群
在nn1上执行hadoop2/bin/hdfs zkfc –formatZK(5) 启动journalnode集群
在d4、d5、d6上分别执行hadoop2/sbin/hadoop-daemon.sh start journalnode(6) 格式化namenode、启动namenode
在nn1上执行hadoop2/bin/hdfsnamenode -format
在nn1上分别执行hadoop2/sbin/hadoop-daemon.shstart namenode
在nn2上执行hadoop2/bin/hdfsnamenode –bootstrapStandby //这里千万要注意,这里不是跟上面一样的格式化,而是数据同步//这里同步数据能否执行多次,就是如果关掉集群了,下次还能不能再次执行??
在nn2上分别执行hadoop2/sbin/hadoop-daemon.sh start namenode(7) 启动datanode
在nn1上分别执行hadoop2/sbin/hadoop-daemons.sh start datanode(8)启动ZKFC(专门用来实现自动切换的,zookeeper 。。。控制器)哪里有namenode,在哪里就要启动ZKFC
在nn1、nn2上 启动zkfc,执行命令hadoop2/sbin/hadoop-daemon.shstart zkfc
2.7 启动resourcemanager和nodemanager
在nn1上执行hadoop/sbin/start-yarn.sh start resourcemanager
(9)sbin/mr-jobhistory-daemon.sh start historyserver
运行效果截图: