簡體   English   中英

Spark 3.2.1 獲取 HBase 數據不適用於 NewAPIHadoopRDD

[英]Spark 3.2.1 fetch HBase data not working with NewAPIHadoopRDD

下面是用於從 HBase 獲取數據的示例代碼片段。 這適用於 Spark 3.1.2。 但是升級到 Spark 3.2.1 后,它不起作用,即返回的 RDD 不包含任何值。 此外,它不會拋出任何異常。

def getInfo(sc: SparkContext, startDate:String, cachingValue: Int, sparkLoggerParams: SparkLoggerParams, zkIP: String, zkPort: String): RDD[(String)] = {{
val scan = new Scan
    scan.addFamily("family")
    scan.addColumn("family","time")
    val rdd = getHbaseConfiguredRDDFromScan(sc, zkIP, zkPort, "myTable", scan, cachingValue, sparkLoggerParams)
    val output: RDD[(String)] = rdd.map { row =>
      (Bytes.toString(row._2.getRow))
    }
    output
  }
 
def getHbaseConfiguredRDDFromScan(sc: SparkContext, zkIP: String, zkPort: String, tableName: String,
                                    scan: Scan, cachingValue: Int, sparkLoggerParams: SparkLoggerParams): NewHadoopRDD[ImmutableBytesWritable, Result] = {
    scan.setCaching(cachingValue)
    val scanString = Base64.getEncoder.encodeToString(org.apache.hadoop.hbase.protobuf.ProtobufUtil.toScan(scan).toByteArray)
    val hbaseContext = new SparkHBaseContext(zkIP, zkPort)
    val hbaseConfig = hbaseContext.getConfiguration()
    hbaseConfig.set(TableInputFormat.INPUT_TABLE, tableName)
    hbaseConfig.set(TableInputFormat.SCAN, scanString)
    sc.newAPIHadoopRDD(
      hbaseConfig,
      classOf[TableInputFormat],
      classOf[ImmutableBytesWritable], classOf[Result]
    ).asInstanceOf[NewHadoopRDD[ImmutableBytesWritable, Result]]
  }

此外,如果我們不使用 NewAPIHadoopRDD 直接使用 Scan 獲取,它就可以工作。

軟件版本:

  • Spark: 3.2.1 prebuilt with user provided Apache Hadoop
  • Scala:2.12.10
  • HBase:2.4.9
  • Hadoop:2.10.1

我找到了解決這個問題的方法。 請參閱從 Spark 3.1.x 到 Spark 3.2.x 的升級指南: https://spark.apache.org/docs/latest/core-migration-guide.html

從 Spark 3.2 開始,spark.hadoopRDD.ignoreEmptySplits 默認設置為 true,這意味着 Spark 不會為空輸入拆分創建空分區。 要恢復 Spark 3.2 之前的行為,可以將 spark.hadoopRDD.ignoreEmptySplits 設置為 false。

可以在 spark-submit 上這樣設置:

  ./spark-submit \
  --class org.apache.hadoop.hbase.spark.example.hbasecontext.HBaseDistributedScanExample \
  --master  spark://localhost:7077 \
  --conf "spark.hadoopRDD.ignoreEmptySplits=false" \
  --jars ... \
  /tmp/hbase-spark-1.0.1-SNAPSHOT.jar YourHBaseTable

或者,您也可以在$SPARK_HOME/conf/spark-defaults.conf全局設置這些以應用於每個 Spark 應用程序。

spark.hadoopRDD.ignoreEmptySplits 錯誤

暫無
暫無

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

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