我要处理数千个文件,它驻留在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个执行器,我也看到它并不会处理文件。请提前指导谢谢。
答案 0 :(得分:2)
RDD可被视为指向允许定义对该数据的操作的数据的指针。这些操作是在集群中的执行程序上安排的。
给定相同数量的资源(簇大小,mem-cpu),RDD指向小数据集还是大数据集只会影响处理数据所需的时间。如果您预计数据大小会增加,则需要确定是否:
简而言之,一个RDD定义很好。根据结果的数据集大小和业务要求调整群集资源。
答案 1 :(得分:0)
首先,如果你的HDFS有数以千计的小文件,你的上游应用程序在写作时不会做。在这种情况下,考虑编写一种输入格式来组合文件(或者查看hadoop的输入格式以查看是否适合您)。 其次,如果你有非常大的文件,请访问Sandy Ryza在cloudera网站上关于调整群集资源的真棒blog。