hadoop2集群搭建详解————————天津九安医疗电子–吴伟
一、需要软件
Jdk1.8.0_linux
Hadoop-2.2.0(Apache官网Stable版本)
Hbase-0.96.2(与Hadoop-2.2.0是配套的,不用覆盖jar包)
Zookeepr-3.4.5
# 集群结构图
IP地址
主机名
ZK
NN
DN
JN
HRS
HM
192.168.12.109
Master1
是
是
是
是
否
是
192.168.12.122
Master2
是
是(备)
是
是
否
是(备)
192.168.12.123
Slave1
是
否
是
是
是
否
192.168.12.126
Slave2
是
否
是
是
是
否
192.168.12.127
Slave3
是
否
是
是
是
否
192.168.12.129
Slave4
是
否
是
否
是
否
192.168.12.131
Slave5
是
否
是
否
是
否
二、基础配置
1、配置hosts文件,方便hadoop用主机名访问
vi /etc/hosts
2、设置ssh免密码登录
1) 进入 ~ 根目录下的 .ssh 目录(没有的话,创建.ssh目录)
2) 执行ssh-keygen -t rsa
3) ls 产生俩个文件(每台都要执行 )
id-rsa #私钥 id-rsa.pub #公钥
在每台服务器上将公钥复制到无需登录的服务器上,在每一台服务器上执ssh-copy-id的命令。
例如:
在192.168.12.109上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.12.122
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.12.123
。。。。。
验证:
ssh slave1
3、关闭防火墙(centos 7)
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
4、安装jdk
1)设置环境变量 vi /etc/profile
增加 export JAVA_HOME=/usr/local/jdk
export HBASE_HOME=/usr/local/hbase
export HADOOP_HOME=/usr/local/hadoop
export ZOOKEEPER_HOME=/usr/local/zk
export
PATH=$PATH:$HBASE_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:
2)立即生效 source profile
三、zookeeper安装
1. zk服务器集群规模不小于3个节点(必须是奇数个),要求各服务器之间系统时间要保持一致。
2. 在节点的/usr/local目录下,解压缩tar -zxvf ###。
3. 设置环境变量 vi /etc/profile 增加ZOOKEEPER_HOME=~~~
立即生效
Source /etc/profile
4. 在zk/conf目录下,重命名文件 mv zoo_sample.cfg zoo.cfg
编辑该文件,执行vi zoo.cfg
修改dataDir=/usr/local/zk/data ——————存放数据目录
新增:zk节点=对应的hadoop节点
Server.1=master1:2888:3888
(一个是通信端口,一个是选举端口)
Server.2=master2:2888:3888
Server.3=slave1:2888:3888
。。。。。。
5 创建文件夹存放数据目录mkdir /usr/local/zk/data
6 在data目录下,创建文件myid,值为1
7 把zk目录复制到其他节点
8 把其他节点中相应的myid的值改为2
9 启动:
在三个节点上分别执行命令(在zk/bin下执行)zkServer.sh start
执行后bin下多了zookeeper.out(日志)
10 检验,在三个节点上分别执行命令zkServer.sh status (leader或者follower)
时间同步
# yum install -y ntp #安装ntp服务
# ntpdate cn.pool.ntp.org #同步网络时间
四、hadoop2.2安装
# 修改7个配置文件
~/hadoop-2.2.0/etc/hadoop/hadoop-env.sh
~/hadoop-2.2.0/etc/hadoop/core-site.xml
~/hadoop-2.2.0/etc/hadoop/hdfs-site.xml
~/hadoop-2.2.0/etc/hadoop/mapred-site.xml
~/hadoop-2.2.0/etc/hadoop/yarn-env.sh
~/hadoop-2.2.0/etc/hadoop/yarn-site.xml
~/hadoop-2.2.0/etc/hadoop/slaves
# 1修改hadoop-env.sh配置文件(jdk 路径)
exportJAVA_HOME=/usr/local/jdk
# 2修改core-site.xml文件修改
<configuration>
<property>
<name>fs.defaultFS</name>
<value> hdfs://mycluster </value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>【这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。】
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
【NameService实际就是HDFS集群的别名。使用federation时,可使用了多个HDFS集群。】
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,master2:2181,slave1:2181,slave2:2181,slave3:2181,slave4:2181,slave5:2181</value>
</property>
【这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点】
</configuration>
# 3修改hdfs-site.xml配置文件
<configuration>
<property>
<name>dfs.nameservices</name>
<value> mycluster </value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>master1,master2</value>
</property>
【指定NameService是mycluster时的namenode有哪些】
<property>
<name>dfs.namenode.rpc-address.mycluster.master1</name>
<value>master1:9000</value>
</property>
【指定master1的RPC地址】
<property>
<name>dfs.namenode.rpc-address.mycluster.master2</name>
<value>master2:9000</value>
</property>
【指定master2的RPC地址】
<property>
<name>dfs.namenode.http-address.mycluster.master1</name>
<value>master1:50070</value>
</property>
【指定master1的http地址】
<property>
<name>dfs.namenode.http-address.mycluster.master2</name>
<value>master2:50070</value>
</property>
【指定master2的http地址】
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;master2:8485;slave1:8485;slave2:8485;slave3:8485/mycluster</value>
</property>
【指定mycluster的两个NameNode共享edits文件目录时,使用的JournalNode集群信息】
<property>
<name>dfs.ha.automatic-failover.enabled.mycluster</name>
<value>true</value>
</property>
【指定mycluster是否启动自动故障恢复,即当NameNode出故障时,是否自动切换到另一台NameNode】
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
【指定mycluster出故障时,哪个实现类负责执行故障切换】
<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.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/journal</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
【指定DataNode存储block的副本数量。默认值是3个,我们现在有7个DataNode,该值不大于7即可。】
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
# 4修改 mapred¬-site.xml配置文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
【指定运行mapreduce的环境是yarn,与hadoop1截然不同的地方】
</configuration>
# 5修改yarn-env.sh配置文件
exportJAVA_HOME=/usr/local/jdk
【这里的JAVA_HOME的值是jdk的安装路径】
# 6修改yarn-site.xml配置文件
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master1</value>
</property>
【自定ResourceManager的地址,还是单点,这是隐患】
</configuration>
# 7修改slaves配置文件
master1
master2
slave1
slave2
slave3
slave4
slave5
【指定所有的DataNode节点列表,每行一个节点名称】
五、启动集群
1、启动Zookeeper集群
在usr/local/zk/bin 目录下
执行启动命令:zkServer.sh start
# 验证Zookeeper是否启动成功1
查看状态命令:zkServer.sh status
在 master1上查看 zookeeper 的状态发现是 leader
在其他的机器上查看 zookeeper 的状态发现是 follower
#验证Zookeeper是否启动成功2
在usr/local/zk/bin 目录下
执行进入命令行命令:
zkCli.sh
Connecting to localhost:2181
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1]
出现这样的提示的话,那么 zookeeper 就启动成功了
2、格式化ZooKeeper集群,目的是在ZooKeeper集群上建立HA的相应节点。
在usr/local/hadoop/bin 目录下
执行命令: hdfs zkfc -formatZK
# 验证zkfc是否格式化成功
进入客户端 zkCli.sh
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha
[mycluster]
【格式化操作的目的是在ZK集群中建立一个节点,用于保存集群c1中NameNode的状态数据】
3、完全分布式 启动Hadoop(切记顺序不能乱)
# 在 master1,master2,slave1,slave2,slave3上分别启动 journalnode
[root@master1sbin]# ./hadoop-daemon.sh start journalnode
# 在master1,master2上分别格式化和启动namenode
从 master1和 master2中任选一个即可,这里选择的是 master1
[root@master1sbin]# ../bin/hdfs namenode –format
[root@master1sbin]# ./hadoop-daemon.sh start namenode
# 将master1上namenode的数据同步到master2中去,需要在master2上执行hadoop的命令
[root@rs227 sbin]# ../bin/hdfs namenode -bootstrapStandby
[root@rs227 sbin]# ./hadoop-daemon.sh start namenode
# 打开浏览器,访问master1跟master2的50070端口
如果都能访问到,说明你 namenode 启动成功了,并且这两个 namenode 都是 standby 状态
# namenode ( master1)转换成 active (这里不需要手动将 namenode 转换为 active 状态了,因为我们是交给 Zookeeper 管理,在后面会启动 ZooKeeperFailoverController )
# 启动所有的 datanodes(在master1上执行命令)
[root@master1sbin]# ./hadoop-daemons.sh start datanode
[root@master1sbin]# jps
25627 Jps
24037 NameNode
25168 DataNode
23343 JournalNode
29367 QuorumPeerMain
# 实验一下手动切换 namenode 的状态 (这里也不需要做, Zookeeper 管理的,自动切换,下面会讲到)
# yarn启动
[root@master1sbin]# ./start-yarn.sh
starting yarn daemons
# 访问master1的8088端口查看ResourceManager的UI界面
# 启动ZooKeeperFailoverController
#在master1上执行命令
[root@master1sbin]# ./hadoop-daemon.sh start zkfc
#在master2上执行命令
[root@master2 sbin]# ./hadoop-daemon.sh start zkfc
# 打开浏览器,再访问master1跟master2的50070端口
发现 master1变成 active 状态了,而 master2还是 standby 状态
# 验证HDFS是否好用
[root@master1sbin]# ../bin/hadoop fs -putyarn-daemon.sh /yting
[root@master1sbin]# ../bin/hadoop fs -ls /yting
Found 1 items
-rw-r–r– 3root supergroup 4278 2014-06-1018:29 /yting/yarn-daemon.sh
# 验证YARN是否好用
[root@master1bin]# pwd
/usr/local/adsit/yting/apache/hadoop/hadoop-2.2.0/bin
[root@master1bin]# ./hadoop jar../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar pi 10 100
…( 不重要的部分就省略了,能出这个值就是对的,虚拟机可能会卡着不动,也可能会卡死,属于正常现象,内存消耗比较大 )
Job Finished in 25.361 seconds
valueof Pi is 3.14800000000000000000
# 验证HA高可用性,是否自动故障转移
在master1节点active namenode上执行 jps ,确定namenode进程,kill 将其杀掉,之后刷新页面我们发现master2节点(原standy)自动变成了 active namenode。
六、安装hbase
按照上图下载正确的hbase版本(版本问题很重要,是很多错误的根源)
# Hbase-0.96.2-hadoop2(启动双HMaster的配置,master1是主HMaster,master2是从HMaster)
# 解压Hbase-0.96.2-hadoop2-bin.tar.gz
tar -zxvfhbase-0.96.2-hadoop2-bin.tar.gz
# 修改hbase-env.sh 文件
[root@master conf]# vi hbase-env.sh
export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=false
# 配置hbase-site.xml 文件
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value> <!– 这里必须跟 core-site.xml 中的配置一样 –>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/usr/local/hbase/tmp</value>
</property>
<property>
<name>hbase.master</name>
<value>60000</value> # 这里是对的,只配置端口,为了配置多个 HMaster
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master1,master2,slave1,slave2,slave3,slave4,slave5</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper/data</value>
</property>
</configuration>
# 配置regionservers
[root@master1conf]# vi regionservers
slave1
slave2
slave3
slave4
slave5
# 创建hdfs-site.xml的软连接
[root@master1conf]# ln /usr/local/hadoop/etc/hadoop/hdfs-site.xml hdfs-site.xml
# 启动hbase
[root@master1hbase-0.96.2-hadoop2]# ./bin/start-hbase.sh
[root@master1hbase-0.96.2-hadoop2]# jps
5131 Jps
4827 HRegionServer
4661 HMaster
6395 NodeManager
6272 DataNode
29849 QuorumPeerMain
# hbase shell 验证 1(查看hbase的版本跟状态)
hbase(main):003:0> list # 刚刚创建的表
hbase(main):004:0> version
0.96.2-hadoop2, r1581096, Mon Mar 24 16:03:18 PDT2014
hbase(main):005:0> status
5 servers, 0 dead, 0.8000 average load
# hbase shell 验证 2(建表插入数据获取数据实时)
hbase(main):006:0> create’test’,’id’,’info’
0 row(s) in 0.4706 seconds
=> Hbase::Table – test
hbase(main):007:0> put’test’,’1314520′,’info:yousmile’,’forever’
hbase(main):008:0> get ‘test,’1314520’
hbase(main):009:0> scan ‘test’
# 在master2上启动HMaster
[root@master2 bin]# ./hbase-daemon.sh start master
# 验证HMaster自动切换
# rs227上的日志查看
2014-07-03 15:43:47,798 INFO [master:rs227:60000] mortbay.log: StartedSelectChannelConnector@0.0.0.0:60010
2014-07-03 15:43:47,897 INFO [master:rs22760000]zookeeper.RecoverableZooKeeper: Node /hbase/master already exists and this isnot a retry
2014-07-03 15:43:47,898 INFO [master:rs227:60000]master.ActiveMasterManager: Adding ZNode for/hbase/backup-masters/rs227,60000,1402645426368 in backup master directory
2014-07-03 15:43:47,908 INFO [master:master2:60000] master.ActiveMasterManager:Another master is the active master, rs229,60000,1402645371520; waiting tobecome the next active master
这里说明zookeeper已经接管了,并且把master2作为一个备份的Hbase了,并且这里提示
waiting to become thenext active master (等待变成下一个活动的master),然后我们可以将master1上的hmaster进程给kill掉,当然,也可以使用 ./hbase-daemon.shstop master 来结束master1上的hmaster进程
只看红色标注的地方,意思就是说当我们 kill 掉 master1上的 hmaster 的时候, Nomaster available. Notifying waiting threads . A master is now available (找不到 master,唤醒等待的 hmaster 线程(认识 96 ),然后找到了等待的 hmaster ( master2)),然后 zookeeper 就接管并且将 master2上的 hmaster 从 等待 状态切换为 激活 状态了,然后就 ok 了。(当然也可以多开几个备用的 hmaster )