spark-shell、spark架构设计、使用idea初始化spark运行环境、Spark RDD
发布日期:2021-05-10 03:44:37 浏览次数:20 分类:精选文章

本文共 2737 字,大约阅读时间需要 9 分钟。

spark-shell

spark是集成开发工具,提供了交互式环境,便于数据处理和分析。以下是通过spark-shell进行操作的一些示例。

val rdd1 = sc.parallelize(1 to 10)
rdd1.collect // 返回结果:Array[Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
rdd1.partitions.size // 返回结果:1
val rdd2 = sc.makeRDD(5 to 15)
rdd2.collect // 返回结果:Array[Int] = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
rdd1 ++ rdd2
rdd1.canEqual(rdd2) // 返回结果:false
rdd1.cartesian(rdd2) // 返回结果:RDD[(Int, Int)],具体分区结构根据运行环境改变

wordcount流程实例

val rddWordCount = sc.parallelize(Array("hello world","hello java","hello scala","scala very good"))
rddWordCount.flatMap(x => x.split(" ")).map(x => (x, 1)).reduceByKey(_ + _).collect
// 以上代码实现的步骤:
// 1. 将每个字符串拆分成单词
// 2. 将单词和计数(1)一起映射
// 3. 按照单词进行聚合,统计出现次数
// 4. 将结果收集到本地机内存中

spark架构设计

Spark是一款非常强大的分布式计算框架,其架构设计主要包括以下几个层次:

  • 驱动程序:通过SparkContext来主导应用的执行。SparkContext负责连接Cluster Manager(如Standalone、YARN或Mesos),并向集群中的Executor传递任务。

  • Executor与Worker:每个应用可以配置Executor的数量,通过SPARK_WORKER_INSTANCES控制。每个Executor处理多个Task分区,确保计算资源被充分利用。

  • Task与分区处理:每个Task仅处理单个RDD分区,这样可以在不同的Executor上并行执行,提高计算效率。

  • 核心组件包括:

    • Cluster Manager:负责资源的分配和节点的管理。
    • SparkContext:应用程序的入口,负责任务提交和资源协调。
    • Executor:在集群中运行Task,负责具体的数据计算。
    • Worker:负责接收并分发任务,协调Task的执行。
  • 使用IDEA初始化Spark运行环境

  • 创建基于 Maven的项目,将必要的依赖添加到pom.xml中。推荐添加以下依赖:
  • junit
    junit
    4.11
    test
    org.scala-lang
    scala-library
    2.11.12
    org.apache.spark
    spark-core_2.11
    2.1.1
    org.apache.spark
    spark-sql_2.11
    2.1.1
    1. SparkContext初始化示例
    2. val conf = new SparkConf().setMaster("local[*]").setAppName("SparkDemo")
      val sc = SparkContext.getOrCreate(conf)
      1. SparkSession初始化示例
      2. val spark: SparkSession = SparkSession.builder().master("local[*]").appName("sparkSessionDemo").getOrCreate()
        println(spark)

        spark架构核心组件

        Spark架构的核心设计基于一个灵活的集群管理模型,工作流程如下:

      3. 切换模式:根据选择的Cluster Manager(如本地模式、YARN或Standalone)配置不同的资源访问方式。
      4. 资源申请:SparkContext通过Cluster Manager申请资源,创建Executor。
      5. 任务提交:将任务打包发送至Executor,通过Task Launcher执行。
      6. 结果收集:Parser将计算结果返回Driver端,供用户处理和查看。
      7. wordcount实现详解

        以下是基于Spark的血缘关系识别工具实现的WordCount功能:

        val wordCount = sc.parallelize(Array("hello world","hello java","hello scala","scala very good"))
        wordCount.flatMap(x => x.split(" ")).map((x, 1)).reduceByKey(_ + _).collect

        代码解读:

      8. parallelize:将输入数据并行生成RDD。
      9. flatMap:对每行文本进行拆分,得到单词列表。
      10. map:将单词与计数(1)结合。
      11. reduceByKey:按照单词合并计数。
      12. collect:将最终结果收集到本地收集器中。
      13. 通过以上代码,可以轻松实现对文本文件中的单词频率进行统计分析。

        RDD概念解析

        RDD(Resilient Distributed Dataset)是Spark核心的数据抽象表示。

        • 弹性性:默认存储在内存中,内存不足时会写入磁盘,切换模式。
        • 容错性:基于血统机制,能自动恢复丢失分区的数据。
        • 分区处理:每个Task仅处理一个分区,确保资源利用效率。

        RDD与DAG

        RDD及其依赖关系构成DAG(有向无环图),反映了Spark任务的执行顺序。

    上一篇:【java面试经(架构师&设计师)-第1课】java常用数据结构(一)
    下一篇:scala函数大全(二)

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年05月07日 15时49分30秒