通过文章“Spark Scheduler内部原理剖析”我们知道,Spark在DAG调度阶段会将一个Job划分为多个Stage,上游Stage做map工作,下游Stage做reduce工作,其本质上还是MapReduce计算框架。Shuffle是连接map和reduce之间的桥梁,它将map的输出对应到reduce输入中,这期间涉及到序列化反序列化、跨节点网络IO以及磁盘读写IO等,所以说Shuffle是整个应用程序运行过程中非常昂贵的一个阶段,理解Spark Shuffle原理有助于优化Spark应用程序。
Spark Scheduler内部原理剖析
通过文章“Spark核心概念RDD”我们知道,Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建DAG,基于DAG划分Stage,将每个Stage中的任务发到指定节点运行。基于Spark的任务调度原理,我们可以合理规划资源利用,做到尽可能用最少的资源高效地完成任务计算。
Spark核心概念RDD
RDD全称叫做弹性分布式数据集(Resilient Distributed Datasets),它是一种分布式的内存抽象,表示一个只读的记录分区的集合,它只能通过其他RDD转换而创建,为此,RDD支持丰富的转换操作(如map, join, filter, groupBy等),通过这种转换操作,新的RDD则包含了如何从其他RDDs衍生所必需的信息,所以说RDDs之间是有依赖关系的。基于RDDs之间的依赖,RDDs会形成一个有向无环图DAG,该DAG描述了整个流式计算的流程,实际执行的时候,RDD是通过血缘关系(Lineage)一气呵成的,即使出现数据分区丢失,也可以通过血缘关系重建分区,总结起来,基于RDD的流式计算任务可描述为:从稳定的物理存储(如分布式文件系统)中加载记录,记录被传入由一组确定性操作构成的DAG,然后写回稳定存储。
Maven 使用本地jar包
通常maven管理的项目中的依赖都是在远程仓库中的,假如我需要在maven项目中添加一个本地的jar包依赖,该jar包在仓库中是不存在的,可能是项目组前人开发的一个库,但是没发布到maven仓库中。遇到这种情况我们可以通过在pom中指定本地的依赖
运用TensorFlow处理简单的NLP问题
当前“人工智能”是继“大数据”后又一个即将被毁的词,每家公司都宣称要发力人工智能,就跟4-5年前大数据一样,业界叫的都非常响亮,不禁想到之前一个老外说过的话:
Big Data is like teenage sex: Everyone talks about it, nobody really knows how to do it, everyone thinks everyone else is doing it, so everyone claims.
现在看来,上面的”Big Data”可以换成”AI”了,在大家还没搞明白大数据的时候,人工智能就开始引领下一个潮流了。本着跟风的态度,我也尝试去窥探个究竟。