[英]How to import a CSV into HBASE table using MapReduce
嗨,我是hadoop的新手,我正在嘗試使用MapReduce將csv表導入到Hbase。
我正在使用hadoop 1.2.1和hbase 1.1.1
我有以下格式的數據:
Wban Number, YearMonthDay, Time, Hourly Precip
03011,20060301,0050,0
03011,20060301,0150,0
我為批量加載編寫了以下代碼
public class BulkLoadDriver extends Configured implements Tool{
public static void main(String [] args) throws Exception{
int result= ToolRunner.run(HBaseConfiguration.create(), new BulkLoadDriver(), args);
}
public static enum COUNTER_TEST{FILE_FOUND, FILE_NOT_FOUND};
public String tableName="hpd_table";// name of the table to be inserted in hbase
@Override
public int run(String[] args) throws Exception {
//Configuration conf= this.getConf();
Configuration conf = HBaseConfiguration.create();
Job job= new Job(conf,"BulkLoad");
job.setJarByClass(getClass());
job.setMapperClass(bulkMapper.class);
FileInputFormat.setInputPaths(job, new Path(args[0]));
job.setInputFormatClass(TextInputFormat.class);
TableMapReduceUtil.initTableReducerJob(tableName, null, job); //for HBase table
job.setNumReduceTasks(0);
return (job.waitForCompletion(true)?0:1);
}
private static class bulkMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put>{
//static class bulkMapper extends TableMapper<ImmutableBytesWritable, Put> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
String [] val= value.toString().split(",");
// store the split values in the bytes format so that they can be added to the PUT object
byte[] wban=Bytes.toBytes(val[0]);
byte[] ymd= Bytes.toBytes(val[1]);
byte[] tym=Bytes.toBytes(val[2]);
byte[] hPrec=Bytes.toBytes(val[3]);
Put put=new Put(wban);
put.add(ymd, tym, hPrec);
System.out.println(wban);
context.write(new ImmutableBytesWritable(wban), put);
context.getCounter(COUNTER_TEST.FILE_FOUND).increment(1);
}
}
}
我為此創建了一個jar並在終端中運行以下命令:
hadoop jar〜/ hadoop-1.2.1 / MRData / bulkLoad.jar bulkLoad.BulkLoadDriver /MR/input/200603hpd.txt hpd_table
但是我得到的輸出是數百行以下類型的行:try_201509012322_0001_m_000000_0:[B @ 2d22bfc8 try_201509012322_0001_m_000000_0:[B @ 445cfa9e
我不確定它們是什么意思,以及如何執行此批量上傳。 請幫忙。
提前致謝。
有幾種方法可以將數據導入HBase。 請查看以下鏈接:
HBase批量加載:
CSV格式的數據文件
將數據處理為HFile格式 。 有關HFile格式的詳細信息,請參見http://hbase.apache.org/book/hfile_format.html 。 通常,您使用MapReduce作業進行轉換,並且由於數據是唯一的,因此經常需要自己編寫Mapper。 作業必須發出行鍵作為Key,並發出KeyValue,Put或Delete作為值。 Reducer由HBase處理; 使用HFileOutputFormat.configureIncrementalLoad()對其進行配置,並執行以下操作:
在輸出文件夾中的每個區域創建一個HFile 。 輸入數據幾乎完全被重寫,因此您需要的可用磁盤空間至少是原始數據集大小的兩倍。 例如,對於mysqldump的100 GB輸出,HDFS中至少應有200 GB可用磁盤空間。 您可以在過程結束時刪除原始輸入文件。
將文件加載到HBase中。 使用LoadIncrementalHFiles命令(通常稱為completebulkload工具),向其傳遞一個URL,該URL在HDFS中定位文件。 每個文件都被加載到RegionServer上該區域的相關區域中。 您可以通過傳遞--versions = N選項來限制加載的版本數,其中N是要包含的最大版本數,從最新到最舊(最大時間戳到最小時間戳)。 如果在創建文件后拆分了一個區域,則該工具會根據新邊界自動拆分HFile。 該過程效率低下,因此,如果您的表正在被其他過程寫入,則應在完成轉換步驟后立即加載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.