Sqoop的基础用法

Sqoop

1. 简介

Sqoop是一种旨在在Hadoop与关系数据库或大型机之间传输数据的工具。您可以使用Sqoop从关系数据库管理系统(RDBMS)(例如MySQL或Oracle)或大型机将数据导入Hadoop分布式文件系统(HDFS),在Hadoop MapReduce中转换数据,然后将数据导出回RDBMS 。

Sqoop依靠数据库描述要导入的数据的模式来自动执行此过程的大部分过程。Sqoop使用MapReduce导入和导出数据,这提供了并行操作以及容错能力。

2. 安装

[root@qphone01 software]# tar -zxvf sqoop-1.4.6-cdh5.7.6.tar.gz -C /opt/apps/

[root@qphone01 sqoop-1.4.6-cdh5.7.6]# vi /etc/profile
export SQOOP_HOME=/opt/apps/sqoop-1.4.6-cdh5.7.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$HBASE_HOME/bin:$FLUME_HOME/bin:$SQOOP_HOME/bin

[root@qphone01 conf]# mv sqoop-env-template.sh sqoop-env.sh
[root@qphone01 conf]# vi sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/apps/hadoop-2.6.0-cdh5.7.6

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/apps/hadoop-2.6.0-cdh5.7.6

#set the path to where bin/hbase is available
export HBASE_HOME=/opt/apps/hbase-1.2.0-cdh5.7.6

#Set the path to where bin/hive is available
export HIVE_HOME=/opt/apps/hive-1.1.0-cdh5.7.6

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/opt/apps/zookeeper-3.4.5-cdh5.7.6/conf

将mysql的jdbc驱动拷贝到sqoop的lib目录下即可
[root@qphone01 conf]# cp /opt/apps/hive-1.1.0-cdh5.7.6/lib/mysql-connector-java-5.1.47-bin.jar ../lib/

[root@qphone01 sqoop-1.4.6-cdh5.7.6]# sqoop version

20/07/21 10:02:29 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.7.6
Sqoop 1.4.6-cdh5.7.6
git commit id
Compiled by jenkins on Tue Feb 21 15:04:07 PST 2017

3. 命令

帮助命令

-- 帮助命令 
[root@qphone01 ~]# sqoop help
Warning: /opt/apps/sqoop-1.4.6-cdh5.7.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /opt/apps/sqoop-1.4.6-cdh5.7.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
20/07/28 19:03:03 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.7.6
usage: sqoop COMMAND [ARGS]

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.

– 常用命令

-- 列出所有的数据库
sqoop list-databases \
--connect jdbc:mysql://qphone02:3306 \
--username root \
--password 123456 

--列出所有的表(需要指定库名)
sqoop list-tables \
--connect jdbc:mysql://qphone02:3306/hive \
--username root \
--password 123456

Sqoop导入

-1. 全量导入

–1. mysql–>hdfs

## 1. 创建密码文件
[root@qphone01 home]# touch password.txt
[root@qphone01 home]# echo -n "123456"  > /home/password.txt
[root@qphone01 home]# chmod 400 password.txt

## 2. sqoop导入
sqoop import \									--导入命令
--connect jdbc:mysql://qphone02:3306/user \		--确定从mysql中的那个库导入
--username root \								--用户
--password-file file:///home/password.txt \		--密码文件
--table emp \									--确定mysql的表
--target-dir /sqoop/emp \						--确定导入的hdfs上的路径
--fields-terminated-by '\t' \					--确定分隔符
--num-mappers 1 \								--mr的个数
--as-textfile									--文件类型

tip:
可能会导入一些jar包,这里缺少josn的jar包,将jasn的jar包导入到sqoop中的lib下

–2. mysql–>hive

理解
--个人理解
	其实mysql导入hive本质上是,先将数据导入到hdfs上,然后在从hdfs上移动到hive对应的文件中。(所以会有一种中情况,会直接将数据导入到hive所对应的目录下)
	
--官方文档
	Sqoop的导入工具的主要功能是将您的数据上传到HDFS中的文件中。如果您具有与HDFS群集关联的Hive元存储,Sqoop还可以通过生成并执行CREATE TABLE语句在Hive中定义数据的布局,将数据导入Hive。将数据导入Hive就像在Sqoop命令行中添加--hive-import选项一样简单。

	如果Hive表已经存在,则可以指定--hive-overwrite选项以指示必须替换hive中的现有表。将数据导入HDFS或省略此步骤后,Sqoop将生成一个Hive脚本,其中包含使用Hive的类型定义您的列的CREATE TABLE操作,以及一条LOAD DATA INPATH语句以将数据文件移动到Hive的仓库目录中。

	该脚本将通过在运行Sqoop的计算机上调用已配置的Hive副本来执行。如果您有多个Hive安装,或者$路径中没有hive,请使用--hive-home选项标识Hive安装目录。 Sqoop将在此处使用$ HIVE_HOME / bin / hive。
前提
--在导入之前需要先在hive中建立一个表,且与mysql的格式一样
CREATE TABLE `emp` (
`id` int,
`name` string,
`deg` string,
`salary` int,
`dept` string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
;
帮助
--途中可能会发生错误,需要导入一些jar包
[root@qphone01 conf]# cp /opt/apps/hive-1.1.0-cdh5.7.6/lib/hive-common-1.1.0-cdh5.7.6.jar /opt/apps/sqoop-1.4.6-cdh5.7.6/lib/
[root@qphone01 conf]# cp $HIVE_HOME/lib/hive-exec-1.1.0-cdh5.7.6.jar $SQOOP_HOME/lib
命令
## 一. 将mysql中emp表的数据导入到hive中的emp表
sqoop import \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--table emp \
--hive-import \
--hive-table default.emp \
--delete-target-dir \
--fields-terminated-by ',' \
--num-mappers 1 \
--as-textfile

--hive-import     	--导入到hive中
--hive-table		--导入到hive中所对应的表
--delete-target-dir	--最后会删除临时文件

## 二. 将mysql中emp、emp_add、emp_conn三个表的数据导入到hive中的emp_detail表中(多表一起导入)
sqoop import \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--query "SELECT e.id, e.name, e.deg, e.salary, e.dept, ea.city, ea.street, ea.hno, ec.phno, ec.email FROM emp e INNER JOIN emp_add ea ON e.id = ea.id INNER JOIN emp_conn ec ON e.id = ec.id and \$CONDITIONS" \
--hive-import \
--create-hive-table \
--hive-overwrite \
--hive-table default.emp_detail \
--delete-target-dir \
--target-dir '/user/root/emp_detail' \
--fields-terminated-by ',' \
--num-mappers 1 \
--as-textfile

--query 			--可以指定mysql中导入的数据,用来判断
--create-hive-table	--如果hive中没有该表就会创建他

2. 增量导入

–1. mysql–>hive

方法一:
sqoop import \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--table emp \
--hive-import \
--hive-table default.emp \
--delete-target-dir \
--where "id > 1205" \
--fields-terminated-by ',' \
--num-mappers 1 \
--as-textfile

--where    --用来判断,增量导入的部分
方法二:
##1. append模式
sqoop import \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--query "select id,name,deg,salary,dept from emp where id < 1207 and \$CONDITIONS" \
--target-dir '/user/root/warehouse/emp' \
--append \
--fields-terminated-by ',' \
--num-mappers 1 \
--split-by id \
--as-textfile

--append		--追加、
##这种实际上是将数据导入到hdfs上,只不过那个目录正好是hive中emp表的目录路径

##2. hive
sqoop import \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--query "select id,name,deg,salary,dept from emp where id > 1207 and \$CONDITIONS" \
--hive-table default.emp \
--delete-target-dir \
--target-dir '/user/root/emp' \
--hive-import \
--fields-terminated-by ',' \
--num-mappers 1 \
--split-by id \
--as-textfile

## 在query中判断符合条件的才会添加
方法四:正规的增量添加数据
sqoop import \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--table emp \
--hive-table default.emp \
--target-dir '/user/root/emp' \
--check-column id \
--incremental append \
--last-value 1208 \
--hive-import \
--fields-terminated-by ',' \
--num-mappers 1 \
--split-by id \
--as-textfile

--check-colum		--指定在确定要导入的行时要检查的列。
--incremental		--有两种类型一种是append一种是lastmodified。append是增加,lastmodified是根据
						时间戳
--last-value		--指定上一次导入的检查列的最大值。

Sqoop导出

-1. 全量导出

–1. hive–>mysql(在导出时必须在mysql中创建表)

sqoop export \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--export-dir /user/root/warehouse/emp \
--columns id,name,deg,salary,dept \
--input-fields-terminated-by ',' \
--table emp \
--num-mappers 1

--columns		--在mysql中的表中写入的哪几列

-2. 增量导出

–1. hive–>mysql

updateonly模式(更新)
sqoop export \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--export-dir /user/root/warehouse/emp \
--columns id,name,deg,salary,dept \
--input-fields-terminated-by ',' \
--update-key id \
--update-mode updateonly \
--table emp \
--num-mappers 1

--update-mode  --不写默认是updateonly会将mysql中数据进行更新成和hive一样
allowinsert模式(插入)
sqoop export \
--connect jdbc:mysql://qphone02:3306/user \
--username root \
--password-file file:///home/password.txt \
--export-dir /user/root/warehouse/emp \
--columns id,name,deg,salary,dept \
--input-fields-terminated-by ',' \
--update-key id \
--update-mode allowinsert \
--table emp \
--num-mappers 1

tip:除了这个语句之外,我们还需要将导出的数据库中的id作为主键被设置,否则又变成追加的全量导出了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值