我正在研究一个研究项目,我正在修改Spark的某些方面以实现我的最终目标。
我正在尝试将新成员变量添加到RDD.scala类,然后在从worker节点(执行程序)访问rdd时访问这些变量。在this回答中,一个火花贡献者提到只有RDD的某些方法可以在执行器中调用。所以,我想知道如何才能将新的成员字段添加到RDD.scala中,以便可以在执行程序中访问它?
答案 0 :(得分:0)
如何将这些变量添加到RDD的Partition
类中?
你知道,在spark中,任务并不直接映射到单个RDD的转换,它可能是几个RDD的组合'。因此,您希望执行程序访问的内容非常模糊,我假设您希望RDD的compute(part: Partition, context: TaskContext)
方法可以访问变量,这些变量在执行程序中执行。
正如compute
签名所解释的那样,它只会获得Partition
& TaskContext
,鉴于TaskContext
与多个转换相关且对RDD透明,答案只能存在于Partition
中。
Partition
是在驱动程序中调用的getPartitions
方法中创建的,您可以覆盖RDD的getPartitions以返回特定类型的Partition
。
因此,我建议的整个程序是:
class YourPartition(rddId: Int, idx: Int, val your_variable: Any, val your_second_variable: Any .....) extends Partition
def getPartitions: Array[Partition]
Array[YourPartition]
compute(part: Partition, context: TaskContext)
中,将部分转换为YourPartition
的实例,并使用您在此处创建的字段。