MapReduce操作HBase

運行HBase時常會遇到個錯誤,我就有這樣的經歷。?

ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times

檢查日志:org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol version mismatch.?(client = 42, server = 41)

如果是這個錯誤,說明RPC協議不一致所造成的,解決方法:將hbase/lib目錄下的hadoop-core的jar文件刪除,將hadoop目錄下的hadoop-0.20.2-core.jar拷貝到hbase/lib下面,然后重新啟動hbase即可。第二種錯誤是:沒有啟動hadoop,先啟用hadoop,再啟用hbase。

在Eclipse開發中,需要加入hadoop所有的jar包以及HBase二個jar包(hbase,zooKooper)。

HBase基礎可見帖子:http://www.cnblogs.com/liqizhou/archive/2012/05/14/2499112.html

  1. 建表,通過HBaseAdmin類中的create靜態方法來創建表。
  2. HTable類是操作表,例如,靜態方法put可以插入數據,該類初始化時可以傳遞一個行鍵,靜態方法getScanner()可以獲得某一列上的所有數據,返回Result類,Result類中有個靜態方法getFamilyMap()可以獲得以列名為key,值為value,這剛好與hadoop中map結果是一樣的。
  3. package test;
    import java.io.IOException;
    import java.util.Map;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.client.HBaseAdmin;
    import org.apache.hadoop.hbase.client.HTable;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Result;public class Htable {/*** @param args*/public static void main(String[] args) throws IOException {// TODO Auto-generated method stubConfiguration hbaseConf = HBaseConfiguration.create();HBaseAdmin admin = new HBaseAdmin(hbaseConf);HTableDescriptor htableDescriptor = new HTableDescriptor("table".getBytes());  //set the name of tablehtableDescriptor.addFamily(new HColumnDescriptor("fam1")); //set the name of column clustersadmin.createTable(htableDescriptor); //create a table HTable table = new HTable(hbaseConf, "table"); //get instance of table.for (int i = 0; i < 3; i++) {   //for is number of rowsPut putRow = new Put(("row" + i).getBytes()); //the ith rowputRow.add("fam1".getBytes(), "col1".getBytes(), "vaule1".getBytes());  //set the name of column and value.putRow.add("fam1".getBytes(), "col2".getBytes(), "vaule2".getBytes());putRow.add("fam1".getBytes(), "col3".getBytes(), "vaule3".getBytes());table.put(putRow);}for(Result result: table.getScanner("fam1".getBytes())){//get data of column clusters for(Map.Entry<byte[], byte[]> entry : result.getFamilyMap("fam1".getBytes()).entrySet()){//get collection of resultString column = new String(entry.getKey());String value = new String(entry.getValue());System.out.println(column+","+value);}}admin.disableTable("table".getBytes()); //disable the tableadmin.deleteTable("table".getBytes());  //drop the tbale
        }
    }
    以上代碼不難看懂。

下面介紹一下,用mapreduce怎樣操作HBase,主要對HBase中的數據進行讀取。

現在有一些大的文件,需要存入HBase中,其思想是先把文件傳到HDFS上,利用map階段讀取<key,value>對,可在reduce把這些鍵值對上傳到HBase中。

package test;import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;public class MapperClass extends Mapper<LongWritable,Text,Text,Text>{public void map(LongWritable key,Text value,Context context)thorws IOException{String[] items = value.toString().split(" ");String k = items[0];String v = items[1];         context.write(new Text(k), new Text(v));}}

Reduce類,主要是將鍵值傳到HBase表中

package test;import java.io.IOException;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.io.Text;public class ReducerClass extends TableReducer<Text,Text,ImmutableBytesWritable>{public void reduce(Text key,Iterable<Text> values,Context context){String k = key.toString();StringBuffer str=null;for(Text value: values){str.append(value.toString());}String v = new String(str); Put putrow = new Put(k.getBytes());putrow.add("fam1".getBytes(), "name".getBytes(), v.getBytes());     }
}

由上面可知ReducerClass繼承TableReduce,在hadoop里面ReducerClass繼承Reducer類。它的原型為:TableReducer<KeyIn,Values,KeyOut>可以看出,HBase里面是讀出的Key類型是ImmutableBytesWritable。

Map,Reduce,以及Job的配置分離,比較清晰,mahout也是采用這種構架。

package test;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.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.util.Tool;public class Driver extends Configured implements Tool{@Overridepublic static void run(String[] arg0) throws Exception {// TODO Auto-generated method stubConfiguration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum.", "localhost");  
        Job job = new Job(conf,"Hbase");job.setJarByClass(TxtHbase.class);Path in = new Path(arg0[0]);job.setInputFormatClass(TextInputFormat.class);FileInputFormat.addInputPath(job, in);job.setMapperClass(MapperClass.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);TableMapReduceUtil.initTableReducerJob("table", ReducerClass.class, job);job.waitForCompletion(true);}}

Driver中job配置的時候沒有設置 job.setReduceClass(); 而是用?TableMapReduceUtil.initTableReducerJob("tab1", THReducer.class, job);?來執行reduce類。

主函數

package test;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.ToolRunner;public class TxtHbase {public static void main(String [] args) throws Exception{

Driver.run(new Configuration(),new THDriver(),args);

}
}

?

讀取數據時比較簡單,編寫Mapper函數,讀取<key,value>值就行了。

package test;import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapred.TableMap;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;public class MapperClass extends MapReduceBase implementsTableMap<Text, Text> {static final String NAME = "GetDataFromHbaseTest";private Configuration conf;public void map(ImmutableBytesWritable row, Result values,OutputCollector<Text, Text> output, Reporter reporter)throws IOException {StringBuilder sb = new StringBuilder();for (Entry<byte[], byte[]> value : values.getFamilyMap("fam1".getBytes()).entrySet()) {String cell = value.getValue().toString();if (cell != null) {sb.append(new String(value.getKey())).append(new String(cell));}}output.collect(new Text(row.get()), new Text(sb.toString()));}

要實現這個方法?initTableMapJob(String?table,?String?columns,?Class<? extends?TableMap>?mapper,?Class<? extends org.apache.hadoop.io.WritableComparable>?outputKeyClass,?Class<? extends org.apache.hadoop.io.Writable>?outputValueClass, org.apache.hadoop.mapred.JobConf?job, boolean?addDependencyJars)。

package test;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.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.util.Tool;public class Driver extends Configured implements Tool{@Overridepublic static void run(String[] arg0) throws Exception {// TODO Auto-generated method stubConfiguration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum.", "localhost");  Job job = new Job(conf,"Hbase");job.setJarByClass(TxtHbase.class);job.setInputFormatClass(TextInputFormat.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);
TableMapReduceUtilinitTableMapperJob(
"table", args0[0],MapperClass.class, job);
job.waitForCompletion(true); }
}

主函數

package test;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.ToolRunner;public class TxtHbase {public static void main(String [] args) throws Exception{Driver.run(new Configuration(),new THDriver(),args); } 
}

?

?作者:BIGBIGBOAT/Liqizhou

轉載于:https://www.cnblogs.com/liqizhou/archive/2012/05/17/2504279.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260814.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

轉 ABAP_ALV_Function方式與OO方式(較為簡單、普通的ALV)

ABAP_ALV_Function方式與OO方式(較為簡單、普通的ALV) 分類&#xff1a; SAP ABAP2013-01-31 09:58 1511人閱讀 評論(0) 收藏 舉報目錄 一、ALV簡介 1、簡介 2、ALV_GRID介紹 3、其它描述 二、開發ALV的基本流程 三、ALV相關開發細節 1、標準ALV與對象ALV的共同開發細節 2、標準…

MAC OS X 1.1 El Capitan安裝方法與步驟

2019獨角獸企業重金招聘Python工程師標準>>> 蘋果公司發布了最新的Mac系統El Capitan,我也跟風安裝了, 昨天試了一天終于算是安裝成功了. ###電腦配置: CPU: E3-1230 v2 主板: 技嘉B75M D3V 顯卡: 微星6850 聲卡: Realtek ALC887 鍵盤: Noppoo 84鍵機械鍵盤 ###下載…

vp與vs聯合開發-網口通信(socket)

Socket通信是一種在網絡中進行進程間通信的機制。它使用了一種稱為套接字&#xff08;Socket&#xff09;的編程接口&#xff0c;通過該接口可以創建、連接、發送和接收數據等操作。 Socket通信中&#xff0c;有兩個主要的角色&#xff1a;服務器和客戶端。服務器負責監聽指定…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波8 - 直方圖處理 - 直方圖均衡化(全局直方圖均衡化)

直方圖均衡化 灰度映射函數&#xff1a; sT(r),0≤r≤L?1(3.8)s T(r), \quad 0\leq r \leq L -1 \tag{3.8}sT(r),0≤r≤L?1(3.8) 假設&#xff1a; (1) T(r)T(r)T(r)在區間0≤r≤L?10 \leq{r} \leq{L-1}0≤r≤L?1 上是一個單調遞增函數。 (2) 對于0≤r≤L?10 \leq{r} …

python 元組和列表區別_Python干貨整理:一分鐘了解元組與列表使用與區別

元組是 Python 對象的集合&#xff0c;跟列表十分相似。下面進行簡單的對比。列表與元組1、python中的列表list是變量&#xff0c;而元組tuple是常量。列表&#xff1a;是使用方括號[]&#xff0c;元組&#xff1a;則是使用圓括號()2、兩者都可以使用索引讀取值列表1.列表中的a…

JS拖拽,移動與拉伸

上次做的簡單的拖拽&#xff1a;javascript簡單拖拽練習(鼠標事件 mousedown mousemove mouseup) 這次增加了一些相關的功能&#xff0c;增加四個角的拉伸改變寬度&#xff0c;主要還是用到一些簡單的坐標位置計算&#xff0c;沒有什么技術難度&#xff0c;熟練了一下自己對拖拽…

關于release后retainCount還是1的問題

轉自&#xff1a;http://www.cocoachina.com/bbs/read.php?tid175523 realse之后再調用還能調用的的問題&#xff0c;我做了這么多年也是經常遇到&#xff0c;也曾經試圖尋找原因&#xff0c; 就像6樓說的&#xff0c;很多時候都會出現realse過后還能調用的現象。而且對象不是…

Maven for Eclipse 第二章 ——安裝 m2eclipse插件

m2eclipse 是一個提供了 Maven 與 Eclipse 整合的插件。它的意圖是橋接上 Maven 和 Eclipse 之間的缺口。通過 Maven 原型提供的簡單直白的接口創建項目&#xff0c;它使 Maven 在 IDE 中非常容易使用。下面是m2eclipse 提供的一些特性。 創建和導入 Maven 項目在 Eclipse 運行…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波9 - 直方圖處理 - 直方圖匹配(規定化)灰度圖像,彩色圖像都適用

直方圖匹配&#xff08;規定化&#xff09; 連續灰度 sT(r)(L?1)∫0rpr(w)dw(3.17)s T(r) (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.17} sT(r)(L?1)∫0r?pr?(w)dw(3.17) 定義關于變量zzz的一個函數GGG&#xff0c;它具有如下性質&#xff1a; G(z)(L?1)∫0zpz(v)d…

C#委托之就是跟委托過不去…

在上一篇博文當中,我們例舉了一個機房自動化系統的邏輯控制程序,其中用到了Lambda表達式,因此方便了我們程序功能的實現.然而,我們不能僅僅為實現功能,完成任務而奮斗,應該知其然,知其所以然,也就是說,知道了Lambda表達式能夠帶來這樣的方便,也應該知道為什么能夠帶來這樣的方便…

closewait一直不釋放_機床為什么要釋放應力?怎么釋放應力才好?

在機床行業內一直有種說法&#xff0c;就是機床需要釋放應力&#xff0c;而且越是高精密的機床就越要注意應力的釋放&#xff0c;最近就有機床粉向小編詢問應力是什么&#xff1f;為什么要釋放應力&#xff1f;如果釋放要釋放多久&#xff1f;怎么釋放應力才好等一系列關于機床…

HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

點我看題目 題意 &#xff1a;兩條平行線上分別有兩種城市的生存&#xff0c;一條線上是貧窮城市&#xff0c;他們每一座城市都剛好只缺乏一種物資&#xff0c;而另一條線上是富有城市&#xff0c;他們每一座城市剛好只富有一種物資&#xff0c;所以要從富有城市出口到貧窮城市…

表單元素選擇器

無論是提交還是傳遞數據&#xff0c;表單元素在動態交互頁面的作用是非常重要的。jQuery中專門加入了表單選擇器&#xff0c;從而能夠極其方便地獲取到某個類型的表單元素 表單選擇器的具體方法描述&#xff1a; 注意事項&#xff1a; 除了input篩選選擇器&#xff0c;幾乎每個…

怎樣在excel表格中畫斜線并打字_一日一技丨Excel斜線表頭如何制作?標題、表頭的4個技巧...

來源 | 迅捷PDF轉換器 (ID:xjpdf6)作者丨小小迅「一日一技」是每天的知識分享專欄&#xff0c;一是分享一些PDF、Office、辦公小技巧&#xff1b;二是抽取小可愛們在留言中的疑問并解決。希望對大家有所幫助&#xff01;表頭的標題是Excel中的第一道大門&#xff0c;精致好看的…

Retina時代的前端視覺優化

隨著New iPad的發布&#xff0c;平板也將逐漸進入Retina時代&#xff0c;在高分辨率設備里圖片的顯示效果通常不盡人意&#xff0c;為了達到最佳的顯示效果就需要對圖片進行優化&#xff0c;這里介紹一些優化方法&#xff1a; 一、用CSS替代圖片 這一點在任何時候都適用&#x…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波10 - 直方圖處理 - 局部直方圖處理

這里寫目錄標題局部直方圖處理局部直方圖處理 因為像素是由基于整個圖像的灰度的變換函數修改的。這種全局性方法適合于整體增強&#xff0c;但當目的是增強圖像中幾個小區域的細節時&#xff0c;通常就會失敗。這是因為在這些小區域中&#xff0c;像素的數量對計算全局變換的…

CodeForces369C On Changing Tree

昨天的CF自己太挫了。一上來看到A題&#xff0c;就有思路&#xff0c;然后馬上敲&#xff0c;但是苦于自己很久沒有敲計數的題了&#xff0c;許多函數都稍微回憶了一陣子。A題的主要做法就是將每個數質因數分解&#xff0c;統計每個質因子的個數&#xff0c;對于每個質因子pi的…

ES6之const命令

一直以來以ecma為核心的js始終沒有常量的概念&#xff0c;es6則彌補了這一個缺陷&#xff1b; const foofoo;foobar;//TypeError: Assignment to constant variable.上例聲明了一個基本類型的常量&#xff0c;如過試圖修改初始值則會報錯&#xff1b;如果是引用類型的值同樣適用…

C++和Rust_后端程序員一定要看的語言大比拼:Java vs. Go vs. Rust

這是Java&#xff0c;Go和Rust之間的比較。這不是基準測試&#xff0c;更多是對可執行文件大小、內存使用率、CPU使用率、運行時要求等的比較&#xff0c;當然還有一個小的基準測試&#xff0c;可以看到每秒處理的請求數量&#xff0c;我將嘗試對這些數字進行有意義的解讀。為了…

Hdu 2015 偶數求和

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2040。水題。CODE&#xff1a;1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <math.h>5 using namespace std;6 7 const int maxn 102;8 9 int save[ma…