2020/1/24寒假自学——学习进度报告5

Posted limitcm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020/1/24寒假自学——学习进度报告5相关的知识,希望对你有一定的参考价值。

  接下来要写4篇的进度报告,准备把RDD编程和SparkSQL放在这几天一起弄掉(没回老家的大年三十稍微有些无聊)。


  这一篇我想先笼统一下各方面的知识,省的有不理解的地方。

  首先是RDD。

  作为一个分布式的数据构造,RDD对我来说方法是抽象的,而且一般来说面向我的都是函数式的编程操作,很难体会到RDD真正意义上的数据转换和行动操作,所以通过学习RDD的构造和运转方式可以更好地理解RDD在Spark中的作用。

  RDD(Resilient Distributed Dataset) 叫着 弹性分布式数据集。

  RDD的特点:

  1. 是一个分区的只读记录的集合;
  2. 一个具有容错机制的特殊集;
  3. 只能通过在稳定的存储器或其他RDD上的确定性操作(转换)来创建;
  4. 可以分布在集群的节点上,以函数式操作集合的方式,进行各种并行操作。

  另外从名称中得出另外的RDD特点——弹性。  

    1. 基于Lineage的高效容错(第n个节点出错,会从第n-1个节点恢复,血统容错);
    2. Task如果失败会自动进行特定次数的重试(默认4次);
    3. Stage如果失败会自动进行特定次数的重试(可以值运行计算失败的阶段),只计算失败的数据分片;
    4. 数据调度弹性:DAG TASK 和资源管理无关;
    5. checkpoint(检查点);
    6. 自动的进行内存和磁盘数据存储的切换。

  笼统的了解了特点之后就需要了解构造(如何实现特性)。

  来自网络的构造图,显示了RDD的关系和属性——

技术图片

 

  值得一提的是RDD内部并不保存数据。

  RDD 只是数据集的抽象,分区内部并不会存储具体的数据。Partition 类内包含一个 index 成员,表示该分区在 RDD 内的编号,通过 RDD 编号 + 分区编号可以唯一确定该分区对应的块编号,利用底层数据存储层提供的接口,就能从存储介质(如:HDFS、Memory)中提取出分区对应的数据。

  之后就是SparkSQL中的DataFrame。

  SparkSQL作为Spark中的数据仓库,本身甚至拥有了比Spark更快的计算速度、更高的计算复杂度,也就是说甚至可以直接使用到机器学习图计算等复杂的算法库中(这也说明DataFrame和python的深度学习中的一些概念相似)。

  Spark中的DataFrame从形式上看最大的不同点是其天生是分布式的。可以简单认为Spark中的DaraFrame是一个分布式的Table。形式如下所述:

1
2
3
4
5
6
7
8
Name Age Tel
String Int Long
String Int Long
String Int Long
...
String Int Long
String Int Long
String Int Long

  而RDD是形如以下所述:

1
2
3
4
5
6
7
Person
Person
Person
...
Person
Person
Person

  DataFrame 是一个分布式数据容器,更像传统数据库的二维表格,除了数据以外,还掌握数据的结构信息, 即 schema。同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、 array 和 map)。 从 API 易用性的角度上 看,DataFrameAPI 提供的是一套高层的关系操作,比函数式的 RDDAPI 要更加友好,门槛更低。   

以上是关于2020/1/24寒假自学——学习进度报告5的主要内容,如果未能解决你的问题,请参考以下文章

2020/2/1寒假自学——学习进度报告8

2020/1/25寒假自学——学习进度报告6

2020/2/13寒假自学——学习进度报告16

2020/1/18寒假自学——学习进度报告3

2020/1/18寒假自学——学习进度报告4

2020/2/2寒假自学——学习进度报告9