使用Apache Ignite优化Spark作业性能(第1部分)

快来看看他们是如何工作的!

本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 如果您对这篇文章感兴趣,请查看本书的其余部分,以获取更多有用的信息。

Apache Ignite提供了几种提高Spark作业性能的方法:Ignite RDD(将Ignite缓存表示为Spark RDD抽象)和Ignite IGFS(可透明地插入Spark部署中的内存文件系统)。 Ignite RDD允许轻松地在不同的Spark作业或应用程序之间共享内存中的状态。 使用Ignite内存共享RDD,任何Spark作业都可以将一些数据放入Ignite缓存中,其他Spark作业以后可以访问。 Ignite RDD是作为Ignite分布式缓存上的视图实现的,该缓存可以部署在Spark作业执行过程中或Spark工作者上。

使用Apache Ignite优化Spark作业性能(第1部分)

在继续讨论更高级的主题之前,让我们看一下Spark的历史以及Ignite RDD可以解决哪些类型的问题。

AMPLab发明了Apache Spark来进行快速计算。 它建立在Hadoop MapReduce之上,并扩展了MapReduce模型以有效使用更多类型的操作,例如交互式查询和流处理。

Spark和Hadoop MapReduce之间的主要区别在于,在执行过程中,Spark尝试将数据保留在内存中,而Hadoop MapReduce将数据混入和移出磁盘。 Hadoop MapReduce花费大量时间将中间数据写入磁盘并回读。 消除了这些冗余磁盘操作,使Spark幅值更快。 Spark可以将数据(中间)存储到内存中,而无需任何I / O,因此您可以非常快速地对相同数据进行操作。

为了将数据存储到内存中,Spark提供了名为Spark RDD的特殊数据集。 Spark RDD代表Spark弹性分布式数据集。 Spark RDD具有Apache Spark大规模数据处理框架的基本组件。 下图显示了Spark RDD上的迭代操作。

使用Apache Ignite优化Spark作业性能(第1部分)

请注意,上图是从Spark文档获得的。 Spark RDD是一个不变的,容错的分布式数据元素集合。 您可以将Spark RDD想象为内存中的Hadoop HDFS。 Spark RDD支持两种类型的操作:

  1. 转换,从现有数据集中创建新数据集
  2. 动作,通过对RDD进行计算来返回值(如下图所示)

使用Apache Ignite优化Spark作业性能(第1部分)

通过使用Spark转换功能来创建Spark RDD。 Spark转换功能可以从各种来源(例如文本文件)创建Spark RDD。 除了从文本文件创建Spark RDD外,还可以从外部存储(例如RDBMS,HBase,Cassandra或与Hadoop输入格式兼容的任何其他数据源)创建Spark RDD。

大多数时候,Spark RDD会从一个RDD转换为另一个新的Spark RDD,以便为将来的处理准备数据集。 让我们考虑一下Spark中的以下数据转换步骤:

  1. 加载文本文件,其中包含RDD1中任何机场的航空公司名称和到达时间。
  2. 将包含任何机场的航空公司名称和航班延误信息的文本文件加载到RDD2中。
  3. 通过航空公司名称将RDD1和RDD2加入,以获得RDD3。
  4. 映射到RDD3以获得每个航空公司的RDD4不错的报告。
  5. 将RDD4保存到文件。
  6. 映射RDD2以提取某些航空公司的航班延误信息,以获取RDD5。
  7. 将RDD5汇总起来,就可以算出每家航空公司的延误航班数为RDD6。
  8. 将RDD6保存到HDFS。

Spark RDD用于通过Spark操作(例如)对RDD数据集执行计算
count
reduce 但是Spark RDD有一个问题:Spark RDD无法在Spark Jobs或SparkContext之间共享,因为Spark RDD已绑定到Spark应用程序。 使用本机Spark分发,在不同Spark作业之间共享RDD的唯一方法是将数据集写入HDFS或文件系统中的某个位置,然后将RDD拉到其他作业中。 但是,通过使用Alluxio(以前称为Tachyon)或Apache Ignite可以实现相同的功能。

Apache Ignite的以内存为中心的体系结构以非常有效的方式实现了RDD共享。 Apache Ignite提供IgniteContext和IgniteRDD在Spark应用程序之间共享RDD。

  1. IgniteContext :IgniteContext是Spark-Ignite集成的主要入口点。 要创建Ignite上下文的实例,用户必须提供SparkContext的实例和创建IgniteConfiguration(配置工厂)的闭包。 Ignite上下文将确保所有涉及的作业实例中都存在服务器或客户端Ignite节点。 或者,可以将XML配置文件的路径传递给IgniteContext构造函数,该构造函数将用于正在启动的节点。
  2. IgniteRDD :IgniteRDD是Spark RDD抽象的实现,表示Ignite缓存的实时视图。 IgniteRDD并非一成不变; Ignite缓存中的所有更改(无论它们是由另一个RDD还是由缓存的外部更改引起的)都将立即对RDD用户可见。 IgniteRDD利用Ignite缓存的分区性质,并将分区信息提供给Spark执行程序。 IgniteRDD中的分区数量等于基础Ignite缓存中的分区数量。 IgniteRDD还通过以下方式向Spark提供关联信息
    getPrefferredLocations以便RDD计算使用数据局部性。

在本系列的下一部分中,我们将安装Apache Spark并执行以下操作:

  1. 跑过
    wordcount示例来验证Spark安装。
  2. 配置Apache Ignite以在Spark应用程序之间共享RDD。
  3. 通过Spark Shell运行Spark应用程序以使用Ignite RDD。
  4. 开发一个Scala Spark应用程序,将一些Ignite RDD放入Ignite群集中,然后从另一个Scala Spark应用程序中提取它们。

翻译自: https://www.javacodegeeks.com/2017/12/optimizing-spark-job-performance-apache-ignite-part-1.html