使用 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-spark
和 hbase-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部署。
感谢您的帮助!
当我尝试从 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-spark
和 hbase-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部署。