预备知识:启动 HBase
清单 1. 修改 hosts 文件
[root@node1:2 hbase-0.96.1.1-cdh5.0.1]# cat /etc/hosts
10.17.139.186 node1
10.17.139.185 scheduler2
...
向 HBase 导入数据
注意:本文代码基于 HBase0.94 版本。
数据导入到 HBase,我们必须考虑分布式环境下的数据合并问题,而数据合并问题一直是 HBase 的难题,因为数据合并需要频繁执行写操作任务,解决方案是我们可以通过生成 HBase 的内部数据文件,这样可以做到直接把数据文件加载到 HBase 数据库对应的数据表。这样的做法写入 HBase 的速度确实很快,但是如果合并过程中 HBase 的配置不是很正确,可能会造成写操作阻塞。目前我们常用的数据导入方法有 HBase Client 调用方式、MapReduce 任务方式、Bulk Load 工具方式、Sqoop 工具方式这四种。下面的文章内容会逐一展开讲解。
下面的几种方式都可以通过 HFile 的帮助做到快速数据导入,我们首先在这里先给出生成 HFile 的 Java 代码,后面各个方法内部再按照各自方式插入 HFile 文件到 HBase 数据库。代码如清单 4 所示。
Client API 方法
使用 HBase 的 API 中的 Put 方法是最直接的数据导入方式,如清单 3 我们就是采用 HBase 自带的 Shell 工具,调用 put 命令插入了几条数据作为演示。该方式的缺点是当需要将海量数据在规定时间内导入 HBase 中时,需要消耗较大的 CPU 和网络资源,所以这个方式适用于数据量较小的应用环境。
使用 Put 方法将数据插入 HBase 中的方式,由于所有的操作均是在一个单独的客户端执行,所以不会使用到 MapReduce 的 job 概念,即没有任务的概念,所有的操作都是逐条插入到数据库中的。大致的流程可以分解为 HBase Client--->HTable---->Hmastermanager/ZK(获取-root-,--meta--)------>HregionServer----->Hregion------>Hlog/Hmemstore----->HFile。即 HBase Client 调用 HTable 类访问到 HMaster 的原数据保存地点,然后通过找到相应的 Region Server,并分配具体的 Region,最后操作到 HFile 这一层级。当连接上 HRegionServer 后,首先获得锁,然后调用 HRegion 类对应的 put 命令开始执行数据导入操作,数据插入后还要写时间戳、写 Hlog,WAL(Write Ahead Log)、Hmemstore。具体实现代码如清单 5 所示,在代码中我们尝试插入了 10 万条数据,打印出插入过程消耗的时间。
领取专属 10元无门槛券
私享最新 技术干货