测试数据请到Blog中下载:http://blog.csdn.net/xfg0218/article/details/51712157
http://www.apache.org/dyn/closer.cgi/hive/选择apache-hive-1.2.1-src.tar.gz点击下载之后使用MyEclipse进行反编译,或者使用作者反编译好的JAR 链接:http://pan.baidu.com/s/1hscaORi 密码:wv6p
放在/opt/hive-1.2/lib/下记得备份之前的JAR包
在hive的conf目录下修改一下文件
[root@skycloud1 conf]# vi hive-site.xml
在之前的基础上添加以下内容
Hive > create table hive_hbase_test(id int,name string,age int);
hive> insert into hive_hbae_test(id,name,age) values(1,"xiaozhang","18");
hive> insert into hive_hbase_test(id,name,age) values(2,"xiaowang","19");
hive> select * from hive_hbase_test;
OK
1 xiaozhang 18
2 xiaowang 19
Time taken: 0.081 seconds, Fetched: 2 row(s)
A)、常见内表
Hive > create table hive_hbase_pro(row_key string,id bigint,name string,age int)
STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" WITH SERDEPROPERTIES
("hbase.columns.mapping" = ":key,info:id,info:name,info:age")
TBLPROPERTIES ("hbase.table.name"="hive_hbase_pro");
B)、创建外表
Hive > create external table hive_hbase_pro(row_key string,id bigint,name string,age int)
STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" WITH SERDEPROPERTIES
("hbase.columns.mapping" = ":key,info:id,info:name,info:age")
TBLPROPERTIES ("hbase.table.name"="hive_hbase_pro");
说明:org.apache.hadoop.hive.hbase.HBaseStorageHandler是Hbase的储存方式
Hbase.columns.mapping:是作为Hbase的映射rowkey与列族
hive_hbase_pro:映射给Hbase的表名字
external : 可创建外表,Hbase中已经存在的表映射到hive用词操作,区别请查看一下解释
hbase(main):020:0> describe 'hive_hbase_pro'
Table hive_hbase_pro is ENABLED
hive_hbase_pro
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING =>
'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOP
E => '0'}
1 row(s) in 0.0170 seconds
-- 关闭hbase的WAL,有点事提高了写入速度,缺点是如果出现错误无法查找日志
hive> set hive.hbase.wal.enabled=false;
-- 开启大量导入配置
hive> set hive.hbase.bulk=true;
-- 设置扫描的缓存
hive> set hbase.client.scanner.caching=1000000;
hive> insert overwrite table hive_hbase_pro select id as row_key,id,name,age from hive_hbase_test;
hive> select * from hive_hbase_pro;
OK
1 1 xiaozhang 18
2 2 xiaowang 19
Time taken: 0.121 seconds, Fetched: 2 row(s)
hbase(main):021:0> scan 'hive_hbase_pro'
ROW COLUMN+CELL
1 column=info:age, timestamp=1510126017074, value=18
1 column=info:id, timestamp=1510126017074, value=1
1 column=info:name, timestamp=1510126017074, value=xiaozhang
2 column=info:age, timestamp=1510126016682, value=19
2 column=info:id, timestamp=1510126016682, value=2
2 column=info:name, timestamp=1510126016682, value=xiaowang
2 row(s) in 0.0420 seconds
Hive > create external table hive_hbase_xiaoxu(row_key string,id bigint,name string,age int)
STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" WITH SERDEPROPERTIES
("hbase.columns.mapping" = ":key,info:id,info:name,info:age")
TBLPROPERTIES ("hbase.table.name"="hive_hbase_pro");
hive> desc hive_hbase_xiaoxu;
OK
row_key string from deserializer
id bigint from deserializer
name string from deserializer
age int from deserializer
Time taken: 0.357 seconds, Fetched: 4 row(s)
hive> select * from hive_hbase_xiaoxu;
OK
1 1 xiaozhang 18
2 2 xiaowang 19
使用hive-hbase-handler往hbase中插入数据是按照一条一条的的形式插入的,速度是比较慢的,如果数量级在百万千万级别机器比较好的情况下可以使用这种方式,执行的速度大概在每妙2-3W之间
https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration
增量更新,建立的是Hive外表;而全量覆盖建立的是Hive内部表;
增量更新,必须先创建HBase表;而全量覆盖不需要事先建立HBase表;
增量更新,是在原有的HBase表的基础上新增数据,不改变原有数据;而全量覆盖则会覆盖原有数据
可以方便的使用SQL的形式查看Hbase中的数据,也可以利用MapReduce的优势针对HBase存储的大量内容进行离线的计算和分析
查询速度性能的损失,hive有这样的功能, 他支持通过类似sql语句的语法来操作hbase中的数据, 但是速度慢
优势:
1、BulkLoad 不会写 WAL,也不会产生 flush 以及 split
2、如果我们大量调用 PUT 接口插入数据,可能会导致大量的 GC 操作。如果没有对Hbase的表进行预分区,会导致单太机器的热点问题,
严重时甚至可能会对 HBase 节点的稳定性造成影响,采用 BulkLoad 无此顾虑。
hive> insert overwrite directory "/tmp/sp_addr_bulktable" row format delimited FIELDS terminated by '\t' select sa.ID,sa.PLACE_CODE,sa.PLACE_NAME from xiaoxu.sp_address sa;
Query ID = root_20170403234442_c34e1570-f478-4c8b-bacf-83485f94b567
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1491287068852_0001, Tracking URL = http://hadoop1:8088/proxy/application_1491287068852_0001/
Kill Command = /opt/hadoop-2.6.4/bin/hadoop job -kill job_1491287068852_0001
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2017-04-03 23:45:28,478 Stage-1 map = 0%, reduce = 0%
2017-04-03 23:46:01,357 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.46 sec
MapReduce Total cumulative CPU time: 1 seconds 460 msec
Ended Job = job_1491287068852_0001
Stage-3 is selected by condition resolver.
Stage-2 is filtered out by condition resolver.
Stage-4 is filtered out by condition resolver.
Moving data to: hdfs://mycluster/tmp/sp_addr_bulktable/.hive-staging_hive_2017-04-03_23-44-42_657_7591325811272483144-1/-ext-10000
Moving data to: /tmp/sp_addr_bulktable
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Cumulative CPU: 1.46 sec HDFS Read: 250195 HDFS Write: 166508 SUCCESS
Total MapReduce CPU Time Spent: 1 seconds 460 msec
OK
Time taken: 81.082 seconds
[root@skycloud1 conf]# HADOOP_CLASSPATH=`hbase classpath` hadoop jar /opt/hbase-1.2.1/lib/hbase-server-1.2.1.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,sp_address:ID,sp_address:PLACE_CODE,sp_address:PLACE_NAME -Dimporttsv.bulk.output="/tmpbulkdata/sp_addr_data" sp_address_bulkload "/tmp/sp_addr_bulktable"
详细的执行过程可以查看:http://blog.csdn.net/xfg0218/article/details/69063014
资料请查看:http://hbase.apache.org/book.html#importtsv
hbase(main):011:0> list
TABLE
sp_address_bulkload
2 row(s) in 0.1430 seconds
=> ["sp_address_bulkload",]
方式一:
[root@skycloud1 conf]# HADOOP_CLASSPATH=`hbase classpath` hadoop jar /opt/hbase-1.2.1/lib/hbase-server-1.2.1.jar completebulkload "/tmpbulkdata/sp_addr_data" sp_address_bulkload
详细的执行过程可以查看:http://blog.csdn.net/xfg0218/article/details/69063137
方式二:
[root@skycloud1 conf]# export HADOOP_CLASSPATH=`hbase classpath`
[root@skycloud1 conf]# yarn jar /opt/hbase-1.2.1/lib/hbase-server-1.2.1.jar completebulkload completebulkload "/tmpbulkdata/sp_addr_data" sp_address_bulkload
在这几种导数据的速度上这种方式是最快的,原理是按照Hfile进行的,一次性处理多条数据,建议使用这种方式。本次测试由于是自己的虚拟机所以会比较慢,在真是环境中会相当快的快,我们测试的是4亿多条的数据,20分钟搞定。
官网介绍:https://cwiki.apache.org/confluence/display/Hive/HBaseBulkLoad
Phoenix 官网 :https://phoenix.apache.org/pig_integration.html
在下载时注意版本的问题。
[root@hadoop1 bin]# chmod a+x apache-phoenix-4.8.2-HBase-1.2-bin.tar.gz
[root@hadoop1 bin]# tar -zxvf apache-phoenix-4.8.2-HBase-1.2-bin.tar.gz
[root@hadoop1 bin]# mv apache-phoenix-4.9.0-HBase-1.1-bin phoenix-4.8.2-HBase-1.2
[root@hadoop1 bin]# cd phoenix-4.8.2-HBase-1.2/
移动phoenix的以下的JAR到Hbase集群中
[root@hadoop1 bin]# cp phoenix-core-4.8.2-HBase-1.2.jar phoenix-4.8.2-HBase-1.2-server.jar /opt/hbase-1.2.1/lib/
复制到其他的机器中:
[root@hadoop1 bin]# scp -r phoenix-core-4.8.2-HBase-1.2.jar phoenix-4.8.2-HBase-1.2-server.jar hadoop2:/opt/hbase-1.2.1/lib/
[root@hadoop1 bin]# scp -r phoenix-core-4.8.2-HBase-1.2.jar phoenix-4.8.2-HBase-1.2-server.jar hadoop3:/opt/hbase-1.2.1/lib/
复制Hbase的hbase-site.xml和Hadoop的core-site.xml和hdfs-site.xml到phoenix的bin目录下:
[root@hadoop1 bin]# cd /opt/hbase-1.2.1/conf/
[root@hadoop1 bin]# cp hbase-site.xml /opt/phoenix-4.8.2-HBase-1.2/bin/
[root@hadoop1 bin]# cd /opt/hadoop-2.6.4/etc/hadoop/
[root@hadoop1 bin]# cp core-site.xml hdfs-site.xml /opt/phoenix-4.8.2-HBase-1.2/bin/
[root@hadoop1 bin]# cd /opt/phoenix-4.8.2-HBase-1.2/
[root@hadoop1 bin]# chmod 777 psql.py sqlline.py
重启Hbase集群使配置文件生效
[root@hadoop1 bin]# ./sqlline.py
Setting property: [incremental, false]
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix: none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/phoenix-4.9.0-HBase-1.1/phoenix-4.9.0-HBase-1.1-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-2.6.4/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
17/04/07 00:25:29 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connected to: Phoenix (version 4.8.2)
Driver: PhoenixEmbeddedDriver (version 4.9)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
87/87 (100%) Done
Done
sqlline version 1.2.0
0: jdbc:phoenix:>
也可以制定端口运行:
[root@hadoop1 bin]# sqlline.py hadoop1:2181
Hadoop1:主机的名字
2181:当前执行的端口
[root@hadoop1 bin]# cd /opt/phoenix-4.9.0-HBase-1.1/bin
[root@hadoop1 bin]# vi hbase-site.xml
追加一下配置文件
1-1)、查看全部的表的信息
0: jdbc:phoenix:> !tables
可以看出有比较好的列的名字与分割线
1-2)、查看一个表的结构
0: jdbc:phoenix:> !describe "STATS"
1-3)、删除表
0: jdbc:phoenix:> DROP TABLE “STATS”
1-4)、查询语句
Phoneix支持常用的SQL语句,不过在查询时使用””与不适用””的区别。
1-5)、Phoenix支持的类型
INTEGER 整形
UNSIGNED_INT 无符号整形
BIGINT 长整形
UNSIGNED_LONG 无符号长整形
TINYINT 短整形
UNSIGNED_TINYINT 无符号短整型
SMALLINT 小整形
UNSIGNED_SMALLINT 无符号短整型
FLOAT 浮点型
UNSIGNED_FLOAT 无符号浮点型
DOUBLE 双精度浮点型
UNSIGNED_DOUBLE 无符号双精度浮点型
DECIMAL 长精度双精度浮点型
BOOLEAN 布尔类型
TIME 时间类型
DATE 日期类型
TIMESTAMP 时间戳类型
UNSIGNED_TIME 无符号时间类型
UNSIGNED_DATE 无符号日期类型
UNSIGNED_TIMESTAMP 无符号时间戳类型
VARCHAR 字符串类型
CHAR 字符类型
BINARY 二进制类型
VARBINARY 可变长二进制类型
ARRAY 数组类型
1-6)、常用的函数
A)、聚合函数
AVG:求平均,如果没有返回NULL
SUM:求和函数
COUNT:求行数,如果指定某列,则返回该列非空个数,如果为*或1,则返回所有行,加上distinct则返回不相同的行数
MAX:求最大值
MIN:求最小值
PERCENTILE_CONT:指定
PERCENTILE_DISC:指定占比的列具体值是多少
PERCENT_RANK:指定值占的百分比,PERCENT_RANK( 39 ) WITHINGROUP (ORDER BY id ASC)
STDDEV_SAMP:样本标准差
STDDEV_POP:总体标准差
B)、支持的字符串函数
SUBSTR:取子串,默认是基于1的,如果想基于0,则指定0,如果指定为负数,则是从字符串结尾算起
TRIM:去除字符串头尾空格
LTRIM:去除字符串左侧空格
RTRIM:去除字符串右侧空格
LENGTH:返回字符串长度
REGEXP_SUBSTR:通过指定正则表达式获取子串
REGEXP_REPLACE:正则替换
UPPER:大写转换
LOWER:小写转换
REVERSE:字符串反转
TO_CHAR:将日期、时间、时间戳或数字格式化为一个字符串。默认日期格式为yyyy-MM-dd HH:mm:ss,数字格式为#,##0.###。
C)、支持的时间、日期函数
ROUND:四舍五入
TRUNC:截断
TO_DATE:转换为date类型
CURRENT_DATE:返回RS上当前日期
CURRENT_TIME:返回RS上当前时间
D)、支持的时间、日期函数
TO_NUMBER:转换日期、时间、时间戳为一个数字,可接受格式化串
COALESCE:指定默认值,如果相应值为null
1-1)、数据从hive中导出成phoenix支持的csv格式
hive> insert overwrite directory '/tmp/sp_address' row format delimited FIELDS TERMINATED BY ',' select * from sp_address;
1-2)、查看HDFS上的信息
[root@hadoop1 bin]# hadoop fs -du -h -s /tmp/sp_address
234.0 K /tmp/sp_address
1-3)、在phoenix中创建表
创建表在Hbase,必须制定主键
0: jdbc:phoenix:> create table sp_address(id integer primary key,place_type varchar,place_code varchar,place_name varchar,up_place_code varchar);
No rows affected (3.185 seconds)
1-4)、使用phoenix将数据导入hbase
[root@hadoop1 phoenix-4.9.0-HBase-1.1]# HADOOP_CLASSPATH=/opt/hbase-1.2.1/lib/hbase-protocol-1.2.1.jar:/etc/hbase/conf/ hadoop jar /opt/phoenix-4.8.2-HBase-1.2/phoenix-4.8.2-HBase-1.2-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool --table SP_ADDRESS --input /tmp/sp_address/*
***********************************
详细的运行日志请查看:http://blog.csdn.net/xfg0218/article/details/69669632
[root@hadoop1 ~]# vi exportHbase.sh
# get current path
# get current path
SCRIPT_DIR=`cd $(dirname $0) && pwd`
# export data
echo "scan 'portrayal',{LIMIT=>10}" | hbase shell > $SCRIPT_DIR/ExportHbase.txt
查看数据
[root@hadoop1 ~]# tail -n 5 ExportHbase.txt
00000075d9d93dc17e163d5c6dd335f8 column=tag:es_jcsx_rksx_xm, timestamp=1491033321055, value=***
00000075d9d93dc17e163d5c6dd335f8 column=tag:es_jcsx_rksx_xz, timestamp=1491033321055, value=\xE7\x8B\xAE\xE5\xAD\x90
00000075d9d93dc17e163d5c6dd335f8 column=tag:es_jcsx_rksx_zjlx, timestamp=1491033321055, value=1
10 row(s) in 0.4260 seconds
1-1)、构造数据
hbase(main):008:0> create 'xiaoxu','cf'
0 row(s) in 4.2890 seconds
=> Hbase::Table - xiaoxu
hbase(main):009:0> put 'xiaoxu','001','cf:name','xiaozhang'
0 row(s) in 0.1870 seconds
hbase(main):010:0> put 'xiaoxu','001','cf:age','18'
0 row(s) in 0.0340 seconds
hbase(main):011:0> scan 'xiaoxu'
ROW COLUMN+CELL
001 column=cf:age, timestamp=1491364070907, value=18
001 column=cf:name, timestamp=1491364050527, value=xiaozhang
1 row(s) in 0.0970 seconds
hbase(main):012:0>
1-2)、导出数据
[root@hadoop1 ~]#hbase org.apache.hadoop.hbase.mapreduce.Export xiaoxu /xiaoxu/test-output-001
***************************
详细的执行过程请查看:http://blog.csdn.net/xfg0218/article/details/69231258
1-3)、查看HDFS上的数据
[[email protected] ~/xiaoxu]$ hadoop fs -cat test-output-001/part-m-00000
SEQ1org.apache.hadoop.hbase.io.ImmutableBytesWritable%org.apache.hadoop.hbase.client.ResultР5ƀ¹z,N001F
001cfage ᱫ(218
#
001cfname ࠬ桳+(2 xiaozhang
因为是序列化的数据所以会乱码
1-4)、清空表中的数据
hbase(main):014:0> truncate 'xiaoxu'
Truncating 'xiaoxu' table (it may take a while):
- Disabling table...
- Truncating table...
0 row(s) in 3.6910 seconds
hbase(main):015:0> scan 'xiaoxu'
ROW COLUMN+CELL
0 row(s) in 0.3180 seconds
1-5)、导入数据
[root@hadoop1 ~]#hbase org.apache.hadoop.hbase.mapreduce.Import xiaoxu /xiaoxu/test-output-001
***************************
详细的导入的过程请查看:http://blog.csdn.net/xfg0218/article/details/69231415
1-6)、查看Hbase导入后的数据
hbase(main):016:0> scan 'xiaoxu'
ROW COLUMN+CELL
001 column=cf:age, timestamp=1491364070907, value=18
001 column=cf:name, timestamp=1491364050527, value=xiaozhang
1 row(s) in 0.0110 seconds
1-1)、安装pig
官网:http://mirror.bit.edu.cn/apache/pig/
或者下载: 链接:http://pan.baidu.com/s/1bpmu0px 密码:gw05
[root@hadoop1 opt]# chmod a+x pig-0.16.0-src.tar.gz
[root@hadoop1 opt]# tar -zxvf pig-0.16.0-src.tar.gz
1-2)、修改配置文件
[root@hadoop1 opt]# vi /etc/profile
export PIG_HOME=/opt/pig-0.16.0
export PIG_CLASSPATH=$HADOOP_HOME
export PATH=$PATH:$PIG_HOME/bin:$PIG_CLASSPATH
1-3)、查看Pig是否能使用
[root@hadoop1 opt]# pig -help
Cannot locate pig-core-h2.jar. do 'ant -Dhadoopversion=23 jar', and try again
1-4)、使用pig导出csv文件
[root@hadoop1 opt]# vi ExportHbase.pig
REGISTER /opt/hbase-1.2.1/lib/htrace-core-3.1.0-incubating.jar;
REGISTER /opt/pig-0.16.0/lib/piggybank.jar;
x=LOAD 'hbase://sp_address_src' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('
sp_address:place_code,
sp_address:place_type
','-loadKey true');
STORE x INTO 'sp_address.csv' USING PigStorage(',');
-loadKey true' : 是显示主键,以,为分割并把文件导出到HDFS的sp_address.csv中
1-5)、运行脚本
[root@hadoop1 opt]# pig -x mapreduce ExportHbase.pig
官网:http://pig.apache.org/
1-1)、准备脚本
脚本一:table查询方式
[root@hadoop1 testSh]# vi example1.pig
REGISTER /opt/phoenix-4.8.2-HBase-1.2/phoenix-4.8.2-HBase-1.2-client.jar;
rows = load 'hbase://table/sp_address_orc' USING org.apache.phoenix.pig.PhoenixHBaseLoader('hadoop1:2181,hadoop2:2181,hadoop3:2181');
STORE rows INTO 'sp_address_orc.csv' USING PigStorage(',');
脚本二:query查询方式
[root@hadoop1 testSh]# vi example2.pig
REGISTER /opt/phoenix-4.8.2-HBase-1.2/phoenix-4.8.2-HBase-1.2-client.jar;
rows = load 'hbase://query/SELECT * FROM SP_ADDRESS' USING org.apache.phoenix.pig.PhoenixHBaseLoader('hadoop1,hadoop2,hadoop3:2181');
STORE rows INTO 'SP_ADDRESS.csv' USING PigStorage(',');
运行脚本:
[root@hadoop1 testSh]# pig -x local example1.pig
详细运行日志请查看:http://blog.csdn.net/xfg0218/article/details/69675774