文章目录
1.sqoop是什么?
封装的一个框架:指定输入和输出
Sqoop其实就是一个mr jar包,底层实现就是mr
==> Sqoop : SQL to Hadoop
SQL: RDBMS
Hadoop: HDFS/Hive/HBase
导入:RDBMS ==> Hadoop
导出:Hadoop ==> RDBMS
2.sqoop架构
分为
Sqoop1.x 用这个
Sqoop2.x
1的架构就是用户通过sqoop在hadoop上建立map的作业,沟通rdbms和hdfs/hbase/hive
问:为什么Sqoop1.x中不需要ReduceTask,仅仅MapTask就ok了?
答:没做计算,仅是把数据传输
3.sqoop的安装
1)下载 cdh http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.7.0.tar.gz
2)解压到~/app下 tar -xzvf sqoop-1.4.6-cdh5.7.0.tar.gz -C ~/app/
3)配置SQOOP_HOME
vi ~/.bash_profile
export SQOOP_HOME=/home/hadoop/app/sqoop-1.4.6-cdh5.7.0
export PATH=$SQOOP_HOME/bin:$PATH
source ~/.bash_profile
4)配置conf: $SQOOP_HOME/conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
5)其他
导入mysql的驱动还有java-json.jar到sqoop的lib里面
4.sqoop基本操作
1).查看有哪些指令
sqoop help
sqoop help import
2).查看mysql可用databases ,\换行
sqoop list-databases \
--connect jdbc:mysql://localhost:3306 \
--username root \
--password 123456
3).看mysql表
sqoop list-tables \
--connect jdbc:mysql://localhost:3306/ruoze_d5 \
--username root \
--password 123456
5.mysql 导入 hdfs
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \ sqoop数据库
--username root \
--password 123456 \
--table emp \ emp表
--mapreduce-job-name FromMySQLToHDFS \ 作业的名称,网页端可查看,这里如不指定,默认emp.jar
-m 1 \ 表示只有1个输出文件,文件不被切分存放
--delete-target-dir \ 目标目录如果存在则删之,如不设置,目标目录已存在会报错
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \ 导哪些列
--target-dir EMP_COLUMN_WHERE \ 指定文件存放路径,默认会在/user/hadoop/emp,这里是/user/hadoop/EMP_COLUMN_WHERE
--fields-terminated-by '\t' \ 分割符指定,默认逗号
--null-non-string '0' \ 如果值是null,不是string类型的可以用0表示
--null-string '' \ null,string类型,用啥表示
--where 'SAL>2000'
这两个相等
hadoop fs -ls
hadoop fs -ls /user/hadoop
如果想写完整sql语法
注意,用select语句时,不能写table,因为假如select里有join两张表,那么就有问题
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password 123456 \
--mapreduce-job-name FromMySQLToHDFS \
-m 1 \
--delete-target-dir \
--target-dir EMP_COLUMN_QUERY \
--fields-terminated-by '\t' \
--null-non-string '0' \
--null-string '' \ 这个\后面多敲了个空格报错
-e "select * from emp where empno>7900 and \$CONDITIONS" 完整sql写法,注意
这里如果用双引号conditions前要加\,单引号不用
如果mysql表没有主键会报错,解决办法是:
在命令里加入 : --split-by 某字段
切分或者-m 1
也就是文件不被拆分。
6.用文件方式执行sqoop
需以以下格式 vi emp.opt
import
--connect
jdbc:mysql://localhost:3306/sqoop
--username
root
--password
123456
--table
emp
--delete-target-dir
执行
sqoop --options-file emp.opt
7.hdfs导出到mysql
导入到emp_d5表里,要先保证mysql有此表,先创建emp_d5
sqoop export \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password 123456 \
--table emp_d5 \ 导入到哪
--export-dir emp \ 从哪导出,等同于user/hadoop/emp
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \
--input-fields-terminated-by '\t'
注意在hdfs里不会存储表的字段,也就是hdfs的emp表无法识别这些columns字段,这个columns是给mysql里的emp_d5识别的。所以emp表的第一列导入到emp_d5的empno,第二列给ename,如此按列导出。
truncate table xxx
删除表所有数据
8.rdbms导入到hive
环境搭建,还需导入包
[hadoop@hadoop000 lib]$ cp hive-common-1.1.0-cdh5.7.0.jar $SQOOP_HOME/lib/
[hadoop@hadoop000 lib]$ cp hive-shims-* /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/lib/
首先先创建hive表,不然数据虽然进入了hdfs,但是不存在于hive,mysql里也没存储元数据。
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password 123456 \
--table emp \
--delete-target-dir \
--hive-import \ 导入到hive
--hive-table d5_emp_test_p \ 导到这张表
--fields-terminated-by '\t' \
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \
--hive-overwrite \
--hive-partition-key 'pt' \ 分区字段
--hive-partition-value 'ruoze' 分区名字
9.hive导入到rdbms
sqoop export
--connect jdbc:mysql://localhost:3306/sqoop
--username root
--password 123456
--table sqoop_test
--export-dir /user/hive/external/sqoop_test
--input-fields-terminated-by
注意
--fields-terminated-by
:争对输出文件格式,import,输出hdfs的分割符
--input-fields-terminated-by
:争对输入文件格式,export,hdfs的文件分割符
10.sqoop job
相当于先写好个sqoop的程序,要用的时候执行
sqoop job --create ruoze_job -- \
import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password 123456 \
--table emp \
--delete-target-dir \
--target-dir EMP_JOB
执行
sqoop job --exec create ruoze_job
sqoop执行避免输入密码配置
vi sqoop-site.xml
<property>
<name>
sqoop.metastore.client.record.password
</name>
<value>true</value>
<description>If true, allow saved passwords in the metastore. </description></property>