准备资源:sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz、mysql-connector-java-5.1.37.jar
一、安装Sqoop
1. 将sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz上传至/opt/software中,解压到/opt/moudle中,对解压出来的目录重新命名
# 解压
tar -zxvf /opt/software/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/moudle/
# 更名
mv /opt/moudle/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/ sqoop-1.4.6
2. 于/etc/profile.d/my-env.sh中配置环境变量,并使环境变量生效
# 使用文本编辑器打开配置文件
sudo vim /etc/profile.d/my-env.sh
# 配置添加内容如下:
# SQOOP环境变量
export SQOOP_HOME=/opt/moudle/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
# 使环境变量生效
source /etc/profile
3. 修改sqoop的配置文件
# 来到配置目录下
cd $SQOOP_HOME/conf
# 对模板配置文件重命名
mv sqoop-env-template.sh sqoop-env.sh
# 使用文本编辑器编辑该配置文件
vim sqoop-env.sh
# 修改内容如下:
# 配置为hadoop的安装目录
export HADOOP_COMMON_HOME=$HADOOP_HOME
# 配置为hadoop的安装目录
export HADOOP_MAPRED_HOME=$HADOOP_HOME
# 应配置为HBase的安装目录,如果已经配置过HABSE_HOME的环境变量,此处无需配置
#export HBASE_HOME=
# 应配置为Hive的安装目录,如果已经配置过HIVE_HOME的环境变量,此处无需配置
#export HIVE_HOME=
# 配置为zookeeper使用的配置文件目录
export ZOOCFGDIR=$ZOOKEEPER_HOME/conf
4. 拷贝JDBC驱动到sqoop的lib目录下
cp /opt/software/mysql-connector-java-5.1.37.jar $SQOOP_HOME/lib/
5. 验证安装是否成功
# 显示帮助
sqoop help
# 列举mysql中创建的数据库列表
sqoop list-databases --connect jdbc:mysql://hadoop101:3306/ --username root --password 123456
二、Sqoop使用
1. 将数据从数据库中导入至HDFS
(1) 常用选项解释
选项 | 解释 |
--connect <jdbc-uri> | 指定要连接的数据库,数据将从数据库中导出,放入HDFS中 |
--username <username> | 指定连接数据库的用户名 |
--password | 指定连接用户名使用的密码 |
--as-textfile | 导入到HDFS的数据将使用普通文本文件进行存储,默认选项 |
--as-parquetfile | 导入到HDFS的数据使用parquet格式的文本文件进行存储,需要指定 |
--table <table-name> | 从数据库的哪张表中读取数据 |
--columns <col,col,col…> | 要读取每行数据的哪些列 |
--where <where clause> | 符合指定条件(where clause)的哪些数据会被读取,采用数据库语法 |
--query "select columns from table_name where 1 = 1 [and (your conditions)] and \$CONDITIONS" | --table、--colums、--where的等价替换,where条件要写入小括号内 |
--target-dir <dir> | 导入HDFS的数据将会被存储在哪一个目录之下 |
--delete-target-dir | 如果数据要存储的目录已经存在,就删除,需要自己指定 |
--split-by <column-name> | sqoop底层是只有mapper的mapreduce,mapper的个数可以自己指定,该参数的作用为:根据哪一个列名划分每个mapper处理的数据大小 |
--num-mappers <num> | 指定mapper的数量,默认设置为4 |
--fields-terminated-by <char> | 指定数据存储为HDFS上的文件时,每个字段的分隔符是什么 |
--compress | 启用压缩 |
--compression-codec <c> | 使用什么压缩,默认为gzip |
--null-string <null-string> | 数据库中的字符串类型空值导出来后应该表示为什么,如果之后使用Hive进行分析,需要使用\\N |
--null-non-string <null-string> | 数据库中的非字符串类型空值导出来后应该表示为什么,如果之后使用Hive进行分析,需要使用\\N |
--append | 以追加方式将数据库中的数据导入到HDFS对应的表目录下 |
(2) 数据导入语法格式(可以通过shell脚本灵活指定sqoop命令中各选项的选项值)
# 写法1
sqoop import \
--connect jdbc:mysql://hadoop101:3306/gmall \
--username root \
--password 123456 \
--table order_info \
--columns id,user_id \
--where "id >= 100 and id <= 200" \
--target-dir /gmall/business \
--delete-target-dir \
--split-by id \
--num-mappers 2 \
--fields-terminated-by '\t' \
--compress \
--compression-codec com.hadoop.compression.lzo.LzopCodec \
--null-string '\\N' \
--null-non-string '\\N'
# 写法2
sqoop import \
--connect jdbc:mysql://hadoop101:3306/gmall \
--username root \
--password 123456 \
--query "select id,user_id from order_info where 1 = 1 and (id >= 100 and id <= 200) and \$CONDITIONS" \
--target-dir /gmall/business \
--delete-target-dir \
--split-by id \
--num-mappers 2 \
--fields-terminated-by '\t' \
--compress \
--compression-codec com.hadoop.compression.lzo.LzopCodec \
--null-string '\\N' \
--null-non-string '\\N'
(3) 数据同步策略
a. 全量同步:将数据库中的表数据全部导出
b. 增量同步:只导出数据库中的增加的数据,利用表内添加该数据的日期和昨天的日期作比较(默认在一天后的凌晨开始导数据)
c. 增量及变化同步:只导出变化过或者增加的数据,利用表内添加数据的日期或者修改数据的日期和昨天的日期作比较(默认在一天后的凌晨开始导数据)
d. 特殊同步:只导出一次
2. 将数据自HDFS中导出
选项 | 解释 |
--connect <jdbc-uri> | 指定要连接的数据库,数据将从HDFS中导出,放入数据库中 |
--username <username> | 指定连接数据库的用户名 |
--password | 指定连接用户名使用的密码 |
--table <table-name> | 将数据读取到数据库中的哪个表中 |
--columns <col,col,col…> | 要读取每行数据的哪些列 |
--export-dir <dir> | 从HDFS的哪一个目录之下导出数据到数据库中 |
--update-key <col-name> | 指定更新模式参考的列,如果要指定多个列,列之间使用逗号(,)分割;会利用这里指定的列,拿出HDFS中每条数据的这些列的内容和数据库中每条数据的这系列的内容进行比较,依次判断两条数据是否为同一条数据。 |
--update-mode <mode> | 指定跟新模式,是只更新(updateonly ,表中原本不存在的数据不会进行任何操作)还是允许插入(allowinsert,对于不存在的数据行会进行插入,存在的数据行会更新update-key未指定的字段) |
--input-null-string <null-string> | HDFS存储的字符串类型空值表示是什么,这里就是什么,如果之前用Hive分析HDFS上的数据,此处应是\\N |
--input-null-non-string <null-string> | HDFS存储的非字符串类型空值表示是什么,这里就是什么,如果之前用Hive分析HDFS上的数据,此处应是\\N |
--input-fields-terminated-by <char> | 指定HDFS中数据文件中每行数据各字段的分隔符 |
--num-mappers <n> | 指定mapper的数量,默认设置为4 |
(2)数据导出语法格式
sqoop export \
--connect jdbc:mysql://hadoop101:3306/gmall \
--username root \
--password 123456 \
--table order_info2 \
--columns id,user_id \
--export-dir /gmall/business \
--num-mappers 2 \
--fields-terminated-by '\t' \
--update-key id \
--update-mode allowinsert \
--input-null-string '\\N' \
--input-null-non-string '\\N'
问题:难道sqoop export只能将hdfs上的普通文本文件中的内容导入到数据库中吗?我想导hdfs上的压缩文件以及其他格式的文件(例如入orc、parquet),sqoop可以直接实现吗?求各位偶尔刷到本博客的大佬解答一下!!!