zoukankan      html  css  js  c++  java
  • Effective Spark RDDs with Alluxio【转】

    转自:http://kaimingwan.com/post/alluxio/effective-spark-rdds-with-alluxio

    1. 介绍

    近期,作者给我推荐了一篇spark on alluxio的文章。原文地址:Effective Spark RDDs with Alluxio

    本文不会全文翻译,主要提取一些文章的内容和观点结合自己的理解做下总结。

    2. 引言

    文章首先说了像百度、去哪儿这些企业都已经在生产上用上了alluxio,效果很好(spark streaming job提升15倍-300倍)。

    在不使用alluxio之前,可能由于内存不足会导致spark job性能变差,甚至无法完成。本文也主要介绍alluxio是如何去改进spark性能,以及使用spark on alluxio的注意点。文中采用spark 2.0, alluxio版本1.2。

    alluxio可以使得spark jobs共享内存数据。通过把RDD保存在alluxio使得RDD可以在多个spark job之间共享。

    3. Alluxio and Spark RDD Cache

    spark提升性能主要是可以把RDD放到Spark executors拥有的内存中,方便下一次访问时可以直接访问。这样就可以起到提升性能的效果。由于可能有很大的数据集,可能有时会导致没有足够的内存用于计算。例如去哪儿之前就遇到过这样的问题,即数据集太大导致无法放入内存。并且如果JOB crash了,这些内存数据也不会持久化。那么下一次访问的时候,就无法从内存取数据来加速了。

    将RDD数据存放在ALLUXIO是个可选的方案。spark job不需要配置额外的内存来存放数据,只需要预留足够的内存用于计算即可。数据存放在alluxio不受job crash的影响。

    将RDD保存到alluxio时比较简单的,只需要将RDD保存到ALLUXIO即可。有两种方式来保存RDD文件:

    1. saveAsTextFile
    2. saveAsObjectFile

    通过以下两种方式,可以从alluxio内存空间读取文件

    1. sc.textFile
    2. sc.objectFile

    下面通过一些实验来理解使用alluxio和使用Spark RDD cache的区别

    实验硬件信息:single r3.2xlarge Amazon EC2 instance, with 61GB of memory and 8 cores.

    4. 保存RDD

    实验分别对比的是:

    1. 使用 Spark rdd cache: 采用persist()保存RDD
    2. 使用alluxio: 采用saveAsTextFile和saveAsObjectFile这两个API

    4.1 采用persist()

    通过persist() API可以在不同的存储媒介上保存RDD:

    作为实验,我们涉及以下的存储方式:

    1. MEMORY_ONLY: 在Spark的JVM内存上存储JAVA对象
    2. MEMORY_ONLY_SER:在Spark的JVM内存上存储序列化后的JAVA对象
    3. DISK_ONLY: 保存在本地磁盘

    例子:

    rdd.persist(MEMORY_ONLY)
    rdd.count()
    

    4.2 采用saveAsTextFile和saveAsObjectFile

    例子:

    rdd.saveAsTextFile(alluxioPath)
    rdd = sc.textFile(alluxioPath)
    rdd.count()
    

    5. 读取保存后的RDD

    RDD保存后,在后续计算中,都可以读取出来使用。我们通过测试读取RDD并且使用count()来统计行数所消耗的时间来衡量性能。下图是实验的结果:

    从图上可以看到,RDD存放在ALLUXIO中,其性能和数据集大小之间的关系是比较稳定的。当RDD存放在Spark JVM内存中时,可以看到当RDD size超过10GB时, MEMORY_ONLY的方式就开始性能下降了。这个主要是由于在Spark Cache当中如果不做序列化,RDD大小会比源文件大很多。所以虽然有61GB的总内存,但是从10G开始就开始性能会下降。

    此外图上也能看到,对于太小的数据集来说,RDD存放在Spark JVM中反而比使用alluxio性能更好一些。

    对于一个给定内存大小的节点来说,alluxio使得应用能够以内存速度处理更多的数据。(图上看起来就是,Spark JVM cache很容易就放不下比较大的数据集)

  • 相关阅读:
    转:孟岩老大的忠告谈谈如何写技术文章
    base html / div / css / HTML / DIV / CSS
    js Connection
    db oracle config
    UNIX + OS IBM AIX 5L HACMP
    JAVA EE JSP collection
    地址和指针的概念
    全局变量
    地址和指针的概念
    内存数组的存储
  • 原文地址:https://www.cnblogs.com/seaspring/p/6186339.html
Copyright © 2011-2022 走看看