Spark-Dependency/Aggregator

本文介绍了Apache Spark中RDD依赖关系的基础知识,包括窄依赖、一对一依赖、范围依赖及洗牌依赖等类型,并详细阐述了Aggregator的作用及其核心方法。

Spark-Dependency/Aggregator

@(spark)[Dependency|Aggregator]
RDD的核心之一:依赖关系

/**                                                                                                                                                                     
 * :: DeveloperApi ::                                                                                                                                                   
 * Base class for dependencies.                                                                                                                                         
 */                                                                                                                                                                     
@DeveloperApi                                                                                                                                                           
abstract class Dependency[T] extends Serializable {                                                                                                                     
  def rdd: RDD[T]                                                                                                                                                       
}         

Product2 是scala的类
Product2 is a cartesian product of 2 components.

NarrowDependency

比较简单的一类依赖,

/**                                                                                                                                                                     
 * :: DeveloperApi ::                                                                                                                                                   
 * Base class for dependencies where each partition of the child RDD depends on a small number                                                                          
 * of partitions of the parent RDD. Narrow dependencies allow for pipelined execution.                                                                                  
 */                                                                                                                                                                     
@DeveloperApi                                                                                                                                                           
abstract class NarrowDependency[T](_rdd: RDD[T]) extends Dependency[T] {    
  /**                                                                                                                                                                   
   * Get the parent partitions for a child partition.                                                                                                                   
   * @param partitionId a partition of the child RDD                                                                                                                    
   * @return the partitions of the parent RDD that the child partition depends upon                                                                                     
   */                                                                                                                                                                   
  def getParents(partitionId: Int): Seq[Int]                                                                                                                            

  override def rdd: RDD[T] = _rdd                                                                                                                                       
}                                                                                                                                                                          

OneToOneDependency

1:1 的mapping

/**                                                                                                                                                                     
 * :: DeveloperApi ::                                                                                                                                                   
 * Represents a one-to-one dependency between partitions of the parent and child RDDs.                                                                                  
 */                                                                                                                                                                     
@DeveloperApi                                                                                                                                                           
class OneToOneDependency[T](rdd: RDD[T]) extends NarrowDependency[T](rdd) {                                                                                             
  override def getParents(partitionId: Int) = List(partitionId)                                                                                                         
} 

RangeDependency

根据range确定依赖关系,每个range一个dependency?

/**                                                                                                                                                                     
 * :: DeveloperApi ::                                                                                                                                                   
 * Represents a one-to-one dependency between ranges of partitions in the parent and child RDDs.                                                                        
 * @param rdd the parent RDD                                                                                                                                            
 * @param inStart the start of the range in the parent RDD                                                                                                              
 * @param outStart the start of the range in the child RDD                                                                                                              
 * @param length the length of the range                                                                                                                                
 */                                                                                                                                                                     
@DeveloperApi                                                                                                                                                           
class RangeDependency[T](rdd: RDD[T], inStart: Int, outStart: Int, length: Int)   

ShuffleDependency

/**                                                                                                                                                                     
 * :: DeveloperApi ::                                                                                                                                                   
 * Represents a dependency on the output of a shuffle stage. Note that in the case of shuffle,                                                                          
 * the RDD is transient since we don't need it on the executor side.                                                                                                    
 *                                                                                                                                                                      
 * @param _rdd the parent RDD                                                                                                                                           
 * @param partitioner partitioner used to partition the shuffle output                                                                                                  
 * @param serializer [[org.apache.spark.serializer.Serializer Serializer]] to use. If set to None,                                                                      
 *                   the default serializer, as specified by `spark.serializer` config option, will                                                                     
 *                   be used.                                                                                                                                           
 * @param keyOrdering key ordering for RDD's shuffles                                                                                                                   
 * @param aggregator map/reduce-side aggregator for RDD's shuffle                                                                                                       
 * @param mapSideCombine whether to perform partial aggregation (also known as map-side combine)                                                                        
 */                                                                                                                                                                     
@DeveloperApi                                                                                                                                                           
class ShuffleDependency[K, V, C](                                                                                                                                       
    @transient _rdd: RDD[_ <: Product2[K, V]],                                                                                                                          
    val partitioner: Partitioner,                                                                                                                                       
    val serializer: Option[Serializer] = None,                                                                                                                          
    val keyOrdering: Option[Ordering[K]] = None,                                                                                                                        
    val aggregator: Option[Aggregator[K, V, C]] = None,                                                                                                                 
    val mapSideCombine: Boolean = false)                                                                                                                                
  extends Dependency[Product2[K, V]] {    

Aggregator

/**                                                                                                                                                                     
 * :: DeveloperApi ::                                                                                                                                                   
 * A set of functions used to aggregate data.                                                                                                                           
 *                                                                                                                                                                      
 * @param createCombiner function to create the initial value of the aggregation.                                                                                       
 * @param mergeValue function to merge a new value into the aggregation result.                                                                                         
 * @param mergeCombiners function to merge outputs from multiple mergeValue function.                                                                                   
 */                                                                                                                                                                     
@DeveloperApi                                                                                                                                                           
case class Aggregator[K, V, C] (                                                                                                                                        
    createCombiner: V => C,                                                                                                                                             
    mergeValue: (C, V) => C,                                                                                                                                            
    mergeCombiners: (C, C) => C) {  
### 如何使用 spark-submit 提交 Spark 任务并指定 MySQL 驱动程序以连接数据库 在提交 Spark 任务时,如果需要连接 MySQL 数据库,则必须确保 Spark 程序能够正确加载 MySQL 的 JDBC 驱动程序。以下是实现此目标的详细方法: #### 1. 指定 MySQL 驱动程序路径 为了使 Spark 能够找到 MySQL 的 JDBC 驱动程序,可以通过 `--jars` 参数将驱动程序添加到 Spark 应用程序中。例如,如果 MySQL 驱动程序位于 `/path/to/mysql-connector-java-x.x.xx.jar`,则可以在 `spark-submit` 命令中添加以下参数: ```bash --jars /path/to/mysql-connector-java-x.x.xx.jar ``` 这一步确保了 MySQL 驱动程序会被分发到所有的 Executor 中[^1]。 #### 2. 配置 Driver 和 Executor 的类路径 除了通过 `--jars` 参数分发驱动程序外,还可以通过 `--driver-class-path` 参数显式地将 MySQL 驱动程序添加到 Driver 的类路径中。对于 Executor,可以使用 `spark.executor.extraClassPath` 配置项来设置类路径。示例如下: ```bash --conf "spark.executor.extraClassPath=/path/to/mysql-connector-java-x.x.xx.jar" \ --driver-class-path /path/to/mysql-connector-java-x.x.xx.jar ``` 这种配置方式可以确保 Driver 和 Executor 都能正确加载 MySQL 驱动程序[^3]。 #### 3. 设置 JDBC URL 和连接参数 在代码中,需要正确配置 JDBC URL 以及相关的连接参数。以下是一个典型的 JDBC URL 示例: ```scala val url = "jdbc:mysql://<host>:<port>/<database>?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=UTC" ``` 其中 `<host>`、`<port>` 和 `<database>` 分别是 MySQL 数据库的主机地址、端口号和数据库名称。此外,`autoReconnect=true` 和 `failOverReadOnly=false` 是推荐的连接参数,用于提高连接的稳定性[^1]。 #### 4. 完整的 spark-submit 命令 结合上述所有步骤,完整的 `spark-submit` 命令如下所示: ```bash bin/spark-submit \ --class <your-main-class> \ --master yarn \ --deploy-mode client \ --jars /path/to/mysql-connector-java-x.x.xx.jar \ --conf "spark.executor.extraClassPath=/path/to/mysql-connector-java-x.x.xx.jar" \ --driver-class-path /path/to/mysql-connector-java-x.x.xx.jar \ --driver-memory 2g \ --executor-memory 2g \ --num-executors 2 \ --executor-cores 24 \ /path/to/your-application.jar ``` 此命令确保了 MySQL 驱动程序被正确加载,并且 Spark 程序能够成功连接到 MySQL 数据库。 #### 5. 注意事项 - 如果仍然遇到 `ClassNotFoundException` 错误,请检查是否正确指定了驱动程序路径。 - 在开发环境中(如 IDEA),需要确保项目依赖中包含了 MySQL 驱动程序,并且在打包时将其包含在最终的 JAR 文件中[^2]。 - 如果使用的是 Maven 或 Gradle 构建工具,请确保在构建文件中正确配置了 MySQL 驱动程序的依赖项。 ```xml <!-- Maven 依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>x.x.xx</version> </dependency> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值