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.138hadoop01
192.168.1.139hadoop02
192.168.1.140hadoop03

 三个节点上均是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的相关信息:

hadoop1.2.1+zk-3.4.4+hbase-0.94.12集群安装_hbase-0.94.1

 

四,排错思路

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