您好,欢迎来到微智科技网。
搜索
您的当前位置:首页hadoop中的关系型数据库

hadoop中的关系型数据库

来源:微智科技网
Hadoop中的关系型数据库 (原创文档,转载请标明出处)

文档时间 各软件版本 Hadoop Hbase Sqoop 2.2.0 0.98.1 1.4.4 2014/6/30

前言 .................................................................................................................. 4 一. Hbase........................................................................................................... 5

1. Hbase的目的 ........................................................................................... 5 2. Hbase的表设计 ........................................................................................ 5

1> 行健(Row Key) ............................................................................. 5 2> 列族(Column-Family) .................................................................... 6 3> 存储单元(Cell) .............................................................................. 6 4> 时间戳(version) ............................................................................ 6 3. Hbase的表查询 ........................................................................................ 6

1> 单行查询(get) .............................................................................. 6 2> 多行查询(scan) ............................................................................ 7 4. Hbase的效率 ........................................................................................... 7 5. Hbase使用示例 ........................................................................................ 8

1> 需求分析 ......................................................................................... 8 2> 数据库设计 ...................................................................................... 8 3> 数据样例 ......................................................................................... 9 4> 查询代码样例 ................................................................................. 10

二. 以RDBMS为数据源 ..................................................................................... 11

1. 实现原理 ............................................................................................... 11 2. 编程接口 ............................................................................................... 11 3. 具体实现 ............................................................................................... 12

1> 建立连接 ....................................................................................... 12 2> 定义表对应的bean ......................................................................... 12 3> 读取数据 ....................................................................................... 13

4> 写入数据 ....................................................................................... 14 5> 完整代码示例 ................................................................................. 14 4. 注意事项 ............................................................................................... 15 三. Sqoop ........................................................................................................ 17

1. Sqoop的作用 ......................................................................................... 17 2. 数据库导入HDFS ................................................................................... 17

1> 命令行方式 .................................................................................... 17 2> 代码方式 ....................................................................................... 18 3. HDFS导入数据库 ................................................................................... 18

1> 命令行方式 .................................................................................... 18 2> 代码方式 ....................................................................................... 19 4. 数据库导入Hbase .................................................................................. 19

1> 命令行方式 .................................................................................... 19 2> 代码方式 ....................................................................................... 20 5. Hbase导入数据库 .................................................................................. 20

前言

MapReduce技术推出后,曾遭到关系数据库研究者的挑剔和批评,认为MapReduce不具备有类似于关系数据库中的结构化数据存储和处理能力。为此,Google和MapReduce社区进行了很多努力。

一方面,他们设计了类似于关系数据中结构化数据表的技术(Google的BigTable,Hadoop的HBase)提供一些粗粒度的结构化数据存储和处理能力。

另一方面,为了增强与关系数据库的集成能力,Hadoop MapReduce提供了相应的访问关系数据库库的编程接口。

另外,我们还可以通过Sqoop,在关系型数据库和HDFS或Hbase间转换数据。

一. Hbase

1. Hbase的目的

Hbase的设计类似于关系数据中结构化数据表的技术,它介于nosql和RDBMS之间,提供一些粗粒度的结构化数据存储和处理能力,主要用来存储非结构化和半结构化的松散数据。

2. Hbase的表设计

HBase以表的形式存储数据,表有行和列组成,列划分为若干个列族(column-family)。Hbase中的列族类似于RDBMS中的列(column),必须在数据插入前,即设计表结构时设计好。一行的每个列族中,均可容纳多个Cell,每一个Cell,都是一个K-V对。

一个Hbase表结构如下图所示: Table1 行 Row row key1 列族 column-family1 column-family2 Cell1(k1-v1),Cell2(k2-v2) Cell3(k3-v3),Cell4(k4-v4) … … … … 其中,Cell是一个虚拟的概念,我们在使用中,通过row key+ column-family+key,在确定获取唯一的值(value)。

1> 行健(Row Key)

row key是用来检索记录的主键,用于访问hbase table中的行,row key是hbase中唯一可以用来创建索引的地方,row key可以是任意字符串。

2> 列族(Column-Family)

hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。

3> 存储单元(Cell)

Cell是一个逻辑上的存储单元,由{row key, column, version} 唯一确定。cell中的数据是没有类型的,是一个K-V对,全部是字节码形式存贮。

4> 时间戳(version)

HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳可以由hbase在数据写入时自动赋值(通常缺省如此做),此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。用户在通过行健、列族和列键查询数据时也不需要指定具体的时间戳,而有系统返回最近时间戳的数据。

在日常的使用当中,我们在大多数情况下实际上是忽略Hbase中时间戳的存在的。

3. Hbase的表查询

Hbase的表查询分为两种:单行数据的get查询;多行数据的scan查询。

1> 单行查询(get)

单行查询适用于获取已确定知道row key的单行数据(可指定具体的列族,也可不指定),注意,类似于RDBMS中一行只有一条数据,Hbase中的一行数据中有多个Cell(K-V对)。

示例代码:

2> 多行查询(scan)

多行查询类似于RDBMS中的单表或多表多条件联合查询,适用于跨行多条件的复杂查询。

Scan查询,目前支持在行健上的范围查询,以及可以在列族、cell中的键和值上分别添加多种形式的过滤器,来达到和RDBMS类似的复杂条件查询效果。Hbase目前提供了多种过滤器,能够满足绝大多数的查询需求。

示例代码:

4. Hbase的效率

Hbase是一个基于HDFS文件系统的数据库,存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起,将极大提升Hbase的查询效率。

注意:

字典序对int排序的结果是

1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。

警告:

Hbase适用于随机读取,但不适用于频繁的全表扫描和大量IO读取,大范围频繁的数据读取容易造成节点当机,大范围数据读取请考虑使用HDFS。

5. Hbase使用示例

1> 需求分析

如上图所示,我们需要按照地域、开始时间和结束时间三个条件,查询出所需数据。

2> 数据库设计

存储单元设计:按照查询条件,地域信息的最小查询单位是村(10位行政编码),时间信息的最小单位是天,所以我们把 村-每天 对应的统计信息值作为一个存储单元(cell)存储。

行健设计:由于同一地域范围内,地域编码都有同一的前缀,所以我们把统一行政编码作为行健,统一为十位,不足十位的后面补零(例如郑州市为:4101000000)。查询时,当需要查询某一地域范围下数据时,只要查询按0补足和按9补足的范围数据即可(例如查询郑州市范围内的数据,只需要查询4101000000~4101999999),如此即可同时满足查询和存储时的位置相关性需求,提升形成。

列族设计:所有数据使用一个列族,该列族在逻辑上木有实际意义。

列键设计:把时间转化为long型数据做为列键,具有和行健相同的效果,查询时只要使用过滤器指定一个时间范围即可。

列值设计:列值上存储具体的统计数据。 数据库设计如下图所示: Row key 统一行政编码 Column-Family Default key 时间(long) value 统计值 3> 数据样例

4> 查询代码样例

二. 以RDBMS为数据源

1. 实现原理

为了增强与关系数据库的集成能力,Hadoop MapReduce提供了访问关系数据库的编程接口。

MapReduce与RDBMS交互的整体架构如下图所示:

从图中我们可以看到,datanode节点不再连接默认的HDFS,而是改为通过JDBC连接传统的RDBMS。也就是在MapReduce中,把关系型数据库做为默认的输入输出设备,而不再是HDFS。

2. 编程接口

具体到MapReduce框架读/写数据库,有2个主要的程序分别是 DBInputFormat和DBOutputFormat,DBInputFormat 对应的是SQL语句select,而DBOutputFormat 对应的是 Inster/update,使用DBInputFormat和DBOutputForma时候需要实现InputFormat这个抽象类,这个抽象类含有getSplits()和createRecordReader()抽象方

法,在DBInputFormat类中由 protected String getCountQuery() 方法传入结果集的个数,getSplits()方法再确定输入的切分原则,利用SQL中的 LIMIT 和 OFFSET 进行切分获得数据集的范围 ,请参考DBInputFormat源码中public InputSplit[]

getSplits(JobConf job, int chunks) throws IOException的方法,在DBInputFormat源码中createRecordReader()则可以按一定格式读取相应数据。

3. 具体实现 1> 建立连接

DBConfiguration类提供数据库配置和创建连接的接口,通过DBConfiguration的静态工厂方法configureDB,来建立数据库的连接。

DBConfiguration.configureDB(

Configuration conf,String driverClass,String url,String userName,String Password) 其中,conf 为当前执行的作业的配置文件,driverClasss为数据库厂商提供的访问其数据库的驱动程序,dbUrl为运行数据库的主机的地址,userName和password分别为数据库提供访问地用户名和相应的访问密码。

2> 定义表对应的bean

Hdoop中自定义的bean,必须要继承Writable接口,并实现write(DataOutput out)和readFields(DataInput in)方法,来让hadoop帮助你序列化这个bean。

同时,为了和数据库交互,还必须要继承DBWritable接口,并实现write(PreparedStatement statement)和readFields(ResultSet resultSet)。

最后还需要实现toString来完成bean的string转化。 示例代码如下:

3> 读取数据

Hadoop框架提供了一个DBInputFormat类,做为从关系型数据库获取数据的接口,DBInputFormat类提供setInput方法来设置要读取的数据库。

setInput(Job job, Class inputClass,

String tableName,String conditions, String orderBy, String... fieldNames)

其中,job为当前准备执行的作业,inputClass为表对应的bean,tableName为表名,conditions为筛选条件(eg. '(updated > 20070101 AND length > 0)'),orderBy为排序规则,fieldNames为要获取的列名。

数据读取示例代码:

4> 写入数据

Hadoop框架提供了一个DBOutputFormat类,做为向关系型数据库写入数据的接口,DBOutputFormat类提供setOutput方法来设置要写入的数据库。

setOutput(Job job, String tableName, String... fieldNames)

其中,job为当前准备执行的作业, tableName为表名, fieldNames为要写入的列名。

数据写入示例代码:

5> 完整代码示例

连接及查询和写入设置:

在map中读取数据

在reduce中写入数据

4. 注意事项

虽然Hadoop允许从数据库中直接读取数据记录作为MapReduce的输入,但处理效率较低,而且大量频繁地从MapReduce程序中查询和读取关系数据库可能会大大增加数据库的访问负载,因此DBInputFormat和DBOutputFormat仅适合操作小量数据记录的计算和应用,不适合数据仓库联机数据分析大量数据的读取处理。

实际上,我们不建议在MapReduce中对任意数据库做大量的操作,效率均不太好,包括Hbase。和MapReduce交互最直接的还是原生的HDFS。

三. Sqoop

1. Sqoop的作用

Sqoop是一个转换工具,用于在关系型数据库与HDFS或Hbase之间进行数据转换。

Sqoop提供的面向java的api,允许我们在代码或MapReduce中调用Sqoop交互数据。

2. 数据库导入HDFS 1> 命令行方式

sqoop import

--connect url //数据库连接地址 --username user //用户名 --password pass //密码 --table name //表名称

--fields-terminated-by '\' //文件中字段间的分隔符 -m number //复制过程使用map作业数量 示例:

sqoop import --connect jdbc:mysql://192.168.0.230/hadoop --username **** --password **** --table student --fields-terminated-by '\' -m 1

文件导出后在hdfs的存储路径为:/user/用户名/表名/part-m-00000

2> 代码方式

3. HDFS导入数据库 1> 命令行方式

sqoop export

--connect url //数据库连接地址 --username user //用户名 --password pass //密码 --table name //表名称 --export-dir url //hdfs文件路径

--fields-terminated-by '\' //文件中字段间的分隔符 示例:

sqoop export --connect jdbc:mysql://192.168.0.230/hadoop --username **** --password **** --table student –-export-dir /user/apple/student/part-m-00000 --fields-terminated-by '\'

2> 代码方式

4. 数据库导入Hbase 1> 命令行方式

sqoop import

--connect url //数据库连接地址 --username user //用户名 --password pass //密码 --table name //表名称

--hbase-table name //hbase表名 --hbase-create-table //表不存在就创建 --column-family family //列族名

--hbase-row-key col //指定那一列做为行健 示例:

sqoop import --connect jdbc:mysql://192.168.0.230/hadoop --username root --password root --table student --hbase-table student --hbase-create-table --column-family default --hbase-row-key id

注意:sqoop会把表中每一列的数据导入到一个Cell中,key为列名,value为列值

示例

关系表中的数据:

导入Hbase后的数据:

2> 代码方式

5. Hbase导入数据库

关于将Hbase的数据导入到mysql里,sqoop并不是直接支持的,一般采用如下3种方法:

将Hbase数据,扁平化成HDFS文件,然后再由sqoop导入。 第二种,将Hbase数据导入Hive表中,然后再导入mysql。

第三种直接使用Hbase的Java API读取表数据,直接向mysql导入,不需要使用sqoop。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务