使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟
使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟
Sqoop 大数据 Hive HBase ETL
基础环境
sqoop:sqoop-1.4.5+cdh5.3.6+78,hive:hive-0.13.1+cdh5.3.6+397,hbase:hbase-0.98.6+cdh5.3.6+115
Sqool和Hive、HBase简介
Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的开源工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Hive
不想用程序语言开发MapReduce的朋友比如DB们,熟悉SQL的朋友可以使用Hive开离线的进行数据处理与分析工作。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
注意Hive现在适合在离线下进行数据的操作,就是说不适合在挂在真实的生产环境中进行实时的在线查询或操作,因为一个字“慢”。
Hive起源于FaceBook,在Hadoop中扮演数据仓库的角色。建立在Hadoop集群的最顶层,对存储在Hadoop群上的数据提供类SQL的接口进行操作。你可以用 HiveQL进行select、join,等等操作。
如果你有数据仓库的需求并且你擅长写SQL并且不想写MapReduce jobs就可以用Hive代替。
Hive的内置数据类型可以分为两大类:(1)、基础数据类型;(2)、复杂数据类型。其中,基础数据类型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。
下面的表格列出这些基础类型所占的字节以及从什么版本开始支持这些类型。
| 数据类型 | 所占字节 | 开始支持版本 |
|---|---|---|
| TINYINT | 1byte: -128 ~ 127 | |
| SMALLINT | 2byte:-32,768 ~ 32,767 | |
| INT | 4byte:-2,147,483,648 ~ 2,147,483,647 | |
| BIGINT | 8byte:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
| BOOLEAN | ||
| FLOAT | 4byte单精度 | |
| DOUBLE | 8byte双精度 | |
| STRING | ||
| BINARY | 从Hive0.8.0开始支持 | |
| TIMESTAMP | 从Hive0.8.0开始支持 | |
| DECIMAL | 从Hive0.11.0开始支持 | |
| CHAR | 从Hive0.13.0开始支持 | |
| VARCHAR | 从Hive0.12.0开始支持 | |
| DATE | 从Hive0.12.0开始支持 |
复杂类型包括ARRAY、MAP、STRUCT、UNION,这些复杂类型是由基础类型组成的。
HBase
HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随即读写操作,HBase正是为此而出现。HBase以Google BigTable为蓝本,以键值对的形式存储。项目的目标就是快速在主机内数十亿行数据中定位所需的数据并访问它。
HBase是一个数据库,一个NoSql的数据库,像其他数据库一样提供随即读写功能,Hadoop不能满足实时需要,HBase正可以满足。如果你需要实时访问一些数据,就把它存入HBase。
你可以用Hive作为静态数据仓库,HBase作为数据存储,放那些进行一些会改变的数据。在Hive中,普通表是存储在HDFS中,而你可以通过创建EXTERNAL TABLE外表来指定数据存储位置,可以是系统目录,也可以是ElasticSearch,还可以是HBase。
在使用Sqoop从Mysql导出数据入Hadoop时,就需要考虑是直接入Hive(此时是普通表),还是导入数据到HBase,Sqoop同时支持导入这两种导入。
测试Sqoop
#测试MySQL连接[hdfs@node196 bin]$ sqoop list-databases --connect jdbc:mysql://192.168.180.11/angel --username anqi –P#检验SQL语句[hdfs@node196 bin]$ sqoop eval --connect jdbc:mysql://192.168.180.11/angel --username anqi --password anqi_mima \--query "SELECT xi.*, jing.name,wang.latitude,wang.longitude \FROM xi ,jing, wang \WHERE xi.id=jing.foreignId AND wang.id=xi.id AND xi.date>='2015-09-01' AND xi.date<='2015-10-01'"
以上Sqoop语句执行过后,可以确认Sqoop运行正常,Sqoop连接MySQL正常。
使用Sqoop从MySQL导入数据到Hive
使用复杂SQL
#从MySQL导入数据到Hive[hdfs@node196 bin]$ sqoop eval --connect jdbc:mysql://192.168.180.11/angel --username anqi --password anqi_mima \--query "SELECT xi.*, jing.name,wang.latitude,wang.longitude \FROM xi ,jing, wang \WHERE xi.id=jing.foreignId AND wang.id=xi.id AND xi.date>='2015-09-01' AND xi.date<='2015-10-01' \AND \$CONDITIONS" \--split-by date --hive-import -m \--target-dir /user/hive/warehouse/anqi_wang \--hive-table anqi_wang
注意:
由于使用Sqoop从MySQL导入数据到Hive需要指定target-dir,因此导入的是普通表而不能为外部表。
以下简要列举了Sqoop的执行过程:
BoundingValsQuery: SELECT MIN(date), MAX(date) FROM (SELECT xi.*, jing.name,wang.latitude,wang.longitude FROM xi ,jing, wang WHERE xi.id=jing.foreignId AND wang.id=xi.id AND xi.date>='2015-09-01' AND xi.date<='2015-10-01' AND ( = ) ) AS t1// :: INFO mapreduce.JobSubmitter: number of splits:// :: INFO mapreduce.Job: map % reduce %// :: INFO mapreduce.Job: map % reduce %// :: INFO mapreduce.Job: map % reduce %// :: INFO mapreduce.Job: map % reduce %// :: INFO mapreduce.Job: map % reduce %// :: INFO mapreduce.Job: map % reduce %
可以看出,--split-by设置后,job按设置值切分,切分个数为-m设置值(-m 5 不设置的话默认job切分数是4)。经检验,此种较复杂的SQL语句,Sqoop支持得很好。
调整Hive数据类型
上面任务执行成功后,经过检测,发现Hive表结构中的数据类型与MySQL对应列有如下关系:
MySQL(bigint) --> Hive(bigint)MySQL(tinyint) --> Hive(tinyint)MySQL(int) --> Hive(int)MySQL(double) --> Hive(double)MySQL(bit) --> Hive(boolean)MySQL(varchar) --> Hive(string)MySQL(decimal) --> Hive(double)MySQL(date/timestamp) --> Hive(string)
可以看出MySQL的decimal类型变成了Hive中的double类型。此时需要在导入时通过--map-column-hive 作出映射关系指定,如下所示:
[hdfs@node196 bin]$ sqoop import \--connect jdbc:mysql://192.168.184.12/angel --username anqi --password anqi_mima \--query "SELECT * FROM xi WHERE date>='2015-09-16' AND date<='2015-10-01' \AND \$CONDITIONS" \--split-by date --hive-import -m \--map-column-hive cost="DECIMAL",date="DATE" \--target-dir /user/hive/warehouse/xi \--hive-table xi
以上命令可以执行成功,然而Hive列类型设置为DECIMAL时,从Mysql[decimal(12,2)]-->Hive[decimal]会导致导入后小数丢失。
注意:
对于cost="DECIMAL(10,2)"这样指定精确度的映射语句的执行,在Sqoop1.4.5中执行失败。这是Sqoop1.4.5的一个BUG,详情见:https://issues.apache.org/jira/browse/SQOOP-2103,它在1.4.7版本中修复。
不断更新
将上面Sqoop语句执行两次,在执行第二次时会出现错误:
ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://node190:8020/user/hive/warehouse/anqi_wang already exists
这表示HDFS中已经存在相应存储,此时需要执行Sqoop-Hive的增量导入语句。
注意:
由于Hive没有rowkey,其hdfs存储决定了Sqoop-Hive只能添加,update更新导入无法进行。
使用Sqoop从MySQL导入数据到HBase
使用复杂SQL
#从MySQL导入数据到HBase[hdfs@node196 bin]$ sqoop import \--connect jdbc:mysql://192.168.184.12/angel --username anqi --password anqi_mima \--query "SELECT * FROM xi WHERE 1=1 \AND \$CONDITIONS" \--hbase-table hxi --hbase-create-table \--hbase-row-key id --split-by date -m \--column-family aitanjupt
上面SQL语句较简单。经检验,更复杂的SQL语句,Sqoop支持得很好,导入正常。
不断更新
以上指定了HBase的Rowkey后,再次执行从MySQL导入数据到HBase的Sqoop语句,基于相同的Rowkey值,HBase内相应的行会进行更新替换。
Hive使用HBase数据
CREATE EXTERNAL TABLE default.angel(id BIGINT,username STRING,password STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, angel:username, angel:password")TBLPROPERTIES("hbase.table.name" = "hxi");
关于Hive使用存储在HBase中的数据,更多详细信息可以查看《使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作》一文。
关于Sqoop2
架构上,Sqoop1使用MapOnly作业进行Hadoop(HDFS/HBase/Hive)同关系数据库进行数据的导入导出,用户使用命令行方式与之交互,数据传输和数据格式紧密耦合;易用性欠佳,Connector数据格式支持有限,安全性不好,对Connector的限制过死。Sqoop2则建立了集中化的服务,负责管理完整的MapReduce作业,提供多种用户交互方式(CLI/WebUI/RESTAPI),具有权限管理机制,具有规范化的Connector,使得它更加易用,更加安全,更加专注。
综上所述
使用Sqoop从MySQL导入数据到HBase要比导入到Hive方便,使用Hive对HBase数据操作时,也无decimal精度相关BUG,并且可以很好的支持更新。因此建议使用Sqoop从MySQL导入数据到HBase,而非直接Hive。
经过测试,使用Sqoop从MySQL导入数据到HBase,100万条需花费7~12分钟。impala对于hbase的查询效率也没有对hdfs效率高。
本文会不定期更新,若有不对之处请前往原文出处:http://www.cnblogs.com/wgp13x/ 进行指正。
其他感受
在大数据领域浸染的多了,才知道当前社会上的公司对于大数据方向的技术都是什么样的理解。有的公司数据量足够大,但数据并无价值或者价值不够大,我们称之为LU(large but unavailable)类型公司;有的公司数据量不多,但都价值连城,我们称之为SV(small but valuable)类型公司;有的公司数据量很大,数据也都很有价值,我们称之为LV(large and valuable)类型公司。
LU公司市场上有很多,造成数据无价值的因素可能是有数据本身的原因,也有产品的原因,他们也经常想要在当前环境下试下大数据的水,这便要细心甄别。SV公司也有不少,对于他们而言,好的数据分析师比大数据平台更重要,欲要试水大数据,还是要对数据量有清晰的预估。LV公司是最需要搭建大数据平台的,但又往往他们没有技术与欲望去做这件事,这也比较可恨。
简而言之,想做的不一定需要,不做的不一定不需要。
使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟的更多相关文章
- 教程 | 使用Sqoop从MySQL导入数据到Hive和HBase
基础环境 sqoop:sqoop-1.4.5+cdh5.3.6+78, hive:hive-0.13.1+cdh5.3.6+397, hbase:hbase-0.98.6+cdh5.3.6+115 S ...
- 使用sqoop从mysql导入数据到hive
目录 前言 一.使用的导入命令 二.遇到的问题及解决 1. 用文本字段进行分区的问题 2. Hadoop历史服务器Hadoop JobHistory没开启的问题 3. 连接元数据存储数据库报错 4 ...
- sqoop从mysql导数据到hive报错:Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
背景 使用sqoop从mysql导数据到hive,从本地服务器是可以访问mysql的(本地服务器是hadoop集群的一个datanode),但是sqoop导数据的时候依然连接不上mysql 报错如下: ...
- mysql导入数据到oracle中
mysql导入数据到oracle中. 建立Oracle表: CREATE TABLE "GG_USER" ( "USERID" BYTE) NOT NULL, ...
- mysql导入数据load data infile用法
mysql导入数据load data infile用法 基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ...
- MYSQL导入数据出现The MySQL server is running with the --secure-file-priv
MYSQL导入数据出现The MySQL server is running with the --secure-file-priv option so it cannot execute this ...
- MySQL导入数据遇到Error Number: 1467 Failed to read auto-increment value from storage engine错误
MySQL导入数据遇到Error Number: 1467 Failed to read auto-increment value from storage engine错误 创建表的语句 CREAT ...
- 三十三、MySQL 导入数据
MySQL 导入数据 本章节我们为大家介绍几种简单的 MySQL 导出的数据的命令. 1.mysql 命令导入 使用 mysql 命令导入语法格式为: mysql -u用户名 -p密码 < 要导 ...
- 安装配置elasticsearch、安装elasticsearch-analysis-ik插件、mysql导入数据到elasticsearch、安装yii2-elasticsearch及使用
一.安装elasticsearch 获取elasticsearch的rpm:wget https://download.elastic.co/elasticsearch/release/org/ela ...
随机推荐
- 【原创】Kafka topic常见命令解析
本文着重介绍几个常用的topic命令行命令,包括listTopic,createTopic,deleteTopic和describeTopic等.由于alterTopic并不是很常用,本文中就不涉及了 ...
- QT5.1 调用https
以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...
- Jar mismatch错误的解决
新建了一个项目,包含了两个库:appcompat_v7和swipelistview,结果出现了Jar mismatch错误: [2016-04-11 17:17:27 - MySwipeListVie ...
- Scalaz(56)- scalaz-stream: fs2-安全运算,fs2 resource safety
fs2在处理异常及资源使用安全方面也有比较大的改善.fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常.在纯代码里隐式引发异常或者在运算中引发异常,举例如下: /函数 ...
- 使用block进行界面之间的反向传值
目标:在两个独立的控制器的界面之间进行反向传值 关键技术:block 代码编写及运行环境:Xcode6.4 / 模拟器8.4 语言:Objective-C 注:使用纯代码实现,不使用xib/story ...
- 《Ext JS模板与组件基本框架图----组件》
本节主要从七个方面讲解组件,组件时什么,它的作用,它的构架,以及怎么创建和周期还有常见的配置项,属性方法和事件以及其层级是什么都进行整理,希望对大家有帮助. 组件的基础知识.png 2 Abstrac ...
- spring面试题(2)
f-sp-1. Spring的aop你怎样实现? 用动态代理和cglib实现,有接口的用动态代理,无接口的用cglib f-sp-2. Spring在SSH起什么作用 整合作用 f-sp-3. Spr ...
- Ant_build.xml的最完整解释
Ant的概念Make命令是一个项目管理工具,而Ant所实现功能与此类似.像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷.最初Ant开发者在开发跨平台 ...
- JS字符串反序输出
function IsReverse(text){ return text.split('').reverse().join(''); } IsReverse("你是我的小丫小苹果" ...
- kmdjs指令大全
调试 通过下面方式,可以输出kmdjs声称的类: <script src="../dist/kmd.js?debug" data-main="js/main&quo ...