Sqoop

Apache Sqoop is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases.

Sqoop是RDBMS和Hadoop之间的一个桥梁RDBMS<<==>>Hadoop

平时说的导入导出都是以Hadoop为基准,即

导入:RDBMS==>>Hadoop

导出:RDBMS<<==Hadoop

http://sqoop.apache.org/

Sqoop底层是通过MapReduce来实现的,而且只有map没有reduce,只负责数据的迁移

一、sqoop-1.4.6-cdh5.7.0部署

1)下载

下载地址:http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.7.0.tar.gz

2)解压

[hadoop@hadoop001 software]$ tar -zxvf sqoop-1.4.6-cdh5.7.0.tar.gz -C ~/app

3)配环境变量

[hadoop@hadoop001 ~]$ vi .bash_profile

export SQOOP_HOME=/home/hadoop/app/sqoop-1.4.6-cdh5.7.0

export PATH=$SQOOP_HOME/bin:$PATH

[hadoop@hadoop001 ~]$ source .bash_profile

[hadoop@hadoop001 ~]$ which sqoop

~/app/sqoop-1.4.6-cdh5.7.0/bin/sqoop

4)修改sqoop配置文件

[hadoop@hadoop001 ~]$ cd $SQOOP_HOME/conf

[hadoop@hadoop001 conf]$ cp sqoop-env-template.sh sqoop-env.sh

[hadoop@hadoop001 conf]$ vi sqoop-env.sh

export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.6.0

export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.6.0

export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0

5)copy  mysql驱动到$SQOOP_HOME/lib

6)查看帮助

[hadoop@hadoop001 bin]$ sqoop help

warning不用管,因为用不到,所以hbase、zookeeper等没有配

[hadoop@hadoop001 bin]$ sqoop version

[hadoop@hadoop001 bin]$ sqoop list-databases \

> --connect jdbc:mysql://localhost:3306 \

> --username root --password 123456

mysql中验证一下:

[hadoop@hadoop001 bin]$ sqoop list-tables \

> --connect jdbc:mysql://localhost:3306/ruozedata_basic03 \

> --username root --password 123456

查看mysql

二、常用命令

1.RDBMS==>HDFS导入   import

1)--connect      

Specify JDBC connect string  指定JDBC连接字符串

2)--username <username>

Set authentication username  设置身份验证的用户名

3)--password <password>

Set authentication password  设置身份验证密码

4)--append

Imports data in append mode  已追加的方式导入数据

5)--as-textfile

Imports data as plain text (default)  导入数据为纯文本(默认)

6)--columns <col,col,col...>

Columns to import from table  选择要从表导入的列

7)--delete-target-dir

Imports data in delete mode  先删除已有的数据,再导入

8)-e,--query <statment>

Import results of SQL 'statement'  导入SQL 'statement'的结果

9)-m,--num-mappers <n>

Use 'n' map tasks to import in parallel 使用n个映射任务并行导入

10)--mapreduce-job-name <name>

Set name for generated mapreduce job  为生成的mapreduce作业设置名称

11)--table <table-name>

Table to read

12)--target-dir <dir> 

HDFS plain table destination

13)--where <where clause>

WHERE clause to use during import

14)--fields-terminated-by  <char>

 Sets the field separator character  设置字段分隔符

15)--lines-terminated-by <char>

 Sets the end-of-line character  设置行尾字符

16)--input-fields-terminated-by <char>

Sets the input field separator  设置输入字段分隔符

 --input-lines-terminated-by <char>

 Sets the input end-of-line char 设置输入的行尾字符

17)--create-hive-table

Fail if the target hive table exists (一般不用)

18)--hive-import

Import tables into Hive  (Uses Hive's default delimiters if none are set.)  将表导入到Hive中(如果没有设置,则使用Hive的默认分隔符)

19)--hive-overwrite

Overwrite existing data in the Hive table

20)--hive-partition-key <partition-key>

Sets the partition key to use when importing to hive

设置在导入hive时使用的分区键

21)--hive-partition-value <partition-value>

Sets the partition value to use when importing to hive

设置在导入到hive时要使用的分区值

实战如下:

1)在mysql中新建一个数据库hivetomysql,并新建一张表emp

create database hivetomysql;

create table emp (

empno int,

ename varchar(100),

job varchar(100),

mgr int,

hiredate varchar(100),

salary double,

comm double,

deptno int);

2)将hive中ruozedata数据库下的ruozedata_emp导出至mysql的表emp中

sqoop export \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

--export-dir \hdfs://192.168.137.141:9000/user/hive/warehouse/ruozedata.db/ruozedata_emp \

--input-fields-terminated-by '\t';

若没有--input-fields-terminated-by '\t'这句,MapReduce会运行失败,报错如下:

MapReduce运行日志保存在$HADOOP_HOME/logs/user logs下,MapReduce报错时可查看相应任务的日志来找到错误

加上--input-fields-terminated-by '\t'这句之后,运行成功

3)将emp表格导入到hadoop

a)

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp;

再次报错,提示表格emp没有主键,需要给emp表格增加主键

mysql> ALTER TABLE emp

    -> ADD PRIMARY KEY (empno);

增加主键后再次执行命令,导入成功

默认的splits是4

[hadoop@hadoop001 ~]$ hadoop fs -ls emp

-rw-r--r-- 1 hadoop supergroup 0 2018-06-18 22:05 emp/_SUCCESS

-rw-r--r--  1 hadoop supergroup        297 2018-06-18 22:05 emp/part-m-00000

-rw-r--r--  1 hadoop supergroup        386 2018-06-18 22:05 emp/part-m-00001

-rw-r--r--  1 hadoop supergroup          0 2018-06-18 22:05 emp/part-m-00002

-rw-r--r--  1 hadoop supergroup        51 2018-06-18 22:05 emp/part-m-00003

果然是被拆分成了四个文件

这15条数据是怎么分配的呢?

##补充:hadoop fs -ls 和hadoop fs -ls /user/hadoop进的是同一目录

b)

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS;

(将split改为2,并把MapReduce的job名称命名为 FromMySQLToHDFS)

报错:ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://192.168.137.141:9000/user/hadoop/emp already exists

emp已经存在

需要加一个语句

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir;

导入成功,并且可以看到number of splits变成了2

打开yarn查看任务

c)

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir \

--columns "empno,ename,job,salary,comm" \

--target-dir EMP_COLUMN;

d)

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir \

--columns "empno,ename,job,salary,comm" \

--target-dir EMP_COLUMN_SPLIT \

--fields-terminated-by '\t' \

--null-string '' --null-non-string '0';

分隔符变为‘\t’(tab键),null变为空,非null字符串变为0

e)

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir \

--columns "empno,ename,job,salary,comm" \

--target-dir EMP_COLUMN_WHERE \

--fields-terminated-by '\t' \

--where 'salary>2000';

f)

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir \

--target-dir EMP_COLUMN_QUERY \

--fields-terminated-by '\t' \

--query 'SELECT * FROM emp WHERE empno>=7566';

报错:Cannot specify --query and --table together.

--query和 --table不可以同时出现,因为query语法里有可能是多表查询

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir \

--target-dir EMP_COLUMN_QUERY \

--fields-terminated-by '\t' \

--query 'SELECT * FROM emp WHERE empno>=7566';

报错:When importing query results in parallel, you must specify --split-by.

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir \

--target-dir EMP_COLUMN_QUERY \

--fields-terminated-by '\t' \

--query 'SELECT * FROM emp WHERE empno>=7566' \

--split-by 'empno';

继续报错: must contain '$CONDITIONS' in WHERE clause.

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

-m 2 \

--mapreduce-job-name FromMySQLToHDFS \

--delete-target-dir \

--target-dir EMP_COLUMN_QUERY \

--fields-terminated-by '\t' \

--query 'SELECT * FROM emp WHERE empno>=7566 AND $CONDITIONS' \

--split-by 'empno';

终于成功了

g)命令封装

上边的例子命令太长了,可否封装到一个脚本里呢?

[hadoop@hadoop001 ~]$ cd shell

[hadoop@hadoop001 shell]$ vi emp.opt

import

--connect

jdbc:mysql://localhost:3306/hivetomysql

--username

root

--password

123456

--table

emp

--delete-target-dir

[hadoop@hadoop001 shell]$ sqoop --options-file emp.opt

2.export                RDBMS<<==HDFS

现在mysql中新建一张表emp_demo,且只需要表结构

mysql> create table emp_demo as select * from emp where 1=2;

[hadoop@hadoop001 bin]$ sqoop export \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--mapreduce-job-name FromHDFSToMySQL \

--table emp_demo \

--export-dir /user/hadoop/emp

3.RDBMS==>Hive   

1)导入普通表

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

--mapreduce-job-name FromMySQLToHive \

--delete-target-dir \

--create-hive-table \                                         (直接自动创建一张表,不建议使用,问题见后续讲解)

--hive-database ruozedata \

--hive-table emp_sqoop \

--hive-import

.ClassNotFoundException: org.apache.hadoop.hive.shims.ShimLoader

可能会遇到上面两种报错的情况,原因是缺少jar包

解决方法:

[hadoop@hadoop001 conf]$ vi sqoop-env.sh

export HADOOP_CLASSPATH=/home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/*

再次运行,继续报错:

数据库不存在?!

解决办法:将$HIVE_HOME/conf下的hive-site.xml拷贝至$SQOOP/HOME/conf

再次运行,成功

为什么说不建议使用--create-hive-table命令呢?

可以看到自动创建的表格是根据mysql中数据的字段类型来确定hive表中的字段类型的,本表中salary和comm都带小数点,所以,hive表中,salary和comm的字段类型为double。

假如最开始导入的salary和comm的数据中没有小数点,都是整数,如:

sal和comm便被默认为int类型,往后再插入带小数点的数据就会出现问题,因此最好事先创建一个hive表,再进行sqoop导入数据到hive表

2)导入分区表

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

--mapreduce-job-name FromMySQLToHive \

--delete-target-dir \

--hive-database ruozedata \

--hive-table ruozedata_emp_partition \

--hive-import \

--hive-partition-key 'pt' \

--hive-partition-value '2018-08-08'

但是,查看表内容发现有问题:

应该是分隔符的问题

sqoop import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp \

--mapreduce-job-name FromMySQLToHive \

--delete-target-dir \

--hive-database ruozedata \

--hive-table ruozedata_emp_partition \

--hive-import \

--hive-partition-key 'pt' \

--hive-partition-value '2018-08-08' \

--fields-terminated-by '\t' \                                            (规定分隔符为\t)

--hive-overwrite                                                              (覆盖之前数据)


3.hive导出到mysql

现在mysql里创建一张表

mysql> create table emp_export as select * from emp where 1=2;

sqoop export \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp_export \

--export-dir \hdfs://192.168.137.141:9000/user/hive/warehouse/ruozedata.db/ruozedata_emp \

--input-fields-terminated-by '\t';

4.job

先创建一个job

sqoop job --create ruozejob \

-- import \

--connect jdbc:mysql://localhost:3306/hivetomysql \

--username root --password 123456 \

--table emp -m 2 \

--mapreduce-job-name FromHiveToMySQL \

--delete-target-dir;

[hadoop@hadoop001 conf]$ sqoop job --list

[hadoop@hadoop001 conf]$ sqoop job --exec ruozejob

需要输入密码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • 1/列出mysql数据库中的所有数据库sqoop list-databases -connect jdbc:mys...
    时待吾阅读 2,741评论 1 5
  • 上节课学习了Hadoop集群测试,这节课我们一起学习一下Sqoop,Sqoop是专门用来迁移数据的,它可以把数据库...
    文子轩阅读 6,941评论 1 9
  • Sqoop: SQL to Hadoop 场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据...
    CrUelAnGElPG阅读 328评论 0 0
  • 1/列出mysql数据库中的所有数据库sqoop list-databases -connect jdbc:mys...
    时待吾阅读 1,352评论 0 0
  • 轮回之境
    不与人知阅读 168评论 0 1