这是我参与「第四届青训营 」笔记创作活动的第4天
大数据的常用处理链路是从数据源获取原始数据记过数据处理进行应用(BI、OLAP、机器学习等)。 常用的计算引擎分为三类: 批计算:
- Hadoop
- Hive
- Spark 流计算:
- Flink OLAP:
- presto
- clickhouse
- impala
- doris
不过这其中也有些许交叉,这里以领域代表来划分
作为计算引擎来说,Spark应该是最有名的,至今spark仍然在相当多的应用里作为计算引擎的后端,比如TiSpark。
Spark 原理主要集中在SparkCore部分。其中最重要的又是RDD,这是spark对用于分布式计算的数据建模。RDD实现了手动的分布式并行度计算编程和自动的分布式并行计算。在RDD之上,Spark提供了相当多的算子,用于增强Spark编程的表达力,降低用户的心智负担。Spark 官方将其分成了转换和行动两类算子,基本上也可以认为是Map和Reduce算子。
Spark RDD 的故障恢复则依赖所谓的阶段划分。阶段的划分具体表现为基于RDD父子关系得到的DAG形成的路径。因为有的算子仅仅依赖前一个rdd比如map,filter,而有的算子则依赖前一步的好几个rdd,比如join,groupByKey。
Spark 的另一个值得探究的东西便是它的SQL模块了。与传统的编程相比,懂得SQL的自然要更多一些,可以让更多人参与其中。而scala、甚至pyspark之类的,尽管拥有相当强的表达力,但是无论是scala过于晦涩的语法还是python过于动态的特性,都可能给初学者带来意料之外的问题。
Spark SQL实际上是在RDD之上构建的一套规范化数据处理建模,它的编程形式是DataFrame和SQL形式是一一对应的。而且由于SQL仅仅是行为的描述而不是具体的定义,这使得它可以套用上过往SQL查询的优化,进一步提高效率。Spark SQL中使用的是catalyst 优化器,强强联手之下,我们特地写出来的sql语句可能不一定有优化之后的性能高。