Rdd成员变量Dependency介绍(类型及其如何被初始化)

本文解析了Apache Spark中RDD的两种依赖类型:NarrowDependency和ShuffleDependency,并详细介绍了这些依赖是如何在RDD操作中初始化的。

Dependency的类型

rdd的Dependency分NarrowDependency和ShuffleDependency两种。
1 NarrowDependency:一个Parent RDD的数据经过处理之后,只能传递到一个Child RDD,它又分为:
a. OneToOneDependency:MapPartitionsRDD、HadoopRDD的依赖,这种依赖Parent RDD和Child RDD是1对1的关系
b. RangeDependency:UnionRDD的依赖,这种依赖是多个Parent RDD对应1个Child RDD

2 ShuffleDependency: 一个Parent RDD的数据经过处理之后,传递给多个Child RDD,ShuffledRDD的依赖就是这种类型。

rdd的dependencies是如何初始化的:

rdd都继承自 class RDD,来看下它的主构造函数:

abstract class RDD[T: ClassTag](
    @transient private var _sc: SparkContext,
    // 参数deps即该rdd的依赖s
    @transient private var deps: Seq[Dependency[_]]
  ) extends Serializable with Logging

rdd的依赖应该都来自这个deps了,那deps怎么来的呢,以rdd.map来看下:

// 以 rdd_A.map(...) 为例
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
    val cleanF = sc.clean(f)
    // 新建 MapPartitionsRDD 对象,将 rdd_A 本身作为第一个参数
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
  }

再看MapPartitionsRDD的定义(主构造函数):

private[spark] class MapPartitionsRDD[U: ClassTag, T: ClassTag](
    prev: RDD[T],
    f: (TaskContext, Int, Iterator[T]) => Iterator[U],  
    preservesPartitioning: Boolean = false)
  extends RDD[U](prev)

MapPartitionsRDD 第一个参数prev来自父类RDD,构造 MapPartitionsRDD 时先调用 super(prev), 即调RDD的构造函数。
super(prev)
=> 调 RDD私有构造函数:

// oneParent 即rdd_A对象
def this(@transient oneParent: RDD[_]) = this(
    oneParent.context , 
    List(new OneToOneDependency(oneParent)))

=> 调 RDD主构造函数:

RDD[T: ClassTag]( 
    @transient private var _sc: SparkContext, 
    @transient private var deps: Seq[Dependency[_]]) 

可以看到rdd_A对象被封装为List传入RDD主构造函数,的第二个参数即其 deps ;
再看 r.dependencies 方法:

final def dependencies: Seq[Dependency[_]] = {
    checkpointRDD.map(r => List(new OneToOneDependency(r))).getOrElse {
      if (dependencies_ == null) {
        // 这里即返回 RDD 主构造函数参数 deps ;
        dependencies_ = getDependencies
      }
      dependencies_
    }
  }
<think>好的,我现在需要帮助用户在IntelliJ IDEA中编写和运行Spark RDD程序。根据用户提供的引用内容,我需要先整理步骤,确保每个环节正确。 首先,用户提到了使用Maven搭建Spark项目,所以第一步应该是创建Maven项目。引用[1]和[2]都提到了创建项目的步骤,可能需要配置pom.xml文件,添加Spark和Scala依赖。这里需要注意版本兼容性,比如用户提到的Spark-2.3.2和Hadoop-2.7.3,还有JDK1.8,所以需要确保依赖的版本对应。 接下来是项目结构设置。用户可能需要创建Scala目录,并标记为源代码根目录,这样才能正确编写Scala类。引用[3]中的包和导入语句提示了包名的设置,比如package com.tipdm.sparkDemo,这需要在项目中创建对应的目录结构。 然后是编写RDD程序。用户需要创建SparkConf和SparkContext,这里要注意设置master为local[*]以便本地运行。代码示例部分可能需要展示如何创建RDD并进行操作,比如map、filter等。同时,记得在最后关闭SparkContext。 关于运行配置,用户可能需要配置Main类,并指定JVM参数,比如内存设置。如果遇到依赖问题,可能需要检查是否使用了provided范围,这会导致运行时缺少依赖,需要调整pom.xml中的配置。 此外,用户可能会遇到常见问题,比如依赖冲突或者日志过多,这时候需要排除冲突的依赖或者调整日志级别。引用[3]中的代码示例展示了SparkConf和SparkContext的初始化,这可以作为模板。 最后,生成相关问题时要围绕Spark RDD编程、性能优化、调试和部署等方面,确保覆盖用户可能感兴趣的扩展内容。</think>以下是在 IntelliJ IDEA 中编写和运行 Spark RDD 程序的详细步骤: ### 一、环境准备 1. **安装JDK 1.8** 配置环境变量`JAVA_HOME`,确保终端执行`java -version`能正确显示版本[^2]。 2. **安装Scala插件** 在 IDEA 中通过 `File > Settings > Plugins` 搜索并安装 Scala 插件。 3. **配置 Maven** 新建 Maven 项目时,选择`maven-archetype-quickstart`模板,并配置阿里云镜像加速依赖下载[^1]。 --- ### 二、项目配置 1. **pom.xml 依赖配置** 添加 Spark 核心依赖和 Scala 语言支持(版本需与服务器环境一致): ```xml <dependencies> <!-- Spark Core --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.3.2</version> </dependency> <!-- Scala --> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.11.12</version> </dependency> </dependencies> ``` 2. **目录结构** 在`src/main`下新建`scala`目录并标记为源代码根目录(右键目录选择`Mark Directory as > Sources Root`)[^3]。 --- ### 三、编写 RDD 程序 1. **创建 Scala 类** 在`scala`目录下新建包(如`com.example.spark`),然后创建`RDDDemo.scala`: ```scala import org.apache.spark.{SparkConf, SparkContext} object RDDDemo { def main(args: Array[String]): Unit = { // 1. 创建Spark配置 val conf = new SparkConf() .setAppName("RDD Demo") .setMaster("local[*]") // 使用本地所有核心 // 2. 初始化SparkContext val sc = new SparkContext(conf) // 3. 创建RDD并进行操作 val data = Array(1, 2, 3, 4, 5) val rdd = sc.parallelize(data) val squaredRDD = rdd.map(x => x * x) // 4. 输出结果 println("原始数据: " + rdd.collect().mkString(", ")) println("平方结果: " + squaredRDD.collect().mkString(", ")) // 5. 关闭资源 sc.stop() } } ``` --- ### 四、运行程序 1. **配置运行参数** - 点击 IDEA 右上角 `Edit Configurations` - 添加`Application`配置,选择 Main 类为`RDDDemo` - 在`VM options`中设置内存:`-Xmx2g -Dspark.master=local[*]` 2. **执行程序** 直接点击绿色箭头运行,控制台会输出: ``` 原始数据: 1, 2, 3, 4, 5 平方结果: 1, 4, 9, 16, 25 ``` --- ### 五、常见问题处理 1. **依赖冲突** 若出现`NoSuchMethodError`,在 pom.xml 中添加`<scope>provided</scope>`排除冲突依赖[^1]。 2. **日志过多** 在`resources`目录下添加`log4j.properties`文件,设置日志级别为`WARN`: ``` log4j.rootCategory=WARN, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值