集群环境至少需要3个节点(也就是3台服务器设备):1个Master,2个Slave,节点之间局域网连接,可以相互ping通,下面举例说明,配置节点IP分配如下:
Hostname | IP | User | Password |
---|---|---|---|
master | 192.168.59.133 | hadoop | 123456 |
slave1 | 192.168.59.134 | hadoop | 123456 |
slave2 | 192.168.59.135 | hadoop | 123456 |
CentOS 6.5
系统,为了便于维护,集群环境配置项最好使用相同用户名、用户密码、相同hadoop、hbase、zookeeper目录结构。/etc/sysconfig/network
文件来修改 hostname 。jdk-8u51-linux-x64.rpm
文件直接安装:
1 |
$ rpm -ivh jdk-8u51-linux-x64.rpm |
修改配置文件 vim /etc/profile
:
1 |
export JAVA_HOME=/usr/java/jdk1.8.0_51 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar |
然后重新加载配置文件使之生效:
1 |
$ source /etc/profile |
分别在三个节点上添加hosts映射关系:
1 |
$ vim /etc/hosts |
添加的内容如下:
1 |
192.168.59.133 master 192.168.59.134 slave1 192.168.59.135 slave2 |
CentOS默认安装了ssh,如果没有你需要先安装ssh 。
集群环境的使用必须通过ssh无密码登陆来执行,本机登陆本机必须无密码登陆,主机与从机之间必须可以双向无密码登陆,从机与从机之间无限制。
2.3.1 设置master无密码自登陆
主要有三步:①生成公钥和私钥、②导入公钥到认证文件、③更改权限
1 |
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 700 ~/.ssh && chmod 600 ~/.ssh/* |
测试,第一次登录可能需要yes确认,之后就可以直接登录了:
1 |
$ ssh localhost Last login: Sat Jul 18 22:57:44 2015 from localhost |
对于 slave1 和 slave2,进行无密码自登陆设置,操作同上。
2.3.2 设置主机->从机的无密码登录
1 |
$ cat ~/.ssh/id_rsa.pub | ssh hadoop@slave1 'cat - >> ~/.ssh/authorized_keys' |
1 |
$ cat ~/.ssh/id_rsa.pub | ssh hadoop@slave2 'cat - >> ~/.ssh/authorized_keys' |
测试:
1 5 |
[hadoop@master ~]$ ssh hadoop@slave1 Last login: Sat Jul 18 23:25:41 2015 from master [hadoop@master ~]$ ssh hadoop@slave2 Last login: Sat Jul 18 23:25:14 2015 from master |
2.3.3 设置从机->主机的无密码登录
分别在slave1、slave2上执行:
1 |
$ cat ~/.ssh/id_rsa.pub | ssh hadoop@master 'cat - >> ~/.ssh/authorized_keys' |
这里会将hadoop、hbase、zookeeper的安装包都解压到/home/hadoop/
个人主文件夹下,并重命名为hadoop、hbase、zookeeper。
配置文件都在~/hadoop/etc/
目录下
3.1.1 core-site.xml
1 5 |
<configuration> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> </configuration> |
3.1.2 hadoop-env.sh
添加JDK路径:
1 |
export JAVA_HOME=/usr/java/jdk1.8.0_51 |
3.1.3 hdfs-site.xml
1 5 9 13 |
<configuration> <property> <name>dfs.name.dir</name> <value>/home/hadoop/hadoop/name</value> </property> <property> <name>dfs.data.dir</name> <value>/home/hadoop/hadoop/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration> |
3.1.4 mapred-site.xml
1 5 |
<configuration> <property> <name>mapred.job.tracker</name> <value>master:9001</value> </property> </configuration> |
3.1.5 修改masters文件
1 |
master |
3.1.6 修改slaves文件
1 |
slave1 slave2 |
注意:三台机器上都进行相同的配置,都放在相同的路径下。
使用scp
命令进行从本地到远程(或远程到本地)的文件拷贝操作:
1 |
scp -r /home/hadoop/hadoop slave1:/home/hadoop scp -r /home/hadoop/hadoop slave2:/home/hadoop |
进入master的~/hadoop
目录,执行以下操作:
1 |
$ bin/hadoop namenode -format |
格式化namenode,第一次启动服务前执行的操作,以后不需要执行。
然后启动hadoop:
1 |
$ sbin/start-all.sh |
通过jps
命令能看到除jps外有5个进程:
1 5 |
$ jps NodeManager NameNode Jps SecondaryNameNode ResourceManager DataNode |
解压zookeeper-3.3.2.tar.gz并重命名为zookeeper。
进入~/zookeeper/conf
目录:
1 |
$ cp zoo_sample.cfg zoo.cfg |
拷贝zoo_sample.cfg
文件为zoo.cfg
,并编辑如下:
1 5 |
dataDir=/home/hadoop/zookeeper/data server.1=192.168.59.133:2888:3888 server.2=192.168.59.134:2888:3888 server.3=192.168.59.135:2888:3888 |
在dataDir目录下新建myid文件,输入一个数字(master为1
,slave1为2
,slave2为3
):
1 |
$ mkdir /home/hadoop/zookeeper/data $ echo "1" > /home/hadoop/zookeeper/data/myid |
同样使用scp
命令进行远程复制,只不过要修改每个节点上myid
文件中的数字。
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本:
1 |
$ ~/zookeeper/bin/zkServer.sh start |
如果启动报类似异常:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/192.168.0.178:3888 是可以忽略的,因为该服务启动时会尝试连接所有节点,而其他节点尚未启动。通过后面部分可以看到,集群在选出一个Leader后,最后稳定 了。其他结点可能也出现类似问题,属于正常。
关闭防火墙。在hadoop集群环境(linux系统)中最好关闭防火墙,不然会出现很多问题,例如namenode找不到datanode等。如果不关闭防火墙,客户端使用API操作HDFS以及ZooKeeper,可能就会出现下面常见的两种异常:
使用root权限登陆后,输入关闭防火墙命令:
1 |
$ /etc/init.d/iptables stop $ service iptables stop |
修改禁用selinux: /etc/selinux/config文件,设置"SELINUX=disabled"
解压hbase-1.0.1.1-bin.tar.gz并重命名为hbase。
1 |
export JAVA_HOME=/usr/java/jdk1.8.0_51 export HBASE_CLASSPATH=/home/hadoop/hadoop/etc/hadoop/ export HBASE_MANAGES_ZK=false |
1 5 9 13 17 21 25 29 |
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> </property> <property> <name>hbase.master</name> <value>master</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property> <property> <name>zookeeper.session.timeout</name> <value>60000000</value> </property> <property> <name>dfs.support.append</name> <value>true</value> </property> </configuration> |
在 regionservers 文件中添加slave列表:
1 |
slave1 slave2 |
5.4 分发并同步安装包
将整个hbase安装目录都拷贝到所有slave服务器:
1 |
$ scp -r /home/hadoop/hbase slave1:/home/hadoop $ scp -r /home/hadoop/hbase slave2:/home/hadoop |
1. 启动ZooKeeper
~/zookeeper/bin/zkServer.sh start
2. 启动hadoop
~/hadoop/sbin/start-all.sh
3. 启动hbase
~/hbase/bin/start-base.sh
4. 启动后,master上进程和slave进程列表
1 5 |
[hadoop@master ~]$ jps Jps SecondaryNameNode # hadoop进程 NameNode # hadoop master进程 ResourceManager # hadoop进程 HMaster # hbase master进程 QuorumPeerMain # zookeeper进程 |
1 5 |
[hadoop@slave1 ~]$ jps Jps QuorumPeerMain # zookeeper进程 DataNode # hadoop slave进程 HRegionServer # hbase slave进程 |
5. 进入hbase shell进行验证
1 5 9 13 |
[hadoop@master ~]$ hbase/bin/hbase shell 2015-07-20 00:42:11,725 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 1.0.1.1, re1dbf4df30d214fca14908df71d038081577ea46, Sun May 17 12:34:26 PDT 2015 hbase(main):001:0> list TABLE row(s) in 1.6950 seconds => [] hbase(main):002:0> status servers, 0 dead, 1.0000 average load hbase(main):003:0> |