关于scala:巨大的插入到HBase

Huge insert to HBase

尝试将数据插入HBase时出现问题。

我有1200万行的Spark DataFrame,其中包含2个字段:

1
2
* KEY, a md5 hash
* MATCH, a boolean ("1" or"0")

我需要将其存储在HBase表中,KEY是行键,MATCH是列。

我创建了一个带有行键拆分表的表:

1
2
3
4
5
6
7
8
create 'GTH_TEST', 'GTH_TEST', {SPLITS=> ['10000000000000000000000000000000',
'20000000000000000000000000000000','30000000000000000000000000000000',
'40000000000000000000000000000000','50000000000000000000000000000000',
'60000000000000000000000000000000','70000000000000000000000000000000',
'80000000000000000000000000000000','90000000000000000000000000000000',
'a0000000000000000000000000000000','b0000000000000000000000000000000',
'c0000000000000000000000000000000','d0000000000000000000000000000000',
'e0000000000000000000000000000000','f0000000000000000000000000000000']}

我使用Hortonworks的HBase shc连接器,如下所示:

1
2
3
4
df.write
  .options(Map(HBaseTableCatalog.tableCatalog -> cat_matrice))
  .format("org.apache.spark.sql.execution.datasources.hbase")
  .save()

此代码永无止境。它开始将数据插入HBase并永久运行(至少在我杀死它之前35小时)。它执行11984/16000个任务,任务数量始终相同。

我做了一个更改:

1
2
3
4
5
df.limit(Int.MaxValue)
  .write
  .options(Map(HBaseTableCatalog.tableCatalog -> cat_matrice))
  .format("org.apache.spark.sql.execution.datasources.hbase")
  .save()

如果有限制(Int.MaxValue),则需要4/5分钟才能插入1200万行。

有人可以解释这种行为吗? HBase端是否有max_connexions?
是否需要在HBase或Spark方面进行一些调整?

谢谢!

杰弗里


我们终于更改了HBase连接器。

通过it.nerdammer.spark.hbase(通过RDD),它可以完美运行。

1
2
3
4
5
import it.nerdammer.spark.hbase._
rdd.toHBaseTable(tableName)
   .toColumns("MATCHED")
   .inColumnFamily(cfName)
   .save()