智能连接器模式下SnappyData表找不到:Spark提交失败Snappy提交正常
嘿,我来帮你拆解这个问题:你在智能连接器模式下,用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的启动日志。
验证一下
按上面的步骤改完后,重新提交任务:
- 看日志里有没有成功初始化智能连接器的提示(就是你之前看到的那行日志)
- 如果还是报错,重点看有没有类冲突的日志(比如
ClassNotFoundException、NoSuchMethodError),针对冲突的依赖进行排除
内容的提问来源于stack exchange,提问作者satish sidnakoppa




