我有成千上万的文件要处理,它驻留在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个执行器,它也会依次处理文件。请提前引导感谢。
2条答案
按热度按时间ojsjcaue1#
首先,如果您的hdfs有数千个小文件,那么您的上游应用程序在编写时不会执行任何操作。在这种情况下,可以考虑编写一种输入格式来组合文件(或者查看hadoop的输入格式,看看是否适合您)。第二,如果你有非常大的文件,请浏览sandyryza在cloudera站点上关于调优集群资源的很棒的博客。
chhqkbe12#
RDD可以看作是一个指向数据的指针,允许对该数据定义操作。这些操作被安排在集群中的执行器上。
给定相同数量的资源(集群大小,mem-cpu),rdd指向的是小数据集还是大数据集只会影响处理数据所需的时间。如果预见到数据大小将增加,则需要确定是否:
等待结果的时间更长是可以接受的=>然后什么也不做
分配的时间是固定的=>然后增加集群资源
简而言之,一个rdd定义就可以了。根据数据集大小和结果的业务需求调整集群资源。