mirror of
https://github.com/DistSysCorp/ddia.git
synced 2024-12-25 20:30:39 +08:00
Update ch10.md
This commit is contained in:
parent
00ac114dec
commit
d28919c999
9
ch10.md
9
ch10.md
@ -638,7 +638,6 @@ Spark、Flink 和 Tez 都会避免将中间状态写到 HDFS 中,因此他们
|
||||
|
||||
当工作流任务完成后,其输出通常要进行持久化,以让用户能够**引用并使用**——最常见的,就是写回分布式文件系统。因此,当使用数据流引擎时,数据流的输入和最终输出通常都会物化在 HDFS 上。和 MapReduce 一样,数据流任务的输入也是**不可变的**,输出不会在原地更新,而会写入其他地方。相比 MapReduce,这些数据流引擎的提升就是避免将所有子任务的中间状态也写入分布式文件系统中。
|
||||
|
||||
---
|
||||
|
||||
## 图计算和迭代处理
|
||||
|
||||
@ -664,7 +663,7 @@ Spark、Flink 和 Tez 都会避免将中间状态写到 HDFS 中,因此他们
|
||||
|
||||
在第二章的例子中,就是沿着 localion_in 的边来找到所有从属于北美大陆的地点列表。
|
||||
|
||||
如果我们想用 Hadoop 生态来进行图计算,使用分布式文件系统**存储图数据**很容易(比如使用文件来顺序的存点和边),但是使用 MapReduce 来**处理这些图数据**,并且很难表达“不断迭代处理,直到某些条件满足时停止”的语义。因为 MapReduce 只着眼于针对数据的单次处理,而很难表达这种**递归**或者**迭代**的语义。这种迭代风格的算法通常包含以下几步:
|
||||
如果我们想用 Hadoop 生态来进行图计算,使用分布式文件系统**存储图数据**很容易(比如使用文件来顺序的存点和边),但是使用 MapReduce 来**处理这些图数据**,就很难表达“不断迭代处理,直到某些条件满足时停止”的语义。因为 MapReduce 只着眼于数据的单次处理,而很难表达这种**递归**或者**迭代**的语义。这种迭代风格的算法通常包含以下几步:
|
||||
|
||||
1. **执行一轮**:全局调度器针对算法的一个步骤调度一个批处理任务。
|
||||
2. **条件检查**:在一次迭代执行完成后,调度器会检查某些条件是否满足,来判断算法是否可以停止。(比如是否还有边需要遍历、结果指标是否收敛等等)。
|
||||
@ -688,7 +687,7 @@ Pregel 中限定只能通过消息传递(而不是通过主动拉取)来进
|
||||
|
||||
即使在消息传输的过程中,可能会出现丢失、重复和不定时延迟,Pregel 仍然能够保证所有消息在目的节点上严格的被处理一次。和 MapReduce 一样,Pregel 会进行对上层无感的错误恢复,以期简化所有基于 Pregel 的上层算的实现。
|
||||
|
||||
容错的方式也很简洁——在每个迭代轮次末尾,将所有顶点的状态做 checkpoint,且持久化到外存。如果某个节点故障,内存中的状态丢失,最简单的恢复方式就是**回滚该轮次所有计算**,恢复到上一个 checkpoint,然后重启该轮次的所有计算。如果计算是**确定性**的,且消息也被记录了下来,则代价相对的小的方式是只对故障节点所在分片的数据进行重新计算(就像之前讨论过的数据流工具,比如 Spark 中的 Partition 容错方式一样)。
|
||||
容错的方式也很简洁——在每个迭代轮次末尾,将所有顶点的状态做 checkpoint,且持久化到外存。如果某个节点故障,内存中的状态丢失,最简单的恢复方式就是**回滚该轮次所有计算**,恢复到上一个 checkpoint,然后重启该轮次的所有计算。如果计算是**确定性**的,且消息也被记录了下来,则代价相对的小的方式是只对故障节点所包含部分的数据进行重新计算(就像之前讨论过的数据流工具,比如 Spark 中的 Partition 容错方式一样)。
|
||||
|
||||
### 并行执行
|
||||
|
||||
@ -726,7 +725,7 @@ Pregel 中限定只能通过消息传递(而不是通过主动拉取)来进
|
||||
|
||||
这些高层的 API 不仅让用户可以更高效的使用体验,还能够提升任务在物理层面的执行效率。
|
||||
|
||||
### 向声明式查询语言靠拢
|
||||
### 向声明式方向靠拢
|
||||
|
||||
相比直接实现代码进行 Join,使用关系型的 Join 算子给了处理框架分析数据集特点、选择最高效 Join 算的**优化空间**。Hive,Spark 和 Flink 都有基于代价的优化器,可以对执行路径进行优化。甚至,可以交换 Join 的顺序,来最小化中间数据集的物化。
|
||||
|
||||
@ -751,7 +750,7 @@ Spark 使用 JVM 字节码、Impala 使用 LLVM 来通过生成代码的方式
|
||||
|
||||
另外一个越来越重要的方向是**数值统计算法**,其在推荐和分类的机器学习算法中常常用到。可复用的实现逐渐多了起来:例如 Mahout 在 MapReduce、Spark 和 Flink 之上实现了很多机器学习算法;MADlib 也在 MPP 数据库之上实现了类似的功能模块。
|
||||
|
||||
其他有用的算法还有—— **k 最近邻算法**(*k-nearest neighbors*)——一种在多维空间中搜索与给定数据条目相似度最高的数据算法,是一种近似性搜索算法。近似搜索对于基因组分析算法也很重要,因为在基因分析中,常需要找不同但类似的基因片段。
|
||||
其他有用的算法还有—— **k 最近邻算法**(*k-nearest neighbors*)——一种在多维空间中搜索与给定数据条目相似度最高的数据算法,是一种近似性搜索算法。近似搜索对于基因组分析算法也很重要,因为在基因分析中,常需要找不同但类似的基因片段。近年来较火的向量数据库也是主要基于该算法。
|
||||
|
||||
批处理引擎被越来越多的用到不同领域算法的分布式执行上。随着批处理系统越来越多支持**内置函数**和**高层声明式算子、**MPP 数据库变的越来越**可编程**和**灵活度高**,他们开始长的越来越像——说到底,本质上他们都是用于存储和处理数据的系统。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user