You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

智能连接器模式下SnappyData表找不到:Spark提交失败Snappy提交正常

智能连接器模式下Spark任务无法识别SnappyData表的解决方案

嘿,我来帮你拆解这个问题:你在智能连接器模式下,用HDP的第三方spark-submit提交任务时,死活找不到通过snappy-shell/snappy-sql创建的表,但换成SnappyData自带的spark-submit就一切正常。日志明明显示已经连上了SnappyData,却提示表不存在,还列出了其他存储的表——这个问题我之前也碰到过,核心原因是第三方Spark的环境和SnappyData预配置的环境不匹配。

先说说问题出在哪

第三方Spark(比如你用的HDP Spark)和SnappyData自带的Spark,在依赖配置、参数默认值上有差异,主要集中在这几点:

  • 类路径(ClassPath)没配全,或者SnappyData的依赖被Spark自带的冲突依赖覆盖了
  • 提交命令里的配置参数有错误,比如参数名写错、格式不对
  • 智能连接器模式的初始化逻辑没走对,导致任务没正确关联到SnappyData集群的元数据

一步步解决问题

1. 先把提交命令的错误修正了

你的原命令里有几个明显的小错误,这可能是关键:

  • 第一个--conf后面是空的,属于无效参数
  • snappydata.connection参数少了spark.前缀,正确的参数名是spark.snappydata.connection
  • --jars后面没指定任何jar包,要么删掉要么补全

修正后的命令应该是这样的(记得替换你的应用jar路径):

/usr/hdp/2.6.2.0-205/spark2/bin/spark-submit \
  --conf spark.snappydata.connection=localhost:1527 \
  --conf spark.ui.port=0 \
  --master local[*] \
  --driver-memory 2g \
  --deploy-mode client \
  --conf spark.driver.extraClassPath=/root/snappydata-1.0.1-bin/jars/* \
  --conf spark.executor.extraClassPath=/root/snappydata-1.0.1-bin/jars/* \
  --class myclass \
  /path/to/your/app.jar

2. 确保SnappyData依赖优先加载

HDP Spark自带的依赖可能和SnappyData的依赖版本冲突(比如Spark SQL、JDBC驱动),你需要让SnappyData的jar包先被加载:
把SnappyData的jars放在extraClassPath的最前面,比如:

--conf spark.driver.extraClassPath=/root/snappydata-1.0.1-bin/jars/*:/usr/hdp/2.6.2.0-205/spark2/jars/*

另外,别把SnappyData的依赖打包到你的应用jar里,不然很容易触发版本冲突。

3. 修正SnappySession的初始化代码

你的代码里把连接配置单独放在SparkSession.Builder里,可能导致配置没被正确传递到所有节点。建议把配置统一放到SparkConf里:

// 修正后的初始化代码
SparkConf sparkConf = new SparkConf()
  .setAppName(args[0])
  .set("spark.snappydata.connection", "localhost:1527");

SparkSession sparkSession = SparkSession.builder().config(sparkConf).getOrCreate();
SnappySession snappySes = new SnappySession(sparkSession);

4. 检查表的完整命名空间

有时候不是表不存在,是你没指定正确的schema!先在snappy-shell里执行SHOW TABLES;,看看表是不是在某个schema下面(比如default之外的schema),然后在代码里用完整表名:

// 比如表在MY_SCHEMA下
snappySes.table("MY_SCHEMA.SNAPPY_COL_TABLE").show(10);

5. 确认SnappyData集群是智能连接器模式

最后,确保你的SnappyData集群确实是运行在智能连接器模式下,而不是嵌入式模式。可以用snappy status命令查看集群状态,或者看SnappyData的启动日志。

验证一下

按上面的步骤改完后,重新提交任务:

  1. 看日志里有没有成功初始化智能连接器的提示(就是你之前看到的那行日志)
  2. 如果还是报错,重点看有没有类冲突的日志(比如ClassNotFoundExceptionNoSuchMethodError),针对冲突的依赖进行排除

内容的提问来源于stack exchange,提问作者satish sidnakoppa

火山引擎 最新活动