1. 程式人生 > >hbase bulk load 小實踐及一些總結

hbase bulk load 小實踐及一些總結

很早就知道bulk load這個東西,也大致都清楚怎麼回事,居然直到前幾天才第一次實踐... 害羞

這篇文章大致分為三個部分:

1. 使用hbase自帶的importtsv工具

2. 自己實現寫mr生成hfile並載入

3. bulk load本身及對依賴的第三方包的一些總結

第一部分:

匯入的檔案是data.txt,符合tsv格式,如下:


做一些準備工作:

a. 在hdfs上穿件/test目錄,並將data.txt傳至該目錄下


b. 建立hbase表bl_tmp


c. 將依賴的jar加到$HADOOP_HOME/conf/hadoop-env.sh (每個人的不一定一樣,加你需要的)


執行hbase自帶的imprttsv工具,這裡輸出路徑是output,列的定義由-Dimporttsv.columns指定:


程式正常執行,執行成功後,檢視/output目錄,output目錄下會根據列族名生成一個自錄,這裡是d,d目錄下為具體的hfile檔案:


執行completebulkload工具將hfile裝載到表bl_tmp中:


裝載完之後,d目錄下的hfile不存在了,這時查詢bl_tmp表,如下:


第二部分:

原始碼直接貼了,簡明扼要,沒什麼好說的... 關鍵的點詳見前邊兩篇簡要介紹相關原始碼的博文...

import java.io.IOException;
import java.util.Date;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat;
import org.apache.hadoop.hbase.mapreduce.PutSortReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public final class HBaseBulkLoadDemo extends Configured implements Tool {

	public static class BulkLoadDemoMapper extends
			Mapper<LongWritable, Text, ImmutableBytesWritable, Put> {

		private static final byte[] FAMILY_NAME = "d".getBytes();
		private static final byte[] COLUMN_A = "colA".getBytes();
		private static final byte[] COLUMN_B = "colB".getBytes();
		private static final byte[] COLUMN_C = "colC".getBytes();

		protected void map(LongWritable key, Text value, Context context) throws IOException,
				InterruptedException {
			String line = value.toString();
			String[] fields = line.split("\t");
			byte[] rowkeybytes = Bytes.toBytes(fields[0]);
			ImmutableBytesWritable rowkey = new ImmutableBytesWritable(rowkeybytes);
			Put put = new Put(rowkeybytes);
			put.add(FAMILY_NAME, COLUMN_A, fields[1].getBytes());
			put.add(FAMILY_NAME, COLUMN_B, fields[2].getBytes());
			put.add(FAMILY_NAME, COLUMN_C, fields[3].getBytes());
			context.write(rowkey, put);
		}

	}

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		System.exit(ToolRunner.run(new HBaseBulkLoadDemo(), args));
	}

	public int run(String[] args) throws Exception {
		Configuration conf = HBaseConfiguration.create();
		String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
		if (otherArgs.length != 3) {
			System.err.println("Usage: <tableName> <inputDir> <outputDir>");
			System.exit(2);
		}
		HTable table = new HTable(conf, otherArgs[0]);
		Job job = new Job(conf);
		job.setJarByClass(HBaseBulkLoadDemo.class);
		job.setJobName("HBaseBulkLoadDemo " + new Date());
		job.setMapperClass(BulkLoadDemoMapper.class);
		job.setReducerClass(PutSortReducer.class);
		job.setMapOutputKeyClass(ImmutableBytesWritable.class);
		job.setMapOutputValueClass(Put.class);
		FileInputFormat.addInputPath(job, new Path(otherArgs[1]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[2]));
		HFileOutputFormat.configureIncrementalLoad(job, table);
		return job.waitForCompletion(true) ? 0 : 1;
	}

}

程式用打包後,扔到叢集上執行,為驗證結果,注意先truncate掉bl_tmp表並刪掉/output目錄。

另外一點,這裡執行自己打的包,如果你沒有打依賴包的話,因為你用到hbase-version.jar,所以你需要把它加到HADOOP_CLASSPATH上:


執行自己打的jar包:


程式正確執行,檢視/output下的輸出:


將資料裝在進bl_tmp仍然可以用completebulkload工具,或者你可以自己寫一個工具,非常簡單,就是構造一個LoadIncrementalHFile物件,並呼叫它的doBulkLoad方法就好了。 然後檢視這時的bl_tmp(注意列名,與importtsv時不一樣...):


第三部分:

關於bulkload本身:

1.這種方式適合初次匯入,對於大資料量,效率非常可觀,並且不需要表offline

2.目前貌似只適合每次對一個單列族匯入..

3.資料量很大時,因為reduce個數與region個數對應,所以導數前記得對錶進行預分割槽。

4.自己實現時,map階段的輸出只能是<ImmutableBytesWritable,KeyValue>或者<ImmutableBytesWritable,Put>,對應的reducer分別是KeyValueSortReducer和PutSortReducer。

關於hadoop對jar的載入方式及bulk load時第三方jar的一些說明,自己在實踐的時候起初迷惑了很久,所以特意總結了下:

1.hadoop jar在執行時一定會將HADOOP_CLASSPATH加到CLASSPATH上(感興趣可以cat hadoop看下),並且將hadoop jar執行的目標jar拷貝到子節點。
2.依賴的第三方jar,一般三種方式處理,要麼-libjars,要麼加到HADOOP_HOME/lib下(所有子節點),要麼打包進目標jar。
3.執行hadop jar hbase-version.jar importtsv時,由於將依賴的jar加到了HADOOP_CLASSPATH,並且在主節點本地可以找到,所以依託TableMapReduceUtil.addDependencyJars方法的作用,依賴的第三方jar在執行時被作為分散式快取拷貝到了子節點,程式得以正確執行。

完... 得意


相關推薦

hbase bulk load 實踐一些總結

很早就知道bulk load這個東西,也大致都清楚怎麼回事,居然直到前幾天才第一次實踐...  這篇文章大致分為三個部分: 1. 使用hbase自帶的importtsv工具 2. 自己實現寫mr生成hfile並載入 3. bulk load本身及對依賴的第三方包的一些總結

移動開發實踐‘坑’總結

設計 頁面 復制代碼 html posit use 比較 國外 itl 1.input placeholder問題   在chrome 模擬移動端調試時[左邊圖],顯示的非常正常,但是在真機上[右邊圖],placeholder裏面的內容明顯靠上,非常的不美觀

大資料之hbase(五) --- 匯出Hbase的表文件到HDFS,Hbase Bulk Load Hbase,MySQL資料通過MR匯入到Hbase表中

一、匯出Hbase的表文件到HDFS -------------------------------------------------------------------------- 1.複製hbase的jar檔案和metrices-core-xxx.jar檔案到

swagger實踐 一些踩過的坑

首先就是我們專案中用的swagger2,編輯的時候已經升級到3.0.0了 有空嘗試下。 然後至少要是個spring的專案,支援@configuration這個註解的版本,我們專案中用的spring4.1.0。 然後就是開開心心的碼程式碼了 @Conf

Pytorch遷移學習技巧 以及 Pytorch技巧的一些總結

遷移學習技巧 內容概要: 遷移學習的概念 Pytorch預訓練模型以及修改 不同修改預訓練模型方式的情況 一些例子:只針對dense layer的重新訓練 ,凍結初始層的權重重新訓練 遷移學習的概念 神經網路需要用資料來訓練,它從資料中獲得資

程序canvas使用,一些坑,以及自己的一些總結

開發 背景圖 height java gda 數據 利用 let 宋體 自己做了一個小程序,主要用於給頭像加圖標的那種,和qq似的,主要用canvas做的, 第一回用,掉了很多坑,所以今天系統的總結一下自己所做的,如果大家有不理解的地方,歡迎提問 canvas可以用來畫一

關於ueditor的一些用法,模板使用方面的一些總結

baidu 配置 bsp sta nbsp htm 設置 用法 blog 將自定義模板設為默認 http://www.bmqy.net/9234.html 設置自定義模板 http://www.cnblogs.com/liupeng61

網絡配置註意事項一些竅門

達內 網絡 安全 竅門 思科 華為1、建議老設備加入現網:(1)IOS配置更新成與現網一致的;(2)所有的配置清除;(3)確認無誤後再上線。2、思科IOS快捷鍵: CTRL+A/CTRL+E,將光標快速移動到命令最前面/最後面。在執行show running-config以後直接結束顯示回到命令輸入狀態,按t

使用Ubuntu14.04中的一些問題處理辦法

apt-get 情況下 找不到 安裝 sam ubuntu14 -s 聲音 型號 1、沒有聲音打開終端,運行alsamixer,把自動靜音(Auto-Mute)那一項關閉,聲音就出來了。 2、找不到無線網卡方法一:在安裝時就插上網線,並且在安裝選項上勾上安裝第三方軟件……這

實踐】Yalmip使用Knitro的一些總結

完整 步驟 bubuko pro 打開 ecg LV start features Yalmip使用Knitro的一些總結 1.軟件   Knitro 11.0.1   Win64(包含安裝包和確定機器ID的軟件):鏈接:https://pan.baidu.com/s/

HBase內建過濾器的一些總結

轉載自:https://blog.csdn.net/cnweike/article/details/42920547 HBase為篩選資料提供了一組過濾器,通過這個過濾器可以在HBase中的資料的多個維度(行,列,資料版本)上進行對資料的篩選操作,也就是說過濾器最終能夠篩選的資料能夠細化到具體的

STL基本使用方法總結一些補充

(Hint:如果在main函式中定義STL的話會比較費時間,對於某些題目來說會超時,所以一般將STL定義為全域性變數,這樣的話快很多~) 一、vector向量容器 標頭檔案#include <vector> 1.建立vector物件(1)不指定容器大小vector<i

HBase技術與應用實踐 | HBase2.0重新定義物件實時存取

本次分享來自中國HBase技術社群第七屆MeetUp成都站,分享嘉賓天引 阿里巴巴 技術專家專注在大資料領域,擁有多年分散式、高併發、大規模系統的研發與實踐經驗,先後參與HBase、Phoenix、Lindorm等產品的核心引擎研發,目前負責阿里上萬節點的HBase As a Service的發展與落地。 分

Sqlit3資料庫的詳細講解一些在python中的技巧

資料庫的基本概念。 庫 schema:好像整個表格文件。好像一個物流公司共佔地100畝,蓋了50個倉庫,A01倉庫負責儲存河南客戶貨物,A02倉庫負責儲存廣州xx專案物料。每一個倉庫對應一個專案。 表 table:對應Excel表格裡sheet1 sheet2。由行內內

點選按鈕刪除bootstrapTable選中行,js模組化一些問題的總結

頁面效果展示 html程式碼: <div class="col-md-12" style="height: 15%"> <form action="web?module=stwmgr&action=Develop&method=se

白學習Vi/Vim編輯器安裝使用總結

Table of Contents 1.vi/vim是什麼?  2.vim模式有哪些?如何切換?   3.使用vim如何開啟檔案?  4.關閉檔案   5.移動游標     6.翻屏:   7

Linux技巧-返回上一次目錄、一些control快捷鍵

1、Linux回到上一次目錄 cd -     -  ==  $OLDPWD 可以 echo $OLDPWD檢視 cd -   ==   cd $OLDPWD   一不小心輸入cd 直接回車就會跑

利用Git 上傳程式碼到Coding的簡單操作步驟一些錯誤總結

今天看到git可以上傳程式碼到coding.net,感覺還是不錯的,於是自己動手上傳了一次,在期間發現了很多的問題,在這裡總結一下,希望能幫到未上傳成功的程式設計師們! 1:先自己註冊coding.net賬號! 2.安裝git 客戶端 安裝過程中的詳細說明可參考: https://jingyan.baidu

HBase利用bulk load批量匯入資料

OneCoder只是一個初學者,記錄的只是自己的一個過程。不足之處還望指導。 看網上說匯入大量資料,用bulk load的方式效率比較高。bulk load可以將固定格式的資料檔案轉換為HFile檔案匯入,當然也可以直接匯入HFile檔案。所以

C#中的自定義控制元件中的屬性、事件一些相關特性的總結

今天學習了下C#使用者控制元件開發新增自定義屬性的事件,主要參考了MSDN,總結並實驗了一些用於開發自定義屬性和事件的特性(Attribute)。 在這裡先說一下我的環境: 作業系統:Windows7旗艦版(Service Pack 1) VS版本:Microsoft