簡體   English   中英

除了多線程之外,還可以從Spark 1.6,Scala 2.10.6進行HBase並發/並行掃描

[英]HBase Concurrent / Parallel Scan from Spark 1.6, Scala 2.10.6 besides multithreading

我有rowPrefixes Array("a", "b", ...)

我需要為每個rowPrefix查詢HBase(使用Nerdammer)。 我當前的解決方案是

case class Data(x: String)

val rowPrefixes = Array("a", "b", "c")

rowPrefixes.par
    .map( rowPrefix => {
          val rdd = sc.hbaseTable[Data]("tableName")
            .inColumnFamily("columnFamily")
            .withStartRow(rowPrefix)

          rdd
        })
    .reduce(_ union _)

我基本上是使用多線程(.par)加載多個rdd的,然后最后將它們全部合並。 有一個更好的方法嗎? 除了nerdammer,我不介意使用其他庫。

此外,由於我正在將hbase讀入case類的RDD中,因此我擔心反射API線程安全問題

我沒有使用過Nerdammer連接器,但是如果我們考慮您的4個前綴行鍵過濾器的示例,那么使用par並行性的數量將受到限制,集群可能會被利用不足,結果可能會很慢。

您可以檢查是否可以使用Nerdammer連接器實現以下目的,我已經使用了hbase-spark連接器(CDH),在以下方法中,行鍵前綴將在所有表分區上進行掃描,即所有表區域並行分布在整個群集中,可以更有效地利用可用資源(內核/ RAM),更重要的是可以利用分布式計算的功能。

val hbaseConf = HBaseConfiguration.create()
// set zookeeper quorum properties in hbaseConf

val hbaseContext = new HBaseContext(sc, hbaseConf)

val rowPrefixes = Array("a", "b", "c")
val filterList = new FilterList()

rowPrefixes.foreach { x => filterList.addFilter(new PrefixFilter(Bytes.toBytes(x))) }

var scan = new Scan()  

scan.setFilter(filterList)
scan.addFamily(Bytes.toBytes("myCF"));

val rdd = hbaseContext.hbaseRDD(TableName.valueOf("tableName"), scan)
rdd.mapPartitions(populateCaseClass)

在您的情況下,將進行全表掃描,但假設您有足夠的可用核心,並且par可以為rowPrefixes數組中的每個元素分配一個核心,那么只有4個分區會做大量工作。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM