Sqoop
Sqoop 介绍
什么是 Sqoop
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。
Sqoop导入
导入工具从RDBMS向HDFS导入单独的表。表中的每一行都被视为HDFS中的记录。所有记录都以文本文件的形式存储在文本文件中或作为Avro和Sequence文件中的二进制数据存储。
Sqoop导出
导出工具将一组文件从HDFS导出回RDBMS。给Sqoop输入的文件包含记录,这些记录在表中被称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。
sqoop实战
sqoop安装(只需要做几项配置即可使用无需启动服务)
# sqoop的安装依赖java环境和hadoop所以安装sqoop前必须安装java和hadoop
# 下载sqoop
$ wget https://mirrors.shu.edu.cn/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
# 解压sqoop
$ tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
# 修改配置文件
$ cp sqoop-env-template.sh sqoop-env.sh
# 修改一下配置(替换为你的软件安装目录)
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/export/servers/hadoop-2.7.7
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/export/servers/hadoop-2.7.7
#set the path to where bin/hbase is available
#export HBASE_HOME=/export/servers/hbase-2.1.2
#Set the path to where bin/hive is available
export HIVE_HOME=/export/servers/apache-hive-2.3.4-bin
# 上传mysql的驱动包到$SQOOP_HOME/lib目录下
# 验证sqoop是否安装成功
# 查看sqoop版本
$ $SQOOP_HOME/bin/sqoop-version
# 查看mysql中的库
$ $SQOOP_HOME/bin/sqoop-list-databases --connect jdbc:mysql://ip --username xxxx --password xxxx
# 查看mysql中的表
$ $SQOOP_HOME/bin/sqoop-list-tables --connect jdbc:mysql://ip/dbName?userSSL=false --username xxxx --password xxxx
sqoop的实战
mysql数据导入到好HDFS中
$ $SQOOP_HOME/bin/sqoop import \
--connect jdbc:mysql://ip/dbName \
--username root \
--password root \
--table t_site \
--fields-terminated-by ',' \
--target-dir /sqoop-1.4.7/mysql/t_site \
--m 2
HDFS中的数据导入到mysql中
$ $SQOOP_HOME/bin/sqoop export \
--connect "jdbc:mysql://ip/dbName?useUnicode=true&characterEncoding=utf8" \
--username root \
--password root \
--table t_site_bak \
--export-dir /sqoop-1.4.7/mysql/t_site \
--fields-terminated-by ','
mysql中的数据导入到hive中
bin/sqoop import \
--connect "jdbc:mysql://ip:3306/dbName?useSSL=false&characterEncoding=utf8" \
--username root \
--password root \
--table t_site \
--m 2 \
--hive-import \
--fields-terminated-by ',' \
--hive-database db1 \
--create-hive-table \
--hive-table t_site_hive
hive中的数据导入到mysql中
bin/sqoop export \
--connect "jdbc:mysql://ip:3306/dbName?useSSL=false&characterEncoding=utf8" \
--username root \
--password root \
--table t_site_bak \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--export-dir /hive-2.3.4/db1.db/t_site_hive \
--fields-terminated-by ','
sqoop 导入导出相关参数
- 验证相关的参数
参数 | 描述 |
---|---|
–valid | 启动数据验证功能,只对单表copy有效 |
–validator < class-name > | 指定验证类 |
–validation-threshold < class-name > | 指定使用的阈值验证类 |
–validation-failurehandler < class-name > | 指定验证失败的处理类 |
- import控制参数
参数 | 描述 |
---|---|
–append | 导入的数据追加到数据文件中 |
–as-avrodatafile | 导入数据格式为avro |
–as-sequencefile | 导入数据格式为sqeuqncefile |
–as-textfile | 导入数据格式为textfile |
–boundary-query < statement > | 代替min(split-by),max(split-by)值指定的边界,下面会有详细介绍 |
–columns < col,col,col… > | 指定导入字段 |
–delete-target-dir | 如果导入的target路径存在,则删除 |
–direct | 使用direct模式 |
–fetch-size < n > | 从数据库一次性读入的记录数 |
-inline-lob-limit < n > | 设定大对象数据类型的最大值 |
-m, –num-mappers < n > | 指定并行导入数据的map个数,默认为4个 |
-e, –query < statement > | 导入查询语句得到的数据 |
–split-by < column-name > | 一般与-m参数一起使用,指定分割split的字段 |
–table < table-name > | 指定database中的表名 |
–target-dir < dir > | 指定目标HDFS路径 |
–warehouse-dir < dir > | 指定表目标路径所在路径 |
–where < where clause > | 即sql语句中的where条件 |
-z, –compress | 打开压缩功能 |
–compression-codec < c > | 使用Hadoop的压缩,默认为gzip压缩 |
–null-string < null-string > | 源表中为null的记录导入为string类型时显示为null-string,默认显示为”null” |
–null-non-string < null-string > | 源表中为null的记录导入为非string类型时显示为null-string,默认显示为”null” |
- export控制参数
参数 | 描述 |
---|---|
–columns < col,col,col… > | 指定导出字段 |
–direct | 使用direct模式 |
–export-dir < dir > | 导出HDFS文件路径 |
-m, –num-mappers < n > | 指定并行导出数据的map个数,默认为4个 |
–table < table-name > | 指定database中的表名 |
–call < stored-proc-name > | 调用的存储过程名称 |
–update-key < col-name > | UPDATE模式下的更新字段,多个字段可以用逗号分隔 |
–update-mode < mode > | 当某记录在数据库中找不到对应记录时的操作。默认为updateonly ,可以设置成allowinsert ,这个模式遇到新增记录会插入导出表中 |
–input-null-string < null-string > | string类型字段表示null值的字符 |
–input-null-non-string < null-string > | 非string类型字段表示null值的字符 |
–staging-table < staging-table-name > | 在最终导出到目标表之前临时存储这些记录的表 |
–clear-staging-table | 表示可以清除上面的staging-table表中的记录 |
–batch | 对底层数据库的插入操作使用batch模式 |
错Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR
将hive 里面的lib下的hive-exec-**.jar 放到 sqoop 的 lib 下可以解决以下问题