Sqoop是Apache顶级项目,主要用来在Hadoop和关系数据库中传递数据。通过sqoop,可以方便的将数据从关系数据库导入到HDFS,或将数据从HDFS导出到关系数据库。


关于Sqoop

官网
Sqoop架构整合了Hive、Hbase和Oozie,通过map-reduce任务来传输数据,从而提供并发特性和容错。
Sqoop主要通过JDBC和关系数据库进行交互。理论上支持JDBC的database都可以使用sqoop和hdfs进行数据交互。但只有一小部分经过sqoop官方测试,如:HSQLDB(1.8.0+),MySQL(5.0+),Oracle(10.2.0+),PostgreSQL(8.3+ );
MySQL和PostgreSQL支持direct;较老的版本有可能也被支持,但未经过测试。出于性能考虑,sqoop提供不同于JDBC的快速存取数据的机制,可以通过–direct使用。

Sqoop与MySQL数据交换

版本:sqoop-1.4.5-cdh5.4.0
sqoop-1.4.5-cdh5.4.0官方文档
数据导入示例

mysql drive导入sqoop

cp /tmp/mysql-connector-java-5.1.36-bin.jar /opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/sqoop/lib
cp /opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/sqoop/lib/mysql-connector-java-5.1.36-bin.jar /opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/hadoop/lib/
备注:官方文档是要导入到sqoop2目录,但copy到sqoop2目录无效,sqoop目录生效

MySQL表导入HDFS然后导入Hive

  • 切换到hdfs用户执行:su hdfs
  • 将MySQL数据库geocodingdb的MatchingAddress表导入HDFS用户目录

    1
    2
    3
    4
    5
    6
    sqoop import --connect jdbc:mysql://192.168.1.161:3306/geocodingdb \
    --driver com.mysql.jdbc.Driver \
    --username geocodingdb --password geocodingdb \
    --table MatchingAddress \
    --fields-terminated-by '\t' --lines-terminated-by '\n' --optionally-enclosed-by '\"'
    --direct
  • 附加--direct参数快速完成MySQL数据导入/导出操作
    与selects和inserts操作相比,MySQL Direct Connector可以用mysqldump and mysqlimport工具对MySQL数据进行更快的导入和导出操作

  • hive新建表结构并导入数据

    1
    2
    3
    4
    5
    6
    DROP TABLE IF EXISTS geocodingdb.MatchingAddress;
     
    create external table geocodingdb.MatchingAddress (source_address_id string,source_address string ,head_splitted_address string,splitted_skeleton_addressnode string,skeleton_addressnode string,skeleton_addressnode_type string,tail_address string,tail_splitted_address string)
    row format delimited fields terminated by '\t' stored as textfile;
     
    load data inpath '/user/hdfs/MatchingAddress/*' into table geocodingdb.MatchingAddress;

MySQL表直接导入Hive

  • MySQL表授权

    1
    2
    GRANT ALL PRIVILEGES ON *.* TO 'geocodingdb'@'%' IDENTIFIED BY 'geocodingdb' with grant option;
    FLUSH PRIVILEGES;
  • hive-import命令
    注意导入MySQL表结构字段顺序需与Hive表结构字段顺序一致

    1
    2
    3
    4
    5
    6
    sqoop import --connect jdbc:mysql://192.168.1.161:3306/geocodingdb \
    --driver com.mysql.jdbc.Driver \
    --username geocodingdb --password geocodingdb \
    --table MatchingAddress \
    --fields-terminated-by '\t' --lines-terminated-by '\n' --optionally-enclosed-by '\"' \
    --direct

Hive表导出到MySQL

1
2
3
4
5
6
sqoop export --direct --connect jdbc:mysql://192.168.1.161:3306/geocodingdb --driver com.mysql.jdbc.Driver \
--username geocodingdb --password geocodingdb \
--table MatchedAddressGroupbySkeleton \
--export-dir /user/hive/warehouse/geocodingdb.db/matchedaddressgroupbyskeleton \
--input-fields-terminated-by "\t" \
--input-null-string "\\\\N" --input-null-non-string "\\\\N"

Sqoop(MySQL)常用命令

指定列

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
–columns “employee_id,first_name,last_name,job_title”

使用8个线程

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
-m 8

快速模式

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
–direct

使用sequencefile作为存储方式

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
–class-name com.foocorp.Employee –as-sequencefile

分隔符

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
–fields-terminated-by ‘\t’ –lines-terminated-by ‘\n’ \
–optionally-enclosed-by ‘\”‘

导入到hive

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
–hive-import

条件过滤

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
–where “start_date > ‘2010-01-01’”

用dept_id作为分个字段

sqoop import –connect jdbc:mysql://db.foo.com/corp –table EMPLOYEES \
–split-by dept_id

追加导入

sqoop import –connect jdbc:mysql://db.foo.com/somedb –table sometable \
–where “id > 100000” –target-dir /incremental_dataset –append

问题记录

sqoop export –direct导出mysqlimport错误

错误描述:Cannot run program “mysqlimport”: error=2, No such file or directory
解决办法:附加--driver com.mysql.jdbc.Driver参数

sqoop export –direct导出mapreduce程序错误

错误描述1:Caused by: java.lang.RuntimeException: Can’t parse input data: ‘长浜 STR 18119 B316D057CE523018E0430A23A2C13018’
解决办法:附加--input-fields-terminated-by "\t"参数

错误描述2:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ‘1614’ for key ‘PRIMARY’
解决办法:附加--input-null-string "\\\\N" --input-null-non-string "\\\\N"如果遇到空值就插入null

Sqoop 导入 Hive 导致发生 Null Pointer Exception (NPE)

解决办法:首先通过 Sqoop 将数据导入 HDFS,然后将其从 HDFS 导入 Hive。

MySQL导入Hive表报错

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘쀀’ )’ at line 1
解决:hive表编码问题;导入时不附加–hcatalog-table,手动新建表,然后导入数据

Sqoop导入MySQL大表内存溢出问题

SqoopUserGuide
抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来

参考:http://www.hadooptechs.com/sqoop/handling-database-fetch-size-in-sqoop

修改yarn的nodemanager xmx还是sqoop 的xmx

分页查询写入

1
2
3
4
5
6
sqoop import --connect jdbc:mysql://192.168.1.161:3306/geocodingdb --username geocodingdb --password geocodingdb \
--query 'select * from MatchingAddress WHERE $CONDITIONS limit 0,100000' \
--split-by guid \
--fields-terminated-by '\t' --lines-terminated-by '\n' --optionally-enclosed-by '\"' \
--target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
--append
1
2
3
4
5
6
sqoop import --connect jdbc:mysql://192.168.1.161:3306/geocodingdb --username geocodingdb --password geocodingdb \
--query 'select * from MatchingAddress WHERE $CONDITIONS' \
--split-by guid \
--fields-terminated-by '\t' --lines-terminated-by '\n' --optionally-enclosed-by '\"' \
--target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
--append

sqoop import –connect jdbc:mysql://192.168.1.161:3306/geocodingdb?user=geocodingdb&password=geocodingdb&dontTrackOpenResources=true&defaultFetchSize=10000&useCursorFetch=true –query ‘select * from MatchingAddress WHERE $CONDITIONS’ –split-by guid \
–fields-terminated-by ‘\t’ –lines-terminated-by ‘\n’ –optionally-enclosed-by ‘\”‘ \
–target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
–append

sqoop import –connect jdbc:mysql://192.168.1.161:3306/geocodingdb \
–driver com.mysql.jdbc.Driver \
–username geocodingdb –password geocodingdb \
–direct \
–table MatchingAddress1 \
–fields-terminated-by ‘\t’ –lines-terminated-by ‘\n’ –optionally-enclosed-by ‘\”‘ \
–target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
–append

sqoop import –connect jdbc:mysql://192.168.1.161:3306/geocodingdb \
–driver com.mysql.jdbc.Driver \
–username geocodingdb –password geocodingdb \
–direct \
–table MatchingAddress2 \
–fields-terminated-by ‘\t’ –lines-terminated-by ‘\n’ –optionally-enclosed-by ‘\”‘ \
–target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
–append

sqoop import –connect jdbc:mysql://192.168.1.161:3306/geocodingdb \
–driver com.mysql.jdbc.Driver \
–username geocodingdb –password geocodingdb \
–direct \
–table MatchingAddress3 \
–fields-terminated-by ‘\t’ –lines-terminated-by ‘\n’ –optionally-enclosed-by ‘\”‘ \
–target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
–append

sqoop import –connect jdbc:mysql://192.168.1.161:3306/geocodingdb \
–driver com.mysql.jdbc.Driver \
–username geocodingdb –password geocodingdb \
–direct \
–table MatchingAddress4 \
–fields-terminated-by ‘\t’ –lines-terminated-by ‘\n’ –optionally-enclosed-by ‘\”‘ \
–target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
–append

sqoop import –connect jdbc:mysql://192.168.1.161:3306/geocodingdb \
–driver com.mysql.jdbc.Driver \
–username geocodingdb –password geocodingdb \
–direct \
–table MatchingAddress5 \
–fields-terminated-by ‘\t’ –lines-terminated-by ‘\n’ –optionally-enclosed-by ‘\”‘ \
–target-dir /user/hive/warehouse/geocodingdb.db/matchingaddress \
–append

Stack trace: ExitCodeException exitCode=255:

Sqoop使用笔记(转载)的更多相关文章

  1. jQuery官方基础教程笔记(转载)

    本文转载于阮一峰的博文,内容基础,结构清晰,是jquery入门不可多得的资料,非常好,赞一个. 阮一峰:jQuery官方基础教程笔记 jQuery是目前使用最广泛的javascript函数库. 据统计 ...

  2. js学习笔记—转载(闭包问题)

    ---恢复内容开始--- 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.     一.变量的作用域 要理解闭包,首先必须理解Javascrip ...

  3. swing读书笔记转载

    (swing读书笔记)Swing Look And Feel(1) http://blog.csdn.net/cszhao1980/article/details/7343524 (swing读书笔记 ...

  4. MySQL全文检索笔记 转载

    1. MySQL 4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型 CREATE TABLE articles ( id ...

  5. Flume+Sqoop+Azkaban笔记

    大纲(辅助系统) 离线辅助系统 数据接入 Flume介绍 Flume组件 Flume实战案例 任务调度 调度器基础 市面上调度工具 Oozie的使用 Oozie的流程定义详解 数据导出 sqoop基础 ...

  6. sqoop 使用笔记

    好久没有更新自己技术博客,现在开始工作了,把自己遇到的问题写到这里边来 主要把自己的问题写出来,分享给大家 sqoop 导入数据时候 有时候会遇到mysql 中有sql 中的关键字 这时候如果直接导出 ...

  7. 【大数据】Sqoop学习笔记

    第1章 Sqoop简介 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MyS ...

  8. sqoop学习笔记

    #################################################################################################### ...

  9. 软件架构自学笔记-- 转载“虎牙在全球 DNS 秒级生效上的实践”

    虎牙在全球 DNS 秒级生效上的实践 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下 5 各部分: 背景介绍: 方案设计和对比: 高可用: 具体实践和落地: ...

随机推荐

  1. Home Assistant系列美化篇——替换天气 UI

    替换天气组件 weather 的默认 UI,生成美观大方的气象卡片. Home Assistant 原生的天气平台不少,国内用户常用的有雅虎天气和 Darksky.其他论坛和社区也有分享自制的和风.彩 ...

  2. rails应用使用carrierwave和mini_magick上传用户头像

    1. 在Gemfile添加 gem 'carrierwave' gem 'mini_magick' 执行 bundle install 2. 生成uploader rails generate upl ...

  3. java 递归打印20个斐波那契数

    class Test { public static void main(String[] args) { // feibo j=new feibo(); for (int n = 1; n < ...

  4. Java基础之static关键字的用法

    Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例.        静态(static)可以是: 变量 ...

  5. bos开发日记一

    BOS项目 第1天 项目12天安排: 1-2天:项目概述.搭建开发环境.主页设计.持久层和表现层设计 3-6天:项目业务开发(取派员.区域.分区.定区.业务受理)---整个项目分为基础设置.取派.中转 ...

  6. BZOJ4247_挂饰_KEY

    题目传送门 背包的变形,不得不说卡了我很久(估计是下午睡傻了). 设f[i][j]为前i个物品剩下j个挂钩. f[i][j]=max(f[i-1][j],f[i-1][max(j-a[i].x,0)+ ...

  7. ajax跨域请求php

    在众多站群中,不同功能的系统使用独立的一个域名,各系统之间存在相互调用的关系.使用js的XMLHttpRequest调用其他域名提示跨域权限不足.有些可能认为都同属于同一个顶级域名或者说域名一模一样怎 ...

  8. hive和关系型数据库

    1)hive和关系型数据库存储文件的系统不同.  hive使用hdfs(hadoop的分布式文件系统),关系型数据库则是服务器本地的文件系统: 2)hive使用的计算模型是mapreduce,而关系型 ...

  9. c的多态

    使用函数数组,实现多态 参考my_strtoll10

  10. Git笔记——01

    Git - 幕布 Git   教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b00 ...