1. 程式人生 > >HBase的幾種匯入資料的方式

HBase的幾種匯入資料的方式

1、傳統的主要使用Hbase的shell進行手動的輸入,都需要經過Hbase的介面,過程

2、使用MapReduce進行批量的匯入,但是還是會經過Hbase的HMaster,HregionerServer一些列的過程,增加系統的資源的消耗。例如:

import java.text.SimpleDateFormat;


public class BatchImport {


//資料的形式類似於 0 20101223122329大叫好
static class BatchImportMapper extends Mapper<LongWritable, Text, LongWritable, Text>{
SimpleDateFormat dateformat1=new SimpleDateFormat("yyyyMMddHHmmss");
Text v2 = new Text();

protected void map(LongWritable key, Text value, Context context) throws java.io.IOException ,InterruptedException {
final String[] splited = value.toString().split("\t");
try {
final Date date = new Date(Long.parseLong(splited[0].trim()));
final String dateFormat = dateformat1.format(date);

v2.set(splited[1]+":"+dateFormat+"\t"+value.toString());
context.write(key, v2);
} catch (NumberFormatException e) {
final Counter counter = context.getCounter("BatchImport", "ErrorFormat");
counter.increment(1L);
System.out.println("出錯了"+splited[0]+" "+e.getMessage());
}
};
}

static class BatchImportReducer extends TableReducer<LongWritable, Text, NullWritable>{
protected void reduce(LongWritable key, java.lang.Iterable<Text> values,Context context) throws java.io.IOException ,InterruptedException {
for (Text text : values) {
final String[] splited = text.toString().split("\t");

final Put put = new Put(Bytes.toBytes(splited[0]));
put.add(Bytes.toBytes("cf"), Bytes.toBytes("date"), Bytes.toBytes(splited[1]));
//省略其他欄位,呼叫put.add(....)即可
context.write(NullWritable.get(), put);
}
};
}

public static void main(String[] args) throws Exception {
final Configuration configuration = new Configuration();
//設定zookeeper
configuration.set("hbase.zookeeper.quorum", "master");
//設定hbase表名稱
configuration.set(TableOutputFormat.OUTPUT_TABLE, "wlan_log");
//將該值改大,防止hbase超時退出
configuration.set("dfs.socket.timeout", "180000");

final Job job = new Job(configuration, "HBaseBatchImport");

job.setMapperClass(BatchImportMapper.class);
job.setReducerClass(BatchImportReducer.class);
//設定map的輸出,不設定reduce的輸出型別
job.setMapOutputKeyClass(LongWritable.class);
job.setMapOutputValueClass(Text.class);

job.setInputFormatClass(TextInputFormat.class);
//不再設定輸出路徑,而是設定輸出格式型別
job.setOutputFormatClass(TableOutputFormat.class);

FileInputFormat.setInputPaths(job, "hdfs://222.27.174.66:9000/input2");

job.waitForCompletion(true);
}
}

3、不經過Hbase的過程,直接在HDFS中生成HFile,在將HFile更新到相應的HReginServer中

可以使用命令的方式,將hdfs檔案轉化為hfile

首先建立一個表 create 'datatsv' ,'d'

建立一個檔案inputfile

row1 c1 c2

row2 c1 c2

row3 c1 c2

row4 c1 c2

row5 c1 c2

row6 c1 c2

row7 c1 c2

row8 c1 c2

row9 c1 c2

hadoop fs -put inputfile /user/input/inputfile //上傳到hdfs的目錄下

hadoop  jar hbase-0.94.7.jar importtsv  -Dimporttsv.columns=HBASE_ROW_KEY,d:c1,d:c2 -Dimporttsv.bulk.output=/user/output/outputfile datatsv /user/input/inputfile

在/user/output/outputfile目錄下生成HFile檔案

將HFile匯入到HBAse中

bin/hbaseorg.apache.hadoop.hbase.mapreduce.LoadIncreamentalHFiles /user/output/outputfile  datatsv

一、這種方式有很多的優點:

1. 如果我們一次性入庫hbase巨量資料,處理速度慢不說,還特別佔用Region資源, 一個比較高效便捷的方法就是使用 “Bulk Loading”方法,即HBase提供的HFileOutputFormat類。

2. 它是利用hbase的資料資訊按照特定格式儲存在hdfs內這一原理,直接生成這種hdfs記憶體儲的資料格式檔案,然後上傳至合適位置,即完成巨量資料快速入庫的辦法。配合mapreduce完成,高效便捷,而且不佔用region資源,增添負載。

二、這種方式也有很大的限制:

1. 僅適合初次資料匯入,即表內資料為空,或者每次入庫表內都無資料的情況。

三、接下來一個demo,簡單介紹整個過程。

1. 生成HFile部分

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 package zl.hbase.mr; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat; import org.apache.hadoop.hbase.mapreduce.KeyValueSortReducer;

相關推薦

HBase匯入資料方式

1、傳統的主要使用Hbase的shell進行手動的輸入,都需要經過Hbase的介面,過程 2、使用MapReduce進行批量的匯入,但是還是會經過Hbase的HMaster,HregionerServer一些列的過程,增加系統的資源的消耗。例如: import jav

hive學習 —Hive匯出資料方式

如果資料檔案恰好是使用者需要的格式,那麼只需要拷貝檔案或資料夾就可以。 hadoop fs –cp source_path target_path 2.匯出到本地檔案系統 --不能使用insert into local directory來匯出資料,會報錯 --只能使用insert over

Hbase資料入庫(load)方式比較

1. 預先生成HFile入庫 2. 通過MapReduce入庫 /* MapReduce 讀取hdfs上的檔案,以HTable.put(put)的方式在map中完成資料寫入,無reduce過程*/ import java.io.IOException; import or

Hbase資料入庫方式比較

import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configurati

一起學Hive——詳解四匯入資料方式

在使用Hive的過程中,匯入資料是必不可少的步驟,不同的資料匯入方式效率也不一樣,本文總結Hive四種不同的資料匯入方式: 從本地檔案系統匯入資料 從HDFS中匯入資料 從其他的Hive表中匯入資料 建立表的同時匯入資料 使用匯入資料時,會使用到into和overwrite into兩個關鍵字,into是

python: websocket獲取實時資料常見連結方式

第一種, 使用create_connection連結,需要pip install websocket-client (此方法不建議使用,連結不穩定,容易斷,並且連線很耗時) import time from websocket import create_co

Android上常用的本地資料儲存方式:3、SQLite資料庫儲存資料

SQLite是輕量級嵌入式資料庫引擎,它支援 SQL 語言,並且只利用很少的記憶體就有很好的效能。此外它還是開源的,任何人都可以使用它。許多開源專案((Mozilla, PHP, Python)都使用了 SQLite.SQLite 由以下幾個元件組成:SQL 編譯器、核心、

nginx upstream 常用的調度方式

均衡 gin 字節 默認 結果 根據 主機 upstream 指定 nginx可以根據客戶IP進行負載均衡,在upstream裏設置ip_hash,以可以對同一個C類地址段的客戶端選擇同一個後端服務器,除非那個後端服務器宕了才會換一個.C類地址:C類地址第1字節、第2字節和

Vue2 常見開局方式

fig elm temp common disable .... false app oot 在SF問題中看到了一個關於vue-cli中的template問題,問題是這樣的:用vue-cli工具生成的main.js中: import Vue from ‘vue‘ i

最近接觸的APP支付方式——支付寶支付

.net core 很多 app 用法 http 相同 沒有 圖片 app支付 項目是在VS2017上、基於.net core 開發的web api 接口 所有的支付接入之前都要先申請好自己的商戶平臺,還有有一個賬戶用於測試使用,這些沒有事先配置好,那麽接下來的開發會無從下

愛創課堂每日一題第五十八天-javascript對象的創建方式

前端 前端學習 前端入門 北京前端1,工廠模式2,構造函數模式3,原型模式4,混合構造函數和原型模式5,動態原型模式6,寄生構造函數模式7,穩妥構造函數模式愛創課堂每日一題第五十八天-javascript對象的幾種創建方式

javascript對象的創建方式整理

添加 屬性和方法 {} ceo this scrip 方法 alert type 1.工廠模式 //工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。 function createPerson(name,age,job){

JS對象的創建方式

push 排序 pos 即使 重復字符 order data 默認 返回值 1、join() join(separator): 將數組的元素組起一個字符串,以separator為分隔符,省略的話則用默認用逗號為分隔符,該方法只接收一個參數:即分隔符。 1 2

SQL Server中遍歷方式比較

不同 .com font size 常用 分享 分享圖片 遊標 inf SQL遍歷解析   在SQL的存儲過程,函數中,經常需要使用遍歷(遍歷table),其中遊標、臨時表等遍歷方法很常用。面對小數據量,這幾種遍歷方法均可行,但是面臨大數據量時,就需要擇優選擇,不同的遍歷方

應用層與內核的通信方式

物理內存 是什麽 nts iat 其他 輸入緩沖 BE virt getc 應用程序與驅動程序據我所知,細分可以分6種,ReadFile,WirteFile方式的緩沖區設備讀寫,直接方式讀寫,和其他方式讀寫。Io設備控制操作(即DeviceControl)的緩沖內存模式IO

創建線程有不同的方式?你喜歡哪一?為什麽?

什麽 all HR thread 同時 應用設計 創建線程 callable 應用程序 創建線程有四種不同的方式: 1、繼承Thread類 2、實現Runnable接口 3、應用程序可以使用Executor框架來創建線程池 4、實現Callable接口 我更喜歡實現Ru

布局方式

技術分享 sel tween 一定的 交叉 寬高 模式 了解 span 一、固定布局: 寬度,高度固定,頁面被一個固定網頁包裹,容器不能移動,頁面的寬高不隨頁面的變化而變化,這種布局大家比較熟悉,這種方式一度成為頁面布局的主流方式,這樣布局設計簡單,更容易定義,

Oracle常見的登錄方式

分享 png 輸入密碼 ron 用戶登錄 con com 登錄方式 clas 1、運行SQLPLUS工具 C:\Users\csb>sqlplus(回車) (輸入賬戶)system(回車) (輸入密碼) (回車) 2、直接進入SQLPLUS命令提示

線程的創建方式

head class 線程池 runnable 計算 異步 影響 bsp nts 編寫多線程程序是為了實現多任務的並發執行,從而能夠更好地與用戶交互。一般有三種方法,Thread,Runnable,Callable. Runnable和Callable的區別是,(1)Cal

學習筆記--離散化方式

常見 然而 stl namespace img 完成 uno find 之前 前言 在OI學習過程中,我們常常會發現一些題目(尤其數據結構題)中,一些數據的範圍很大,但是涉及的數值的個數卻很少,同時我們想用一個數組的下標與這些數據建立一一對應關系,這時我們就需要離散化 大致