最終的に上記HDFSに格納されたデータのうちのHBase、天然のHBase MRの動作をサポートして、我々はMR間のHBaseを介してデータを直接処理することができ、そしてMRはHBaseのに直接移動処理結果を格納することができます
データが別のテーブルのHBaseに書き込まれ、このテーブル先の読み取りMYUSER
HBaseのテーブル間でデータを読み、その後、別のテーブルにそれらの間でのHBaseにデータを書き込みます。注:私たちは、TableMapperとTableReducerはHBaseの中から、読み取りおよび書き込みデータを達成するために使用することができます
このテーブルには、F1の列ファミリ名と年齢の間でMYUSERうに、このテーブルmyuser2フィールドf1列ファミリーに書かれています
1、この表が作成されmyuser2
HBaseの(メイン):010:0> 'myuser2'、 'F1' を作成
2、ジャーパッケージをインポートし、Mavenのプロジェクトを作成します
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0-mr1-cdh5.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.0-cdh5.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.2.0-cdh5.14.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!-- <verbal>true</verbal>-->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*/RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
3、MR手順の開発
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
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.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import java.io.IOException;
public class HBaseMR extends Configured implements Tool {
public static class HBaseMapper extends TableMapper<Text,Put>{
/**
* @param key 主键rowkey
* @param value 一行数据所有列的值都封装在value里面了
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
String rowKey = Bytes.toString(key.get());
Put put = new Put(key.get());
Cell[] cells = value.rawCells();
for (Cell cell : cells) {
if ("f1".equals(Bytes.toString(CellUtil.cloneFamily(cell)))){
if ("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))){
put.add(cell);
}
if ("age".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))){
put.add(cell);
}
}
}
if (!put.isEmpty()){
context.write(new Text(rowKey),put);
}
}
}
public static class HBaseReducer extends TableReducer<Text,Put,ImmutableBytesWritable> {
@Override
protected void reduce(Text key, Iterable<Put> values, Context context) throws IOException, InterruptedException {
for (Put value : values) {
context.write(null,value);
}
}
}
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(super.getConf());
job.setJarByClass(this.getClass());
Scan scan = new Scan();
//使用TableMapReduceUtil 工具类来初始化我们的mapper TableMapReduceUtil.initTableMapperJob(TableName.valueOf("myuser2"),scan,HBaseMapper.class,Text.class,Put.class,job);
//使用TableMapReduceUtil 工具类来初始化我们的reducer
TableMapReduceUtil.initTableReducerJob("myuser4",HBaseReducer.class,job);
job.setNumReduceTasks(1);
return job.waitForCompletion(true)?0:1;
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
System.exit(ToolRunner.run(conf,new HBaseMR(),args));
}
}
4、梱包作業
プラグイン・パッケージを使用する必要があり、HBaseのは、ジャーパッケージのjarパッケージに依存します内側に行くためにプロジェクトに駆動され、
そして、実行
糸ジャーhbaseStudy-1.0-SNAPSHOT.jarにcn.itcast.hbasemr.HBaseMR
それとも私たちは私たち自身の環境変数を設定することができます
輸出HADOOP_HOME = /エクスポート/サーバ/ Hadoopの-2.6.0-cdh5.14.0 /
輸出HBASE_HOME = /エクスポート/サーバ/ HBaseの-1.2.0-cdh5.14.0 /
輸出HADOOP_CLASSPATH = `$ {HBASE_HOME} / binに/ HBaseのmapredcp`
糸ジャーオリジナル-hbaseStudy-1.0-SNAPSHOT.jarにcn.itcast.hbasemr.HBaseMR
第二に、HDFSのファイルは、テーブルのHBaseにそれらを書くこと、読みます
1、データファイル、およびデータファイルを準備するには、上記のHDFSにアップロードします
HDFS DFS -mkdir -p / HBaseの入力/
CD /エクスポート/サーバ/
vimのUSER.TXT
0007 zhangsan 18
0008 lisi 25
0009 wangwu 20
2、MRのプログラム開発
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.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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.TextInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import java.io.IOException;
public class Hdfs2Hbase extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(super.getConf(), "hdfs2Hbase");
job.setJarByClass(Hdfs2Hbase.class);
job.setInputFormatClass(TextInputFormat.class);
TextInputFormat.addInputPath(job,new Path("hdfs://node01:8020/hbase/input"));
job.setMapperClass(HdfsMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
TableMapReduceUtil.initTableReducerJob("myuser2",HBaseReducer.class,job);
job.setNumReduceTasks(1);
boolean b = job.waitForCompletion(true);
return b?0:1;
}
public static void main(String[] args) throws Exception {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
int run = ToolRunner.run(conf, new Hdfs2Hbase(), args);
System.exit(run);
}
public static class HdfsMapper extends Mapper<LongWritable,Text,Text,NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
context.write(value,NullWritable.get());
}
}
public static class HBaseReducer extends TableReducer<Text,NullWritable,ImmutableBytesWritable> {
@Override
protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
String[] split = key.toString().split("\t");
Put put = new Put(Bytes.toBytes(split[0]));
put.addColumn("f1".getBytes(),"name".getBytes(),split[1].getBytes());
put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(Integer.parseInt(split[2])));
context.write(new ImmutableBytesWritable(Bytes.toBytes(split[0])),put);
}
}
}
第三に、HBaseのテーブルデータを読み込み、HDFS上に行くためにデータを書き込みます
第四に、途中でのHBaseへのバルクロードバルクロードデータが行くことにしました
多様な中でのHBaseにデータをロードしへの道は、我々は我々のデータが書かれたかのHBaseにインポートされsqoop JAVAAPIのHBaseまたは使用を使用行くことでしたが、地域は、効率へのデータインポートプロセスのリードで占められ、これらの方法は、低速ではありませんすることができ低い、我々はまた、MR手順は、我々のデータは、直接、最終的な保存形式HFILEのHBaseに変換し、その後、直接その中にデータをロードすることができHBaseのに行きます
各領域内の格納フォルダ、テーブルと呼ばれるフォルダ名、表フォルダ同じメモリのフォルダとルートディレクトリ(/ HBaseの)内の各テーブルにHBaseの、各領域下の各フォルダ列ファミリは、格納するフォルダを使用し、いくつかのHFILEファイルは、各列の家族の下に格納されていることを、HFILE HBaseのデータは、フォーマットの下HFDSに保存されているHBので、ASEは、HDFS上での最後のパフォーマンスに保存されたファイル形式をあるHF たちができる場合のIleは、データは直接に変換HF その後、私たちの、フォーマットILE HB ASEを直接読み取ることができ、ロードされたHFのフォーマットILEファイルを、あなたが直接することができます読んで
利点:
1.インポートプロセスは、地域資源を取りません。
2.すぐに膨大な量のデータをインポートすることができます
3.メモリを節約します
HBaseの通常のデータの読み出しと書き込みプロセス
バルクロードの方法、その後のHBaseを行くテーブルに直接ロード、我々のデータを直接生成HFILE形式を使用して、
要件:私たちは、その後、データファイル、変換HFILEフォーマット、および/hbase/input/user.txtこのパス上のHDFSはmyuser2に内側に移動するには、このテーブルをロードします
1、MR手順の開発
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;
import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;
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.Tool;
import org.apache.hadoop.util.ToolRunner;
import java.io.IOException;
public class BulkData extends Configured implements Tool {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
System.exit(ToolRunner.run(conf,new BulkLoadData(),args));
}
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(super.getConf());
Connection connection = ConnectionFactory.createConnection(super.getConf());
Table connectionTable = connection.getTable(TableName.valueOf("myuser2"));
RegionLocator regionLocator = connection.getRegionLocator(TableName.valueOf("myuser2"));
job.setJarByClass(BulkLoadData.class);
job.setMapperClass(BulkLoadMap.class);
job.setMapOutputKeyClass(ImmutableBytesWritable.class);
job.setMapOutputValueClass(Put.class);
HFileOutputFormat2.configureIncrementalLoad(job,connectionTable,regionLocator);
FileInputFormat.addInputPath(job,new Path("hdfs://node01:8020/hbase/input/"));
FileOutputFormat.setOutputPath(job,new Path("hdfs://node01:8020/hbase/output_hfile"));
return job.waitForCompletion(true)?0:1;
}
public static class BulkLoadMap extends Mapper<LongWritable,Text,ImmutableBytesWritable,Put> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] split = value.toString().split("\t");
Put put = new Put(Bytes.toBytes(split[0]));
put.addColumn("f1".getBytes(),"name".getBytes(),split[1].getBytes());
put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(Integer.valueOf(split[2])));
context.write(new ImmutableBytesWritable(Bytes.toBytes(split[0])),put);
}
}
}
2、コードラベル瓶パッケージしてから実行します
糸ジャーオリジナル-hbaseStudy-1.0-SNAPSHOT.jarにcn.itcast.hbasemr.HBaseLoad
3、開発コード、負荷データ
私たちのテーブルにロードされたHFILEファイルを、次の出力パスはHBaseのを行くことにしました
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;
public class LoadData {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.property.clientPort","2181");
conf.set("hbase.zookeeper.quorum","node01,node02,node03");
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
Table connectionTable = connection.getTable(TableName.valueOf("myuser"));
RegionLocator regionLocator = connection.getRegionLocator(TableName.valueOf("myuser"));
LoadIncrementalHFiles load = new LoadIncrementalHFiles(conf);
load.doBulkLoad(new Path("hdfs://node01:8020/hbase/output_hfile"),admin,connectionTable,regionLocator);
}
}
それとも、私たちは、コマンドラインからデータをロードすることができます
クラスパスのジャーHadoopのパスに追加HBaseの最初のパッケージ
輸出HBASE_HOME = /エクスポート/サーバ/ HBaseの-1.2.0-cdh5.14.0 /
輸出HADOOP_HOME = /エクスポート/サーバ/ Hadoopの-2.6.0-cdh5.14.0 /
輸出HADOOP_CLASSPATH = `$ {HBASE_HOME} / binに/ HBaseのmapredcp`
次のコマンドは、どのmyuser2にテーブルに直接HFILEをHBaseの実行
糸ジャー/export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-server-1.2.0-cdh5.14.0.jar completebulkload / HBaseの/ output_hfile myuser2