Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 【2月更文挑战第9天】Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)

1.环境说明

# 不必要信息不再贴出
# JDK
[root@tcloud ~]# java -version
java version "1.8.0_251"
# MySQL
[root@tcloud ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.28
# Hadoop
[root@tcloud ~]# hadoop version
Hadoop 3.1.3
# Hive 
[root@tcloud ~]# hive --version
Hive 3.1.2
# Sqoop
[root@tcloud ~]# sqoop version
Sqoop 1.4.7

2.基本命令

:one: 查看所有命令【 sqoop help 】

[root@tcloud ~]# sqoop help

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.

:two: 查看某条命令的具体使用方法【 sqoop help COMMAND 】

[root@tcloud ~]# sqoop help job

usage: sqoop job [GENERIC-ARGS] [JOB-ARGS] [-- [<tool-name>] [TOOL-ARGS]]

Job management arguments:
   --create <job-id>            Create a new saved job
   --delete <job-id>            Delete a saved job
   --exec <job-id>              Run a saved job
   --help                       Print usage instructions
   --list                       List saved jobs
   --meta-connect <jdbc-uri>    Specify JDBC connect string for the
                                metastore
   --show <job-id>              Show the parameters for a saved job
   --verbose                    Print more information while working

Generic Hadoop command-line arguments:
(must preceed any tool-specific arguments)
Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines

The general command line syntax is:
command [genericOptions] [commandOptions]

3.查询操作

3.1 list-databases

查询MySQL所有数据库,通常用于 Sqoop 与 MySQL 连通测试:

# 注意:以下URL写法都可以【但是建议用第一个或第四个】
jdbc:mysql://ip:port/
jdbc:mysql://ip/
jdbc:mysql://ip
jdbc:mysql://hostname:port/
jdbc:mysql://hostname/
jdbc:mysql://hostname
jdbc:mysql:///
jdbc:mysql://

【具体参数可以使用 sqoop help list-databases 查看】实例:

sqoop list-databases \
--connect jdbc:mysql://tcloud:3306/ \
--username root \
-password tcloud@2021

结果:

# INFO信息不再贴出这里只贴出WARN信息
2021-09-09 10:12:09,596 WARN tool.BaseSqoopTool: 
Setting your password on the command-line is insecure. Consider using -P instead.

Thu Sep 09 10:12:10 CST 2021 WARN: 
Establishing SSL connection without server's identity verification is not recommended.
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be
established by default if explicit option isn't set. For compliance with existing 
applications not using SSL the verifyServerCertificate property is set to 'false'. 
You need either to explicitly disable SSL by setting useSSL=false, 
or set useSSL=true and provide truststore for server certificate verification.

information_schema
metastore
mysql
performance_schema
sys

【2个】WARN处理:

# 第一个WARN是说 在命令行中设置密码是不安全的 考虑使用-P代替 修改后
sqoop list-databases \
--connect jdbc:mysql://tcloud:3306/ \
--username root \
-P
# 然后输入密码即可【这显然不利于自动化 使用过程中我们可以忽略此WARN】
# 第二个WARN是说 不建议在不验证服务器身份的情况下建立SSL连接 并给出解决建议 修改后
sqoop list-databases \
--connect jdbc:mysql://tcloud:3306/?useSSL=false \
--username root \
-P

3.2 list-tables

查询指定数据库中所有数据表,这里要注意一下 :point_right:(会查询出所有的表和视图,但不包含函数和存储过程)【具体参数可以使用 sqoop help list-tables 查看】实例:

# 找一个表比较少的库进行测试
sqoop list-tables \
--connect jdbc:mysql://tcloud:3306/sys?useSSL=false \
--username root \
--password aliyun@2021

结果:

2021-09-09 11:05:23,943 ERROR manager.CatalogQueryManager: Failed to list tables
java.sql.SQLException: Access denied for user 'root'@'tcloud' (using password: YES)

【1个】ERROR处理:

# 原来是密码错了 修改后
sqoop list-tables \
--connect jdbc:mysql://tcloud:3306/sys?useSSL=false \
--username root \
--password tcloud@2021

# 这里只贴出部分结果
host_summary
host_summary_by_file_io
host_summary_by_file_io_type
host_summary_by_stages
host_summary_by_statement_latency
host_summary_by_statement_type

3.3 eval

通过sqoop执行SQL语句对关系数据库进行操作,这样我们在使用import这种工具进行数据导入前,预先了解相关的SQL语句是否正确,并能将结果显示在控制台。【具体参数可以使用 sqoop help eval 查看】实例:

sqoop eval \
--connect jdbc:mysql://tcloud:3306/sys?useSSL=false \
--username root \
--password tcloud@2021 \
--query "select * from version"

# 结果
------------------
| sys_version | mysql_version |
------------------
| 1.5.2 | 5.7.28 |
------------------

4.MySQL数据导入导出到HDFS

4.1 import

  导入导出有时候我们无法分辨方向,这时把HDFS、Hive、HBase 等分布式文件存储系统当作【主体】,进入文件系统的就是导入import,从文件系统获取数据就是导出export。

  将 MySQL 数据库中的 help_keyword 表数据导入到 HDFS 的 /sqoop 目录下,如果导入目录存在则先删除再导入,使用 n 个 map tasks 并行导入。【具体参数可以使用 sqoop help import 查看】实例:

注:help_keyword 是 MySQL数据库内置的一张字典表,之后的示例均使用这张表。

  1. 直接导入
    ```shell

    备注版

    sqoop import \
    --connect jdbc:mysql://tcloud:3306/mysql?useSSL=false \
    --username root \
    --password tcloud@2021 \
    --table help_keyword \ # 待导入的表名称
    --delete-target-dir \ # 目标目录存在则先删除
    --target-dir /sqoop \ # 导入的目标目录
    --fields-terminated-by '\t' \ # 指定导出数据的分隔符
    -m n # 指定并行执行的 map tasks 数量

可执行版

sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql?useSSL=false \
--username root \
--password tcloud@2021 \
--table help_keyword \
--delete-target-dir \
--target-dir /sqoop \
--fields-terminated-by '\t' \
-m 1

结果,这里只保留WARN信息:
```bash
# 这个WARN我们可以忽略
2021-09-09 13:40:51,014 WARN tool.BaseSqoopTool: 
Setting your password on the command-line is insecure. Consider using -P instead.

# 开启直接模式 MySQ会使用自带的导入导出工具进行处理
2021-09-09 13:40:59,272 WARN manager.MySQLManager: 
It looks like you are importing from mysql.
This transfer can be faster! Use the --direct
option to exercise a MySQL-specific fast path.

# 原因是 mapred-site.xml 配置了yarn模式 启动yarn 或者去掉yarn配置都行
# 【云服务器内存较小所以选择去掉了yarn】
2021-09-09 13:40:59,682 INFO client.RMProxy: 
Connecting to ResourceManager at tcloud/xxx.xx.x.x:8032

2021-09-09 13:41:01,488 INFO ipc.Client: Retrying connect to server: 
tcloud/xxx.xx.x.x:8032. Already tried 0 time(s); 
retry policy is RetryUpToMaximumCountWithFixedSleep(
maxRetries=10, sleepTime=1000 MILLISECONDS)

解决无法连接 ResourceManager 后再次执行,出现 ClassNotFoundException:

2021-09-09 14:55:36,267 WARN mapred.LocalJobRunner: job_local1346801578_0001
java.lang.Exception: java.lang.RuntimeException:
java.lang.ClassNotFoundException: Class help_keyword not found

这个很明显是执行job时找不到jar包导致的,处理方法是将生成到 /tmp/sqoop-你的用户名/compile(或者是/tmp/sqoop/compile)的文件放到$SQOOP_HOME/lib文件夹下,也可以使用--bindir指定生成代码的文件夹,处理后:

sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql?useSSL=false \
--username root \
--password tcloud@2021 \
--table help_keyword \
--delete-target-dir \
--target-dir /sqoop \
--fields-terminated-by '\t' \
--bindir /usr/local/sqoop/lib/ \
-m 1

修改--bindir后执行仍然会报错,但是这次会生成jar文件,再次执行就成功了,但是这样下去,lib下的文件会越来越多,不是办法:

[root@tcloud lib]# ll
total 17820
-rw-r--r-- 1 root root     611 Sep  9 15:09 help_keyword$1.class
-rw-r--r-- 1 root root     617 Sep  9 15:09 help_keyword$2.class
-rw-r--r-- 1 root root    9441 Sep  9 15:09 help_keyword.class
-rw-r--r-- 1 root root     237 Sep  9 15:09 help_keyword$FieldSetterCommand.class
-rw-r--r-- 1 root root    5294 Sep  9 15:09 help_keyword.jar
-rw-r--r-- 1 root root   11509 Sep  9 15:09 help_keyword.java

⚠️以下方法无法解决此问题,仍然需要使用 --bindir $SQOOP_HOME/lib:

【方法一:x:】

# 1.配置Hadoop的core-site.xml添加sqoop1代理
vim /usr/local/hadoop-3.1.3/etc/hadoop/core-site.xml
    # 添加以下内容
    <property>
        <name>hadoop.proxyuser.sqoop1.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.sqoop1.groups</name>
        <value>*</value>
    </property>

# 2.comma separated list of system users who CAN run applications
# 【可以运行应用程序的系统用户列表,以逗号分隔】
vim /usr/local/hadoop-3.1.3/etc/hadoop/container-executor.cfg
    # 添加
    allowed.system.users=root,sqoop1

【方法二:x:】

# 将生成的jar文件配置到第三方库
vim /etc/profile.d/my_env.sh
    # 添加
    export SQOOP_SERVER_EXTRA_LIB=/tmp/sqoop-root/compile
  1. 【增量导入】追加模式和最后修改模式
    ```shell

    追加模式

    sqoop import \
    --driver com.mysql.jdbc.Driver \
    --connect jdbc:mysql://tcloud:3306/mysql \
    --username root \
    --password tcloud@2021 \
    --table help_keyword \
    --target-dir /sqoop/part-m-00000 \
    --incremental append \
    --check-column help_keyword_id \
    --last-value '666' \
    --bindir /usr/local/sqoop/lib/ \
    -m 1

最后修改模式

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table slow_log\
--target-dir /sqoop/part-m-00000 \
--incremental lastmodified \
--check-column start_time\
--last-value '2021-09-08 20:59:15' \
--bindir /usr/local/sqoop/lib/ \
-m 1

incremental 参数有以下两个可选的选项:

+ append:要求参考列的值必须是递增的,所有大于  last-value 的值都会被导入;
+ lastmodified:要求参考列的值必须是  timestamp 类型,且插入数据时候要在参考列插入当前时间戳,更新数据时也要更新参考列的时间戳,所有时间晚于  last-value 的数据都会被导入。

Sqoop1的增量导入是依靠维护的参考列来判断哪些是增量数据。我们也可以使用 query 参数来进行手动的增量导入,会更加灵活。

3. SQL语句导入
```shell
# 注意:不能添加--table参数
sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--query 'SELECT help_keyword_id,name from help_keyword where $CONDITIONS' \
--delete-target-dir \
--target-dir /sqoop_query \
--bindir /usr/local/sqoop/lib/ \
-m 1

4.2 export

【具体参数可以使用 sqoop help export 查看】导出的表必须预先创建,建表语句如下:

CREATE TABLE help_keyword_from_hdfs LIKE help_keyword ;
# 导出数据存储在 MySQL 的help_keyword_from_hdf 的表中
sqoop export \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword_from_hdfs \
--export-dir /sqoop \
--input-fields-terminated-by '\t'\
--bindir /usr/local/sqoop/lib/ \
--m 1

# 采用export插入数据的时候,如果数据已经存在了,插入会失败
# 如果我们使用-update-key,它会认为每个数据都是更新,比如我们使用下面这条语句:
sqoop export \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword_from_hdfs \
--update-key help_keyword_id \
--export-dir /sqoop \
--input-fields-terminated-by '\t'\
--bindir /usr/local/sqoop/lib/ \
--m 1

--update-mode allowinsert # 如果存在就更新,不存在就插入

5.MySQL数据导入导出到Hive

Sqoop 导入数据到 Hive 是通过先将数据导入到 HDFS 上的临时目录,然后再将数据从 HDFS 上 Load 到 Hive 中,最后将临时目录删除。可以使用 target-dir 来指定临时目录。

5.1 import

  1. 数据导入

导入到 Hive 中的 sqoop_test 数据库需要预先创建,不指定则默认使用 Hive 中的 default 库。

# 查看 hive 中的所有数据库
hive> SHOW DATABASES;
# 创建 sqoop_test 数据库
hive> CREATE DATABASE sqoop_test;
# 备注版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \         
# 待导入的表  
--delete-target-dir \             
# 如果临时目录存在删除
--target-dir /sqoop_hive \      
# 临时目录位置
--hive-database sqoop_test \      
# 导入到Hive的sqoop_test数据库,库需要预先创建。不指定则默认为default库
--hive-import \                
# 导入到 Hive
--hive-overwrite \             
# 如果 Hive 表中有数据则覆盖,这会清除表中原有的数据,然后再写入
--bindir /usr/local/sqoop/lib/ \
-m 1                            
# 并行度

# 可执行版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \
--delete-target-dir \
--target-dir /sqoop_hive \
--hive-database sqoop_test \
--hive-import \
--hive-overwrite \
--bindir /usr/local/sqoop/lib/ \
-m 1
  • -hive-table emp指定在Hive中创建的表名为emp(默认数据库default)
  • -hive-table sqoop.emp指定在Hive中的sqoop数据库下创建emp表
  • -fields-terminated-by "\0001" 是设置每列之间的分隔符,"\0001"是ASCII码中的1,是hive的默认行内分隔符,而sqoop的默认行内分隔符为","
  • -lines-terminated-by "\n" 设置的是每行之间的分隔符,此处为换行符,也是默认的分隔符;
  1. 导入验证
    # 查看 sqoop_test 数据库的所有表
    hive> SHOW TABLES IN sqoop_test;
    # 查看表中数据
    hive> SELECT * FROM sqoop_test.help_keyword;
    
  2. 可能出现的问题

    # 如果执行报错  
    java.io.IOException: 
    java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
    # 则需将 Hive 安装目录下 lib 下的 hive-exec-**.jar 放到 ${SQOOP_HOME}/lib。
    
    # 查看
    [root@tcloud lib]# ll hive-exec-*
    -rw-rw-r-- 1 root root 41068549 Apr 15  2020 hive-exec-3.1.2.jar
    # 复制
    [root@tcloud lib]#cp hive-exec-3.1.2.jar ${SQOOP_HOME}/lib
    

    5.2 export

    由于 Hive 的数据是存储在 HDFS 上的,所以 Hive 导入数据到 MySQL,实际上就是 HDFS 导入数据到 MySQL。

  3. 查看Hive表在HDFS的存储位置

    # 进入对应的数据库
    hive> use sqoop_test;
    # 查看表信息
    hive> desc formatted help_keyword;
    # Location 属性为其存储位置 
    # hdfs://tcloud:8020/user/hive/warehouse/sqoop_test.db/help_keyword
    
  4. 执行导出命令

MySQL 中的表需要预先创建:

CREATE TABLE help_keyword_from_hive LIKE help_keyword ;
# 需要注意的是 hive 中默认的分隔符为 \001
sqoop export \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword_from_hive \
--export-dir /user/hive/warehouse/sqoop_test.db/help_keyword \
-input-fields-terminated-by '\001' \       
--bindir /usr/local/sqoop/lib/ \
-m 1

6.MySQL导入数据到HBase

HBase数据库暂时没有安装,这里是之前验证过的笔记,当前环境未验证。这里只举例从 RDBMS 导入数据到 HBase,因为暂时没有命令能够从 HBase 直接导出数据到RDBMS。

5.1 import

  1. 导入数据

导入的 HBase 表需要预先创建:

# 查看所有表
hbase> list
# 创建表
hbase> create 'help_keyword_hbase', 'keywordInfo'
# 查看表信息
hbase> desc 'help_keyword_hbase'

将 help_keyword 表中数据导入到 HBase 上的 help_keyword_hbase 表中,使用原表的主键 help_keyword_id 作为 RowKey ,原表的所有列都会在 keywordInfo 列族下,目前只支持全部导入到一个列族下,不支持分别指定列族。

# 备注版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \                    # 待导入的表
--hbase-table help_keyword_hbase \        # hbase 表名称,表需要预先创建
--column-family 'keywordInfo' \            # 所有列导入到 keywordInfo 列族下
--hbase-row-key help_keyword_id \        # 使用原表的 help_keyword_id 作为 RowKey
--bindir /usr/local/sqoop/lib/ \
-m 1

# 可执行版
sqoop import \
--connect jdbc:mysql://tcloud:3306/mysql \
--username root \
--password tcloud@2021 \
--table help_keyword \
--hbase-table help_keyword_hbase \
--column-family 'keywordInfo' \
--hbase-row-key help_keyword_id \
--bindir /usr/local/sqoop/lib/ \
-m 1
  1. 导入验证

使用 scan 查看表数据:

hbase(main):008:0> scan 'help_keyword_hbase'

7.总结

至此,Sqoop的核心导入导出举例完成,这次遇到的问题和之前的不同,不同环境下执行的情况有所不同,java.lang.ClassNotFoundException: Class tableName not found 的问题在此版本下未能彻底解决,希望知道如何解决的小伙伴儿们能不吝赐教 :pray:

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
分布式计算 关系型数据库 MySQL
Sqoop【部署 01】CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
【2月更文挑战第8天】Sqoop CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
100 1
|
2月前
|
SQL 关系型数据库 MySQL
|
4月前
|
SQL 分布式数据库 HIVE
Hbase 和Hive表关联
Hbase 和Hive表关联
41 0
|
4月前
|
SQL 分布式数据库 HIVE
Hbase二级索引_Hive on Hbase 及phoenix详解
Hbase二级索引_Hive on Hbase 及phoenix详解
44 0
|
4月前
|
SQL 分布式计算 分布式数据库
HBase 和 Hive 你能分清楚吗?(转拉勾教育)
HBase 和 Hive 你能分清楚吗?(转拉勾教育)
33 0
|
4月前
|
消息中间件 Java 关系型数据库
【Spring Boot+Kafka+Mysql+HBase】实现分布式优惠券后台应用系统(附源码)
【Spring Boot+Kafka+Mysql+HBase】实现分布式优惠券后台应用系统(附源码)
92 2
|
7月前
|
关系型数据库 MySQL 大数据
大数据Sqoop将mysql直接抽取至Hbase
大数据Sqoop将mysql直接抽取至Hbase
78 0
|
7月前
|
SQL 分布式计算 分布式数据库
大数据Sqoop借助Hive将Mysql数据导入至Hbase
大数据Sqoop借助Hive将Mysql数据导入至Hbase
156 0
|
10月前
|
SQL 分布式计算 关系型数据库
大数据 | (五)通过Sqoop实现从MySQL导入数据到HDFS
大数据 | (五)通过Sqoop实现从MySQL导入数据到HDFS
171 0
|
SQL 分布式计算 运维
【大数据开发运维解决方案】Sqoop增量同步mysql/oracle数据到hive(merge-key/append)测试文档
上一篇文章介绍了sqoop全量同步数据到hive, 本片文章将通过实验详细介绍如何增量同步数据到hive,以及sqoop job与crontab定时结合无密码登录的增量同步实现方法。
【大数据开发运维解决方案】Sqoop增量同步mysql/oracle数据到hive(merge-key/append)测试文档