详解Sqoop及使用

您所在的位置:网站首页 sqoop主要用于 详解Sqoop及使用

详解Sqoop及使用

2024-03-07 04:05| 来源: 网络整理| 查看: 265

一、Sqoop 简介

Sqoop 是一个常用的数据迁移工具,主要用于在不同存储系统之间实现数据的导入与导出:

导入数据:从 MySQL,Oracle 等关系型数据库中导入数据到 HDFS、Hive、HBase 等分布式文件存储系统中;

导出数据:从 分布式文件系统中导出数据到关系数据库中。

其原理是将执行命令转化成 MapReduce 作业来实现数据的迁移,如下图: 在这里插入图片描述

二、Sqoop安装

版本选择:目前 Sqoop 有 Sqoop 1 和 Sqoop 2 两个版本,但是截至到目前,官方并不推荐使用 Sqoop 2,因为其与 Sqoop 1 并不兼容,且功能还没有完善,所以这里优先推荐使用 Sqoop 1。 在这里插入图片描述

2.1 下载并解压

下载所需版本的 Sqoop ,这里下载的是 CDH 版本的 Sqoop 。下载地址为: http://archive.cloudera.com/cdh5/cdh/5/

下载后进行解压 tar -zxvf sqoop-1.4.6-cdh5.15.2.tar.gz

2.2 配置环境变量

vim /etc/profile 添加环境变量: export SQOOP_HOME=/usr/app/sqoop-1.4.6-cdh5.15.2 export PATH=$SQOOP_HOME/bin:$PATH 使得配置的环境变量立即生效: source /etc/profile

2.3 修改配置

进入安装目录下的 conf/ 目录,拷贝 Sqoop 的环境配置模板 sqoop-env.sh.template

cp sqoop-env-template.sh sqoop-env.sh

修改 sqoop-env.sh,内容如下 (以下配置中 HADOOP_COMMON_HOME 和 HADOOP_MAPRED_HOME 是必选的,其他的是可选的):

Set Hadoop-specific environment variables here. Set path to where bin/hadoop is available export HADOOP_COMMON_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2 Set path to where hadoop-*-core.jar is available export HADOOP_MAPRED_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2 set the path to where bin/hbase is available export HBASE_HOME=/usr/app/hbase-1.2.0-cdh5.15.2 Set the path to where bin/hive is available export HIVE_HOME=/usr/app/hive-1.1.0-cdh5.15.2 Set the path for where zookeper config dir is export ZOOCFGDIR=/usr/app/zookeeper-3.4.13/conf

2.4 拷贝数据库驱动

将 MySQL 驱动包拷贝到 Sqoop 安装目录的 lib 目录下, 驱动包的下载地址为 https://dev.mysql.com/downloads/connector/j/ 。 在这里插入图片描述

2.5 验证

由于已经将 sqoop 的 bin 目录配置到环境变量,直接使用以下命令验证是否配置成功:

sqoop version

出现对应的版本信息则代表配置成功: 在这里插入图片描述 这里出现的两个 Warning 警告是因为本身就没有用到 HCatalog 和 Accumulo,忽略即可。Sqoop 在启动时会去检查环境变量中是否有配置这些软件,如果想去除这些警告,可以修改 bin/configure-sqoop,注释掉不必要的检查。

# Check: If we can't find our dependencies, give up here. if [ ! -d "${HADOOP_COMMON_HOME}" ]; then echo "Error: $HADOOP_COMMON_HOME does not exist!" echo 'Please set $HADOOP_COMMON_HOME to the root of your Hadoop installation.' exit 1 fi if [ ! -d "${HADOOP_MAPRED_HOME}" ]; then echo "Error: $HADOOP_MAPRED_HOME does not exist!" echo 'Please set $HADOOP_MAPRED_HOME to the root of your Hadoop MapReduce installation.' exit 1 fi ## Moved to be a runtime check in sqoop. if [ ! -d "${HBASE_HOME}" ]; then echo "Warning: $HBASE_HOME does not exist! HBase imports will fail." echo 'Please set $HBASE_HOME to the root of your HBase installation.' fi ## Moved to be a runtime check in sqoop. if [ ! -d "${HCAT_HOME}" ]; then echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail." echo 'Please set $HCAT_HOME to the root of your HCatalog installation.' fi if [ ! -d "${ACCUMULO_HOME}" ]; then echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail." echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.' fi if [ ! -d "${ZOOKEEPER_HOME}" ]; then echo "Warning: $ZOOKEEPER_HOME does not exist! Accumulo imports will fail." echo 'Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.' fi 三、Sqoop 基本命令 3.1 查看所有命令

sqoop help

在这里插入图片描述

3.2 查看某条命令的具体使用方法

sqoop help 命令名

四、Sqoop 与 MySQL 4.1 查询MySQL所有数据库

通常用于 Sqoop 与 MySQL 连通测试:

sqoop list-databases –connect jdbc:mysql://hadoop001:3306/ –username root –password root

在这里插入图片描述

4.2 查询指定数据库中所有数据表 sqoop list-tables \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root 五、Sqoop 与 HDFS 5.1 MySQL数据导入到HDFS

1. 导入命令 示例:导出 MySQL 数据库中的 help_keyword 表到 HDFS 的 /sqoop 目录下,如果导入目录存在则先删除再导入,使用 3 个 map tasks 并行导入。

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

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

日志输出如下,可以看到输入数据被平均 split 为三份,分别由三个 map task 进行处理。数据默认以表的主键列作为拆分依据,如果你的表没有主键,有以下两种方案:

添加 -- autoreset-to-one-mapper 参数,代表只启动一个 map task,即不并行执行; 若仍希望并行执行,则可以使用 --split-by 指明拆分数据的参考列。 在这里插入图片描述

2. 导入验证

查看导入后的目录 hadoop fs -ls -R /sqoop 查看导入内容 hadoop fs -text /sqoop/part-m-00000

查看 HDFS 导入目录,可以看到表中数据被分为 3 部分进行存储,这是由指定的并行度决定的。

在这里插入图片描述

5.2 HDFS数据导出到MySQL sqoop export \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword_from_hdfs \ # 导出数据存储在 MySQL 的 help_keyword_from_hdf 的表中 --export-dir /sqoop \ --input-fields-terminated-by '\t'\ --m 3

表必须预先创建,建表语句如下:

CREATE TABLE help_keyword_from_hdfs LIKE help_keyword ; 六、Sqoop 与 Hive 6.1 MySQL数据导入到Hive

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

1. 导入命令

sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword \ # 待导入的表 --delete-target-dir \ # 如果临时目录存在删除 --target-dir /sqoop_hive \ # 临时目录位置 --hive-database sqoop_test \ # 导入到 Hive 的 sqoop_test 数据库,数据库需要预先创建。不指定则默认为 default 库 --hive-import \ # 导入到 Hive --hive-overwrite \ # 如果 Hive 表中有数据则覆盖,这会清除表中原有的数据,然后再写入 -m 3 # 并行度

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

查看 hive 中的所有数据库 hive> SHOW DATABASES; 创建 sqoop_test 数据库 hive> CREATE DATABASE sqoop_test;

2. 导入验证

查看 sqoop_test 数据库的所有表 hive> SHOW TABLES IN sqoop_test; 查看表中数据 hive> SELECT * FROM sqoop_test.help_keyword;

在这里插入图片描述

3. 可能出现的问题 在这里插入图片描述

如果执行报错java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf,则需将 Hive 安装目录下 lib 下的hive-exec-**.jar放到 sqoop 的 lib 。

[root@hadoop001 lib]# ll hive-exec-* -rw-r–r–. 1 1106 4001 19632031 11 月 13 21:45 hive-exec-1.1.0-cdh5.15.2.jar [root@hadoop001 lib]# cp hive-exec-1.1.0-cdh5.15.2.jar ${SQOOP_HOME}/lib

6.2 Hive 导出数据到MySQL

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

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

进入对应的数据库 hive> use sqoop_test; 查看表信息 hive> desc formatted help_keyword;

Location 属性为其存储位置: 在这里插入图片描述

这里可以查看一下这个目录,文件结构如下: 在这里插入图片描述

2. 执行导出命令

sqoop export \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword_from_hive \ --export-dir /user/hive/warehouse/sqoop_test.db/help_keyword \ -input-fields-terminated-by '\001' \ # 需要注意的是 hive 中默认的分隔符为 \001 --m 3

MySQL 中的表需要预先创建:

CREATE TABLE help_keyword_from_hive LIKE help_keyword ; 七、Sqoop 与 HBase

本小节只讲解从 RDBMS 导入数据到 HBase,因为暂时没有命令能够从 HBase 直接导出数据到 RDBMS。

7.1 MySQL导入数据到HBase

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

sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword \ # 待导入的表 --hbase-table help_keyword_hbase \ # hbase 表名称,表需要预先创建 --column-family keywordInfo \ # 所有列导入到 keywordInfo 列族下 --hbase-row-key help_keyword_id # 使用原表的 help_keyword_id 作为 RowKey

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

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

7.2导入验证

使用 scan 查看表数据: 在这里插入图片描述

八、全库导出

Sqoop 支持通过 import-all-tables 命令进行全库导出到 HDFS/Hive,但需要注意有以下两个限制:

所有表必须有主键;或者使用 --autoreset-to-one-mapper,代表只启动一个 map task;你不能使用非默认的分割列,也不能通过 WHERE 子句添加任何限制。

第二点解释得比较拗口,这里列出官方原本的说明: You must not intend to use non-default splitting column, nor impose any conditions via a WHERE clause.

8.1 全库导出到 HDFS: sqoop import-all-tables \ --connect jdbc:mysql://hadoop001:3306/数据库名 \ --username root \ --password root \ --warehouse-dir /sqoop_all \ # 每个表会单独导出到一个目录,需要用此参数指明所有目录的父目录 --fields-terminated-by '\t' \ -m 3 8.2 全库导出到 Hive: sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true \ --connect jdbc:mysql://hadoop001:3306/数据库名 \ --username root \ --password root \ --hive-database sqoop_test \ # 导出到 Hive 对应的库 --hive-import \ --hive-overwrite \ -m 3 九、Sqoop 数据过滤 9.1 query参数

Sqoop 支持使用 query 参数定义查询 SQL,从而可以导出任何想要的结果集。使用示例如下:

sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --query 'select * from help_keyword where $CONDITIONS and help_keyword_id


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3