HBase y MapReduce Integración

HBase entre los datos almacenados en los HDFS en última instancia anteriormente, soporta la operación de los recursos naturales HBase MR, podemos procesar los datos directamente a través de HBase entre MR, y el MR se puede almacenar resultados procesados ​​que van directamente a HBase

Un leer miUsuario esta tabla a la que se escriben los datos en otra tabla, que a HBase

HBase leer datos entre una mesa, y luego escribir datos en HBase entre ellos a otra mesa. Nota: Podemos utilizar TableMapper y TableReducer para lograr los datos de lectura y escritura entre HBase

Esta tabla se MyUser entre apellido y edad f1 columna se escribe en el campo de la familia columna F1 a la que esta tabla myuser2

myuser2 1, se crea esta tabla

hbase (principal): 010: 0> crear 'myuser2', 'F1'

2, cree un proyecto Maven importar el paquete jar

<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, el desarrollo de procedimientos de RM 

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, la operación de embalaje

Requiere el uso de plug-in paquete, HBase dependerá del paquete jar jar paquete son impulsados ​​en el proyecto de ir dentro

A continuación, ejecute

tarro hilo hbaseStudy-1,0-SNAPSHOT.jar cn.itcast.hbasemr.HBaseMR

O podemos crear nuestras propias variables de entorno

exportación HADOOP_HOME = / export / servidores / hadoop-2.6.0-cdh5.14.0 /

exportación HBASE_HOME = / export / servidores / hbase-1.2.0-cdh5.14.0 /

exportación HADOOP_CLASSPATH = `$ {} HBASE_HOME / bin / hbase mapredcp`

frasco original del hilo-hbaseStudy-1,0-SNAPSHOT.jar cn.itcast.hbasemr.HBaseMR

En segundo lugar, el archivo HDFS leer, a escribirlos en el HBase mesa

1, se preparan los archivos de datos y archivos de datos que se cargan a HDFS anteriormente

hdfs dfs -mkdir -p / hbase / entrada

cd / export / servidores /

vim user.txt

0007    zhangsan    18
0008    lisi    25
0009    wangwu    20

2, el desarrollo del programa 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);
        }
    }

}

En tercer lugar, leer datos de la tabla HBase y escribir datos a ir por encima hdfs

En cuarto lugar, por cierto bulkload datos de carga a granel en HBase debían ir

Manera de cargar datos en HBase entre diversa, podemos utilizar JAVAAPI HBase o uso Sqoop nuestros datos se escribe o importado en HBase llegara a salir, pero estos métodos no son lentos en la región ocupada es el proceso de importación de datos conduce a la eficiencia es baja, podemos también procedimientos de RM, nuestros datos directamente adaptados al formato del almacenamiento final hFILE HBase luego cargar los datos directamente en la cual vamos a HBase

HBase en cada tabla en el directorio raíz (/ HBase) con una carpeta de almacenamiento, el nombre de la carpeta llamada Mesa, carpeta de mesa de cada región una carpeta con la misma memoria, cada carpeta en cada Región familia de columnas también se utiliza la carpeta tiendas, y que algunos archivos hFILE se almacenan en cada familia la columna, los datos hFILE HBase se almacena en formato HFDS bajo, por lo que HB ASE archivos de hdfs rendimiento final en el anterior almacenada forma es HF Ile, si podemos datos convierte directamente en HF ile formato, entonces nuestro HB ASE se puede leer directamente HF cargado archivo ile formato, puede directamente leer el

ventajas:

1. El proceso de importación no ocupa recursos Región

2. puede importar rápidamente grandes cantidades de datos

3. Para guardar la memoria

HBase datos normales de lectura y proceso de escritura

 

bulkload manera el uso de nuestros datos de formato HFILE generada directamente, a continuación, se cargó directamente en una tabla que va HBase

 

Requisitos: Le hdfs por encima de este camino /hbase/input/user.txt archivos de datos, formato HFILE convertir, y luego cargar esta tabla que ir dentro de myuser2

1, el desarrollo de procedimientos de RM

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, el código de la etiqueta del paquete frasco y luego ejecutar

frasco original del hilo-hbaseStudy-1,0-SNAPSHOT.jar cn.itcast.hbasemr.HBaseLoad

3, código de desarrollo, los datos de carga

La ruta de salida después de archivos HFILE cargados en nuestra mesa llegara a salir 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);

    }
}

O podemos cargar datos desde la línea de comandos

Hbase primer paquete añadido a la ruta frasco hadoop de la ruta de clases

exportación HBASE_HOME = / export / servidores / hbase-1.2.0-cdh5.14.0 /

exportación HADOOP_HOME = / export / servidores / hadoop-2.6.0-cdh5.14.0 /

exportación HADOOP_CLASSPATH = `$ {} HBASE_HOME / bin / hbase mapredcp`

A continuación, ejecute el siguiente comando hbase HFILE directamente en la tabla a la que myuser2

tarro hilo /export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-server-1.2.0-cdh5.14.0.jar completebulkload / hbase / output_hfile myuser2

Publicado 81 artículos originales · ganado elogios 21 · vistas 2216

Supongo que te gusta

Origin blog.csdn.net/qq_44065303/article/details/103636770
Recomendado
Clasificación