真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

利用BulkLoad導(dǎo)入Hbase表-創(chuàng)新互聯(lián)

1、插入HBase表傳統(tǒng)方法具有什么問題?

我們先看下 HBase 的寫流程:

目前創(chuàng)新互聯(lián)建站已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、凱里網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

利用BulkLoad導(dǎo)入Hbase表

    通常 MapReduce 在寫HBase時(shí)使用的是TableOutputFormat方式,在map/reduce中直接生成put對(duì)象寫入HBase,該方式在大量數(shù)據(jù)寫入時(shí)效率低下,因?yàn)镠Base會(huì)block寫入,頻繁進(jìn)行flush、split、compact等大量IO操作,這樣對(duì)HBase節(jié)點(diǎn)的穩(wěn)定性也會(huì)造成一定的影響,例如GC時(shí)間過長(zhǎng),響應(yīng)變慢,導(dǎo)致節(jié)點(diǎn)超時(shí)退出,并引起一系列連鎖反應(yīng),而HBase支持BulkLoad的寫入方式,它是利用HBase數(shù)據(jù)按照特定格式存儲(chǔ)在HDFS內(nèi)這一原理,直接利用MapReduce生成持久化的HFile數(shù)據(jù)格式文件,然后上傳至合適位置,即完成巨量數(shù)據(jù)快速入庫(kù)的辦法。配合mapreduce完成,高效便捷,而且不占用region資源,增添負(fù)載,在大數(shù)據(jù)量寫入時(shí)能極大的提高寫入效率,并降低對(duì)HBase節(jié)點(diǎn)的寫入壓力。
    通過使用先生成HFile,然后再BulkLoad到HBase的方式來替代之前直接調(diào)用HTableOutputFormat的方法有如下的好處:
(1)消除了對(duì)HBase集群的插入壓力
(2)提高了Job的運(yùn)行速度,降低了Job的執(zhí)行時(shí)間

2、BulkLoad實(shí)踐

    BulkLoad原理已在上面介紹,其具體實(shí)現(xiàn)流程是先用MapReduce生成HFile文件輸出并且存儲(chǔ)在HDFS上,然后利用loader.doBulkLoad(HFIle,HBaseTable);寫入HBase中。具體代碼如下:

public class BulkLoad {          private static final String JOBNAME = "BulkLoad";     private static final String TABLENAME = "bulkLoad";     private static final String PATH_IN = "/xx/xx";    //輸入路徑     private static final String PATH_OUT = "/xx/xx";    //輸入路徑              private static final String SEPARATOR = "\\|";          private static final byte[] ColumnFamily =  "f".getBytes();  // 列簇     private static final byte[] QUALIFIER_TAG1 =  "tag1".getBytes();    // 列名       private static final byte[] QUALIFIER_TAG2 =  "tag2".getBytes();      private static final byte[] QUALIFIER_TAG3 =  "tag3".getBytes();      private static final byte[] QUALIFIER_TAG4 =  "tag4".getBytes();      private static final byte[] QUALIFIER_TAG5 =  "tag5".getBytes();      private static final byte[] QUALIFIER_TAG6 =  "tag6".getBytes();      private static final byte[] QUALIFIER_TAG7 =  "tag7".getBytes();      private static final byte[] QUALIFIER_TAG8 =  "tag8".getBytes();      private static final byte[] QUALIFIER_TAG9 =  "tag9".getBytes();      private static final byte[] QUALIFIER_TAG10 =  "tag10".getBytes();           public static class Map extends Mapper {         protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {             String[] strArr = value.toString().split(SEPARATOR);             String row = strArr[0];             Put put = new Put(Bytes.toBytes(row.toString()));     // rowkey             put.add(ColumnFamily, QUALIFIER_TAG1, Bytes.toBytes(strArr[2]));             put.add(ColumnFamily, QUALIFIER_TAG2, Bytes.toBytes(strArr[3]));             put.add(ColumnFamily, QUALIFIER_TAG3, Bytes.toBytes(strArr[4]));             put.add(ColumnFamily, QUALIFIER_TAG4, Bytes.toBytes(strArr[5]));             put.add(ColumnFamily, QUALIFIER_TAG5, Bytes.toBytes(strArr[6]));             put.add(ColumnFamily, QUALIFIER_TAG6, Bytes.toBytes(strArr[7]));             put.add(ColumnFamily, QUALIFIER_TAG7, Bytes.toBytes(strArr[8]));             put.add(ColumnFamily, QUALIFIER_TAG8, Bytes.toBytes(strArr[9]));             put.add(ColumnFamily, QUALIFIER_TAG9, Bytes.toBytes(strArr[10]));             put.add(ColumnFamily, QUALIFIER_TAG10, Bytes.toBytes(strArr[11]));                          context.write(new ImmutableBytesWritable(value.getBytes()), put);         }     }          public static void main(String[] args) throws Exception {         Configuration conf = HBaseConfiguration.create();         conf.set("hbase.zookeeper.quorum", "xx,xx,xx");         Job job = new Job(conf, JOBNAME);         job.setJarByClass(CreditScoreBulkLoad.class);         job.setMapOutputKeyClass(ImmutableBytesWritable.class);         job.setMapOutputValueClass(Put.class);                  job.setMapperClass(Map.class);         //這個(gè) SorterReducer(KeyValueSortReducer或PutSortReducer) 可以不指定,         //因?yàn)樵创a中已經(jīng)做了判斷         job.setReducerClass(PutSortReducer.class);         job.setOutputFormatClass(HFileOutputFormat.class);         FileSystem fs = FileSystem.get(URI.create("/"),conf);                  Path outPath = new Path(PATH_OUT);         if (fs.exists(outPath))fs.delete(outPath, true);         FileInputFormat.setInputPaths(job, new Path(PATH_IN));         FileOutputFormat.setOutputPath(job, outPath);         HTable table = new HTable(conf, TABLENAME);         HFileOutputFormat.configureIncrementalLoad(job, table);         if(job.waitForCompletion(true)){             LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);             loader.doBulkLoad(outPath, table);         }         System.exit(0);     } }

3、說明與注意事項(xiàng):

(0)上文提到會(huì)將生成的HFile文件插入HBase中,在此過程中由MapReduce生成的存儲(chǔ)在HDFS上的文件會(huì)消失,其實(shí)插入HBase就是將HFile文件移到HBase中,但是HFile文件在HDFS上的存儲(chǔ)路徑還在,只是里面的文件消失了。

(1)利用BulkLoad導(dǎo)入HBase時(shí),定記得在建表時(shí)做region的預(yù)切分(隨后會(huì)對(duì)HBase的Region進(jìn)行總結(jié)),HFileOutputFormat.configureIncrementalLoad方法會(huì)根據(jù)region的數(shù)量來覺得reduce的數(shù)量以及每個(gè)reduce覆蓋的rowkey范圍。否則當(dāng)個(gè)reduce過大,任務(wù)處理不均衡,導(dǎo)致任務(wù)運(yùn)行時(shí)間過長(zhǎng)。

(2)單個(gè)rowkey下的子列不要過多,否則在reduce階段排序的時(shí)候會(huì)造成oom,有一種辦法是通過二次排序來避免reduce階段的排序,看應(yīng)用而定。

(3)該代碼執(zhí)行完后需要將hdfs中生成好的hfile寫入到hbase表中。采用hadoop jar hbase-version.jar completebulkload /hfilepath tablename 命令實(shí)現(xiàn)。

(4)HFile方式在所有的加載方案里面是最快的,不過有個(gè)前提——數(shù)據(jù)是第一次導(dǎo)入,表是空的。如果表中已經(jīng)有了數(shù)據(jù)。HFile再導(dǎo)入到hbase的表中會(huì)觸發(fā)split操作。

(5)最終輸出結(jié)果,無論是map還是reduce,輸出部分key和value的類型必須是: < ImmutableBytesWritable, KeyValue>或者< ImmutableBytesWritable, Put>。
否則報(bào)這樣的錯(cuò)誤:

java.lang.IllegalArgumentException: Can't read partitions file ... Caused by: java.io.IOException: wrong key class: org.apache.hadoop.io.*** is not class org.apache.hadoop.hbase.io.ImmutableBytesWritable

(6)最終輸出部分,Value類型是KeyValue 或Put,對(duì)應(yīng)的Sorter分別是KeyValueSortReducer或PutSortReducer,這個(gè) SorterReducer 可以不指定,因?yàn)樵创a中已經(jīng)做了判斷:

if (KeyValue.class.equals(job.getMapOutputValueClass())) {     job.setReducerClass(KeyValueSortReducer.class); } else if (Put.class.equals(job.getMapOutputValueClass())) {     job.setReducerClass(PutSortReducer.class); } else {     LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass()); }

(7) MR例子中job.setOutputFormatClass(HFileOutputFormat.class); HFileOutputFormat只適合一次對(duì)單列族組織成HFile文件,多列簇需要起多個(gè)job,不過新版本的 Hbase 已經(jīng)解決了這個(gè)限制。

(8) MR例子中最后生成HFile存儲(chǔ)在HDFS上,輸出路徑下的子目錄是各個(gè)列族。如果對(duì)HFile進(jìn)行入庫(kù)HBase,相當(dāng)于move HFile到HBase的Region中,HFile子目錄的列族內(nèi)容沒有了。

(9)最后一個(gè) Reduce 沒有 setNumReduceTasks 是因?yàn)?,該設(shè)置由框架根據(jù)region個(gè)數(shù)自動(dòng)配置的。

(10)下邊配置部分,注釋掉的其實(shí)寫不寫都無所謂,因?yàn)榭丛创a就知道configureIncrementalLoad方法已經(jīng)把固定的配置全配置完了,不固定的部分才需要手動(dòng)配置。

4、Refer:

1、http://blog.csdn.net/kirayuan/article/details/6371635

2、http://blog.pureisle.net/archives/1950.html

3、http://shitouer.cn/2013/02/hbase-hfile-bulk-load

4、http://my.oschina.net/leejun2005/blog/187309

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文題目:利用BulkLoad導(dǎo)入Hbase表-創(chuàng)新互聯(lián)
文章源于:http://weahome.cn/article/csscdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部