黑猴子的家:HBase 自定義HBase-MapReduce案列一
將fruit表中的一部分資料,通過MR遷入到fruit_mr表中
1、Code -> GitHub
https://github.com/liufengji/hbase_mapredece_one.git
2、構建ReadFruitMapper類,用於讀取fruit表中的資料
import java.io.IOException;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
public class ReadFruitMapper extends TableMapper<ImmutableBytesWritable, Put> {
@Override
protected void map(ImmutableBytesWritable key, Result value, Context context)
throws IOException, InterruptedException {
//將fruit的name和color提取出來,相當於將每一行資料讀取出來放入到Put物件中。
Put put = new Put(key.get());
//遍歷新增column行
for(Cell cell: value.rawCells()){
//新增/克隆列族:info
if("info".equals(Bytes.toString(CellUtil.cloneFamily(cell)))){
//新增/克隆列:name
if("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))){
//將該列cell加入到put物件中
put.add(cell);
//新增/克隆列:color
}else if("color".equals(
Bytes.toString(CellUtil.cloneQualifier(cell)))){
//向該列cell加入到put物件中
put.add(cell);
}
}
}
//將從fruit讀取到的每行資料寫入到context中作為map的輸出
context.write(key, put);
}
}
3、構建WriteFruitMRReducer類,用於將讀取到的fruit表中的資料寫入到fruit_mr表中
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.NullWritable;
public class WriteFruitMRReducer extends TableReducer<ImmutableBytesWritable,
Put, NullWritable> {
@Override
protected void reduce(ImmutableBytesWritable key, Iterable<Put> values,
Context context)
throws IOException, InterruptedException {
//讀出來的每一行資料寫入到fruit_mr表中
for(Put put: values){
context.write(NullWritable.get(), put);
}
}
}
4、構建Fruit2FruitMRRunner用於組裝執行Job任務
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class Fruit2FruitMRRunner extends Configured implements Tool {
@Override
public int run(String[] arg0) throws Exception {
// 得到Configuration
Configuration conf = this.getConf();
// 建立Job任務
Job job = Job.getInstance(conf, this.getClass().getSimpleName());
job.setJarByClass(Fruit2FruitMRRunner.class);
// 配置Job
Scan scan = new Scan();
scan.setCacheBlocks(false);
scan.setCaching(500);
// 設定Mapper,注意匯入的是mapreduce包下的,不是mapred包下的,後者是老版本
TableMapReduceUtil.initTableMapperJob("fruit", // 資料來源的表名
scan, // scan掃描控制器
ReadFruitMapper.class, // 設定Mapper類
ImmutableBytesWritable.class, // 設定Mapper輸出key型別
Put.class, // 設定Mapper輸出value值型別
job// 設定給哪個JOB
);
// 設定Reducer
TableMapReduceUtil.initTableReducerJob("fruit_mr",
WriteFruitMRReducer.class, job);
// 設定Reduce數量,最少1個
job.setNumReduceTasks(1);
boolean isSuccess = job.waitForCompletion(true);
if (!isSuccess) {
throw new IOException("Job running with error");
}
return isSuccess ? 0 : 1;
}
}
5、主函式中呼叫執行該Job任務
public static void main(String[] args) throws Exception {
Configuration conf = HBaseConfiguration.create();
int status = ToolRunner.run(conf, new Fruit2FruitMRRunner(), args);
System.exit(status);
}
6、打包執行任務
[victor@node1 hbase-1.3.1]$ /opt/module/hadoop-2.7.2/bin/yarn jar \
hbase-0.0.1-SNAPSHOT.jar com.victor.hbase.mr1.Fruit2FruitMRRunner
尖叫提示:執行任務前,如果待資料匯入的表不存在,則需要提前建立之。
尖叫提示:maven打包命令:-P local clean package或-P dev clean package install(將第三方jar包一同打包,需要外掛:maven-shade-plugin)
相關文章
- 黑猴子的家:Yum aliyun 映象
- 黑猴子的家:IDEA 使用 Git 進行專案管理IdeaGit專案管理
- 黑猴子的家:python 函式是什麼?Python函式
- 黑猴子的家:Maven 統一管理目標jar包的版本MavenJAR
- 黑猴子的家:Maven 私服 Nexus3 下載MavenS3
- 黑猴子的家:Hive 資料倉儲位置配置Hive
- 黑猴子的家:Hadoop之Namenode多目錄配置Hadoop
- 黑猴子的家:mysql 流程控制之分支結構MySql
- 黑猴子的家:window7+CentOS7雙系統CentOS
- 黑猴子的家:Windows 安裝 Navicat121 x64Windows
- 黑猴子的家:Hadoop NameNode 高可用 (High Availability) 實現解析HadoopAI
- 黑猴子的家:Redis 之 You need tcl 8.5 or newer in order to run the Redis testRedis
- 自定義列舉
- js:陣列自定義排序JS陣列排序
- 使用 Go 語言在 MacOS 建立一個自定義的命令列工具GoMac命令列
- [分享]laravel自定義檔案系統,以企鵝家cos為例Laravel
- php 自定義配置檔案PHP
- 建立自定義專案模板
- 自定義命令列計算工具:AYBO for Mac命令列Mac
- 自定義鍵盤(一)
- XCode 建立自定義檔案模版XCode
- AUTOCAD——新增自定義填充圖案
- Spring Boot - 自定義 Banner 圖案Spring Boot
- .NET Core - 自定義專案模板
- HBase中Memstore存在的意義以及多列族引起的問題和設計
- WPF -- 使用當前程式開啟自定義檔案的一種方式
- 自定義一個kaniko映象
- 小程式檔案館——自定義元件元件
- SpringBoot讀取自定義配置檔案Spring Boot
- 使用stub快速生成自定義檔案
- 自定義Vue-cli專案模板Vue
- 五、自定義Zabbix監控專案
- springboot如何使用自定義配置檔案Spring Boot
- VS2019 自定義專案模板
- oracle sqldeveloper下 自定義Snippets檔案的替換OracleSQLDeveloper
- 自定義的PopupWindow
- flutter 用 CustomPaint 畫一個自定義的 CircleProgressBar (一)FlutterAI
- Javascript陣列排序sort方法和自定義排序方法JavaScript陣列排序