簡體   English   中英

如何使用MapReduce將CSV導入HBASE表

[英]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。 請查看以下鏈接:

http://www.cloudera.com/content/cloudera/zh-CN/documentation/core/latest/topics/admin_hbase_import.html

HBase批量加載:

  1. CSV格式的數據文件

  2. 將數據處理為HFile格式 有關HFile格式的詳細信息,請參見http://hbase.apache.org/book/hfile_format.html 通常,您使用MapReduce作業進行轉換,並且由於數據是唯一的,因此經常需要自己編寫Mapper。 作業必須發出行鍵作為Key,並發出KeyValue,Put或Delete作為值。 Reducer由HBase處理; 使用HFileOutputFormat.configureIncrementalLoad()對其進行配置,並執行以下操作:

    • 檢查表以配置總訂單分區程序
    • 將分區文件上載到集群並將其添加到DistributedCache
    • 設置化簡任務數以匹配當前區域數
    • 設置輸出鍵/值類以匹配HFileOutputFormat要求
    • 將Reducer設置為執行適當的排序(KeyValueSortReducer或PutSortReducer)
  3. 在輸出文件夾中的每個區域創建一個HFile 輸入數據幾乎完全被重寫,因此您需要的可用磁盤空間至少是原始數據集大小的兩倍。 例如,對於mysqldump的100 GB輸出,HDFS中至少應有200 GB可用磁盤空間。 您可以在過程結束時刪除原始輸入文件。

  4. 將文件加載到HBase中。 使用LoadIncrementalHFiles命令(通常稱為completebulkload工具),向其傳遞一個URL,該URL在HDFS中定位文件。 每個文件都被加載到RegionServer上該區域的相關區域中。 您可以通過傳遞--versions = N選項來限制加載的版本數,其中N是要包含的最大版本數,從最新到最舊(最大時間戳到最小時間戳)。 如果在創建文件后拆分了一個區域,則該工具會根據新邊界自動拆分HFile。 該過程效率低下,因此,如果您的表正在被其他過程寫入,則應在完成轉換步驟后立即加載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM