使用 spark-hbase 时,出现 ClassNotFoundException: org.apache.hadoop.hbase.spark.SparkSQLPushDownFilter

When using spark-hbase, I got a 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"

我的 Scala 代码:

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 \

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

  • 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 运行-time 库的版本,在你的例子中是 2.11.something。您可以从本地 Maven 缓存中提取库。看下

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

在我的HBase部署中,我通常在$HBASE_HOME中创建一个site-lib目录并将三个文件放在那里,然后在$HBASE_HOME/conf/hbase-env.sh中设置HBASE_CLASSPATH。例如,使用为 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()

请注意,这将阻止区域服务器上 运行ning 的 .filter("height > 1.0") 等列筛选操作,并可能导致不必要的数据传输,因此不推荐使用,除非您无法控制HBase部署。