这两天正在为公司配置一个Hadoop集群(以及HBase),作为存储及计算海量数据的平台。现在将安装的过程贴出来,仅供参考。
Hadoop的配置
-
集群的物理配置情况
集群IP: 172.16.38.213 ~ 172.16.38.218
(hostname分别为master、slave0、slave1、slave2、slave3、slave4)
用户名/密码:root/123456
其中,master作为jobtracker和namenode,其余节点作为tasktracker和datanode
-
节点角色分配
修改每个节点的 /etc/hosts文件,追加如下内容
172.16.38.213 master
172.16.38.214 slave0
172.16.38.215 slave1
172.16.38.216 slave2
172.16.38.217 slave3
172.16.38.218 slave4
再修改每个节点自己的hostname,如对于master,将其/etc/sysconfig/network文件改为
NETWORKING=yes
HOSTNAME=master
然后,运行
hostname master
退出,再进入输入env | grep hostname发现修改生效
-
为每个节点设置无密码ssh登录
1、 在master节点上运行
ssh-keygen –t rsa
2、 在master节点上,首先
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
然后
chmod 644 ~/.ssh/authorized_keys
3、将master节点上的~/.ssh/id_rsa.pub文件分别scp到每个slave节点上,如
scp ~/.ssh/id_rsa.pub root@slave0:/home
4、 登录每个slave节点,运行(以slave0为例)
cat /home/id_rsa.pub >> ~/.ssh/authorized_keys
5、 修改文件权限
chmod 600 ~/.ssh/authorized_keys
6、从第3步开始循环,直至配置好每个slave节点
-
下载Hadoop
下载hadoop-1.1.2,放在/home/LTE目录下,用命令 tar zxvf hadoop-1.1.2.tar.gz解压,在/home/LTE下生成目录hadoop-1.1.2
-
修改HADOOP的配置文件
修改conf/core-site.xml文件
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:54310</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/LTE/hadoop/tmp</value>
</property>
</configuration>
在conf/hadoop-env.xml文件里增加
export JAVA_HOME=/usr/local/java/jdk1.6.0_32
修改conf/hdfs-site.xml文件:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/LTE/hadoop/data</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/LTE/hadoop/name</value>
</property>
</configuration>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/LTE/hadoop/temp</value>
</property>
</configuration>
conf/masters文件
master conf/slaves文件
slave0
slave1
slave2
slave3
slave4
从master节点上,将/home/LTE目录依次拷贝到每个slave节点的/home目录下
-
启动Hadoop
在master节点的/home/LTE/hadoop-1.1.2目录下进行HDFS的格式化
bin/hadoop namenode –format
格式化后,HDFS中的内容会全部丢失
然后,开启Hadoop集群
bin/start-all.sh
此时,Hadoop集群已经启动,可以提交运算的作业了。
HBase的配置
安装HBase时,不仅需要HBase本身,还需要ZooKeeper来提供、管理和协调分布式服务。在运行HBase之前,也需要先启动ZooKeeper服务。
另外,有些版本的HBase只能支持特定版本的Hadoop,如下表:
在本文中,采用了Hadoop-1.1.2,HBase-0.94.8,以及ZooKeeper-3.4.5
由于ZooKeeper采用了Paxos算法来进行选举,因此实际能够有效参与选举的节点数量是奇数。所以,我们在安装HBase和ZooKeeper时,只采用奇数个节点(本文采用5个节点,分别为master、slave0、slave1、slave2、slave3)。
安装ZooKeeper
将zookeeper-3.4.5.tar.gz在/home/LTE下解压,生成zookeeper-3.4.5目录。在/home/LTE/zookeeper-3.4.5/conf中,有zoo_sample.cfg文件,使用命令 cp zoo_sample.cfg zoo.cfg 命令生成 zoo.cfg配置文件。编辑zoo.cfg的内容,如下:
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/home/LTE/zookeeper # the port at which the clients will connect clientPort=2181 server.1=master:2888:3888 server.2=slave0:2888:3888 server.3=slave1:2888:3888 server.4=slave2:2888:3888 server.5=slave3:2888:3888 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1
为了让系统能够识别zoo.cfg中的server.id=host:port:port中的server.id,在master节点的/home/LTE/zookeeper中创建一个文件myid,里面只有一个数字1;同理,在slave0节点的/home/LTE/zookeeper中创建一个文件myid,里面只有一个数字2;以此类推…. 直至slave3节点。注意,这里id的范围是1~255 。以上配置(zookeeper以及zookeeper-3.4.5)要复制到集群中的每一个节点上去。
在/etc/profile的最后添加:
export HBASE_HOME=/home/LTE/hbase-0.94.8 export HADOOP_HOME=/home/LTE/hadoop-1.1.2 export ZK_HOME=/home/LTE/zookeeper-3.4.5 export JAVA_HOME=/usr/local/java/jdk1.6.0_32 export CLASSPATH=$CLASSPATH:$HBASE_HOME/lib:$JAVA_HOME/lib export PATH=$JAVA_HOME/bin:$HBASE_HOME/bin:$ANT_HOME/bin:$HADOOP_HOME/bin:$ZK_HOME/bin:$PATH
然后,source /etc/profile
这个操作要在集群的每一个节点上进行
启动ZooKeeper
在每一个节点的/home/LTE/zookeeper-3.4.5/bin中执行命令: ./zkServer.sh start
这样就启动了zookeeper集群中的各个节点。
输入命令./zkServer.sh status
可以查看当前节点在zookeeper集群中的角色是leader还是follower
安装HBase
将/home/LTE/hbase-0.94.8.tar.gz解压,生成/home/LTE/hbase-0.94.8。在hbase-0.94.8/lib中,原来有一个hadoop-core-1.0.4.jar文件,但是我们用的Hadoop的版本是hadoop-1.1.2,所以需要将hbase-0.94.8/lib/hadoop-core-1.0.4.jar替换成hadoop-1.1.2/hadoop-core-1.1.2.jar,否则会有冲突。
打开conf/hbase-env.sh文件,将其中最后一行改为:
export HBASE_MANAGES_ZK=false
这表示我们不使用hbase-0.94.8自带的zookeeper,而是使用我们刚才自己安装的zookeeper-2.3.4(具体指定使用哪个zookeeper是通过/etc/profile中的ZK_HOME变量来指定的)。
下面,打开conf/hbase-site.xml文件,添加以下内容:
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master:54310/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave0,slave1,slave2,slave3</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/LTE/zookeeper/dataDir</value> </property> </configuration>
其中,我们需要通过hbase.rootdir指定HDFS的一个namenode节点,并让HBase将数据写入HDFS中的一个目录(本例中就是hdfs://master:54310/hbase);hbase.zookeeper.quorum指定了哪些节点运行Quorum Peer(即QuorumPeerMain进程),个数需为奇数。
下面,打开文件conf/regionservers,添加以下内容:
slave0 slave1 slave2 slave3
该文件指定了HRegionServer进程将在哪些节点上运行。
以上配置需要在HBase的每一个节点中生效。
启动HBase
OK,现在HBase集群配置好了。我们来启动HBase。
进入$HBASE_HOME/bin目录下,输入命令
./start-hbase.sh
在HBase集群启动之后,键入命令
./hbase shell
启动HBase的控制台界面
我们可以在浏览器中查看HBase系统的运行状态,地址为http://172.16.38.213:60010/master-status,其中172.16.38.213是master所在节点的IP.
常见问题
HBase中的某个节点无法启动
这很可能是因为集群中各个节点的系统时间不一致(时间差超出了某个阈值),这是我们需要将几台机器间的时间调整一致。
我们可以将master作为时间服务器,让其他机器与master进行对时。
首先,在master上键入命令 service ntpd start 来开启master上的时间服务器。
等待几分钟后,在其他每一台机器上键入命令 ntpdate master 来与master进行对时