【提示】点击每一关参考答案可以快速复制。
目录
第1关:Sqoop 在HBase中导入
任务描述
编程要求
测试说明
参考答案
第2关:Sqoop 在HBase中导出
任务描述
相关知识
编程要求
测试说明
参考答案
本关任务:在右侧命令行中,导入 sql 文件至 MySQL 中并使用 Sqoop 工具将 MySQL 中的数据导入至 HBase 。
为了完成本关任务,你需要掌握: 1.Sqoop 命令与操作
Sqoop 命令
Sqoop 支持 HDFS 和 Hive 之外的其他导入目标。Sqoop 还可以将记录导入到 HBase 中的表中。
参数名称 | 参数含义 |
---|---|
--column-family | 设置导入的目标列族 |
--hbase-create-table | 如果指定,则创建缺少的 HBase 表 |
--hbase-row-key | 指定要用作行键的输入列,如果输入表包含复合键,则 |
--hbase-table | 指定要用作目标的 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 表,表数据如下:
1.进入 HBase 客户端,创建一个列族 为 info表名为 student 的表。
create 'student','info'
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
成功执行后,显示。
3.查询 HBase 表 student 是否成功导入数据;
数据已经成功导入至 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 表中
mysql -uroot -p123123 < /data/workspace/myshixun/step1/1.sql
评测时,需要开启各个服务,点击评测后,平台脚本会查看 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
本关任务:在右侧命令行中,完成 HBase 数据导入至 MySQL中。
HBase 数据无法直接导出至 MySQL ,需要在 Hive 进行中转,其流程图如下:
数据准备
在 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 查看表数据:
创建 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");
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;
将外部表数据导入至内部表 book 中,可以方便使用 Sqoop 更好的导入至 MySQL 中。
insert overwrite table test.book select * from test.h_book;
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 导出数据至 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
dir 参数可以通过 hadoop fs -ls / 命令来查看数据文件存放位置
最后查看 MySQL 中表 book 是否存在数据导入。
mysql -uroot -p123123 -e "select * from test.book;"
至此使用 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;"
至此,所有内容都完成辣。如果存在任何问题欢迎大佬指教🥰!