目录

第1关:Sqoop 在HBase中导入

任务描述

相关知识

编程要求

测试说明

参考答案

第2关:Sqoop 在HBase中导出

任务描述

相关知识

编程要求

测试说明

参考答案


第1关:Sqoop 在HBase中导入

任务描述

本关任务:在右侧命令行中,导入 sql 文件至 MySQL 中并使用 Sqoop 工具将 MySQL 中的数据导入至 HBase 。

相关知识

为了完成本关任务,你需要掌握: 1.Sqoop 命令与操作

Sqoop 命令

Sqoop 支持 HDFS 和 Hive 之外的其他导入目标。Sqoop 还可以将记录导入到 HBase 中的表中。

参数名称

参数含义

--column-family <family>

设置导入的目标列族

--hbase-create-table

如果指定,则创建缺少的 HBase 表

--hbase-row-key <col>

指定要用作行键的输入列,如果输入表包含复合键,则 <col> 必须采用单个的形式,逗号分隔的组合键列表属性

--hbase-table <table-name>

指定要用作目标的 HBase 表名而不是 HDFS

--hbase-bulkload

启用批量加载

通过指定--hbase-table,您指示 Sqoop 导入到 HBase 中的表而不是 HDFS 中的目录。Sqoop 会将数据导入到指定为 的参数的表中--hbase-table。输入表的每一行都会转化为一个HBase Put操作到输出表的一行。每行的键取自输入的一列。默认情况下,Sqoop 将使用 split-by 列作为行键列。如果未指定,它将尝试识别源表的主键列(如果有)。您可以使用 手动指定行键列--hbase-row-key。每个输出列都将放置在同一个列族中,必须用--column-family.

如果输入表有复合键,则--hbase-row-key必须采用逗号分隔的复合键属性列表的形式。在这种情况下,HBase 行的行键将通过使用下划线作为分隔符组合复合键属性的值来生成。注意:只有--hbase-row-key在指定了参数的情况下,Sqoop 导入表才能使用复合键。

如果目标表和列族不存在,则 Sqoop 作业将退出并显示错误。您应该在运行导入之前创建目标表和列族。如果指定--hbase-create-table,Sqoop 将使用 HBase 配置中的默认参数创建目标表和列族(如果它们不存在)。

Sqoop 当前通过将每个字段转换为其字符串表示形式(就像您以文本模式导入到 HDFS 一样)将所有值序列化到 HBase,然后在目标单元格中插入此字符串的 UTF-8 字节。Sqoop 将跳过除行键列之外的所有列中包含空值的所有行。

为了减少 hbase 上的负载,Sqoop 可以进行批量加载而不是直接写入。要使用批量加载,请使用--hbase-bulkload

MySQL 导入至 HBase

MySQL 中有一张 student 表,表数据如下:

sqoop抽取到hbase命令 sqoop导入到hbase_hive

1.进入 HBase 客户端,创建一个列族 为 info表名为 student 的表。

create 'student','info'

sqoop抽取到hbase命令 sqoop导入到hbase_sqoop_02

2.使用 Sqoop 将 MySQL 数据导入 HBase 表 student 中。

sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://127.0.0.1/test --username root --password 123123 --table student --hbase-table student  --column-family info --hbase-row-key stu_no -m 1

sqoop抽取到hbase命令 sqoop导入到hbase_hive_03

成功执行后,显示。

3.查询 HBase 表 student 是否成功导入数据;

sqoop抽取到hbase命令 sqoop导入到hbase_sqoop_04

数据已经成功导入至 HBase 中了。总结:

1.导入至 HBase 中时,最好是先在 HBase 中创建好表,否则导入时会报 HBase 找不到表。 2.导入命令中加上 Map Task 数目(-m),可以更好、更快的执行程序。

编程要求

根据相关知识,在右侧命令行中完成 MySQL 数据成功导入至 HBase 中,具体操作如下: 1.启动服务

  • 启动 Hadoop、MySQL、ZooKeeper、HBase服务,命令已经写在 sh 文件中了,执行 shell 脚本启动所有服务;
sh /data/workspace/myshixun/service.sh
  • 如果服务全部启动,输入jsp 查看服务进程

2.将 MySQL 数据导入至 HBase 表中

  • 导入 SQL 至 MySQL 中
mysql -uroot -p123123 < /data/workspace/myshixun/step1/1.sql
  • 进入 HBase 客户端创建表 tb_class 列族为 info
  • 使用 Sqoop 将 MySQL 中 School 数据库的 tb_class 表中的数据导入至 HBase 中 tb_class 表中。

测试说明

评测时,需要开启各个服务,点击评测后,平台脚本会查看 HBase 中的 tb_class 表数据,查询的表数据与以下结果一致则可通关。

1 column=info:course, timestamp=1628590952274, value=Chinese
 1 column=info:id, timestamp=1628590952274, value=1
 1 column=info:name, timestamp=1628590952274, value=Emma
 1 column=info:score, timestamp=1628590952274, value=86
 2 column=info:course, timestamp=1628590952274, value=Chinese
 2 column=info:id, timestamp=1628590952274, value=2
 2 column=info:name, timestamp=1628590952274, value=Mary
 2 column=info:score, timestamp=1628590952274, value=79
 3 column=info:course, timestamp=1628590952274, value=Chinese
 3 column=info:id, timestamp=1628590952274, value=3
 3 column=info:name, timestamp=1628590952274, value=Allen
 3 column=info:score, timestamp=1628590952274, value=92
 4 column=info:course, timestamp=1628590952274, value=English
 4 column=info:id, timestamp=1628590952274, value=4
 4 column=info:name, timestamp=1628590952274, value=Emma
 4 column=info:score, timestamp=1628590952274, value=116
 5 column=info:course, timestamp=1628590952274, value=English
 5 column=info:id, timestamp=1628590952274, value=5
 5 column=info:name, timestamp=1628590952274, value=Mary
 5 column=info:score, timestamp=1628590952274, value=95
 6 column=info:course, timestamp=1628590952274, value=English
 6 column=info:id, timestamp=1628590952274, value=6
 6 column=info:name, timestamp=1628590952274, value=Allen
 6 column=info:score, timestamp=1628590952274, value=100
6row(s)

参考答案

#命令行


#启动 Hadoop、MySQL、ZooKeeper、HBase服务,命令已经写在 sh 文件中了,执行 shell 脚本启动所有服务
sh /data/workspace/myshixun/service.sh

#输入jps查看服务进程是否全部启动
jps

#导入 SQL 至 MySQL 中
mysql -uroot -p123123 < /data/workspace/myshixun/step1/1.sql 

#进入hbase
hbase shell
#以下为HBase Shell


#创建一个列族为 info 表名为 student 的表
create 'tb_class','info'

#查看表
list

#Ctrl + C 退出 HBase Shell
#命令行


#使用 Sqoop 将 MySQL 数据导入 HBase 表 student 中
sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://127.0.0.1/school --username root --password 123123 --table tb_class --hbase-table tb_class  --column-family info --hbase-row-key id -m 1

#查看是否成功
hbase shell
#以下为HBase Shell


#查询 HBase 表 student 是否成功导入数据
scan 'tb_class'

#Ctrl + C 退出 HBase Shell

第2关:Sqoop 在HBase中导出

任务描述

本关任务:在右侧命令行中,完成 HBase 数据导入至 MySQL中。

相关知识

HBase 数据无法直接导出至 MySQL ,需要在 Hive 进行中转,其流程图如下:

sqoop抽取到hbase命令 sqoop导入到hbase_sqoop_05

数据准备

在 HBase shell 添加数据:

create 'book','info'
put 'book',1,'info:id',01
put 'book',1,'info:name','Hamlet'
put 'book',1,'info:author','William Shakespeare'
put 'book',1,'info:price',32
put 'book',2,'info:id',02
put 'book',2,'info:name','nahan'
put 'book',2,'info:author','luxun'
put 'book',2,'info:price',27

添加数据后,使用 scan 查看表数据:

sqoop抽取到hbase命令 sqoop导入到hbase_hbase_06

创建 Hive 外部表

创建 test 数据库,并在数据库中创建 h_book 外部表,将 HBase 表book 数据导入进来。

create database test;
CREATE EXTERNAL TABLE test.h_book (key int,id int,name string,author string,price int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" =
":key,info:id, info:name,info:author,info:price"
)
TBLPROPERTIES( "hbase.table.name" = "book",
"hbase.mapred.output.outputtable" = "book");

sqoop抽取到hbase命令 sqoop导入到hbase_hbase_07

Hive 创建内部表

外部表创建后需要创建内部表 book。

CREATE TABLE test.book(key int,id int,name string,author string,price int)row format delimited fields terminated by ',' stored as textfile;

sqoop抽取到hbase命令 sqoop导入到hbase_sqoop_08

将外部表数据导入至内部表 book 中,可以方便使用 Sqoop 更好的导入至 MySQL 中。

insert overwrite table test.book select * from test.h_book;

sqoop抽取到hbase命令 sqoop导入到hbase_mysql_09

MySQL 创建表

MySQL 创建 test 数据库和 book 表。

create database test;

create table test.book(rowkey int(11),id int(11),name varchar(20),author varchar(20),price int(11),primary key (id));

sqoop抽取到hbase命令 sqoop导入到hbase_hbase_10

使用 Sqoop 导出数据至 MySQL 中

将 Hive 内部表 book 的数据导出至 MySQL 表 book 中。

sqoop export -connect jdbc:mysql://127.0.0.1:3306/test -username root -password 123123 -table book --fields-terminated-by ',' --export-dir /opt/hive/warehouse/test.db

sqoop抽取到hbase命令 sqoop导入到hbase_sqoop_11

dir 参数可以通过 hadoop fs -ls / 命令来查看数据文件存放位置

sqoop抽取到hbase命令 sqoop导入到hbase_sqoop抽取到hbase命令_12

最后查看 MySQL 中表 book 是否存在数据导入。

mysql -uroot -p123123 -e "select * from test.book;"

sqoop抽取到hbase命令 sqoop导入到hbase_hive_13

至此使用 Sqoop 导出 HBase 数据结束。

编程要求

根据相关知识操作,完成一次使用 Sqoop 将数据从 HBase 导出至 MySQL 中。

1.数据通过 HBase 生成导入 Hive 数据仓库,在导出至 MySQL 中。

2.需要导入 MySQL 的数据库为 book。

测试说明

评测时,需要开启各个服务,点击评测后,平台脚本会查看 MySQL 中的 book 表数据,查询的表数据与以下结果一致则可通关。

mysql: [Warning] Using a password on the command line interface can be insecure.
rowkey id name author price
1 1 Hamlet William Shakespeare 32
2 2 nahan luxun 27

参考答案

#命令行


hbase shell
#以下为HBase Shell


#在 HBase shell 添加数据
create 'book','info'
put 'book',1,'info:id',01
put 'book',1,'info:name','Hamlet'
put 'book',1,'info:author','William Shakespeare'
put 'book',1,'info:price',32
put 'book',2,'info:id',02
put 'book',2,'info:name','nahan'
put 'book',2,'info:author','luxun'
put 'book',2,'info:price',27

#查看数据
scan 'book'

#Ctrl + C 退出 HBase Shell
#命令行


#创建 Hive 外部表
hive
--以下为hive


--创建 test 数据库,并在数据库中创建 h_book 外部表,将 HBase 表book 数据导入进来
create database test;
CREATE EXTERNAL TABLE test.h_book (key int,id int,name string,author string,price int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" =
":key,info:id, info:name,info:author,info:price"
)
TBLPROPERTIES( "hbase.table.name" = "book",
"hbase.mapred.output.outputtable" = "book");

--外部表创建后需要创建内部表 book
CREATE TABLE test.book(key int,id int,name string,author string,price int)row format delimited fields terminated by ',' stored as textfile;

--将外部表数据导入至内部表 book 中
insert overwrite table test.book select * from test.h_book;

quit;
#命令行


#进入MySQL
mysql -uroot -p123123
#以下为MySQL


#MySQL 创建 test 数据库和 book 表
create database test;
create table test.book(rowkey int(11),id int(11),name varchar(20),author varchar(20),price int(11),primary key (id));

quit;
#命令行


#将 Hive 内部表 book 的数据导出至 MySQL 表 book 中
sqoop export -connect jdbc:mysql://127.0.0.1:3306/test -username root -password 123123 -table book --fields-terminated-by ',' --export-dir /opt/hive/warehouse/test.db/book

#dir 参数可以通过 hadoop fs -ls / 命令来查看数据文件存放位置
hadoop fs -ls /
hadoop fs -ls /opt
hadoop fs -ls /opt/hive
hadoop fs -ls /opt/hive/warehouse
hadoop fs -ls /opt/hive/warehouse/test.db

#最后查看 MySQL 中表 book 是否存在数据导入
mysql -uroot -p123123 -e "select * from test.book;"

至此,所有内容都完成辣。如果存在任何问题欢迎大佬指教🥰!