Hadoop集群搭建
搭建文档:
https://pan.baidu.com/s/1dPUHiwhcDNrMsKNIgOjj0Q
一、实验环境
虚拟机数量:3台
操作系统:Ubuntu 14.04
Hadoop:Hadoop 2.6.5
Java:java version "1.7.0_51"
二、实验内容及步骤
为方便阐述,本实验只搭建一个有三台主机的小集群。
三台机器的具体分工命名如下:
IP |
主机名 |
功能角色 |
10.49.23.127 |
Master |
namenode(控制节点)、JobTracker(工作分配) |
10.49.23.134 |
slave1 |
datanode(数据节点)、TaskTracker(任务执行) |
10.49.23.129 |
slave2 |
datanode(数据节点)、TaskTracker(任务执行) |
(一)JDK安装
1、解压
tar –zxvf jdk-7u67-linux-x64.tar.gz
2、修改/etc/profile文件
(1)vim /etc/profile
文件末尾加:
export JAVA_HOME=/home/ubuntu/jdk1.7.0_51
export JRE_HOME=/home/ubuntu/jdk1.7.0_51/jre
export PATH=$PATH:/home/ubuntu/jdk1.7.0_51/bin
export CLASSPATH=./:/home/ubuntu/jdk1.7.0_51/lib
图1-2
(2)使/etc/profile文件生效:
source /etc/profile
(3)验证JDK安装成功:
java –version
图1-4
(4)按此步骤在集群剩余服务器中配置好JDK
(二)SSH安装
1、单台安装ssh.
(1)apt-get install ssh.
(2)进入.ssh目录下面,在每台机器上执行:ssh-keygen -t dsa 之后一路回车,产生密钥;如果没有.ssh目录则在/home文件mkdir .ssh
图2-1
(3)完成第二步后会产生两个文件:
id-dsa #私钥
id-dsa.pub #公钥
(4)在第一台机器的目录.ssh下执行命令,cat id_dsa.pub >> authorized_keys;此后.ssh下面会出现authorized_keys文件。
(5)然后将第一台机器的.ssh目录下面的authorized_keys文件拷贝到第二台计算机的.ssh目录下,如:scp authorized_keys slaver1:~/.ssh/
(6)再转到第二台机器的.ssh目录下,会发现刚刚传输过来的文件-authorized_keys,然后执行命令,将第二台计算机的公钥也加进来,如:cat id_dsa.pub >> authorized_keys.
(7)将第二台计算机新生成的authorized_keys传输第三台计算机,将第三台计算机的公钥-id-rsa.pub添加到从第二台计算机传过来的authorized_keys里面。
(8)依次类推,直至集群中的最后一台计算机。
(9)在集群的最后一台计算机执行完添加后,生成的authorized_keys文件就包含集群中所有计算机的公钥,如果以后还有机器加进到集群中来,可以直接添加到文件-authorized_keys。最后,将最后生成的authorized_keys复制到集群中的每一台计算机的.ssh目录下,覆盖掉之前的authorized_keys。
(10)完沉第九步后,就可以在集群中任意一台计算机上,免密码ssh登录到其他计算了。
(三)Hadoop搭建
1.在三台主机上分别设置/etc/hostname:vim /etc/hostname修改为对应的master或slave。hosts文件用于定义主机名与IP地址之间的对应关系(三台主机配置相同)。
修改/etc/hosts:vim /etc/hosts
图3-1
三台hadoop文件配置相同,所以配置完一台后,可以把整个hadoop复制过去就行了,现在开始配置master主机的hadoop文件。
2.需要配置的文件涉及到的有7个(mapred-site.xml.tmplate除外)如下图标示部分:
mapred-site.xml默认不存在的,可以复制相应的template文件获得。
(1)配置文件1:hadoop-env.sh
修改JAVA_HOME值如下图:
图3-3
(2)配置文件2:yarn-env.sh
末尾添加JAVA_HOME值如下图:
图3-4
(3)配置文件3:slaves(保存所有slave节点)删除localhost写入slave1,slave2:
图3-5
(4)配置文件4:core-site.xml
添加配置内容如下图:
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/software/hdfs_all/tmp</value>
</property>
图3-6
(5)配置文件5:hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 以下两个参数可以不进行配置,在2.20版本中只要在core-site.xml
文件中指定了hadoop.tmp.dir以下目录会自动生成在tmp目录中,但是为
了维护方便,有必要将其路径明确指定在配置文件中 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/software/hdfs_all/dfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>file:/home/software/hdfs_all/dfs/data</value>
</property>
图3-7
(6)配置文件6:mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
图3-8
(7)配置文件7:yarn-site.xml
<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.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
图3-9
上面配置完毕后,基本上完成了90%的工作,剩下的就是复制。我们可以把整个hadoop复制过去使用命令如下:
scp -r hadoop-2.6.5/ slave1:/home/
scp -r hadoop-2.6.5/ slave2:/home/
为方便用户和系统管理使用hadoop、hdfs相关命令,需要在/etc/environment配置系统环境变量,使用命令:vim /etc/environment
配置内容为hadoop目录下的bin、sbin路径,具体如下
图3-10
添加完后执行生效命令:source /etc/environment
下面要做的就是启动验证,建议在验证前,把以上三台机器重启,使其相关配置生效。
(四)启动验证
在maser节点格式化namenode:
hadoop namenode -format
启动hadoop:
start-all.sh
使用Jps命令master有如下进程,说明配置正确
图4-1
使用Jps命令slave1、slave2有如下进程,说明配置正确
图4-2
查看分布式文件系统:http://master:50070
图4-3
查看MapReduce:http://master:8088
Zookeeper的安装与配置
实验学时1学时
虚拟机个数:3
实验环境:Ubuntu14.04系统,3台虚拟机
一、 实验目的
1 .可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。
2 .实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
3.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
4.原子性:更新只能成功或者失败,没有中间状态。
5 .顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
二、实验原理
Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题. Zookeeper 的核心是广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播 模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后, 恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。为了保证事务的顺序一致性,zookeeper采用了递增的事务id号 (zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用 来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递 增计数。
三、实验内容
在三台ubuntu系统中搭建好Zookeeper
四、实验指导
1、解压zooker-3-4-5.tar.gz
解压:# tar -zxf zookeeper-3.4.5.tar.gz
更改名字为zookeeper:# mv zookeeper-3.4.5 u-zookeeper
2、修改zoo.cfg配置文件
在Zookeeper集群环境下只要一半以上的机器正常启动了,那么Zookeeper服务将是可用的。因此,集群上部署Zookeeper最好使用奇数台机器,这样如果有5台机器,只要3台正常工作则服务将正常。
下面我们将对Zookeeper的配置文件的参数进行设置
进入到u-zookeeper的conf目录下将zoo_sample.cfg文件拷贝一份,命名为为:zoo.cfg
进入目录: # cd u-zookeeper/conf
拷贝
命名:# mv zoo_sample.cfg zoo.cfg
vim zoo.cfg修改内容如下:
配置文件里面的目录需要自己创建
4、# vim /etc/environment
5、远程复制分发安装文件
接下来将上面的安装文件拷贝到集群中的其他机器上对应的目录下:
在master节点/roor/u-zookeeper/data/里面创建myid文件
echo "1" > /roor/u-zookeeper/data/myid
同理拷贝/etc/profile,/etc/environment至slaver1,slaver2中,拷贝完成后修改对 应的机器上的myid。例如修改slaver1中的myid如下:
echo "2" > /roor/u-zookeeper/data/myid
cat /roor/u-zookeeper/data/myid
结果: 2
Slaver2中的myid如下:
echo "3" > /roor/u-zookeeper/data/myid
cat /roor/u-zookeeper/data/myid
结果: 3
以上操作完成后,请所有节点服务器重启。
6、启动zookeeper集群
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本:zkServer.sh start
如下图所示:
其中,QuorumPeerMain是zookeeper进程,启动正常。
如上依次启动了所有机器上的Zookeeper之后可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower),如下所示,是在ZooKeeper集群中的每个结点上查询的结果:
通过上面状态查询结果可见,slaver1是集群的Leader,其余的两个结点是Follower
另外,可以通过客户端脚本,连接到ZooKeeper集群上。对于客户端来说,ZooKeeper是一个整体(ensemble),连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接,例如:
7、停止zookeeper进程
# zkServer.sh stop
至此,Zookeeper集群安装完成!
4、HBase的安装和配置
# tar -zxvf hbase-0.96.0.tar.gz
更改名字为hbase:mv hbase-0.96.0 /soft/hbase
4.1 配置conf/hbase-env.sh
图4-1 配置HBase配置文件
图4-2 配置HBase配置文件
export JAVA_HOME==/usr/lib/jvm/jdk1.7.0_51
export HBASE_CLASSPATH=~/u/etc/hadoop
export HBASE_PID_DIR=/soft/hbase/pids
修改:
export HBASE_MANAGES_ZK=false
一个分布式运行的Hbase依赖一个zookeeper集群。所有的节点和客户端都必须能够访问zookeeper。默认的情况下Hbase会管理一个zookeep集群,即Hbase默认自带一个zookeep集群。这个集群会随着Hbase的启动而启动。而在实际的商业项目中通常自己管理一个zookeeper集群更便于优化配置提高集群工作效率,但需要配置Hbase。需要修改conf/hbase-env.sh里面的HBASE_MANAGES_ZK 来切换。这个值默认是true的,作用是让Hbase启动的时候同时也启动zookeeper.在本实验中,我们采用独立运行zookeeper集群的方式,故将其属性值改为false。
4.2 配置conf/hbase-site.xml
配置效果图如下:
图4-3 hbase-site.xml配置文件
要想运行完全分布式模式,加一个属性 hbase.cluster.distributed 设置为 true 然后把 hbase.rootdir 设置为HDFS的NameNode的位置
hbase.rootdir:这个目录是region server的共享目录,用来持久化Hbase。URL需要是'完全正确'的,还要包含文件系统的scheme
hbase.cluster.distributed :Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面。
在hbase-site.xml配置zookeeper:当Hbase管理zookeeper的时候,你可以通过修改zoo.cfg来配置zookeeper,对于zookeepr的配置,你至少要在 hbase-site.xml中列出zookeepr的ensemble servers,具体的字段是 hbase.zookeeper.quorum.在这里列出Zookeeper集群的地址列表,用逗号分割。
hbase.zookeeper.property.clientPort:ZooKeeper的zoo.conf中的配置,客户端连接的端口。
hbase.zookeeper.property.dataDir:ZooKeeper的zoo.conf中的配置。
对于独立的Zookeeper,要指明Zookeeper的host和端口。需要在 hbase-site.xml中设置。
4.3 配置conf/regionservers
写入:slaver1、slaver2
图4-4 配置集群信息
在这里列出了你希望运行的全部 HRegionServer,一行写一个host (就像Hadoop里面的 slaver 一样). 列在这里的server会随着集群的启动而启动,集群的停止而停止。
4.4 hadoop配置文件拷入
# cp ~/u/etc/hadoop/hdfs-site.xml /soft/hbase/conf
# cp ~/u/etc/hadoop/core-site.xml /soft/hbase/conf
4.5 分发hbase
# scp -r /soft/hbase slaver1:/soft/hbase
# scp -r /soft/hbase slaver2:/soft/hbase
4.6 运行和测试
在master上执行:
(1)、# start-dfs.sh
(2)、# start-yarn.sh
(3)、# zkServer.sh start(各个节点均执行)
(4)、# start-hbase.sh (涵盖web管理界面的启动)
使用jps查看进程,在master上:
图4-5 master进程列表
图4-6 从节点进程列表
图4-7 从节点进程列表
通过浏览器查看60010,60030端口查看(端口号改成了16010和16030)
http://192.168.60.190:60010/
图4-8 浏览器主节点信息
http://192.168.60.199:60030/rs-status
图4-9 浏览器从节点信息
4.7 多节点启动HMaster
root@master:/soft/hbase/bin# hbase-daemon.sh start master
在其他子节点同时启动HMaster
可以做等待备份作用;
5、HBase简单操作
Hbase脚本
启动:hbase shell
图5-1 启动HBase
(1) status命令
hbase(main):008:0> status
1 servers, 0 dead, 3.0000 average load
(2) version命令
hbase(main):007:0> version
0.94.12, r1524863, Fri Sep 20 00:25:45 UTC 2013
(3) create 命令
创建一个名为 test 的表,这个表只有一个列为 cf。其中表名、列都要用单引号括起来,并以逗号隔开。
hbase(main):001:0> create 'test', 'cf'
0 row(s) in 10.3830 seconds
(4) list 命令
查看当前 HBase 中具有哪些表。
hbase(main):009:0> list
TABLE
test
1 row(s) in 0.3590 seconds
6、备注
问题解决:
1、在安装完HBase后,启动hbase时会报slf4j-log4j的错误,这是因为hadoop的slf4j-log4j与HBase中的slf4j-log4j启冲突。
2、在web上查看HBase时,之前用的时:
但是存在问题,不能打开页面进行查看HBase里边的信息。是因为在HBase1.X之后的版本中端口号改成了16010和16030。
运行PI实例:
root@master:/home/hadoop-2.6.5/share/hadoop/mapreduce# hadoop jar hadoop-mapreduce-examples-2.6.5.jar pi 2 10