有多少spark JavaRDD是处理数千个文件的理想选择?

bejyjqdl  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(343)

我有成千上万的文件要处理,它驻留在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,或者一个是好的,即使在数百万的文件的情况下。我注意到的一点是没有并行性,即使我在主线程上使用12个执行器,它也会依次处理文件。请提前引导感谢。

ojsjcaue

ojsjcaue1#

首先,如果您的hdfs有数千个小文件,那么您的上游应用程序在编写时不会执行任何操作。在这种情况下,可以考虑编写一种输入格式来组合文件(或者查看hadoop的输入格式,看看是否适合您)。第二,如果你有非常大的文件,请浏览sandyryza在cloudera站点上关于调优集群资源的很棒的博客。

chhqkbe1

chhqkbe12#

RDD可以看作是一个指向数据的指针,允许对该数据定义操作。这些操作被安排在集群中的执行器上。
给定相同数量的资源(集群大小,mem-cpu),rdd指向的是小数据集还是大数据集只会影响处理数据所需的时间。如果预见到数据大小将增加,则需要确定是否:
等待结果的时间更长是可以接受的=>然后什么也不做
分配的时间是固定的=>然后增加集群资源
简而言之,一个rdd定义就可以了。根据数据集大小和结果的业务需求调整集群资源。

相关问题