hadoop + hbase + hive 集群搭建文档

一、环境

master.hdp.imdst.com      NameNode   SecondaryNameNode  zookeeper  
1.slave.hdp.imdst.com     DataNode  zookeeper  
2.slave.hdp.imdst.com     DataNode  zookeeper  

二、 部署

  • 解压缩软件包
tar zxf hbase-1.2.2-bin.tar.gz  -C /home/hadoop/src/  
chown hadoop.hadoop /home/hadoop -R  
su hadoop
  • 配置hbase-env.sh (注意等号之间不要有空格)
vim src/hbase-1.2.2/conf/hbase-env.sh  
----------------------------------------------------
#修改以下配置
export HBASE_MANAGES_ZK=false  
export HBASE_CLASSPATH=/home/hadoop/src/hadoop-2.7.2/etc/hadoop  
# 如果修改过SSH默认端口请修改以下配置
export HBASE_SSH_OPTS="-p 23132"  
----------------------------------------------------
  • 配置 hbase-site.xml
<configuration>  
        <!-- HDFS的NameNode的位置 -->
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://master.hdp.imdst.com:9000/hbase</value>
        </property>
        <!-- false是单机模式,true是分布式模式 -->
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
        <!-- zookeepr的配置-->
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>master.hdp.imdst.com,1.slave.hdp.imdst.com</value>
        </property>

        <property>
                <name>hbase.master</name>
                <value>master.hdp.imdst.com:16000</value>
        </property>

        <property>
                <name>hbase.master.port</name>
                <value>16000</value>
                <description>The port master should bind to.</description>
        </property>

        <property>
                <name>hbase.client.scanner.caching</name>
                <value>100000</value>
                <description> MapReduce Scan Caching</description>
        </property>
</configuration>  
  • 配置 regionservers,加入DataName地址
1.slave.hdp.imdst.com  
2.slave.hdp.imdst.com  

三、开启hbase服务

  • 开启
cd src/hbase-1.2.2/bin  
./start-hbase.sh 
  • 关闭
./stop-hbase.sh 

四、整合Hbase和Hive

  • 修改hive配置文件 hive-site.xml
<property>  
    <name>hive.aux.jars.path</name>
    <value>file:///home/hadoop/src/apache-hive-1.2.1-bin/lib/hive-hbase-handler-1.2.1.jar,file:///home/hadoop/src/apache-hive-1.2.1-b
in/lib/hbase-procedure-1.2.2.jar,file:///home/hadoop/src/apache-hive-1.2.1-bin/lib/protobuf-java-2.5.0.jar,file:///home/hadoop/src/ap  
ache-hive-1.2.1-bin/lib/hbase-protocol-1.2.2.jar,file:///home/hadoop/src/apache-hive-1.2.1-bin/lib/hbase-client-1.2.2.jar,file:///hom  
e/hadoop/src/apache-hive-1.2.1-bin/lib/hbase-common-1.2.2.jar,file:///home/hadoop/src/apache-hive-1.2.1-bin/lib/zookeeper-3.4.6.jar,f  
ile:///home/hadoop/src/apache-hive-1.2.1-bin/lib/guava-14.0.1.jar</value>  
    <description>The location of the plugin jars that contain implementations of user defined functions and serdes.</description>
  </property>

注意:
1. 目前只支持file://也就是本地文件,暂不支持HDFS,也不支持文件夹。
2. 多个文件使用逗号分隔。
3. 不能换行。
4. 以上需要的jar包从hbase/lib目录拷贝至hive/lib ,这里分享一个我用过的包,因为版本兼容性问题不太好找,自己编译好的.点击下载: hive-1.2.1.lib.tar.gz

  • hive-site.xml 添加hbase和zookeeper
<!--必须配奇数个数的DataNode-->  
<!-- 某论坛看到这样的解释  
zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;同理你多列举几个:2->0;3->1;4->1;5->2;6->2会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢。  
-->
 <property>
    <name>hbase.zookeeper.quorum</name>
 <value>master.hdp.imdst.com,1.slave.hdp.imdst.com,2.slave.hdp.imdst.com</value>
   <description>zookeeper</description>
  </property>

  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
    <description>port</description>
  </property>

  <property>
    <name>hbase.master</name>
    <value>master.hdp.imdst.com:16000</value>
    <description>hbase</description>
  </property>
  • 重新启动hive
# 先关闭
ps aux|grep hive|grep -v grep |awk '{print $2}'|xargs kill -9  
# 启动
nohup bin/hive --service metastore &  
nohup bin/hive --service hiveserver2 &  

五、测试-使用sqoop将MySQL数据库中的数据导入Hbase

  • sqoop安装说明
  • 先在mysql中创建一个测试的表,插入随机数据
  • MySQL导入HBase命令
sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://127.0.0.1:3306/库名 --username hadoop --password-file sqoop.pwd --table 表名 --where "id > 1" --hbase-table hbase表名 --columns [字段集:id,user,passwd] --column-family col --hbase-row-key "id" --target-dir /user/[临时目录:建议用hbase表名,后一参数导之前会先删除] --delete-target-dir -m 1  
# sqoop.pwd 提前创建,这个密码就是你的数据库用户的密码:
echo -n "123456" > sqoop.pwd  
#然后上传至hadoop 
./hdfs dfs -put sqoop.pwd /user/hadoop

#导入成功后出现如下提示
16/09/09 16:55:47 INFO mapreduce.ImportJobBase: Transferred 0 bytes in 19.8432 seconds (0 bytes/sec)  
16/09/09 16:55:47 INFO mapreduce.ImportJobBase: Retrieved 9192 records.  
  • 查看是否已经导入habse
./hdfs dfs -ls /hbase/data/default/
Found 1 items  
drwxr-xr-x   - hadoop supergroup          0 2016-09-09 11:49 /hbase/data/default/hbase表名  

六、Hbase的REST访问

  • 前台启动hbase rest服务
    bin/hbase rest start -p <port>
  • 后台启动hbase服务
    bin/hbase-daemon.sh start rest -p <port>
  • 停止服务
    bin/hbase-daemon.sh stop rest
    不加端口的情况下,端口默认为8080