2011-12-27 111 views
12

我已经安装了hadoop和hbase cdh3u2。在hadoop我有一个文件在路径/home/file.txt。它有像这样的数据从HDFS导入数据到HBase(cdh3u2)

one,1 
two,2 
three,3 

我想将这个文件导入hbase。在那里,第一个字段应该被解析为String,第二个字段被解析为整数,然后它应该被推入到hbase中。帮我在dvance做到这一点

aThanks ....

+0

那你希望你的关键是什么?你是把他们推到一个单一的家庭,还是两个单独的家庭? – 2011-12-27 14:24:30

回答

20

我喜欢使用Apache猪的摄取到HBase的,因为它是简单,直接,灵活。

这是一个Pig脚本,可以在创建表格和列族之后为您完成这项工作。要创建表和列族,你会做:

$ hbase shell 
> create 'mydata', 'mycf' 

将文件移动到HDFS:

$ hadoop fs -put /home/file.txt /user/surendhar/file.txt 

然后,写一个小猪脚本存储与HBaseStorage(你可能要看看了怎么set up and run Pig):

A = LOAD 'file.txt' USING PigStorage(',') as (strdata:chararray, intdata:long); 
STORE A INTO 'hbase://mydata' 
     USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
       'mycf:intdata'); 

注意,在上面的脚本,关键将是strdata。如果你想从某个东西创建自己的密钥,请使用FOREACH语句来生成密钥。 HBaseStorage假定上一个关系中的第一件事(在这种情况下为A::strdata)是关键。


一些其他的选择将是:

  • Java MapReduce工作要做如上同样的事情。
  • the client直接交互HTable并逐行放入。这应该只能用更小的文件来完成。
  • 使用某种脚本(即,sed,perl,python)将数据与hbase shell一起向上推,这些脚本将csv的行转换为shell put命令。同样,只有在记录数量很少的情况下才能这样做。

    $ cat /home/file.txt | transform.pl 
    put 'mydata', 'one', 'mycf:intdata', '1' 
    put 'mydata', 'two', 'mycf:intdata', '2' 
    put 'mydata', 'three', 'mycf:intdata', '3' 
    
    $ cat /home/file.txt | transform.pl | hbase shell 
    
+0

嘿唐纳德。你能看看这个帖子吗? http://stackoverflow.com/questions/21126483/how-to-have-pig-store-rows-in-hbase-as-text-and-not-bytes – 2014-01-14 23:50:50

+0

唐纳德你是写这个答案的英雄! – 2014-04-25 17:32:52

+0

别忘了在PIG脚本中注册所需的HBase jar。像那样“REGISTER /usr/lib/hbase/lib/*.jar;” – PinoSan 2014-06-22 22:41:19