Sam*_*jee 4 java cloud hadoop hadoop-yarn apache-spark
我有一个简单的spark应用程序,试图在YARN Cluster上广播String类型的变量。但是每次我尝试访问广播的变量值时,在Task中都会得到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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为您的广播变量处于类级别。并且由于在工作节点中初始化该类时,它将不会看到您在main方法中分配的值。由于广播变量未初始化为任何内容,因此只会看到一个null。我发现的解决方案是在调用方法时将广播变量传递给该方法。蓄能器也是如此
| 归档时间: |
|
| 查看次数: |
2302 次 |
| 最近记录: |