一、环境
- hbase做数据库,但由于hbase没有类sql查询方式,所以操作和计算数据非常不方便,于是整合hive,让hive支撑在hbase数据库层面的
hql
查询也做数据仓库 - CentOS 6.6 x64
- hadoop 2.7.2 部署文档
- hive-1.2.1 部署文档
- hbase-1.2.2-bin.tar.gz
- zookeeper集群
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