我有一个简单的 Spark 应用程序,我试图在 YARN 集群上广播 String 类型变量。
但是每次我尝试访问广播变量 value 时,我都会在任务中得到 null 。如果你们能建议我在这里做错了什么,这将非常有帮助。
我的代码如下:-
public class TestApp implements Serializable {
static Broadcast<String[]> mongoConnectionString;
public static void main( String[] args ) {
String mongoBaseURL = args[0];
SparkConf sparkConf = new SparkConf().setAppName(Constants.appName);
JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
mongoConnectionString = javaSparkContext.broadcast(args);
JavaSQLContext javaSQLContext = new JavaSQLContext(javaSparkContext);
JavaSchemaRDD javaSchemaRDD = javaSQLContext.jsonFile(hdfsBaseURL+Constants.hdfsInputDirectoryPath);
if(javaSchemaRDD!=null) {
javaSchemaRDD.registerTempTable("LogAction");
javaSchemaRDD.cache();
pageSchemaRDD = javaSQLContext.sql(SqlConstants.getLogActionPage);
pageSchemaRDD.foreach(new Test());
}
}
private static class Test implements VoidFunction<Row> {
private static final long serialVersionUID = 1L;
public void call(Row t) throws Exception {
logger.info("mongoConnectionString "+mongoConnectionString.value());
}
}
}
这是因为您的广播变量处于类级别。因为当该类在工作节点中初始化时,它将看不到您在 main 方法中分配的值。由于广播变量未初始化为任何内容,因此它只会看到 null。我找到的解决方案是在调用方法时将广播变量传递给该方法。累加器也是如此
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)