sqoop

sqoop导入 hdfs:

sqoop import --connect jdbc:mysql://s201/mydb1 --username sqoop --password sqoop --table emp --m 1

sqoop导入 hive:

sqoop import --connect jdbc:mysql://s201/mydb1 --username sqoop --password sqoop --table emp2 --hive-import --m 1

sqoop导出 hive:

sqoop export --connect  jdbc:mysql://s201:3306/ip  --username sqoop --password sqoop --table up --export-dir '/user/hive/warehouse/mydb1.db/upflow' --input-fields-terminated-by ','

增量导入

sqoop import \
--connect jdbc:mysql://s201/mydb1 \
--username sqoop \
--password sqoop \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1205

增量导出

sqoop export \
--connect jdbc:mysql://s201/mydb1 \
--username sqoop \
--password sqoop \
--table emp \
--export-dir /user/hadoop/emp/

//如果报datanode找不到文件就是因为没有权限,执行下面的命令
//第一个hive为用户第二个hive为密码

create database if not exists database1;
grant all privileges on database1.* to 'hive'@'%' identified by 'hive';
grant all privileges on database1.* to 'hive'@'localhost' identified by 'hive';
grant all privileges on database1.* to 'hive'@'s201' identified by 'hive';
flush privileges;
use hive_metadata;

如果用sqoop导出hive中显示的是没有分隔符的数据 后面可以加上 --input-fields-terminated-by '\001'
ps:\001 是默认的分隔符。

Sqoop中文手册

sqoop数据导入导出应用案例

1 sqoop导入数据

将RDBMS中的一个表数据导入到hdfs。表中的每一行被视为hdfs的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)。

1.1 语法

下面的命令用于将数据导入到hdfs上。
$sqoop import (generic-args) (import-args)

1.2 测试数据

在MySQL有一个userdb的数据库,其中有一张usertable表,该表结构如下:

id name age
2 tom 15
3 toms 25
4 tomslee 17
5 bob 16
1.3 导入表中数据到HDFS

下面的命令用于从mysql数据库服务器中的usertable表导入数据到hdfs。

sqoop import \
–connect jdbc:mysql://mysqlhost:3306/userdb \
–username root \
–password root \
–table usertable \
–m 1
1
2
3
4
5
6
1
2
3
4
5
6
上面的命令中–connect指的是连接地址,这里面是mysql服务器的地址;–table usertable是MySQL数据库的数据表;–m 1是指定MapReduce的数量。

如果执行成功,会显示如下输出:

14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar

O mapreduce.Job: map 0% reduce 0%
14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%

14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully


14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec)
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
上述的过程由于没有指定hdfs的保存位置,所以系统会分配一个默认的地址,该地址根据当前的用户名和表名生成的。
为了验证在hdfs导入的数据,使用下面的命令可以查看:
Hadoop fs -cat /user/hadoop/userdb/part-m-00000
默认情况下hdfs上面的数据字段之间用逗号(,)分割。
这里写图片描述

1.4 导入到hive表中

sqoop import \
–connect jdbc:mysql://mysqlhost:3306/userdb \
–username root \
–password root \
–table usertable \
–hive-import \
–m 1;
1
2
3
4
5
6
7
1
2
3
4
5
6
7
调用上述命令之前不用先建立Hive数据表,由于没有指定hive的数据库,所以系统会在hive的default数据库下面建立一张usertable数据表。
数据传输过程:

1 从MySQL到hdfs上(通过MapReduce)
2 从hdfs迁移到hive中
hive> select * from usertable;
OK
2 tom 15
3 toms 25
4 tomslee 17
5 bob 16
Time taken: 0.191 seconds, Fetched: 4 row(s)
hive> dfs -cat /user/hive/warehouse/usertable/part-m-00000;
2tom15
3toms25
4tomslee17
5bob16
hive>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
通过查看hdfs上的数据可知hive中的字段之间默认是用’\001’进行分割的,所以字段之间看起来紧挨着。

1.5 导入到hdfs指定的目录上

在导入表数据到hdfs使用sqoop工具,我们可以指定目标目录。
以下是指定目标目录选项的sqoop导入命令到的语法。
–target-dir
下面的命令是用来导入MySQL数据库的user数据表到hdfs的/user/test目录。

sqoop import \
–connect jdbc:mysql://mysqlhost:3306/userdb \
–username root \
–password root \
–target-dir /uer/test \
–table usertable \
–m 1;
1
2
3
4
5
6
7
1
2
3
4
5
6
7
注意:指定的hdfs的目录不能存在,因为sqoop会将这个目录作为MapReduce的输出目录。
导入到hdfs上的输出数据格式如下:

2,tom,15
3,toms,25
4,tomslee,17
5,bob,16
1
2
3
4
5
1
2
3
4
5
1.6 导入表数据子集

我们可以导入表的”where”子句的一个子集通过sqoop工具。它执行在各自的数据库服务器相应的sql查询中,并将结果储存在hdfs的目标目录上。
where子句的语法如下:
–where
下面的命令用来 导入usertable表的数据子集。子集查询用户的姓名和年龄。

sqoop import \
–connect jdbc:mysql://mysqlhost:3306/userdb \
–username root \
–password root \
–table usertable \
–where “name=’tom’ and age=15” \
–target-dir /user/test \
–m 1;
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
注意:指定的hdfs的目录不能存在,因为sqoop会将这个目录作为MapReduce的输出目录。
导入到hdfs上的输出数据格式如下:

2,tom,15
1
1
1.7 增量导入数据

增量导入是仅导入新添加的表中的行的技术。
它需要添加’incremental’,’check-column’,’last-value’选项来执行增量导入。
下面的语法用于sqoop导入命令 增量的选项。

–incremental
–check_column
–last-value
1
2
3
1
2
3
下面命令用于在user表执行增量导入。

sqoop import \
–connect jdbc:mysql://mysqlhost:3306/userdb \
–username root \
–password root \
–table usertable \
–incremental append \
–check-column id \
–last-value 2 \
–target-dir /user/test \
–m 1;
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
注意:这里面指定的hdfs路径不但可以存在而且在该目录下还可以有文件存在。

2 sqoop数据导出

将数据从hdfs导出到RDBMS数据库。
导出前,目标表必须存在于目标数据库中。

默认操作是从将文件中的数据使用insert语句插入到mysql数据表中。
更新模式下,是生成update语句更新表数据。
2.1 语法

以下是export命令的语法。
sqoop export (generic-args) (export-args)

2.2 案例一

将hdfs中的数据导出到MySQL的usertable表中。

sqoop export \
–connect jdbc:mysql://mysqlhost:3306/userdb \
–username root \
–password root \
–table usertable \
-export-dir /user/hive/warehouse/usertable \
–input-fields-terminated-by ‘\001’
–m 1;
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
上述命令中的input-fields-terminated-by ‘\001’指的是输入的字段之间的分隔符,在hive中的默认分隔符为’\001’。

验证:在MySQL中输入select * from usertable;

3 sqoop数据导入导出命令详解

3.1 sqoop import导入数据命令参数详解

输入sqoop import –help命令可以查看所有导入命令的参数详解:

常用命令:
–connect JDBC连接字符串
–connection-manager 连接管理者
–driver 驱动类
–hadoop-home

指定$HADOOP_HOME路径
-P 从命令行输入密码(这样可以保证数据库密码的安全性)
–password 密码
–username 用户名
–verbose 打印信息

Import control arguments:
–append 添加到hdfs中已经存在的dataset上
直接使用该参数就可向一个已经存在的目录追加内容了
–as-avrodatafile 导入数据作为avrodata
–as-sequencefile 导入数据作为SequenceFiles
–as-textfile 默认导入数据为文本
–boundary-query Set boundary query for retrieving max
and min value of the primary key
–columns

展开阅读全文

没有更多推荐了,返回首页