我目前正在尝试将自定义InputSplit
和RecordReader
与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:如果需要,我可以提供更多技术细节。
答案 0 :(得分:1)
是的,如果从getLength()返回任何值,然后读取那些没有。来自您文件的字节,hadoop将生成一个新的拆分以读取更多数据。 如果您不想要此行为,请重写方法InputFormat.getSplits()以返回false。即..你不希望它分裂。
getProgress()方法与生成新拆分无关。