hadoop1.2.1+zk-3.4.4+hbase-0.94.12集群安装
系统环境:
CentOS release 6.3 (Final)
软件版本:
hadoop1.2.1
zk-3.4.4
hbase-0.94.12
主机规划:
集群中包括3个节点:hadoop01为Master,其余为Salve,节点之间局域网连接,可以相互ping通
IP地址 | 节点名 |
192.168.1.138 | hadoop01 |
192.168.1.139 | hadoop02 |
192.168.1.140 | hadoop03 |
三个节点上均是CentOS6.3 x86_64系统,并且有一个相同的用户hadoop。hadoop01做为master配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;另外两台配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。安装目录统一为/usr/local下
二,准备工作,三台机器都需要做 ,将三台机器selinux,iptables停用。
1,安装jdk (jdk版本:jdk-7u25-linux-x64.rpm)
# ln -s jdk1.7.0_25 jdk 做软连接
# vim /etc/profile 配置java环境变量
export JAVA_HOME=/usr/java/jdk export JAVA_BIN=/usr/java/jdk/bin export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPAT
# source /etc/profile 让其java命令立即生效
2、做三台机器之间做双机互信,原因master通过远程启动datanode进程和tasktracker进程,如果不做双机互信,会导致每次启动集群服务都会需要密码
# vim /etc/hosts
192.168.1.138 hadoop01 192.168.1.139 hadoop02 192.168.1.140 hadoop03
将hosts文件分别复制到另外两台。
3、切换到hadoop用户,对其用做双机互信,先在三台机器先执行ssh-keygen生成公钥与私钥
[root@hadoop01 ~]# ssh-copy-id -i hadoop02
[root@hadoop01 ~]# ssh-copy-id -i hadoop03
[root@hadoop02 ~]# ssh-copy-id -i hadoop01
[root@hadoop02 ~]# ssh-copy-id -i hadoop03
[root@hadoop03 ~]# ssh-copy-id -i hadoop01
[root@hadoop03 ~]# ssh-copy-id -i hadoop02
ssh-copy-id: command not found 解决办法:
yum install openssh-clients -y
4、同步时间,三台机器启用ntpd服务,另外两台执行相同的操作
[root@hadoop01 ~]# crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp.api.bz &> /dev/null
三,配置master,也就hadoop01
[root@hadoop01 ~]# tar xf hadoop-1.2.1.tar.gz -C /usr/local/
修改hadoop-env.sh
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun export JAVA_HOME=/usr/java/jdk
修改core-site.xml
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> <property> <name>fs.default.name</name> <value>hdfs://hadoop01:9000</value> </property> </configuration>
hadoop.tmp.dir属性用于定义Hadoop的临时目录,其默认为/tmp/hadoop-${username}。HDFS进程的许多目录默认都在此目录中,/hadoop/tmp目录,需要注意的是,要保证运行Hadoop进程的用户对其具有全部访问权限。
fs.default.name属性用于定义HDFS的名称节点和其默认的文件系统,其值是一个URI,即NameNode的RPC服务器监听的地址(可以是主机名)和端口(默认为8020)。其默认值为file:///,即本地文件系统。
修改hdfs-site.xml文件
# vim conf/hdfs-site.xml
<configuration> <property> <name>dfs.data.dir</name> <value>/data/hadoop/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>
dfs.name.dir属性定义的HDFS元数据持久存储路径,默认为${hadoop.tmp.dir}/dfs/name
dfs.replication属性定义保存副本的数量,默认是保存3份,由于这里只有两台slave。所以设置2。
修改mapred-site.xml文件
# vim conf/mapred-site.xml
<configuration> <property> <name>mapred.job.tracker</name> <value>http://hadoop01:9001</value> </property> </configuration>
编辑masters文件
masters用于指定,辅助名称节点(SecondaryNameNode)的主机名或主机地址
[hadoop@hadoop01 hadoop-1.2.1]$ vim conf/masters
hadoop01
编辑slaves文件,这个文件只需在master主机上编辑就行
用于指定各从服务器(TaskTracker或DataNode)的主机名或主机地址
hadoop02
hadoop03
在三台机器上分别创建两个目录:
# mkdir -p /hadoop/data
# mkdir -p /hadoop/tmp
配置slave:将配置的hadoop整个目录复制到hadoop02,hadoop03
# scp -rp /usr/local/hadoop-1.2.1 hadoop02:/usr/local/
# scp -rp /usr/local/hadoop-1.2.1 hadoop03:/usr/local/
四,启动集群:
1、格式化名称节点
与普通文件系统一样,HDFS文件系统必须要先格式化,创建元数据数据结构以后才能使用。
# bin/hadoop namenode -format
# bin/start-all.sh
# jps 查看进程是否起来。secondarynamenode,nomenode,jobtracker三个进程必须都有,才正常。
8549 SecondaryNameNode
8409 NameNode
8611 JobTracker
8986 Jps
或者这种方式查看集群是否正常
[hadoop@hadoop01 hadoop-1.2.1]$ bin/hadoop dfsadmin -report
Safe mode is ON
Configured Capacity: 37073182720 (34.53 GB)
Present Capacity: 32421658624 (30.2 GB)
DFS Remaining: 32421576704 (30.19 GB)
DFS Used: 81920 (80 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 2 (2 total, 0 dead)
Name: 192.168.0.33:50010
Decommission Status : Normal
Configured Capacity: 18536591360 (17.26 GB)
DFS Used: 40960 (40 KB)
Non DFS Used: 2325061632 (2.17 GB)
DFS Remaining: 16211488768(15.1 GB)
DFS Used%: 0%
DFS Remaining%: 87.46%
Last contact: Sat Aug 31 22:25:13 CST 2013
Name: 192.168.0.32:50010
Decommission Status : Normal
Configured Capacity: 18536591360 (17.26 GB)
DFS Used: 40960 (40 KB)
Non DFS Used: 2326462464 (2.17 GB)
DFS Remaining: 16210087936(15.1 GB)
DFS Used%: 0%
DFS Remaining%: 87.45%
Last contact: Sat Aug 31 22:25:12 CST 2013
测试集群:
# bin/hadoop jar hadoop-test-1.2.1.jar DFSCIOTest -write -nrFiles 10 -filesize 1000
# bin/hadoop jar hadoop-test-1.2.1.jar DFSCIOTest -read -nrFiles 10 -filesize 1000
hadoop默认监听的端口:
Hadoop进程监听的地址和端口
Hadoop启动时会运行两个服务器进程,一个为用于Hadoop各进程之间进行通信的RPC服务器,另一个是提供了便于管理员查看Hadoop集群各进程相关信息页面的HTTP服务器。
可用于定义各HTTP服务器的属性有如下几个:
dfs.http.address:NameNode的HTTP服务器地址和端口,默认为0.0.0.0:50070;
dfs.secondary.http.address:SecondaryNameNode的HTTP服务器地址和端口,默认为0.0.0.0:50090;
mapred.job.tracker.http.addrss:JobTracker的HTTP服务器地址和端口,默认为0.0.0.0:50030;
dfs.datanode.http.address:DataNode的HTTP服务器地址和端口,默认为0.0.0.0:50075;
mapred.task.tracker.http.address:TaskTracker的HTTP服务器地址和端口,默认为0.0.0.0:50060;上述的HTTP服务器均可以通过浏览器直接访问以获取对应进程的相关信息,访问路径为http://Server_IP:Port。如namenode的相关信息:
四,排错思路
1,是否是hadoop.tmp.dir,dfs.data.dir属性,如果定义在别的目录需要在集群中所有节点都创建,并让hadoop用户能够访问
2,查看进程对应的端口是否有在监听。在上面配置中将namenode的端口定义9000,jobtracker定义成9001
[hadoop@hadoop01 hadoop-1.2.1]$ netstat -tunlp |grep 9000
tcp 0 0 ::ffff:192.168.0.31:9000 :::* LISTEN 22709/java
[hadoop@hadoop01 hadoop-1.2.1]$ netstat -tunlp |grep 9001
tcp 0 0 ::ffff:192.168.0.31:9001 :::* LISTEN 22924/java
3,查看日志,哪个服务没起来就查看对应的日志。
4,查看集群中所有节点的时间是不是一致。
5,iptable与selinux是否阻止。
6,/etc/hosts是否正确。
五,添加节点,删除节点
添加节点
1.修改host
和普通的datanode一样。添加namenode的ip
2.修改namenode的配置文件conf/slaves
添加新增节点的ip或host
3.在新节点的机器上,启动服务
[hadoop@hadoop04 hadoop]# ./bin/hadoop-daemon.sh start datanode
[hadoop@hadoop04 hadoop]# ./bin/hadoop-daemon.sh start tasktracker
4.均衡block
[hadoop@hadoop04 hadoop]# ./bin/start-balancer.sh
1)如果不balance,那么cluster会把新的数据都存放在新的node上,这样会降低mapred的工作效率
2)设置平衡阈值,默认是10%,值越低各节点越平衡,但消耗时间也更长
[root@slave-004 hadoop]# ./bin/start-balancer.sh -threshold 5
3)设置balance的带宽,默认只有1M/s
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>1048576</value>
<description>
Specifies the maximum amount of bandwidth that each datanode
can utilize for the balancing purpose in term of
the number of bytes per second.
</description>
</property>
注意:
1. 必须确保slave的firewall已关闭;
2. 确保新的slave的ip已经添加到master及其他slaves的/etc/hosts中,反之也要将master及其他slave的ip添加到新的slave的/etc/hosts中
删除节点
1.集群配置
修改conf/hdfs-site.xml文件
<property>
<name>dfs.hosts.exclude</name>
<value>/data/soft/hadoop/conf/excludes</value>
<description>Names a file that contains a list of hosts that are
not permitted to connect to the namenode. The full pathname of the
file must be specified. If the value is empty, no hosts are
excluded.</description>
</property>
2确定要下架的机器
dfs.hosts.exclude定义的文件内容为,每个需要下线的机器,一行一个。这个将阻止他们去连接Namenode。如:
haoop04
3.强制重新加载配置
[root@master hadoop]# ./bin/hadoop dfsadmin -refreshNodes
它会在后台进行Block块的移动
4.关闭节点
等待刚刚的操作结束后,需要下架的机器就可以安全的关闭了。
[root@master hadoop]# ./bin/ hadoop dfsadmin -report
可以查看到现在集群上连接的节点
正在执行Decommission,会显示:
Decommission Status : Decommission in progress
执行完毕后,会显示:
Decommission Status : Decommissioned
5.再次编辑excludes文件
一旦完成了机器下架,它们就可以从excludes文件移除了
登录要下架的机器,会发现DataNode进程没有了,但是TaskTracker依然存在,需要手工处理一下
六,安装zookeeper:
1,zookeeper概述:
ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务――分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
hadoop01为zookeeper1,hadoop02为zookeeper2,hadoop03为zookeeper3
2、下载zookeeper-3.4.4解压到/usr/local/下,并修改权限
# vim conf/zoo.cfg
dataDir=/hadoop/zookeeper # the port at which the clients will connect clientPort=2181 server.1=hadoop01:28888:38888 server.2=hadoop02:28888:38888 server.3=hadoop03:28888:38888
注解:
tickTime发送心跳时间间隔,单位毫秒
initlimit和sysnclimit,两者都是以ticktime的总数进行度量(上面的时间为10*2000=20s)。initLimit参数设定了允许所有跟随者与领导者进行连接并同步的时间,如果在设定的时间内内,半数以上的跟随者未能完成同步,领导者便会宣布放弃领导地位,然后进行另外一次领导 者选举。如果这种情况经常发生,通过查看日志中的记录发现,则表明设定的值太小。
syscLimit参数设定了允许一个跟随者与领导者进行同步的时间。如果在设定的时间内,一个跟随者未能完成同步,它将会自己重启,所有关联到这个跟随者的客户端将连接到另外一个跟随者。
datadir保存的zk中持久化的数据,zk中存在两种数据,一种用完即消失,一种需要持久存在,zk的日志也保存在这
# mkdir /hadoop/zookeeper/
# echo "1" > /hadoop/zookeerper/myid
hadoop02,hadoop03 相应的节点创建myid
在对应的节点上启动服务
[hadoop01 zookeeper-3.4.4]$ sh bin/zkServer.sh start
三个节点启动完之后,查看
[hadoop01 zookeeper-3.4.4]$ jps
1320 NameNode
2064 Jps
1549 JobTracker
1467 SecondaryNameNode
1996 QuorumPeerMain
[hadoop@hadoop01 zookeeper-3.4.4]$ sh bin/zkServer.sh status 查看当前节点是否是leader
[hadoop@hadoop01 zookeeper-3.4.4]$ sh bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.4/bin/../conf/zoo.cfg
Mode: follower 表示是跟从
参考文档:
http://smalldeng.blog.51cto.com/1038075/1329290
http://qindongliang.iteye.com/blog/1977053