45分钟

HBase Java API 开发实战

HBase Java API开发实战

实验预计耗时:45分钟

前置实验教程:HBase 应用实战

1. 课程背景

1.1 课程目的

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

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

1.2 课前知识准备

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

1、能力基础

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

2、相关技术

  • HBase 读流程:
  • Client先访问zookeeper,获取meta表所在的regionserver地址;
  • 访问该regionserver获取到目标数据的regionserver ;
  • 直接发送请求给regionserver获取数据。
  • HBase写流程:
    • Client先访问zookeeper,获取meta表所在相应region信息,然后找到meta表的regionserver数据;
    • 根据namespace、表名和rowkey根据meta表的数据找到写入数据对应的region信息 ;
    • 找到对应的regionserver把数据写入相应的region中。

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 API程序编写

【任务目标】

通过Maven工程完成一个简单的HBase API程序,可以实现增删改查等操作

【任务步骤】

1、创建Maven工程

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

2.选择项目类型为Maven;

3.GroupId为:com.test;ArtifactId为:testHbase;

4.Project name为:testHbase;

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>testHbase</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.test.hbase.HBaseController</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

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

2、主程序编写

1.创建一个package,包名为com.test.hbase。在包内创建HBaseCreator,编写创建方法:

package com.test.hbase;

import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.io.compress.Compression.Algorithm;

import java.io.IOException;

public  class HBaseCreator {
    public static void createTable(Admin admin) throws IOException {

        HTableDescriptor table = new HTableDescriptor(TableName.valueOf("testTable"));
        table.addFamily(new HColumnDescriptor("cf").setCompressionType(Algorithm.NONE));

        System.out.print("Creating table. ");
        if (admin.tableExists(table.getTableName())) {
            admin.disableTable(table.getTableName());
            admin.deleteTable(table.getTableName());
        }
        admin.createTable(table);
    }
}

2.在包内创建HBaseInserter类,编写插入方法:

package com.test.hbase;

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class HBaseInserter {
    public static void putData(Connection connection) throws IOException {
        Table table1 = connection.getTable(TableName.valueOf("testTable"));
        Put put1 = new Put(Bytes.toBytes("row1"));
        put1.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("a"),
                Bytes.toBytes("value1"));
        table1.put(put1);
        Put put2 = new Put(Bytes.toBytes("row2"));
        put2.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("b"),
                Bytes.toBytes("value2"));
        table1.put(put2);
        Put put3 = new Put(Bytes.toBytes("row3"));
        put3.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("c"),
                Bytes.toBytes("value3"));
        table1.put(put3);

        System.out.println(" Done.");
    }
}

3.在包内创建HBaseModifier类,编写修改方法,分别对创建的testTable进行列族的添加和压缩类型的更新等操作:

package com.test.hbase;

import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.io.compress.Compression;

import java.io.IOException;

public class HBaseModifier {
    public static void modifyTable(Admin admin) throws IOException {
        TableName tableName = TableName.valueOf("testTable");
        HTableDescriptor table = admin.getTableDescriptor(tableName);

        // Update existing table
        HColumnDescriptor newColumn = new HColumnDescriptor("NEWCF");
        newColumn.setCompactionCompressionType(Compression.Algorithm.GZ);
        newColumn.setMaxVersions(HConstants.ALL_VERSIONS);
        admin.addColumn(tableName, newColumn);

        // Update existing column family
        HColumnDescriptor existingColumn = new HColumnDescriptor("cf");
        existingColumn.setCompactionCompressionType(Compression.Algorithm.GZ);
        existingColumn.setMaxVersions(HConstants.ALL_VERSIONS);
        table.modifyFamily(existingColumn);
        admin.modifyTable(tableName, table);
    }
}

4.在包内创建HBaseDeleter类,编写删除方法。方法创建tableName对象后,对表先进行disable操作,再进行delete:

package com.test.hbase;

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;

import java.io.IOException;

public class HBaseDeleter{
    public static void deleteTable(Admin admin) throws IOException {
        TableName tableName = TableName.valueOf("testTable");
        admin.disableTable(tableName);
        admin.deleteTable(tableName);
    }
}

5.编写驱动主类,使用switch case实现功能选择,注意在代码中修改ZooKeeper内网IP

package com.test.hbase;


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.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;


import java.io.IOException;

public class HBaseController {
    public static Admin admin;

    public static void main(String[] args) throws IOException {
        Configuration conf = HBaseConfiguration.create();
        // ZooKeeper的内网IP
        conf.set("hbase.zookeeper.quorum", "172.16.0.15");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        Connection connection = ConnectionFactory.createConnection(conf);
        admin = connection.getAdmin();
        String arg = args[0];
        switch (arg) {
            case "create":
                HBaseCreator.createTable(admin);
            case "modify":
                HBaseModifier.modifyTable(admin);
            case "insert":
                HBaseInserter.putData(connection);
            case "delete":
                HBaseDeleter.deleteTable(admin);
        }
    }
}

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

复制主节点的内网IP地址

3、程序编译打包

1.代码编写确认后,我们使用Maven对程序生成jar包。

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

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

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

任务3 程序上传与运行

【任务目标】

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

【任务步骤】

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 testHbase-1.0-SNAPSHOT-jar-with-dependencies.jar

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

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

2、运行jar包

1.创建表

java -jar testHbase-1.0-SNAPSHOT-jar-with-dependencies.jar create

验证,进入HBase Ul,查看到表已经创建:

2.插入数据:

java -jar testHbase-1.0-SNAPSHOT-jar-with-dependencies.jar insert

验证,进入HBase shell,查看表内数据:

hbase shell

查看表

scan 'testTable'

3.列族修改

java -jar testHbase-1.0-SNAPSHOT-jar-with-dependencies.jar modify

验证,进入HBase UI,查看表信息:

4.表删除

java -jar testHbase-1.0-SNAPSHOT-jar-with-dependencies.jar delete

验证,进入HBase UI,查看表信息为空:

至此,HBase Java API开发实战练习的任务就全部完成了,您可以通过查看HBase官网以及E-MapReduce官网文档学习其他功能。

5. 注意事项

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