在yarn-cluster模式下在rdd操作内部访问数组变量时出现问题

时间:2019-04-17 04:23:53

标签: java apache-spark yarn

我的输入是一些csv / tsv或任何用分隔符分隔的文件及其标题。我想将任何列映射为键,将整个行映射为值。我在机器上运行了以下代码,但是在纱线群集模式下测试失败。

public class SparkController implements java.io.Serializable {
    String DELIMITER;
    String[] header;
    String path;

    public static void main(String[] args) {
        // some parse function
        // say input file is a csv likes: (id,timestamp,ip)
        // header = [ "id", "timestamp", "ip" ]
        // DELIMITER = ","
        SparkController sparkController = new SparkController();
        sparkController.parseArgs(args);

        JavaPariRDD<String, String> pairRdd = sparkController.map2PairRdd("ip");

    }

    private JavaPariRDD<String, String> map2PairRdd(String column) {
        JavaRDD<String> rawFile = sc.textFile(path);
        JavaPariRDD<String, String> pairRdd = rawFile.mapToPair((s) -> {
            // DELIMITER can be accessed normally 
            String[] fields = s.split(DELIMITER);
            // turns out header is empty when runs in yarn, 
            // but works fine in standalone mode
            return new Tuple2<>(fields[header.indexOf("ip")], s);
        });

        // other operations continue
    }

}

我了解到DELIMITERheader之类的变量在集群模式下被序列化为worker。但是数组header在rdd操作中如何为空。

我通过在index外部声明一个最终的int变量mapToPair并在内部访问index来修改代码,然后修复了该错误。

但是我仍然对为什么在header内访问时mapToPair为空的原因感到困惑。谁能提供一些见识?

0 个答案:

没有答案