sqoop

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值