首页 > 解决方案 > 使用 spark-hbase 时,我得到了 ClassNotFoundException:org.apache.hadoop.hbase.spark.SparkSQLPushDownFilter

问题描述

谢谢你的帮助!

当我尝试从 Hbase 读取时,出现异常!

我尝试设置 --jars 并设置 spark.sparkContext.addJar("./hbase-spark-1.0.0.jar"),但它不起作用;

而且我也尝试将 hbase 和 sbt 保持为相同的版本,它也不起作用;

我的 sbt 代码:

      "org.apache.hbase.connectors.spark" % "hbase-spark" % "1.0.0",
      "org.apache.hbase" % "hbase" % "2.1.0" pomOnly(),
      "org.apache.hbase" % "hbase-client" % "2.1.0"

我的斯卡拉代码:

val df = sql.read.format("org.apache.hadoop.hbase.spark")
    .option("hbase.columns.mapping",
      "name STRING :key, " +
        "email STRING c:email, " +
        "birthDate STRING p:birthDate, " +
        "height FLOAT p:height"
    )
    .option("hbase.table", "person")
    .load()
  df.createOrReplaceTempView("personView")

  val results = sql.sql("SELECT * FROM personView WHERE name = 'alice'")
  results.show()

我的例外:

Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.spark.SparkSQLPushDownFilter

我的火花提交:

spark-submit \
--master yarn \
--driver-memory 3G \
--class cn.run.HbaseTest \
--num-executors 2 \
--executor-memory 3G \
--executor-cores 2 \
--conf spark.ui.port=4399 \
--conf spark.driver.maxResultSize=0 \
--jars ./hbase-spark-1.0.0.jar \
SparkFM_2.11-2.4.3.jar \

标签: scalaapache-sparkhbase

解决方案


HBase Spark 连接器使用服务器端过滤器,因此需要您将多个 JAR 文件添加到每个 HBase 区域服务器的类路径中:

  • hbase-spark-<connector.version>.jar
  • hbase-spark-protocol-shaded-<connector.version>.jar
  • scala-library-<scala.version>.jar

<connector.version>是 HBase Spark 连接器的版本,在您的情况下是1.0.0. <scala.version>是 Scala 运行时库的版本,在您的情况下是2.11.something. 您可以从本地 Maven 缓存中提取库。往下看

$HOME/.m2/repository/org/scala-lang/scala-library/<scala.version>/

在我的 HBase 部署中,我通常会site-lib在其中创建一个目录$HBASE_HOME并将三个文件放在那里,然后设置HBASE_CLASSPATH$HBASE_HOME/conf/hbase-env.sh. 例如,使用为 Spark 3.x 编译的连接器的快照版本:

export HBASE_CLASSPATH=$HBASE_HOME/site-lib/hbase-spark-1.0.1-SNAPSHOT.jar:$HBASE_HOME/site-lib/hbase-spark-protocol-shaded-1.0.1-SNAPSHOT.jar:$HBASE_HOME/site-lib/scala-library-2.12.12.jar

您仍然需要将两个 JAR 文件 (hbase-sparkhbase-spark-protocol-shaded) 添加到您的spark-submit命令中(或构建一个胖 JAR),客户端组件才能工作。


hbase.spark.pushdown.columnfilter另一种解决方案是通过将选项设置为来关闭过滤器下推false

val df = sql.read.format("org.apache.hadoop.hbase.spark")
    .option("hbase.columns.mapping", "...")
    .option("hbase.spark.pushdown.columnfilter", false)
    .option("hbase.table", "person")
    .load()

请注意,这将阻止列过滤操作(例如.filter("height > 1.0")在区域服务器上运行),并可能导致不必要的数据传输,因此除非您无法控制 HBase 部署,否则不建议这样做。


推荐阅读