1.1.0 sqoop 语法和常用命令
2.1.0 sqoop 典型用法
3.1.0 sqoop 的一个小案例
4.1.0 sqoop 的分区表导入导出
=======================================
1.1.0 sqoop 语法和常用命令
hive导入参数
--hive-home 重写$HIVE_HOME
--hive-import 插入数据到hive当中,使用hive的默认分隔符
--hive-overwrite 重写插入
--create-hive-table 建表,如果表已经存在,该操作会报错!
--hive-table [table] 设置到hive当中的表名
--hive-drop-import-delims 导入到hive时删除 \n, \r, and \01
--hive-delims-replacement 导入到hive时用自定义的字符替换掉 \n, \r, and \01
--hive-partition-key hive分区的key
--hive-partition-value hive分区的值
--map-column-hive 类型匹配,sql类型对应到hive类型
1.1.1 前期准备:
如果sqoop要连接mysql 或者 oracle 需要下载 相应的jdbc
放到 $SQOOP_HOME/lib/ 下 ,如果是CDH 那么放在
/opt/cloudera/parcels/CDH-5.4.10-1.cdh5.4.10.p0.16/lib/sqoop/lib 下
mysql-connector-java-5.1.27-bin.jar
ojdbc6.jar
如果要采用压缩,那么需要在hdfs编译的时候加上native ,否则无法采用压缩。
例子:mvn clean package -Pdist,native -DskipTests -Dtar
1.1.2 list 功能
列出SQL中的所有库
sqoop list-databases --connect jdbc:mysql://192.168.100.100:3306/ -username root -password 123456
连接SQL 并列出库中的表
sqoop list-tables --connect jdbc:mysql://192.168.100.100:3306/oozie --username root --password 123456
sqoop list-tables --connect jdbc:mysql://192.168.100.100:3306/test --username root --password 123456
sqoop list-tables --connect jdbc:oracle:thin:@192.168.4.11:1521:dg1 --username wxk --password wxk
1.1.3 导入 mysql –> hdfs [表如果没有主键,这样会报错,需要特殊指定]
直接导入:
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password password \
--table emp
默认splits = 4 ,通过 -m 1 来指定maptask数量,也就是指定结果集分片的数量。
导入放在哪里了呢?默认放在 /user/用户名 下
[root@hadoop002 lib]# hadoop fs -ls /user/root
Found 1 items
drwxr-xr-x - root supergroup 0 2017-09-23 10:05 /user/root/emp
一些参数解释:
–query 和 –table –where 不能同时使用,必须要加 $CONDITIONS,如果 query 后面是”” 那么要写 \$CONDITIONS 转义字符。
最好把要抽取的列直接写入sql中,这样能避免报错。
-m 指定分片,也是指定maptask数量
–delete-target-dir 覆盖,自动先删再导
–mapreduce-job-name 指定mr作业的名字
–columns “A,B” 导出指定的列
–target-dir EMP_COLUMN 导出到指定的路径 这里 EMP_COLUMN 其实也是表名的意思
–where “sal > 2000” 条件语句,按条件导出
例子1:
将 emp 的部分列 sal > 2000 的数据 从mysql的sqoop的库中 导入到 hdfs 上,存放在 /user/root/EMP_COLUMN 路径,
指定mapreduce的作业名为emp-all ,如果已经存在,那么先删除再导入。
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password password \
--table emp \
-m 1 \
--delete-target-dir \
--mapreduce-job-name emp-all \
--columns "empno,ename,job,mgr,sal,deptno" \
--target-dir EMP_COLUMN \
--where "sal > 2000"
例子2:
通过 sql 将数据从 mysql 的sqoop库中导入到hdfs上,存放在/user/root/EMP_COLUMN 路径,
指定mapreduce的作业名为emp-all ,如果已经存在,那么先删除再导入,
将输出文件设置为 parquet 或者 sequencefile 格式。
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password password \
-m 1 \
--delete-target-dir \
--mapreduce-job-name emp-all \
--columns "empno,ename,job,mgr,sal,deptno" \
--target-dir EMP_COLUMN \
--query 'select empno,ename,job,mgr,sal,deptno from emp where sal>2000 and $CONDITIONS'
--as-parquetfile 或者 --as-sequencefile
[root@hadoop002 ~]# hadoop fs -ls /user/root/EMP_COLUMN/
Found 3 items
drwxr-xr-x - root supergroup 0 2017-09-24 04:24 /user/root/EMP_COLUMN/.metadata
drwxr-xr-x - root supergroup 0 2017-09-24 04:24 /user/root/EMP_COLUMN/.signals
-rw-r--r-- 1 root supergroup 1714 2017-09-24 04:24 /user/root/EMP_COLUMN/d2ce0a72-51e2-4125-accc-deb449c2ac3a.parquet
[root@hadoop002 ~]# hadoop fs -ls /user/root/EMP_COLUMN/
Found 2 items
-rw-r--r-- 1 root supergroup 0 2017-09-24 04:26 /user/root/EMP_COLUMN/_SUCCESS
-rw-r--r-- 1 root supergroup 587 2017-09-24 04:26 /user/root/EMP_COLUMN/part-m-00000
例子3:
将导入文件进行压缩 –compression-codec codec为hadoop的压缩模式,-z 为默认gzip
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password password \
-m 1 \
--delete-target-dir \
--mapreduce-job-name emp-all \
--columns "empno,ename,job,mgr,sal,deptno" \
--target-dir EMP_COLUMN \
--query 'select empno,ename,job,mgr,sal,deptno from emp where sal>2000 and $CONDITIONS' \
-z
如果用其他格式的压缩,需要配合hdfs上压缩格式使用。
--compression-codec snappy 163k
不用压缩 210k
如何查看能用的压缩格式?
[root@hadoop002 native]# hadoop checknative -a
17/09/26 04:04:31 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
17/09/