45分钟

HBase MapReduce 开发实战

HBase MapReduce开发实战

实验预计耗时:45分钟

前置实验教程:

MapReduce 实战

HBase 应用实战

1. 课程背景

1.1 课程目的

弹性 MapReduce(EMR)是腾讯云结合云技术和 Hadoop、HBase、Spark 等社区开源技术,提供的安全、低成本、高可靠、可弹性伸缩的云端托管 Hadoop 服务。

本实验将搭建一个包含HBase组件的EMR集群,通过使用MapReduce开发的形式,实现对HBase数据的操作,让学员掌握通过MapReduce实现HBase数据迁移的基本流程。

1.2 课前知识准备

学习本课程前,学员需要掌握以下前置知识:

1、能力基础

  • Linux运维基础:掌握Linux远程登录、文件与目录管理等。
  • Hadoop基础:理解Hadoop基本组件的功能与原理。
  • HBase基础:理解HBase基本概念,基本HBase shell操作。

2、相关技术

HBase数据模型

  • 命名空间:命名空间是对表的逻辑分组,不同的命名空间类似于关系型数据库中的不同的Database数据库。利用命名空间,在多租户场景下可做到更好的资源和数据隔离。
  • 表:对应于关系型数据库中的一张张表,HBase以“表”为单位组织数据,表由多行组成。
  • 行:行由一个RowKey和多个列族组成,一个行有一个RowKey,用来唯一标示。
  • 列族:每一行由若干列族组成,每个列族下可包含多个列,列族是列共性的一些体现。注意:物理上,同一列族的数据存储在一起的。
  • 列:列由列族和列限定符唯一指定,像如上的name、age即是ImployeeBasicInfoCLF列族的列限定符。
  • 单元格:单元格由RowKey、列族、列限定符唯一定位,单元格之中存放一个值(Value)和一个版本号。
  • 时间戳:单元格内不同版本的值按时间倒序排列,最新的数据排在最前面。

2. 实验环境

2.1 实验操作环境

本课程需要以下实验操作环境:

  1. 可以接入互联网且具备Java开发环境的笔记本电脑或者台式机,本实验使用Windows系统;
  2. 实验环境:计算机本地+腾讯云控制台;

2.2 实验架构图

本实验将使用EMR三节点集群(Master节点和两个Core节点),使用PuTTY连接Master节点的方式访问集群,本实验使用HBase Java API开发客户端程序,进行HBase数据的访问。

2.3 实验的数据规划表

资源名称

数据

说明

腾讯云账号

账号:XXXXXXXX、密码:XXXXXXXX

涉及产品如下:VPC、EMR

JDK

版本:1.8即可

Maven

版本:3.6.3

IntelliJ IDEA

版本:最新版即可

PuTTY

版本:0.73

下载JDK

下载Maven

下载IntelliJ IDEA

PuTTY下载

3. 实验流程

实验共分为三个任务,首先为实验环境准备,通过腾讯云弹性MapReduce创建一个HBase集群,并使用PuTTY进行远程连接。

接下来在本地创建Maven工程,通过HBase API 实现数据的增删等功能,并最后对程序进行打包。最后我们将jar包上传至集群,运行并验证功能的实现。

4. 实验步骤

任务1 实验环境准备

【任务目标】

通过EMR集群的搭建练习,使学员可以熟练EMR集群搭建,并掌握使用PuTTY连接EMR集群。

【任务步骤】

1、EMR集群选购

1.在腾讯云官网,找到弹性MapReduce首页,点击立即购买

2.可用区与软件配置如下:

配置项

配置项说明

计费模式

按量计费

地域/可用区

广州/广州四区(可根据所在地自定义选择)

产品版本

EMR-V2.1.0

必选组件

hadoop、zookeeper、knox

可选组件

hbase 1.3.1

请确认HBase版本为1.3.1,确认配置无误后,点击下一步:硬件配置

3.硬件配置如下:

配置项

配置项说明

节点高可用

不启用

Master配置1台

EMR标准型S4 / 2核8G,CBS云盘:100G高效云盘 X 1

Core配置2台

EMR标准型S4 / 2核8G,CBS云盘:100G高效云盘 X 1

集群外网

开启集群Master节点公网

集群网络

新建或选择已有的私有网络

启动高可用选项可以自定义选择,默认是选择的,如果取消需要手动取消选择。由于我们这里的实验环境仅仅是一个学习的实验环境所以这里我们将此选项取消,实际生产中要根据实际环境合理选择是否需要这个配置。

确认硬件配置信息无误后,点击下一步:基础配置

4.基础配置如下:

配置项

配置项说明

集群名称

emr-test

远程登录

开启

安全组

创建新安全组

对象存储

不开启

登录密码

EMR集群云主机root用户登录的密码

确认信息无误后,点击购买,会自动跳转至集群页。图中的集群实例状态中显示集群创建中

等待8min左右,集群构建成功,截图如下:

2、第三方工具连接EMR集群

1.复制集群页的主节外网IP,打开PuTTY创建连接,将复制的外网IP粘贴至Host Name,端口默认22,如图:

2.点击Open,第一次连接会弹出安全警告,点击是(Y)

3.接下在login as:后填写用户名为root,密码为构建EMR的时候设置的密码:

备注:这里只能使用root用户进行连接。

回车确认后,我们即可成功访问主节点实例。输入java进程查看命令jps,可看到应用进程已经启动。其中HMaster为HBase主节点进程,QuorumPeerMain为ZooKeeper进程。

jps

任务2 HBase表数据准备

【任务目标】

通过HBase shell命令创建好表,并在原始数据表内插入数据。

【任务步骤】

1、创建HBase表

1.进入hbase shell

hbase shell

2.创建fruit表为原始数据表,在default(默认)namespace,列族为info;

create 'fruit','info'

3.创建fruit1表为目标数据表,在default(默认)namespace,列族为info;

create 'fruit1','info'

查看表列表:

list

2、插入表数据

1.在fruit表内插入一些数据:

put 'fruit', '1001', 'info:name','orange'
put 'fruit', '1001', 'info:color','orange'
put 'fruit', '1002', 'info:name','grape'
put 'fruit', '1002', 'info:color','purple'
put 'fruit', '1003', 'info:name','mango'
put 'fruit', '1003', 'info:color','yellow'

2.查看表数据插入成功:

scan 'fruit'

3.退出hbase shell

quit

任务3 MapReduce程序编写

【任务目标】

通过Maven工程完成一个的HBase MapRuce程序,可以实现HBase表数据的读取和写入。

【任务步骤】

1、创建Maven工程

1.打开IDEA后,点击Create New Project

2.选择项目类型为Maven;

3.GroupId为:com.test;ArtifactId为:hbase-mr;

4.Project name为:hbase-mr;

5.项目创建成功后配置Maven的pom.xml,内容如下;

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test</groupId>
    <artifactId>hbase-mr</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>hbase-hbase</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.test.hbase.mr.DataTransferDriver</mainClass>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                    <classesDirectory>
                    </classesDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

点击Import ChangesEnable Auto-Import,开始下载依赖(此处建议每次更改POM文件后手动点击Import Changes)。

2、MapReduce编写

1.创建一个package,包名为com.test.hbase.mr。在包内创建DataTransferMapper类:

package com.test.hbase.mr;

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;

import java.io.IOException;

/**
 * TableMapper是HBase提供的api
 */
public class DataTransferMapper extends TableMapper<ImmutableBytesWritable, Put> {


    @Override
    protected void map(ImmutableBytesWritable rowKey, Result value, Context context)
            throws IOException, InterruptedException {

        /*1,读取数据,拿到一个rowkey的数据,根据rowkey得到put对象 */
        Put put = new Put(rowKey.get());
        /*2,遍历出每个列cell */
        for (Cell cell : value.rawCells()) {
            /* 2-1 获取列族*/
            String cf = Bytes.toString(CellUtil.cloneFamily(cell));
            /* 2-1-1 获取info列族*/
            if ("info".equals(cf)) {
                /* 2-1-2 获取info:name列*/
                if ("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))) {
                    /*2-1-3获取info列族的name列的数据,并导入到另一张表的info列族的name列*/
                    put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), CellUtil.cloneValue(cell));
                }
            }
            /*2-2 如果原表数据不做不筛选,可以直接使用此方法,将2-1全部注释即可*/
            /*put.add(cell);*/
        }
        context.write(rowKey, put);
    }
}

2.在包内创建DataTransferReducer类继承TableReducer,编写reduce方法:

package com.test.hbase.mr;

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;

import java.io.IOException;

public class DataTransferReducer extends TableReducer<ImmutableBytesWritable, Put, NullWritable>{
	
	@Override
	protected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context)
			throws IOException, InterruptedException {
			
		for (Put put : values) {
			context.write(NullWritable.get(), put);
		}
	}
}

3.在包内创建DataTransferDriver类,Tool类是官方推荐的Driver类接口,注意在代码中修改ZooKeeper内网IP

package com.test.hbase.mr;

import org.apache.hadoop.conf.Configuration;
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;


/**
 * HBase to HBase
 */
public class DataTransferDriver implements Tool {

    private Configuration configuration = null;

    public static void main(String[] args) {
        try {
            Configuration configuration = new Configuration();
            /* 请注意修改ip为主节点的内网ip */
            configuration.set("hbase.zookeeper.quorum", "172.16.0.6");
            configuration.set("hbase.zookeeper.property.clientPort", "2181");
            int run = ToolRunner.run(configuration, new DataTransferDriver(), args);
            System.exit(run);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public int run(String[] args) throws Exception {

        /*1.获取job对象*/
        Job job = Job.getInstance(configuration);
        job.setJobName("hbase2hbase");
        /*2.设置主类*/
        job.setJarByClass(DataTransferDriver.class);
        /*3,创建scan,以查询源table表的数据*/
        Scan scan = new Scan();
        /*4,配置Mapper*/
        TableMapReduceUtil.initTableMapperJob("fruit", scan,
                DataTransferMapper.class, ImmutableBytesWritable.class, Put.class, job);
        /*5,配置Reducer*/
        TableMapReduceUtil.initTableReducerJob("fruit1", DataTransferReducer.class, job);
        boolean result = job.waitForCompletion(true);
        return result ? 0 : 1;
    }

    @Override
    public void setConf(Configuration conf) {
        configuration = conf;
    }

    @Override
    public Configuration getConf() {
        return configuration;
    }
}

获取内网IP可以点击控制台上方的云产品 > 云服务到达云服务器控制台:

复制主节点的内网IP地址

3、程序编译打包

1.代码编写确认后,我们使用Maven对程序生成jar包,注意打包前在代码中修改ZooKeeper内网IP

使用IDEA,点击右侧Maven选项卡,点击每一模块下的Lifecycle,双击生命周期中的package,即可开始构建jar包。

package运行结果大致如下,其中我们看到BUILD SUCCESS时,表示构建成功:

2.打包成功后,我们可以在该模块目录的target文件夹下,查看到jar包。我们将jar包移至D盘,等待上传EMR。

任务4 程序上传与运行

【任务目标】

运行打包好的MapReduce程序,并查看任务运行的结果。

【任务步骤】

1、上传程序jar包

1.使用mkdir命令在Master节点创建一个/test目录。

创建文件夹test;

mkdir /test

切换到test路径下;

cd /test

2.找到PuTTY的安装目录,在上方地址栏输入cmd并执行。

3.上传jar包

在弹出的黑窗口首先输入psftp,打开psftp工具用来传输文件;

psftp

接下来连接服务器,回车后需要输入用户名和密码;

open xxx.xxx.xxx.xxx 

用于切换远程Linux 服务器上的目录;

cd /test/

lcd命令用于切换本地的路径;

lcd D:\

上传jar文件;

put hbase-hbase.jar

注意:待CMD窗口最后一行再次出现psftp>及光标时,说明上传完毕。

上传成功后在Master节点的/test目录查看到上传的jar包。

2、运行jar包

1.导入HBase相关jar包,使Hadoop可以访问HBase Jar包(该命令在当前会话有效);

export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`

2.切换用户为hadoop;

su hadoop

3.运行jar包,开始HBase表数据迁移。

yarn jar /test/hbase-hbase.jar

3、验证结果

1.进入hbase shell

hbase shell

2.查看表fruit1内的数据

scan 'fruit1'

看到结果表数据只有name列数据,迁移成功。

至此,您已完成了基于HBase开发MapReduce实验的全部任务,您可以自行切换筛选结果,体验其他迁移条件。HBase详细操作请自行查看官方文档。

5. 注意事项

如实验资源无需保留,请在实验结束后及时销毁,以免产生额外费用。