作者:吴泽锋,新炬网络高级技术专家。
R语言是一个非常优秀的统计分析和统计绘图的编程语言,它支持很多扩展以便支持数据处理和机器学习任务。然而目前R语言的核心运行环境是单机的,能处理的数据量受限于单机的内存容量。大数据时代的海量数据处理对R构成了巨大的挑战。为了能够使用R语言分析大规模分布式的数据,UC Berkeley给我们带来了SparkR,SparkR就是用R语言编写Spark程序,它很好解决了R语言的短板,大数据分布式存储和处理,水平扩展能力。
SparkR最初是由AMPlab开发的项目,旨在整合R的易用性和Spark的可扩展能力。这一项目后来得到了开源社区的大力支持,性能大幅提高。最近,SparkR项目被并入Apache Spark孵化项目并在1.4版本中作为alpha的组件发布。
SparkR的核心是SparkR DataFrames,是一个基于Spark的分布式数据框架。在概念上和关系型数据库中的表类似,或者和R语言中的data frame类似。Data Frames作为R的数据处理基本对象其概念已经被扩展到很多的语言。
DataFrames的数据来源是非常广泛的:
? JSON文件、Parquet文件、Hive数据表。
? 本地文件系统、分布式文件系统(HDFS)以及云存储(S3)。
? 通过JDBC读取外部关系型数据库系统。
? 通过Spark SQL的外部数据源(external data sources) API。
? 第三方扩展已经包含Avro、CSV、ElasticSearch和Cassandra。
在SparkR DataFrames 上执行的所有操作都会自动分发到Spark群集中的所有机器上进行处理。依赖spark原有的分布式内存计算框架,可以轻易用于TB数据的处理及水平服务器的扩展。
与R/Python中data frame使用的eager方式不同,Spark中的DataFrames执行会被查询优化器自动优化。在DataFrame上的计算开始之前,Catalyst优化器会编译操作,这将把DataFrame构建成物理计划来执行。因为优化器清楚操作的语义和数据的结构,所以它可以为计算加速制定智能的决策。
首先,Catalyst提供了逻辑优化,比如谓词下推(predicate pushdown)。优化器可以将谓词过滤下推到数据源,从而使物理执行跳过无关数据。在使用Parquet的情况下,更可能存在文件被整块跳过的情况,同时系统还通过字典编码把字符串对比转换为开销更小的整数对比。在关系型数据库中,谓词则被下推到外部数据库用以减少数据传输。
第二,为了更好地执行,Catalyst将操作编译为物理计划,并生成JVM bytecode,这些通常会比人工编码更加优化。例如,它可以智能地选择broadcast joins和shuffle joins来减少网络传输。其次,同样存在一些较为低级的优化,如消除代价昂贵的对象分配及减少虚拟函数调用。
? 数据缓存控制:cache(),persist(),unpersist()
? 数据保存:saveAsTextFile(),saveAsObjectFile()
? 常用的数据转换操作,如map(),flatMap(),mapPartitions()等
? 数据分组、聚合操作,如partitionBy(),groupByKey(),reduceByKey()等
? RDD间join操作,如join(), fullOuterJoin(), leftOuterJoin()等
? 排序操作,如sortBy(), sortByKey(), top()等
? Zip操作,如zip(), zipWithIndex(), zipWithUniqueId()
? 重分区操作,如coalesce(), repartition()
总体上看,SparkR程序和Spark程序结构很相似。程序简洁易懂。毫无疑问,这将大幅度地降低大数据统计分析使用门槛。
借助Spark内存计算、统一软件栈上支持多种计算模型的优势,高效地进行分布式数据计算和分析,解决大规模数据集带来的挑战。SparkR必将成为大数据时代的数据分析统计又一门新利器。
上一篇:敏捷开发经验之谈
下一篇:如何结合Scrum和Kanban实施敏捷开发