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文件:
- saveAsTextFile
- saveAsObjectFile
通过以下两种方式,可以从alluxio内存空间读取文件
- sc.textFile
- sc.objectFile
下面通过一些实验来理解使用alluxio和使用Spark RDD cache的区别
实验硬件信息:single r3.2xlarge Amazon EC2 instance, with 61GB of memory and 8 cores.
4. 保存RDD
实验分别对比的是:
- 使用 Spark rdd cache: 采用persist()保存RDD
- 使用alluxio: 采用saveAsTextFile和saveAsObjectFile这两个API
4.1 采用persist()
通过persist() API可以在不同的存储媒介上保存RDD:
作为实验,我们涉及以下的存储方式:
- MEMORY_ONLY: 在Spark的JVM内存上存储JAVA对象
- MEMORY_ONLY_SER:在Spark的JVM内存上存储序列化后的JAVA对象
- 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【转】的更多相关文章
- Spark RDDs vs DataFrames vs SparkSQL
简介 Spark的 RDD.DataFrame 和 SparkSQL的性能比较. 2方面的比较 单条记录的随机查找 aggregation聚合并且sorting后输出 使用以下Spark的三种方式来解 ...
- <Spark><Programming><RDDs>
Introduction to Core Spark Concepts driver program: 在集群上启动一系列的并行操作 包含应用的main函数,定义集群上的分布式数据集,操作数据集 通过 ...
- Hive架构及Hive On Spark
Hive的所有数据都存在HDFS中. (1)Table:每个表都对应在HDFS中的目录下,数据是经过序列化后存储在该目录中.同时Hive也支持表中的数据存储在其他类型的文件系统中,如NFS或本地文件系 ...
- Spark之GraphX的Graph_scala学习
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...
- 搭建一个IntelliJ的Spark项目
之前发现创建一个新项目之后,无法添加scala class 创建新项目 选择maven项目,然后选择simple或者quickstart: 进入项目后,在Project Structure里面,在gl ...
- spark 三种数据集的关系(一)
Catalyst Optimizer: Dataset 数据集仅可用Scala或Java.但是,我们提供了以下上下文来更好地理解Spark 2.0的方向数据集是在2015年作为Apache Spark ...
- Spark OFF_HEP变迁
在文章的开头,安利一下我自己的github上的一个项目:AlluxioBlockManager,同时还有我的github上的博客:blog这个项目的作用是替代Spark2.0以前默认的TachyonB ...
- Spark RDD Tutorial
Spark RDD教程 这个教程将会帮助你理解和使用Apache Spark RDD.所有的在这个教程中使用的RDD例子将会提供在github上,供大家快速的浏览. 什么是RDD(Rssilient ...
- 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 ...
随机推荐
- EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手
----------------------------目录------------------------------ EntityFramework 5.0 CodeFirst 教程03-数据结构 ...
- 自己开发Visual studio插件-一个nvelocity高亮插件
首先,有一个项目用到了nvelocity模板引擎,但是用vs开发模板的时候,没有高亮效果,所以非常不方便,鉴于这个,于是有了自己开发插件的念头,但是在vs sdk开发上面,这方面的资料真是少之又少,网 ...
- 【linux】系统初始化的shell脚本
根据参考网上的一些文章,总结出来一个系统初始化的shell脚本 1.初始化脚本 #!/bin/bash cat << EOF +------------------------------ ...
- iOS 10 的一个重要更新-线程竞态检测工具 Thread Sanitizer
本文介绍了 Xcode 8 的新出的多线程调试工具 Thread Sanitizer,可以在 app 运行时发现线程竞态. 想想一下,你的 app 已经近乎大功告成:它经过精良的打磨,单元测试全覆盖. ...
- Redis 集群_主从配置_哨兵模式
首先:slaveof 可以在[从]服务器启动一个service服务,直接将[从]服务器定义为[从Redis] redis-server --slaveof <master-ip> < ...
- Android 获取包名,版本信息
Android 获取包名,版本信息及VersionName名称 <span style="font-size: 14px;">private String ge ...
- c# 中内部类的简单介绍 C#内部类
最近在看java一方面的书籍,看到一个很奇怪的问题,java类中还可以再定义一个类,这种结构非常特殊!后来才发现我知识浅薄了,原来C#中也有内部类,之前都一直没有注意过这个语法结构! 使用内部类有这样 ...
- mysql升级5.5
对付Linux的问题,其实很多都是权限问题,细心想一下即可. centos6.4默认装的是mysql5.1,使用 yum update 也update不了.google了一下,找到个yum安装的方法: ...
- golang 学习笔记 ---数组/字符串/切片
数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.数组的长度是数组类型的组成部分.因为数组的长度是数组类型的一个部分,不同长度或不同类型的数据组成的数组都是不同的类 ...
- PHP与MYSQL中UTF8 中文排序例子
1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gbk和gb2312可以.这跟几种格式的编码有关系.gbk和gb2312本身的编码就是用拼音排序的. 代 ...