转自: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很容易就放不下比较大的数据集)

Effective Spark RDDs with Alluxio【转】的更多相关文章

  1. Spark RDDs vs DataFrames vs SparkSQL

    简介 Spark的 RDD.DataFrame 和 SparkSQL的性能比较. 2方面的比较 单条记录的随机查找 aggregation聚合并且sorting后输出 使用以下Spark的三种方式来解 ...

  2. <Spark><Programming><RDDs>

    Introduction to Core Spark Concepts driver program: 在集群上启动一系列的并行操作 包含应用的main函数,定义集群上的分布式数据集,操作数据集 通过 ...

  3. Hive架构及Hive On Spark

    Hive的所有数据都存在HDFS中. (1)Table:每个表都对应在HDFS中的目录下,数据是经过序列化后存储在该目录中.同时Hive也支持表中的数据存储在其他类型的文件系统中,如NFS或本地文件系 ...

  4. Spark之GraphX的Graph_scala学习

    /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...

  5. 搭建一个IntelliJ的Spark项目

    之前发现创建一个新项目之后,无法添加scala class 创建新项目 选择maven项目,然后选择simple或者quickstart: 进入项目后,在Project Structure里面,在gl ...

  6. spark 三种数据集的关系(一)

    Catalyst Optimizer: Dataset 数据集仅可用Scala或Java.但是,我们提供了以下上下文来更好地理解Spark 2.0的方向数据集是在2015年作为Apache Spark ...

  7. Spark OFF_HEP变迁

    在文章的开头,安利一下我自己的github上的一个项目:AlluxioBlockManager,同时还有我的github上的博客:blog这个项目的作用是替代Spark2.0以前默认的TachyonB ...

  8. Spark RDD Tutorial

    Spark RDD教程 这个教程将会帮助你理解和使用Apache Spark RDD.所有的在这个教程中使用的RDD例子将会提供在github上,供大家快速的浏览. 什么是RDD(Rssilient ...

  9. A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets(中英双语)

    文章标题 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets 且谈Apache Spark的API三剑客:RDD.Dat ...

随机推荐

  1. js代码实现购物车效果

    页面分上下两部分,上部分是所有的数据,下部分是购物车.通过在上面选择需要处理的数据添加进到购物车,实现对购物车数据的统一处理. 需要注意的有两点:①购物车数据可删除,且不能重复添加 ②响应时间考虑,购 ...

  2. 关于Bigdecimal比较大小

    java中对bigdimical比较大小一般用的是bigdemical的compareTo方法: int a = bigdemical.compareTo(bigdemical2);a = 1,表示b ...

  3. 重装wordpress

    1.删除wordpress: https://blog.csdn.net/yeqinghanwu/article/details/77916912 2.uninstall lnmp 3.安装lnmp ...

  4. IT编年史 技术生命周期起步,成长,成熟和衰退四个阶段 IT历史总结

    IT编年史 最近查看了大量的正史或者野史,体会了整个IT夜发展的风气云涌,颇为激动,撰写如下. 感谢google黑板报的浪潮之巅http://googlechinablog.com/2007/07/a ...

  5. android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法

    今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化.最后发现原因是 ListView滚 ...

  6. sql server 删除所有表、视图、存储过程

    如果由于外键约束删除table失败,则先删除所有约束:   --/第1步**********删除所有表的外键约束*************************/   DECLARE c1 curs ...

  7. 基于Amoba实现mysql主从读写分离

    一.Amoeba简介           Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特 ...

  8. 在windows下安装Jupyter Notebook的安装和使用

    1 认识jupyter jupyter /ˈdʒuːpɪtə(r)/可以提供适合捕捉整个计算过程的基于web的应用程序:开发.记录和执行代码,以及结果输出. jupyter Notebook提供了两个 ...

  9. python 生成图表

    python写入excel(xlswriter)--生成图表 折线图 # -*- coding:utf-8 -*- import xlsxwriter # 创建一个excel workbook = x ...

  10. mmap映射文件至内存( 实现 共享内存 与 文件的另类访问 )

    Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...