欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

spark 笔记

发布时间:2024/10/12 编程问答 58 豆豆
生活随笔 收集整理的这篇文章主要介绍了 spark 笔记 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
  • 分布式计算,数据尽量在本地计算,减少网络I/O
  • 如果操作之间相互关系不大,则尽量采用分布式计算。
  •  

     

    spark采用分布式计算中的master-slave模型,master对应含有master进程的节点,slave对应含有worker进程的节点。Client 负责提交应用,driver负责控制应用的执行。

     

    基本组件

    • Cluster managermaster节点,控制整个集群
    • Worker: 计算节点
    • Driver: 运行application main函数 并创建 spark context
    • Executor: 用于启动线程池执行任务,每一个application拥有一组独立的 Executor
    • Spark context: 整个应用的上下文,控制应用的生命周期
    • RDD DAG 一组RDD构成的有向无环图。当RDD遇到一个action算子时候,将之前所有的算子形成一个rdd graph. 并把这个rdd graph转化为job提交到cluster中执行
    • Job. 一个Rdd Graph触发的作业。往往由Spark Context通过 runJob方法向spark 提交job
    • DAG scheduler. 每个job会根据RDD DAG构建 Stage DAG 并把stage交给 Task Scheduler
    • Task Scheduler: task 分发给 task scheduler
    • SparkEnv: 线程级别的上下文

    Spark Env包括以下几部分

  • MapOutPutTracker: 负责 Shuffle元信息的存储
  • BroadcastManager: 负责广播变量的控制和元信息的存储
  • BlockManger: 负责存储管理,创建和查询块
  • MetricsSystem: 监控运行时性能指标信息
  • SparkConf: 负责存储配置信息
  •  

    spark主要流程

  • Client 提交应用给 master
  • master启动一个worker来执行 driver
  • driver生成 RDD Graph 再由 DAG scheduler转化为 Stage DAG
  • Dag scheduler提交 stage dagtask scheduler
  • Task scheduler提交 taskexcutor
  •  

    RDD两种创建方式

  • 从已有的rdd 转换生成
  • hdfs中读取
  •  

    RDD 相关

  • 逻辑上的RDD的每个分区叫一个partition
  • 一个变换将一个RDD变换成另外一个RDD,这些RDD之间通过Lineage产生依赖关系
  • 分区只是一个逻辑概念,变换前和变换后的分区可能是同一块内存存储
  • 有些RDD是计算的中间结果,不一定有物理的存储空间与之对应,如果需要迭代使用数据,可以调用cache()函数来缓存数据
  • 在物理上,RDD对象实质上是一个元数据结构,存储着Block, Node等的映射关系,以及其他的元数据信息。
  • 一个RDD就是一组分区,每个分区就是一个block block可以存储在内存中,如果内存不够时可以存储在磁盘上 
  • Note: 如果是从HDFS等外部存储结构中读取数据,数据则按照HDFS中的数据分布策略进行数据分区,HDFS中的一个block对应spark的一个分区 

  • spark支持重分区,数据通过spark默认或者用户自定义的分区器进行分区,决定数据块分布在哪些节点上。
  •  

     

    Transformation 算子

  • 输入输出分区一对一型

  • Map. 将原有的Rdd中的数据项通过用户自定的function map成新的元素。得到一个类型为MappedRDD的新RDD
  • Flatmap. 将原有RDD中的元素通过函数f转换为新的元素,并将生成的RDD合并为一个集合。 得到一个类型为FlatMappedRDD的心RDD
  • Map patitions. 获取每个分区的迭代器,在函数中通过这个分区整体的迭代器对整个分区进行操作。得到一个新的类型为MapPartitionsRDD 的新RDD
  • Glom. glom函数将每个分区形成一个数组。得到一个新的GlommedRDD
  • 输入和输出分区多对一

  • Union.
  • 保证两个RDD中的数据类型是相同的。
  • 合并后类型和原有类型相同
  • 不进行去重操作,如果想去重可以使用distinct
  • ++ 相当于union操作
  • Cartesian. 对两个集合的素有元素做笛卡儿积
  • 输入输出多对多

  • Groupby. 将元素按照function生成key,数据转化为key-value格式,之后将key相同的元素分为一组。
  • 输出是输入分区的子集。

  • Filter. 对元素应用function过滤。 生成一个新的filtered RDD
  • Distinct 将元素去重。
  • Subtract. 将元素进行集合的差操作。
  • Sample. RDD集合内的元素进行采样,获取子集。 用户可以指定采样方式。
  • Takesample. sample类似,但是不指定采样的比例而是指定采样个数。
  • cache型算子

  • Cache. RDD元素缓存到内存。相当于persist(MEMORY_ONLY).
  • Persist. RDD进行缓存操作。数据缓存在什么地方,由storage level枚举类型决定。
  •  

    Action 算子

  • 无输出
  • Foreach.
  • SaveAsTextFile. 将数据输出,存储在指定的HDFS目录。
  •  RDD Dependencies

    1. Narrow Dependencies.  each partition of the parent RDD is used by at most one partition of the child RDD.

    • allow for pipelined execution on one cluster node.
    • easy fault recovery
    • Transformation: map、flatMap、filter、sample

    2. Wide Dependencies. multiple child partitions may depend on a parent partition.

    • require data from all parent partitions to be available and to be shuffled across the nodes
    • a single failed node might cause a complete reexecution
    • Transformation: sortByKey、reduceByKey、groupByKey、cogroupByKey、join、cartensian

            

     

     

     

    转载于:https://www.cnblogs.com/shexinwei/p/4614697.html

    总结

    以上是生活随笔为你收集整理的spark 笔记的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。