scala - 使用 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 \
解决方案
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-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()
请注意,这将阻止列过滤操作(例如.filter("height > 1.0")
在区域服务器上运行),并可能导致不必要的数据传输,因此除非您无法控制 HBase 部署,否则不建议这样做。
推荐阅读
- kubernetes - 独家客户亲和力
- c# - 如何加载正确的场景
- c++ - 使用函数指针进行类型擦除不适用于 GCC
- postgresql - 与 postgresql 中的数组相关的错误“错误:格式错误的记录文字:”
- javascript - Apps 脚本极慢或无休止地“准备执行...”
- wordpress - 为什么 Wordpress 缓存插件不适用于 NGINX/PHP-FM?
- python - 在 Python 中使用 Tkinter 进行间距
- java - aspectj 不拦截带有注释的方法
- javascript - d3 x 轴不是从 00:00 开始,而是从 02:00 开始
- bash - 在bash中将带有小时和分钟的日期字符串转换为秒