Hadoop2.6整合hbase1.1.0分布式环境搭建
环境准备
三台机器Linux机器,这里使用CentOS-6.5-x86_64:
192.168.1.120 master
192.168.1.121 slave1
192.168.1.122 slave2
安装包准备
jdk-7u79-linux-x64.tar.gz
hadoop-2.6.0.tar.gz
hbase-1.1.0-bin.tar.gz
zookeeper-3.4.6.tar.gz
集群规划
主机名 |
IP |
安装软件 |
运行进程 |
master |
192.168.1.120 |
Hadoop、JDK、Zookeeper、HBase |
NameNode、QuorumPeerMain 、JournalNode、DFSZKFailoverController、HMaster、ResourceManager、DataNode、NodeManager |
slave1 |
192.168.1.121 |
Hadoop、JDK、Zookeeper、HBase |
NameNode、QuorumPeerMain 、JournalNode、DFSZKFailoverController、HMaster、HRegionServer、DataNode、NodeManager |
slave2 |
192.168.1.122 |
Hadoop、JDK、Zookeeper、HBase |
QuorumPeerMain 、JournalNode、HRegionServer、DataNode、NodeManager |
说明:
在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态。
系统基本环境配置
1) 修改主机名 :
vim /etc/sysconfig/network 文件,可以不修改,一旦修改了主机名后需要重启机器。
2) 配置静态 IP:
一般情况都建议配置使用静态IP,如果网络环境经常变动就没必要使用静态IP了。
vim/etc/sysconfig/network-scripts/ifcfg-eth0
重新启动网络服务:service network restart
3) 配置ip和主机名映射,vim /etc/hosts 文件。
可以通过scp 命令直接将文件同步到其它机器。
4) 创建用户和用户组
创建Hadoop用户组:groupadd Hadoop
创建hadoop用户,并添加到Hadoop组中:
设置用户密码: passwd hadoop
5) 关闭SELinux
修改selinux配置文件: vim /etc/selinux/config 文件。
修改完后需要重启机器,如果不想重启可以使用临时关闭命令:
其它机器做同样配置。
6) 集群SSH免密码登陆:
切换到hadoop用户,由于集群安装和启动使用hadoop用户身份,在配置免密码登陆时也必须使用hadoop用户。
ssh-keygen -t rsa 四次Enter键。
会在当前用户家目录下的隐藏文件夹.ssh目录下生产密匙:
cp id_rsa.pub authorized_keys
其它机器重复上述步骤。
配置master到slave1和slave2的免密码登陆:
master本机也需要免密码:
ssh-copy-id -i com.brian.hadoop.cloud.master
查看master的authorized_keys文件:
cat authorized_keys
master到slave1:
ssh-copy-id -i com.brian.hadoop.cloud.slave1
查看slave1的authorized_keys:
master到slave2:
ssh-copy-id -i com.brian.hadoop.cloud.slave2
查看slave2的authorized_keys文件:
由于需要配置Hadoop HA,另外一台机器也需要配置免密码登陆,配置slave1到master和slave2的免密码登陆:
slave1本机免密码:
ssh-copy-id -i com.brian.hadoop.cloud.slave1
slave1到master:
ssh-copy-id -i com.brian.hadoop.cloud.master
slave1到slave2:
ssh-copy-id -i com.brian.hadoop.cloud.slave2
测试:
在master机器上登陆到slave1和slave2:
ssh com.brian.hadoop.cloud.slave1
ssh com.brian.hadoop.cloud.slave2
同样的在slave1机器上登陆到master和slave2,没有提示输入密码即免密码配置完成。
安装目录规划及创建
1) Hadoop安装目录:
/opt/hadoop_cloud/Hadoop
2) Hadoop数据存放目录:
/apps/Hadoop
3) HBase安装目录:
/opt/hadoop_cloud/HBase
4) HBase数据存放目录:
/apps/HBase
5) Zookeeper安装目录:
/opt/hadoop_cloud/Zookeeper
6) Zookeeper数据存放目录:
/apps/Zookeeper/data
/apps/Zookeeper/dataLogs
目录结构:
7) JDK安装目录:
/opt/hadoop_cloud/JDK
8) 查看目录结构:
ll /opt/hadoop_cloud/
ll -R /apps/
9) 同步到其它机器:
scp -r /opt/hadoop_cloud/ com.brian.hadoop.cloud.slave1:/opt/
scp -r /apps/ com.brian.hadoop.cloud.slave1:/
scp -r /opt/hadoop_cloud/com.brian.hadoop.cloud.slave2:/opt/
scp -r /apps/ com.brian.hadoop.cloud.slave2:/
10) 修改目录权限:
chown hadoop:Hadoop -R /opt/hadoop_cloud/
chown hadoop:Hadoop -R /apps/
其它机器也需要修改权限。
11) 修改安装包用户权限:
chown hadoop:Hadoop *.gz
安装JDK
1) 解压jdk-7u79-linux-x64.tar.gz 到 /opt/hadoop_cloud/JDK 目录下:
tar -xf jdk-7u79-linux-x64.tar.gz -C /opt/hadoop_cloud/JDK/
2) 配置JDK环境变量:
在/etc/profile.d/ 目录下创建一个名为jdk_env.sh的shell脚本:
vim /etc/profile.d/jdk_env.sh
立即生效:source /etc/profile.d/jdk_env.sh
也可以直接修改/etc/profile文件,添加的内容是一样的。
3) 同步配置:
scp -r/opt/hadoop_cloud/JDK/jdk/ com.brian.hadoop.cloud.slave1:/opt/hadoop_cloud/JDK/
scp /etc/profile.d/jdk_env.shcom.brian.hadoop.cloud.slave1:/etc/profile.d/
scp -r/opt/hadoop_cloud/JDK/jdk/ com.brian.hadoop.cloud.slave2:/opt/hadoop_cloud/JDK/
scp /etc/profile.d/jdk_env.sh com.brian.hadoop.cloud.slave2:/etc/profile.d/
分别登陆到其它机器上进行以下操作:
立即生效:source /etc/profile.d/jdk_env.sh
4) 切换用户:
安装完JDK后,需要切换到hadoop用户来安装Hadoop相关组件。
安装配置Zookeeper
1) 解压 zookeeper-3.4.6.tar.gz 到/opt/hadoop_cloud/Zookeeper/:
tar -xf zookeeper-3.4.6.tar.gz -C /opt/hadoop_cloud/Zookeeper/
2) 复制Zookeeper配置文件:
cp zoo_sample.cfg zoo.cfg
3) 修改Zookeeper配置文件:
vim zoo.cfg
4) 创建myid文件:
在dataDir配置的目录下创建一个myid文件。
echo “1” > /apps/Zookeeper/data/myid
不同的主机上myid文件的内容是不同的。
5) 同步配置:
scp -r /opt/hadoop_cloud/Zookeeper/zookeeper-3.4.6/ com.brian.hadoop.cloud.slave1:/opt/hadoop_cloud/Zookeeper/
scp /apps/Zookeeper/data/myidcom.brian.hadoop.cloud.slave1:/apps/Zookeeper/data/
修改myid文件内容:
echo “2” > /apps/Zookeeper/data/myid
scp -r /opt/hadoop_cloud/Zookeeper/zookeeper-3.4.6/ com.brian.hadoop.cloud.slave2:/opt/hadoop_cloud/Zookeeper/
scp /apps/Zookeeper/data/myidcom.brian.hadoop.cloud.slave2:/apps/Zookeeper/data/
修改myid文件内容:
echo “3” > /apps/Zookeeper/data/myid
6) 防火墙开放端口(使用root用户):
iptables -I INPUT -d 192.168.1.120 -p tcp –dport 2181 -j ACCEPT
iptables -I INPUT -d 192.168.1.120 -p tcp –dport 2888 -j ACCEPT
iptables -I INPUT -d 192.168.1.120 -p tcp –dport 3888 -j ACCEPT
查看:iptables -nL
iptables -A OUTPUT -d 192.168.1.120 -p tcp –dport 2181 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.120 -p tcp –dport 2888 -j ACCEPT
iptables –A OUTPUT -d 192.168.1.120 -p tcp –dport 3888 -j ACCEPT
保存配置并重新启动服务:
service iptables save
service iptables restart
其它机器也要开放相应端口。
7) 启动Zookeeper服务(hadoop用户):
cd /opt/hadoop_cloud/Zookeeper/zookeeper-3.4.6/bin/
./zkServer.sh start
查看Zookeeper服务状态:
master: ./zkServer.sh status
slave1: ./zkServer.sh status
slave2: ./zkServer.sh status
Zookeeper配置完成。
安装配置Hadoop
1) 解压 hadoop-2.6.0.tar.gz 到/opt/hadoop_cloud/Hadoop/ 目录下:
tar -xf hadoop-2.6.0.tar.gz -C /opt/hadoop_cloud/Hadoop/
2) 配置core-site.xml:
vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hacluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/apps/Hadoop/tmp</value>
</property>
<property>
<name>io.native.lib.available</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>com.brian.hadoop.cloud.master:2181,com.brian.hadoop.cloud.slave1:2181,com.brian.hadoop.cloud.slave2:2181</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>false</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>simple</value>
</property>
</configuration>
3) 配置hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>hacluster</value>
</property>
<property>
<name>dfs.namenode.rpc.port</name>
<value>9000</value>
</property>
<property>
<name>dfs.ha.namenodes.hacluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.http-address.hacluster.nn1</name>
<value>com.brian.hadoop.cloud.master:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hacluster.nn1</name>
<value>com.brian.hadoop.cloud.master:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.hacluster.nn2</name>
<value> com.brian.hadoop.cloud.slave1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hacluster.nn2</name>
<value> com.brian.hadoop.cloud.slave1:9000</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value> qjournal://com.brian.hadoop.cloud.master:8485;com.brian.hadoop.cloud.slave1:8485;com.brian.hadoop.cloud.slave2:8485/hacluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value> /apps/Hadoop/journalnode</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hacluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value> file:/apps/Hadoop/dfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value> file:/apps/Hadoop/dfs/datanode</value>
</property>
<property>
<name>dfs.journalnode.http-address</name>
<value>0.0.0.0:8480</value>
</property>
<property>
<name>dfs.journalnode.rpc-address</name>
<value>0.0.0.0:8485</value>
</property>
4) 配置mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:19888</value>
</property>
<property>
<name>mapreduce.remote.os</name>
<value>Linux</value>
</property>
5) 配置yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>com.brian.hadoop.cloud.master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
6) 修改slaves文件:
7) 同步配置到其它机器:
scp –r /opt/hadoop_cloud/Hadoop/hadoop-2.6.0/ com.brian.hadoop.cloud.slave1:/opt/hadoop_cloud/Hadoop/
scp –r /opt/hadoop_cloud/Hadoop/hadoop-2.6.0/ com.brian.hadoop.cloud.slave2:/opt/hadoop_cloud/Hadoop/
8) 防火墙开放端口(root用户):
master和slave1防火墙开放端口一致,slave2略有不同,少了9000和50070端口
master、slave1:
iptables -I INPUT -d 192.168.1.120-p tcp –dport 9000 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 50070 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 50010 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 8485 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 8480 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 8031 -j ACCEPT
iptables -I INPUT -d 192.168.1.120 -p tcp –dport 8088 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 8042 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 10020 -j ACCEPT
iptables -I INPUT -d 192.168.1.120-p tcp –dport 19888 -j ACCEPT
iptables -A OUTPUT -d192.168.1.120 -p tcp –dport 9000 -j ACCEPT
iptables -A OUTPUT-d 192.168.1.120-p tcp –dport 50070 -j ACCEPT
iptables -A OUTPUT -d192.168.1.120 -p tcp –dport 50010 -j ACCEPT
iptables –A OUTPUT -d192.168.1.120 -p tcp –dport 8485 -j ACCEPT
iptables -A OUTPUT -d192.168.1.120 -p tcp –dport 8480 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.120-p tcp –dport 8031 -j ACCEPT
iptables -A OUTPUT -d192.168.1.120 -p tcp –dport 8088 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.121 -p tcp –dport 8042 -j ACCEPT
iptables -A OUTPUT -d192.168.1.120 -p tcp –dport 10020 -j ACCEPT
iptables -A OUTPUT -d192.168.1.120 -p tcp –dport 19888 -j ACCEPT
slave2:
iptables -I INPUT -d 192.168.1.122-p tcp –dport 8485 -j ACCEPT
iptables -I INPUT -d 192.168.1.122-p tcp –dport 8480 -j ACCEPT
iptables -I INPUT -d 192.168.1.122-p tcp –dport 8031-j ACCEPT
iptables -I INPUT -d 192.168.1.122 -p tcp –dport 8042 -j ACCEPT
iptables -I INPUT -d 192.168.1.122-p tcp –dport 50010 -j ACCEPT
iptables -I INPUT -d 192.168.1.122-p tcp –dport 10020 -j ACCEPT
iptables -I INPUT -d 192.168.1.122-p tcp –dport 19888 -j ACCEPT
iptables -A OUTPUT -d192.168.1.122 -p tcp –dport 8485 -j ACCEPT
iptables -A OUTPUT -d192.168.1.122 -p tcp –dport 8480 -j ACCEPT
iptables -A OUTPUT -d192.168.1.122 -p tcp –dport 8031 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.122 -p tcp –dport 8042 -j ACCEPT
iptables -A OUTPUT -d192.168.1.122 -p tcp –dport 50010 -j ACCEPT
iptables -A OUTPUT -d192.168.1.122 -p tcp –dport 10020 -j ACCEPT
iptables -A OUTPUT -d192.168.1.122 -p tcp –dport 19888 -j ACCEPT
保存更改:service iptables save
重启服务:service iptables restart
9) 配置Hadoop环境变量(root用户):
vim /etc/profile.d/hadoop_env.sh
立即生效:source /etc/profile.d/hadoop_env.sh
环境变量测试:hadoop version
同步到其它机器。
10) 启动journalnode(master上启动):
hadoop-daemons.sh start journalnode
在slave1上使用jps命令查看进程:
在slave2上使用jps查看进程:
Journalnode进程启动成功!
11) 格式化HDFS
在master上执行hdfs namenode –format:
看到以上信息说明格式化成功,格式化后会在根据core-site.xml中的hadoop.tmp.dir配置的目录下生产一些目录和文件。这里是/apps/Hadoop/ 目录:
将生产的目录拷贝到slave1的/apps/Hadoop/ 目录:
scp -r dfs/ com.brian.hadoop.cloud.slave1:/apps/Hadoop/
12) 格式化ZK(在master上格式化):
hdfs zkfc –formatZK
输出没有报错且看到以上信息说明Zookeeper格式化成功。
13) 启动HDFS(在master上执行):
start-dfs.sh
14) 测试HDFS:
hadoop fs –ls /
创建文件:
15) 通过web页面查看:
访问:http://192.168.1.120:50070
HDFS HA配置成功!
16) 启动YARN(在master上执行):
start-yarn.sh
17) 测试YARN:
先上传文件到hdfs上:
运行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount/user /out
查看输出:hadoop fs -ls /out
通过web页面查看:
访问:http://192.168.1.120:8088
18) 集群运行进程检查:
master(7个进程):
slave1(6个进程):
slave2(4个进程):
至此hadoop启动成功!
安装配置HBase
1) 解压 hbase-1.1.0-bin.tar.gz 到/opt/hadoop_cloud/HBase/ 目录下:
2) 配置HBase:
修改/opt/hadoop_cloud/HBase/hbase-1.1.0/conf 目录下的hbase-site.xml:
vim hbase-site.xml:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hacluster/hbase</value>
</property>
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/apps/HBase/tmp</value>
</property>
<property>
<name>hbase.regionserver.port</name>
<value>16020</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value> com.brian.hadoop.cloud.master,com.brian.hadoop.cloud.slave1,com.brian.hadoop.cloud.slave2</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>12000</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
<property>
<name>zookeeper.znode.rootserver</name>
<value>hbase-region-server</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/apps/HBase/zookeeper</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.master.handler.count</name>
<value>25</value>
</property>
<property>
<name>dfs.namenode.rpc.port</name>
<value>9000</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>false</value>
</property>
</configuration>
3) 修改regionservers:
vim regionservers
4) 同步配置到其它服务器:
scp -r /opt/hadoop_cloud/HBase/hbase-1.1.0/com.brian.hadoop.cloud.slave1:/opt/hadoop_cloud/HBase/
scp -r /opt/hadoop_cloud/HBase/hbase-1.1.0/ com.brian.hadoop.cloud.slave2:/opt/hadoop_cloud/HBase/
5) 防火墙开放端口(root用户):
master:
iptables -I INPUT -d 192.168.1.120 -p tcp –dport 16000 -j ACCEPT
iptables -I INPUT -d 192.168.1.120 -p tcp –dport 16010-j ACCEPT
iptables -A OUTPUT -d 192.168.1.120 -p tcp –dport16000 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.120 -p tcp –dport16010 -j ACCEPT
slave1:
iptables -I INPUT -d 192.168.1.121 -p tcp –dport 16000 -j ACCEPT
iptables -I INPUT -d 192.168.1.121 -p tcp –dport 16010-j ACCEPT
iptables -I INPUT -d 192.168.1.121 -p tcp –dport16020 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.121 -p tcp –dport16000 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.121 -p tcp –dport16010 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.121 -p tcp –dport16020 -j ACCEPT
slave2:
iptables -I INPUT -d 192.168.1.122 -p tcp –dport16020 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.122 -p tcp –dport16020 -j ACCEPT
保存更改:service iptables save
重启服务:service iptables restart
6) 启动 HBase(在master上启动):
cd /opt/hadoop_cloud/HBase/hbase-1.1.0/bin/
./start-hbase.sh
在slave1上在单独启动一个HMaster,实现HBase HA:
cd /opt/hadoop_cloud/HBase/hbase-1.1.0/bin/
./hbase-daemon.sh start master
slave2:
7) 测试HBase:
在master上执行hbase shell:
cd /opt/hadoop_cloud/HBase/hbase-1.1.0/bin
./hbase shell
至此HBase配置成功。
8) 通过web页面查看HBase相关信息:
访问:http://192.168.1.120:16010/master-status
访问:http://192.168.1.121:16010/master-status
可以看到当前Master是stadby节点。
常见安装问题总结:
1) 权限问题:在搭建过程中由于需要频繁的切换用户,所以有时会涉及到权限。安装或操作前需要仔细检查文件或目录是否具有权限。
防火墙问题:防火墙是比较麻烦的一件事情。由于需要开放的端口比较多所以比较容易出问题。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/9173.html