hadoop - hive 到 Hbase : wrong use case for Spark?

标签 hadoop apache-spark hive hbase

我最近遇到了一个关于将数据从 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.bulkPutrdd.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,以实现此目的

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

关于hadoop - hive 到 Hbase : wrong use case for Spark?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37594261/

相关文章:

shell - 如何在 OOZIE 中使用正则表达式?

apache - 如何在centos 7上使用Ambari监视hadoop集群

scala - 如何在 Spark 中找到分组数据的确切中位数

scala - Spark独立模式: How to compress spark output written to HDFS

java - 使用 MapReduce 作业的 HBase 批量删除

python - 类型错误 : 'JavaPackage' object is not callable

hadoop - 在单个实例中将 pig 输出存储到 Hive 表中

sql - 正则表达式和配置单元

java - ClassNotFoundException : org. apache.hive.jdbc.HiveDriver

python - Hadoop Streaming Job 在 python 中失败