数据导入HBase最常用的三种方式及实践分析
摘要:要使用Hadoop,需要将现有的各种类型的数据库或数据文件中的数据导入HBase。一般而言,有三种常见方式:使用HBaseAPI中的Put方法,使用HBase bulk load工具和使用定制的MapReduce Job方式。本文均有详细描述。
【编者按】要使用Hadoop,数据合并至关重要,HBase应用甚广。一般而言,需要 针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase 中。常见方式为:使用HBaseAPI中的Put方法; 使用HBase bulk load 工具;使用定制的MapReduce Job方式。《HBase Administration Cookbook》一书对这三种方式有着详尽描述,由 ImportNew 陈晨进行了编译,很有收获,推荐给大家。
HBase数据迁移(1-使用HBaseAPI中的Put方法 
使用HBaseAPI中的Put是最直接的方法,用法也很容易学习。但针对大部分情况,它并非都是最高效的方式。当需要将海量数据在规定时间内载入HBase中时,效率问题体现得尤为明显。待处理的数据量一般都是巨大的,这也许是为何我们选择了HBase而不是其他数据库的原
因。在项目开始之前,你就该思考如何将所有能够很好的将数据转移进HBase,否则之后可能面临严重的性能问题。
HBase有一个名为 bulk load的功能支持将海量数据高效地装载入HBase中。Bulk load是通过一个MapReduce Job来实现的,通过Job直接生成一个HBase的内部HFile格式文件来形成一个特殊的HBase数据表,然后直接将数据文件加载到运行的集中。使用bulk load功能最简单的方式就是使用importtsv 工具。importtsv 是从TSV文件直接加载内容至HBase的一个内置工具。它通过运行一个MapReduce Job,将数据从TSV文件中直接写入HBase的表或者写入一个HBase的自有格式数据文件。
尽管importtsv 工具在需要将文本数据导入HBase的时候十分有用,但是有一些情况,比如导入其他格式的数据,你会希望使用编程来生成数据,而MapReduce是处理海量数据最有效的方式。这可能也是HBase中加载海量数据唯一最可行的方法了。当然我们可以使用MapReduceHBase导入数据,但海量的数据集会使得MapReduce Job也变得很繁重。若处理不当,则可能使得MapReducejob运行时的吞吐量很小。
HBase中数据合并是一项频繁执行写操作任务,除非我们能够生成HBase的内部数据文件,
并且直接加载。这样尽管HBase的写入速度一直很快,但是若合并过程没有合适的配置,也有可能造成写操作时常被阻塞。写操作很重的任务可能引起的另一个问题就是将数据写入了相同的族服务器(region server),这种情况常出现在将海量数据导入到一个新建的HBase中。一旦数据集中在相同的服务器,整个集就变得不平衡,并且写速度会显著的降低。我们将会在本文中致力于解决这些问题。我们将从一个简单的任务开始,使用API中的Put方法将MySQL中的数据导入HBase。接着我们会描述如何使用 importtsv bulk loadTSV数据文件导入HBase并可查看.我们也会有一个MapReduce样例展示如何使用其他数据文件格式来导入数据。上述方式都包括将数据直接写入HBasehbase属于什么数据库中,以及在HDFS中直接写入HFile类型文件。本文中最后一节解释在向HBase导入数据之前如何构建好集。本文代码均是以Java编写,我们假设您具有基本Java知识,所以我们将略过如何编译与打包文中的Java示例代码,但我们会在示例源码中进行注释。
通过单个客户端导入MySQL数据
数据合并最常见的应用场景就是从已经存在的关系型数据库将数据导入到HBase中。对于此类型任务,最简单直接的方式就是从一个单独的客户端获取数据,然后通过HBaseAPIPut方法将数据存入HBase中。这种方式适合处理数据不是太多的情况。
本节描述的是使用Put方法将MySQL数据导入HBase中的方式。所有的操作均是在一个单独的客户端执行,并且不会使用到MapReduce。本节将会带领你通过HBase Shell创建HBase表格,通过Java来连接集,并将数据导入HBase
准备
公共数据集合是个练习HBase数据合并的很好数据源。互联网上有很多公共数据集合。我们在本文中奖使用美国国家海洋和大气管理局 1981-2010气候平均值的公共数据集合。访问aa.gov/pub/data/normals/1981-2010/下载。
这些气候报表数据是由美国国家海洋和大气管理局(NOAA)生成的。在本文中,我们使用在目录 products | hourly 下的小时温度数据(可以在上述链接页面中到)。下载文件。 
需要一个MySQL实例,在MySQL数据库中创建hly_temp_normal表格,使用如下的SQL命令:
[sql] view plaincopy
1. create table hly_temp_normal ( 
2. id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
3. stnid CHAR(11), 
4. month TINYINT, 
5. day TINYINT, 
6. value1 VARCHAR(5), 
7. value2 VARCHAR(5), 
8. value3 VARCHAR(5), 
9. value4 VARCHAR(5), 
10. value5 VARCHAR(5), 
11. value6 VARCHAR(5), 
12. value7 VARCHAR(5), 
13. value8 VARCHAR(5), 
14. value9 VARCHAR(5), 
15. value10 VARCHAR(5), 
16. value11 VARCHAR(5), 
17. value12 VARCHAR(5), 
18. value13 VARCHAR(5), 
19. value14 VARCHAR(5), 
20. value15 VARCHAR(5), 
21. value16 VARCHAR(5), 
22. value17 VARCHAR(5), 
23. value18 VARCHAR(5), 
24. value19 VARCHAR(5), 
25. value20 VARCHAR(5), 
26. value21 VARCHAR(5), 
27. value22 VARCHAR(5), 
28. value23 VARCHAR(5), 
29. value24 VARCHAR(5) 
30. ); 
本文提供了一些脚本将txt中的数据导入到MySQL表中。你可以使用 insert_hly.py 来加载每小时的NOAA数据。只需要修改脚本中的主机(host),用户(user),密码(password)以及数据名称(database name)。完成修改后就能够将下载的数据导
入到mysqlhly_temp_normal 表中,使用命令如下: 
$ python insert_hly.py - -t hly_temp_normal
译者注:此处给出python脚本下载地址(github/uprush/hac-book/blob/master/2-data-migration/script/insert_hly.py
译者注:由于对于python的了解有限以及环境限制,所以单独另写了一段Java的代码,可以直接使用的:
[java] view plaincopy
1. import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; 
2.     import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; 
3.     import java.sql.PreparedStatement; import java.sql.SQLException; import 
4.     java.util.ArrayList; import java.util.List; public class InsertHly { static 
5.     String user="root"static String pwd="root123"static String driver="sql.jdbc.Driver"
6.     static String url="jdbc:mysql://127.0.0.1:3306/htom?useUnicode=true&characterEncoding=UTF-8"
7.     public static void main(String[] args) throws SQLException { Connection 
8.     baseCon = null; String sqlStr="insert into hly_temp_normal (stnid,month,day,value1,value2,value3,value4,value5,value6,value7,value8,value9,value10,value11,value12,value13,value14,value15,value16,value17,value18,value19,value20,value21,value22,value23,value24) 
9.     values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; List parasValues=new 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。