Hbase 学习(十一)使用hive往hbase当中导入数据

我们可以有很多方式可以把数据导入到hbase当中,比如说用map-reduce,使用TableOutputFormat这个类,但是这种方式不是最优的方式。

Bulk的方式直接生成HFiles,写入到文件系统当中,这种方式的效率很高。

一般的步骤有两步:

(1)使用ImportTsv或者import工具或者自己写程序用hive/pig生成HFiles

(2)用completebulkload把HFiles加载到hdfs上

ImportTsv能把用Tab分隔的数据很方便的导入到hbase当中,但还有很多数据不是用Tab分隔的 下面我们介绍如何使用hive来导入数据到hbase当中。

1.准备输入内容

a.创建一个tables.ddl文件

-- pagecounts data comes from http://dumps.wikimedia.org/other/
pagecounts-raw/
-- documented http://www.mediawiki.org/wiki/Analytics/Wikistats
-- define an external table over raw pagecounts data
CREATE TABLE IF NOT EXISTS pagecounts (projectcode STRING, pagename
STRING, pageviews STRING, bytes STRING)
ROW FORMAT
DELIMITED FIELDS TERMINATED BY ' '
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/tmp/wikistats';
-- create a view, building a custom hbase rowkey
CREATE VIEW IF NOT EXISTS pgc (rowkey, pageviews, bytes) AS
SELECT concat_ws('/',
projectcode,
concat_ws('/',
pagename,
regexp_extract(INPUT__FILE__NAME, 'pagecounts-(\\d{8}-\\d{6})\
\..*$', 1))),
pageviews, bytes
FROM pagecounts;
-- create a table to hold the input split partitions
CREATE EXTERNAL TABLE IF NOT EXISTS hbase_splits(partition STRING)
ROW FORMAT
SERDE 'org.apache.hadoop.hive.serde2.binarysortable.
BinarySortableSerDe'
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.
HiveNullValueSequenceFileOutputFormat'
LOCATION '/tmp/hbase_splits_out';
-- create a location to store the resulting HFiles
CREATE TABLE hbase_hfiles(rowkey STRING, pageviews STRING, bytes STRING)
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHFileOutputFormat'
TBLPROPERTIES('hfile.family.path' = '/tmp/hbase_hfiles/w');

b.创建HFils分隔文件,例子:sample.hql

-- prepate range partitioning of hfiles
ADD JAR /usr/lib/hive/lib/hive-contrib-0.11.0.1.3.0.0-104.jar;
SET mapred.reduce.tasks=1;
CREATE TEMPORARY FUNCTION row_seq AS 'org.apache.hadoop.hive.contrib.udf.
UDFRowSequence';
-- input file contains ~4mm records. Sample it so as to produce 5 input
splits.
INSERT OVERWRITE TABLE hbase_splits
SELECT rowkey FROM
(SELECT rowkey, row_seq() AS seq FROM pgc
TABLESAMPLE(BUCKET 1 OUT OF 10000 ON rowkey) s
ORDER BY rowkey
LIMIT 400) x
WHERE (seq % 100) = 0
ORDER BY rowkey
LIMIT 4;
-- after this is finished, combined the splits file:
dfs -cp /tmp/hbase_splits_out/* /tmp/hbase_splits;

c.创建hfiles.hql

ADD JAR /usr/lib/hbase/hbase-0.94.6.1.3.0.0-104-security.jar;
ADD JAR /usr/lib/hive/lib/hive-hbase-handler-0.11.0.1.3.0.0-104.jar;
SET mapred.reduce.tasks=5;
SET hive.mapred.partitioner=org.apache.hadoop.mapred.lib.
TotalOrderPartitioner;
SET total.order.partitioner.path=/tmp/hbase_splits;
-- generate hfiles using the splits ranges
INSERT OVERWRITE TABLE hbase_hfiles
SELECT * FROM pgc
CLUSTER BY rowkey;

2.导入数据

注意:/$Path_to_Input_Files_on_Hive_Client是hive客户端的数据存储目录

mkdir /$Path_to_Input_Files_on_Hive_Client/wikistats
wget http://dumps.wikimedia.org/other/pagecounts-raw/2008/2008-10/
pagecounts-20081001-000000.gz
hadoop fs -mkdir /$Path_to_Input_Files_on_Hive_Client/wikistats
hadoop fs -put pagecounts-20081001-000000.
gz /$Path_to_Input_Files_on_Hive_Client/wikistats/ 

3.创建必要的表

注意:$HCATALOG_USER是HCatalog服务的用户(默认是hcat)

$HCATALOG_USER-f /$Path_to_Input_Files_on_Hive_Client/tables.ddl

执行之后,我们会看到如下的提示:

OK
Time taken: 1.886 seconds
OK
Time taken: 0.654 seconds
OK
Time taken: 0.047 seconds
OK
Time taken: 0.115 seconds

4.确认表已经正确创建

执行以下语句

$HIVE_USER-e "select * from pagecounts limit 10;"

执行之后,我们会看到如下的提示:

...
OK
aa Main_Page 4 41431
aa Special:ListUsers 1 5555
aa Special:Listusers 1 1052

再执行

$HIVE_USER-e "select * from pgc limit 10;"

执行之后,我们会看到如下的提示:

...
OK
aa/Main_Page/20081001-000000 4 41431
aa/Special:ListUsers/20081001-000000 1 5555
aa/Special:Listusers/20081001-000000 1 1052
...

5.生成HFiles分隔文件

$HIVE_USER-f /$Path_to_Input_Files_on_Hive_Client/sample.hql
hadoop fs -ls /$Path_to_Input_Files_on_Hive_Client/hbase_splits

为了确认,执行以下命令

hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-streaming-1.2.0.1.
3.0.0-104.jar -libjars /usr/lib/hive/lib/hive-exec-0.11.0.1.3.0.0-104.
jar -input /tmp/hbase_splits -output /tmp/hbase_splits_txt -inputformat
SequenceFileAsTextInputFormat

执行之后,我们会看到如下的提示:

...
INFO streaming.StreamJob: Output: /tmp/hbase_splits_txt

再执行这一句

hadoop fs -cat /tmp/hbase_splits_txt/*

执行之后,我们会看到类似这样的结果

61 66 2e 71 2f 4d 61 69 6e 5f 50 61 67 65 2f 32 30 30 38 31 30 30 31 2d 30
30 30 30 30 00 (null)
61 66 2f 31 35 35 30 2f 32 30 30 38 31 30 30 31 2d 30 30 30 30 30 30 00
(null)
61 66 2f 32 38 5f 4d 61 61 72 74 2f 32 30 30 38 31 30 30 31 2d 30 30 30
30 30 00 (null)
61 66 2f 42 65 65 6c 64 3a 31 30 30 5f 31 38 33 30 2e 4a 50 47 2f 32 30
38 31 30 30 31 2d 30 30 30 30 30 30 00 (null)

6.生成HFiles

HADOOP_CLASSPATH=/usr/lib/hbase/hbase-0.94.6.1.3.0.0-104-security.jar
 hive -f /$Path_to_Input_Files_on_Hive_Client/hfiles.hql

以上内容是hdp的用户手册中推荐的方式,然后我顺便也从网上把最后的一步的命令格式给找出来了。

hadoop jar hbase-VERSION.jar completebulkload /user/todd/myoutput mytable
时间: 2024-11-02 07:59:34

Hbase 学习(十一)使用hive往hbase当中导入数据的相关文章

一文看懂HIVE和HBASE的区别

两者分别是什么? Apache Hive是一个构建在hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询–因为它只能够在Haoop上批量的执行Hadoop. Apache HBase是一种Key/Value系统,它运行在HDFS之上.和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapReduce任务

浅谈Hive vs. HBase

对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的.本文将尝试从其各自的定义.特点.限制.应用场景等角度来进行分析,以作抛砖引玉之用. Hive是什么? Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,注意这里不是数据库.Hive可以看作是用户编程接口,它本身不存储和计算数据:它依赖于HDFS(Hadoop分布式文件系统)和MapReduce(一种编程模型,映射与化简:用于大数据并行运算).其对HDFS的操作类似于SQL-名为HQL,它提供

Hive整合HBase:通过Hive读/写 HBase中的表

写在前面一: 本文将Hive与HBase整合在一起,使Hive可以读取HBase中的数据,让Hadoop生态系统中最为常用的两大框架互相结合,相得益彰. 写在前面二: 使用软件说明 约定所有软件的存放目录: /home/yujianxin 一.Hive整合HBase原理 Hive与HBase整合的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler-0.9.0.jar工具类,如下图 Hive与HBase通信示意图 二.具体步骤 安装前说明 1.关

大数据工具篇之Hive与HBase整合完整教程

一.引言 最近的一次培训,用户特意提到Hadoop环境下HDFS中存储的文件如何才能导入到HBase,关于这部分基于HBase Java API的写入方式,之前曾经有过技术文章共享,本文就不再说明.本文基于Hive执行HDFS批量向HBase导入数据,讲解Hive与HBase的整合问题.这方面的文章已经很多,但是由于版本差异,可操作性不大,本文采用的版本均基于以下版本说明中的版本. 二.版本说明 序号 软件 版本 1 Hive  0.10.0 2 HBase 0.94.0 3 Hadoop 1.

hbase学习(一)hbase单机部署和java客户端连接单机hbase

最近看了些hbase的东西,打算写点什么,谁知鼓捣的过程中步步是坑,最终呕心沥血,憋出了这篇文章,实属不易. hbase和hive总是成对出现的,简单说,hbase是数据库,hive是mapReduce作业. 先从hbase单机部署说起,尽量说的简洁点,说多了都是眼泪. 1.给服务器起个机器名,iptables关掉,同时本地绑定host. 起个机器名 1 vi /etc/hosts 127.0.0.1 localhost 211.155.225.210 love-kaige 1 vi /etc/

HBase学习笔记——基于HBase的日志系统的性能优化

我之前参与过一个日志系统的开发,存储用HBase.我简单罗列下用到的HBase优化,备忘.以后把它整理成更友好的介绍性文章. 系统简介 有一张大的日志数据表,保存所有日志.row key是 hash + app id + log-severity + timestamp + host等,cell保存日志正文数据. 可以看到row key的hash保证日志散列在各个region中,写入.查询的负载均衡.但是无法通过它进行范围查询,所以为不同查询模式,建立了多张索引表. 为不同的日志级别(DEBUG

Hive Over HBase的介绍

Hive Over HBase是基于Hive的HQL查询引擎支持对hbase表提供及时查询的功能,它并不是将hql语句翻译成mapreduce来运行,其响应时间在秒级别. 特性 支持的字段类型: boolean, tinyint, smallint, int, bigint, float, double, string, struct (当hbase中的rowkey字段为struct类型,请将子字段定义为string类型,同时指定表的collection items terminated分隔字符

hive跟hbase整合用hive导入数据报错,报一个路径不是目录。

问题描述 hive跟hbase整合用hive导入数据报错,报一个路径不是目录. hive>load data local inpath '/home/hadoop/ha1.txt' into table ha1; FAILED: Hive Internal Error: java.lang.RuntimeException(org.apache.hadoop.ipc.RemoteException: java.io.FileNotFoundException: Parent path is no

Hive与Hbase整合

Hive与Hbase整合 我们这边开始使用hbase做实时查询,但是分析的任务还是得交给hive,hive计算的结果导入到hbase. hive提供了几个jar包,帮助我们实现: 创建与hbase共享的表,数据(数据和表两边都有) 映射来自hbase的表到hive hive查询的结果直接导入hbase 启动hive 启动命令如下,主要是指定jar包,以及hbase使用的zookeeper的地址 bin/hive --auxpath /opt/CDH/hive/lib/hive-hbase-han