sqoop1和sqoop2是两个不同的版本,完全不兼容。
Sqoop2比Sqoop1的改进,引入sqoop server,集中化管理Connector等
多种访问方式:CLI,Web UI,REST API
引入基于角色的安全机制
本博主使用sqoop1,因为sqoop1相对而言稳定。
sqoop的配置和测试都是基于完全分布式集群,用的是Hadoop2.X版本,cdh5.3.6。
配置Sqoop 1.x
Sqoop安装目录下的conf目录,重命名sqoop-env-template.sh为sqoop-env.sh,配置环境变量:
export HADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6
export HADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6
export HIVE_HOME=/opt/modules/hive-0.13.1-cdh5.3.6
export ZOOCFGDIR=/opt/modules/zookeeper-3.4.5-cdh5.3.6
配置完sqoop即可使用sqoop help查看sqoop的帮助命令了
第一步:放置驱动包
将mysql数据库的jdbc驱动包复制到sqoop中的lib目录下
$ cp /opt/softwares/mysql-connector-java-5.1.27-bin.jar /opt/modules/sqoop-1.4.5-cdh5.3.6/lib/
第二步:测试Sqoop
开启hdfs、yarn和mysql
连接mysql,并list数据库中的databases
bin/sqoop list-databases \
–connect jdbc:mysql://master64:3306 \
–username root \
–password 123456
默认情况下导入数据到HDFS
bin/sqoop import \
–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users
1.创建目录
$ bin/hdfs dfs -mkdir -p /sqoop/in(可以去浏览器输入http://master64:50070/查看文件是否创建成功)
2.设置map个数为1,指定目录,并且如果已存在目标目录则先删除
[hadoop@master64 sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \
–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir
定义字段用制表符隔开
默认的情况下,导入到HDFS上的文件中每行数据的列与列之间的分隔符是【逗号】隔开,可以通过【–fields-terminated-by】属性指定分隔符,测试命令如下(需要注意 换行符“\” 需要统一 一个空格)
[hadoop@master64 sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \
–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir \
–fields-terminated-by “\t”
增量导入数据到HDFS文件中,可以通过下面三个参数进行设置:
–check-column
–incremental
–last-value
增量导入通常用在日志的导入,比如第一个小时导入日志,第二个小时就无需导入第一小时的日志,直接从某处开始
[hadoop@master64 sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \
–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir \
–fields-terminated-by “\t” \
–check-column id \ //字段是id
–incremental append \
–last-value 3000 //表示从第3000位开始
默认情况下,导入数据到HDFS文件存储格式为textfile,可以通过属性进行指定,比如文件存储格式为parquet
[hadoop@master64 sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \
–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir \
–fields-terminated-by “\t” \
–as-parquetfile
导出数据到RDBMS(关系型数据库管理系统)
在mysql下创建一张新的空表,空表格式与users表结构一样
执行sqoop export命令
bin/sqoop export \
–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users_sq \ //填空表名称
–export-dir /sqoop/in/part-m-00000