sqoop的import与export及其脚本使用

来源:互联网 发布:吕骋 知乎 编辑:程序博客网 时间:2024/05/31 18:45

Sqoop官方网址:http://sqoop.apache.org/

一、Sqoop的诞生

1、存在的问题

⑴RDBMS:数据大量存储在RDBMS(Oracle、MySQL、DB2等)上,如果需要对数据进行分析,需要将这些数据迁移到HDFS上去。

2、Sqoop的产生和作用

⑴Sqoop:Sql-to-Hadoop

⑵将关系数据库中的某张表数据抽取到Hadoop的HDFS文件系统当中,底层运行还是MapReduce。

将HDFS上的文件数据或者是Hive表中的数据导出到关系型数据库中的某张表中。

⑷Sqoop利用MapReduce批处理方式进行数据传输加快数据传输速度。

二、sqoop的版本

1、Sqoop1 & Sqoop2两个不同版本,完全不兼容;

2、Sqoop2比Sqoop1的改进

⑴引入Sqoop server,集中化管理Connector等;

⑵多种访问方式:CLI,Web UI,REST API  ;

⑶引入基于角色的安全机制;

三、sqoop的架构


四、sqoop的使用

1、Sqoop使用要点




2、测试Sqoop

⑴链接MySQL数据库,并list数据库中的databases,测试Sqoop是否配置正确。

$bin/sqoop list-databases \--connect jdbc:mysql://hostname:3306 \--username root \--password root

3、import

⑴默认情况下导入数据到HDFS

$/bin/sqoop import \--connect jdbc:mysql://hostname:3306/mydb \--username root \--password root \--table mytable


⑵指定目录和Mapper个数导入HDFS

①创建目录

${HADOOP_HOME}/bin/hdfs dfs -mkdir -p /user/sqoop/


②设置map个数为1,指定目录为/user/sqoop/,如果目标目录已经存在则先删除
$ bin/sqoop import \--connect jdbc:mysql://blue01.mydomain:3306/mydb \--username root \--password root \--table my_user \--target-dir /user/hive/warehouse/my_user \--delete-target-dir \--num-mappers 1 \--fields-terminated-by "\t" \--columns  id,passwd \--where "id<=3"


⑶增量导入HDFS
①增量导入数据到HDFS文件中,可以通过下面三个参数进行设置:
--check-column
--incremental
--last-value
$bin/sqoop import \--connect jdbc:mysql://hostname:3306/mydb \--username root \--password root \--table mytable \--num-mappers 1 \--target-dir /user/sqoop/ \--fields-terminated-by "\t" \--check-column id \--incremental append \--last-value 4      //表示从第5位开始导入


⑷指定文件格式导入HDFS
①默认情况下,导入数据到HDFS,文件存储格式为textfile,可以通过属性进行指定,比如文件存储格式为parquet
$bin/sqoop import \--connect jdbc:mysql://hostname:3306/mydb \--username root \--password root \--table mytable \--num-mappers 1 \--target-dir /user/sqoop/ \--fields-terminated-by "\t" \--as-parquetfile


⑸指定压缩格式导入HDFS
①默认情况下,导入的HDFS文件是不压缩的,可以通过属性--compress 和 --compression-codec设置;
$bin/sqoop import \--connect jdbc:mysql://hostname:3306/mydb \--username root \--password root \--table mytable \--num-mappers 1 \--target-dir /user/sqoop/ \--fields-terminated-by "\t" \--compress \--compression-codec org.apache.hadoop.io.compress.SnappyCodec


⑹把select查询结果导入HDFS
①把select查询结果导入HDFS,必须包含'$CONDITIONS'在where子句中;
$ bin/sqoop import \--connect jdbc:mysql://hostname:3306/mydb \--username root \--password root \--target-dir /user/hive/warehouse/mydb.db/mytable \--delete-target-dir \--num-mappers 1 \--fields-terminated-by "\t" \--query 'select id,account from my_user where id>=3 and $CONDITIONS'


⑺导入数据到Hive中
$ bin/sqoop import \--connect jdbc:mysql://hostname:3306/mydb \--username root \--password root \--table mytable \--num-mappers 1 \--hive-import \--hive-database mydb \--hive-table mytable \--fields-terminated-by "\t" \--delete-target-dir \--hive-overwrite 


⑻脚本的使用(以数据导入为例)
①导入数据到HDFS
export--connectjdbc:mysql://hostname:3306/mydb--usernameroot--passwordroot--tablemytable--num-mappers1--export-dir/user/hive/warehouse/mydb.db/mytable--input-fields-terminated-by"\t"


②执行脚本
$ bin/sqoop  --options-file xxx.opt


4、export
⑴从Hive或者HDFS导出数据到MySQL
$ bin/sqoop export \--connect jdbc:mysql://hostname:3306/mydb \--username root \--password root \--table mytable \--num-mappers 1 \--export-dir /user/hive/warehouse/mydb.db/mytable \--input-fields-terminated-by "\t"