有多少 Spark JavaRDD 最适合处理数千个文件?

How many Spark JavaRDDs are ideal to process thousands of files?

我有数千个文件要处理,它们位于 HDFS 中。我有如下所示的工作解决方案,但我想知道想法 RDD 计数的最佳实践。目前我只使用一个 RDD,它指向 HDFS 中的数千个文件。

    //the following line contains comma separated files to process
        String fileToProcessList = "/user/server1/server.dat,/user/server2/server2.dat";
    JavaRDD<Record> rdd_records = sc.textFile(filetoProcessList).map(
      new Function<String, Record>() {
          public Record call(String line) throws Exception {
             String[] fields = line.split(",");
             Record sd = new Record(fields[0], fields[1], fields[2].trim(), fields[3]);
             return sd;
      }
});

在上述情况下我需要使用更多的 JavaRDD 还是即使有数百万个文件也可以?我注意到的一件事是没有并行性:我看到它按顺序处理文件,即使我在 master yarn 上使用 12 个执行程序也是如此。

RDD 可以看作是指向数据的指针,允许定义对该数据的操作。这些操作安排在集群中的执行程序上。

给定相同数量的资源(集群大小、内存 - cpu),无论您的 RDD 指向小数据集还是大数据集,只会影响处理数据所需的时间。如果您预见到数据大小会增加,您需要确定是否:

  • 可以接受更长的等待时间 => 然后什么都不做
  • 分配的时间是固定的=>然后增加集群资源

简而言之,一个RDD定义就可以了。根据结果​​的数据集大小和业务要求调整集群资源。

首先,如果您的 HDFS 有数千个小文件,则您的上游应用程序在写入时不会做任何事情。在这种情况下,请考虑编写一种输入格式来组合文件(或查看 hadoop 的输入格式以查看是否适合您)。 其次,如果您有非常大的文件,请在 cloudera 站点上阅读 Sandy Ryza 的精彩 blog 关于调整集群资源。