为何获取Spark配置项时Apache Spark抛出java.util.NoSuchElementException异常?
为什么调用
sparkContext.getConf().get("spark.files.maxPartitionBytes")会抛出NoSuchElementException? 我之前踩过这个坑,其实核心原因可以拆解成这几点:
1. get()方法的“严格性”
Spark的Conf.get(String key)方法是强制要求配置项必须存在的——如果找不到指定的key,直接就会抛出NoSuchElementException。这和它的兄弟方法getOption(String key)不一样,后者会返回Optional<String>,不存在时只会返回空值,不会触发异常。
2. Spark默认配置的“隐式性”
你要找的spark.files.maxPartitionBytes确实有默认值(128MB,也就是134217728字节),但这个默认值是Spark内部逻辑直接使用的,不会主动写入到你创建的SparkConf对象里。只有当你显式在代码里设置过这个配置,或者通过加载外部配置文件(比如spark-defaults.conf)注入了它,这个key才会出现在Conf对象中。
3. 你的代码场景刚好踩中了这个点
看你的代码,你只给SparkConf设置了appName和master,既没显式配置spark.files.maxPartitionBytes,也没加载外部配置文件。所以当你调用get()时,这个key在Conf里根本不存在,自然就抛出异常了。
解决办法
如果你只是想拿到这个配置的实际生效值,可以换用getOption()并指定默认值:
String maxPartitionBytes = sparkContext.getConf() .getOption("spark.files.maxPartitionBytes") .orElse("134217728"); // 填入Spark的默认值即可
如果你希望这个配置明确出现在Conf对象里,就在初始化SparkConf时显式设置它:
SparkConf conf = new SparkConf() .setAppName("SparkUnitTest") .setMaster("local[*]") .set("spark.files.maxPartitionBytes", "134217728");
内容的提问来源于stack exchange,提问作者Paulo Moreira
相关产品推荐
相关产品推荐

