Hase到Hbase:Spark的错误用例?

时间:2016-06-02 14:07:29

标签: hadoop apache-spark hive hbase

我最近遇到了将数据从Hive迁移到Hbase的问题。 我们这个项目在cdh5.5.1集群上使用Spark(在SUSE Linux Enterprise上运行7个节点,48个核心,每个256 GB RAM,hadoop 2.6)。作为初学者,我认为使用Spark从Hive加载表数据是个好主意。我使用正确的Hive列/ Hbase ColumnFamily和列映射在HBase中插入数据。

我找到了一些关于如何将数据批量插入Hbase的解决方案,例如我们可以使用hbaseContext.bulkPutrdd.saveAsHadoopDataset(我测试了两种类似的结果)。

结果是一个功能程序,但是工作真的太慢了​​(比如10分钟/ GB,3 GB时减慢到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秒,具体取决于哪个regionserver。

1 个答案:

答案 0 :(得分:1)

由于put操作导致HBase数据加载缓慢的原因。 HBase中的正常放置操作包括,

  • 在WAL中输入(提前写日志)
  • mem store flushes
  • 以及将数据写入hdfs作为HFiles的所有方法。

如果你正在对HBase进行批量加载,那么你应该考虑通过HfileFormat2来实现它,它比普通的HBase put快得多。

我们遇到了同样的情况,尝试通过put将2 TB数据加载到HBase中,加载数据需要大约10小时,配置和调整HBase后,加载时间减少到7-8小时。

然后我们决定加载为HFileFormat,为了实现这个目的

  1. 首先了解您的数据,然后创建一个包含预拆分区域的表格
  2. 处理输入数据集并通过Spark / Map-Reduce Job将结果写入HFileFormat
  3. 最后使用hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles
  4. 将数据加载到HBase表中