我创建的RDD如下:
JavaPairRDD<String,String> inputDataFiles = sparkContext.wholeTextFiles("hdfs://ip:8020/user/cdhuser/inputFolder/");
在此RDD上,我执行map
处理单个文件并调用foreach
来触发相同的map
。
JavaRDD<Object[]> output = inputDataFiles.map(new Function<Tuple2<String,String>,Object[]>()
{
private static final long serialVersionUID = 1L;
@Override
public Object[] call(Tuple2<String,String> v1) throws Exception
{
System.out.println("in map!");
//do something with v1.
return Object[]
}
});
output.foreach(new VoidFunction<Object[]>() {
private static final long serialVersionUID = 1L;
@Override
public void call(Object[] t) throws Exception {
//do nothing!
System.out.println("in foreach!");
}
});
此代码适用于本地笔记本电脑上的独立设置,同时访问本地文件和远程HDFS文件。
在群集中,相同的代码不会产生任何结果。我的直觉是数据没有到达单个执行者,因此map
和foreach
都不起作用。这可能是猜测。但我无法弄清楚为什么这在集群中不起作用。我甚至看不到map
和foreach
中的打印语句以集群执行模式打印。
我注意到在集群执行中没有看到的独立输出中的特定行。
16/09/07 17:35:35 INFO WholeTextFileRDD: Input split: Paths:/user/cdhuser/inputFolder/data1.txt:0+657345,/user/cdhuser/inputFolder/data10.txt:0+657345,/user/cdhuser/inputFolder/data2.txt:0+657345,/user/cdhuser/inputFolder/data3.txt:0+657345,/user/cdhuser/inputFolder/data4.txt:0+657345,/user/cdhuser/inputFolder/data5.txt:0+657345,/user/cdhuser/inputFolder/data6.txt:0+657345,/user/cdhuser/inputFolder/data7.txt:0+657345,/user/cdhuser/inputFolder/data8.txt:0+657345,/user/cdhuser/inputFolder/data9.txt:0+657345
我有一个类似于textFile()
的代码,它早先适用于群集上的单个文件。问题仅在于wholeTextFiles()
。
请告知使用此工作或其他替代方法的最佳方法。
我的设置是使用Spark Service分发cloudera 5.7。我将主人用作yarn-client
。
action
可以是任何东西。它只是调用map
的虚拟步骤。我也尝试了System.out.println("Count is:"+output.count());
,因为我在10
得到了正确答案,因为文件夹中有10个文件,但地图仍然无法正常工作。
感谢。