Spark集成了Hadoop InputFormat混淆

时间:2014-07-18 00:01:42

标签: java hadoop apache-spark

我目前正在尝试将自定义InputSplitRecordReader与Apache Spark的SparkContext hadoopRDD()函数一起使用。

我的问题如下:

InpuSplit.getLenght()和/或RecordReader.getProgress()返回的值是否会影响Spark Runtime中map()函数的执行?

我在问,因为我在Apache Hadoop上使用了这两个自定义类,它们按预期工作。但是,在Spark中,我看到在运行时生成了新的InputSplit对象,这是我不希望代码执行的操作。更确切地说:

在执行开始时,我在日志文件中看到生成了正确数量的InputSplit个对象(在本例中我们只说1)。反过来,生成与该分割相关联的RecordReader对象并开始获取记录。在某些时候,我收到一条消息,表示正在处理上一个InputSplit的作业停止,并且新作业将使用新的InputSplit生成。我不明白为什么会这样?是否与RecordReader.getProgress()方法或InputSplit.getLength()方法返回的值有关?

另外,我将InputSplit的长度定义为一些任意大量的字节(即1GB)。此值是否会影响在运行时生成的Spark作业数量?

欢迎任何帮助和/或建议?

谢谢你, 尼克

P.S.-1:我为发布这么多问题而道歉,但Apache Spark是一个新工具,通过HadoopRDD很少有关于Hadoop-Spark集成的文档。

P.S.-2:如果需要,我可以提供更多技术细节。

1 个答案:

答案 0 :(得分:1)

是的,如果从getLength()返回任何值,然后读取那些没有。来自您文件的字节,hadoop将生成一个新的拆分以读取更多数据。 如果您不想要此行为,请重写方法InputFormat.getSplits()以返回false。即..你不希望它分裂。

getProgress()方法与生成新拆分无关。