我最近遇到了一个关于将数据从 Hive 迁移到 Hbase 的问题。 我们项目在 cdh5.5.1 集群上使用 Spark(7 个节点在 SUSE Linux Enterprise 上运行,具有 48 个内核,每个 256 GB RAM,hadoop 2.6)。作为初学者,我认为使用 Spark 从 Hive 加载表数据是个好主意。我正在使用正确的 Hive 列/Hbase ColumnFamily 和列映射在 HBase 中插入数据。
我找到了一些关于如何将数据批量插入 Hbase 的解决方案,例如我们可以使用 hbaseContext.bulkPut
或 rdd.saveAsHadoopDataset
(我测试了两者的结果相似) .
结果是一个功能正常的程序,但工作真的太慢了(比如 10 分钟/GB,3GB 减慢到 1 小时),而且我的 regionServers 内存/堆大小使用太多(它们可能会崩溃,取决于我设置的配置)。
在一次又一次地修改regionServers和Hbase配置后,我尝试使用简单的Hive方式,即使用hbase存储处理程序创建一个外部表作为hbase的入口点,并加载
INSERT OVERWRITE TABLE entry_point
SELECT named_struct('rk_field1', rk_field1, 'rk_field2', rk_field2)
, field1
, field2
FROM hive_table
非常顺利,在 10 分钟内在 hbase 中插入了 22GB 的数据。 我的问题是,为什么那样会好很多?是配置问题吗?为什么它会成为 Spark 如此糟糕的用例?
编辑:即使使用最后一种技术,它仍然很慢(插入 150 GB 需要 2 小时)。我可以通过 cloudera 管理器看到的唯一问题是 GC 时间,平均为 8 秒,但有时会增加到 20 秒,具体取决于哪个区域服务器。
最佳答案
HBase数据加载慢的原因是因为put操作。 HBase 中的正常 put 操作包括,
- WAL(Write Ahead Log)中的条目
- 内存存储刷新
- 一直到将数据作为 HFile 写入 hdfs。
如果您正在对 HBase 执行批量加载,那么您应该考虑通过 HfileFormat2 执行此操作,与常规 HBase put 相比它要快得多。
我们遇到了同样的情况,试图通过 put 将 2 TB 的数据加载到 HBase,加载数据大约需要 10 个小时,在配置和调整 HBase 之后,加载时间减少到 7-8 个小时。
然后我们决定加载为 HFileFormat,以实现此目的
- 首先了解您的数据,然后创建一个包含预拆分区域的表
- 通过Spark/Map-Reduce Job处理输入数据集并将结果写入HFileFormat
- 最后使用 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles 将数据加载到 HBase 表中
关于hadoop - hive 到 Hbase : wrong use case for Spark?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37594261/