博客
关于我
Spark Learning
阅读量:737 次
发布时间:2019-03-22

本文共 3868 字,大约阅读时间需要 12 分钟。

Spark RDD详细解析:从基础到高级操作

一、Spark与Hadoop的区别

Spark和Hadoop是两大主流的大数据处理框架,但它们在性能和特性上有显著差异。Spark的速度比Hadoop快,因为Spark通过其函数式编程特性优化了处理流程,而Hadoop主要依赖于分布式存储和容错功能。这种差异直接影响了两种框架在处理大规模数据时的表现。

二、Spark RDD的核心特性

Spark的Resilient Distributed Dataset(RDD)是其核心数据结构。RDD具有两大特性:转换(Transformation)动作(Action)。转换操作如filter、map等是惰性执行的,Spark会根据优化策略延迟执行,提升处理效率;而动作操作如count、foreach等是立即执行的,直接产生最终结果。

三、Spark Job执行流程

Spark的任务执行遵循明确的流程:首先,SparkContext接收任务请求,分发到Executor进行处理。随着任务的执行,Spark通过内存缓存数据,减少IO操作,提升处理速度。通过多次调用和优化,Spark能够高效管理内存资源,确保任务按时完成。

四、常用API概述

4.1 转换操作

  • groupBy、groupByKey、reduceBy、reduceByKey:这些操作将数据按照指定键进行分组,reduceByKey方法会立即计算键的聚合结果,适用于大数据量处理。

4.2 动作操作

  • count、countByKey、foreach:这些操作立即执行,直接产生结果,是数据处理的终点。

五、Pair RDD应用

Pair RDD是一种将键值对存储在RDD中的数据结构,支持高效的并行处理。这种结构在处理大量结构化数据时尤为有效,例如在自然语言处理和网页数据分析中,Pair RDD能够显著提升处理速度。

六、优化与应用

通过合理搭配Spark的高级API,可以显著提升数据处理效率。例如,使用inverted index结合reduceByKey排序,可以将传统的逐行查找速度提升一倍。这种优化不仅提升了处理速度,还降低了资源消耗。

七、性能对比与总结

通过对比不同处理方法的性能,可以发现使用inverted index和reduceByKey的组合能够显著提升处理效率。同时,通过将数据处理和索引构建整合为一个步骤,可以进一步减少资源消耗和处理时间。

八、代码示例分析

以下代码示例展示了如何利用Spark RDD进行数据处理:

package wikipedia;
import java.util.stream.Collectors;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.SparkContext._;
import org.apache.spark.rdd.RDD;
import org.apache.spark.storage.StorageLevel;
case class WikipediaArticle(title: String, text: String) {
def mentionsLanguage(lang: String): Boolean = text.split(' ').contains(lang)
}
object WikipediaRanking {
val langs = List(
"JavaScript", "Java", "PHP", "Python", "C#", "C++", "Ruby", "CSS",
"Objective-C", "Perl", "Scala", "Haskell", "MATLAB", "Clojure", "Groovy"
)
val conf: SparkConf = new SparkConf().setAppName("Spark RDD").setMaster("local[*]").set("spark.executor.memory", "2g")
val sc: SparkContext = new SparkContext(conf)
val wikiRdd: RDD[WikipediaArticle] = sc.textFile(WikipediaData.filePath).flatMap(lines => lines.split("\n")).map(x => WikipediaData.parse(x))
def occurrencesOfLang(lang: String, rdd: RDD[WikipediaArticle]): Int =
rdd.aggregate(0)((acc, article) =>
if (article.mentionsLanguage(lang)) acc + 1 else acc,
(acc1, acc2) => (acc1 + acc2))
def rankLangs(langs: List[String], rdd: RDD[WikipediaArticle]): List[(String, Int)] =
langs.map((lang) => (lang, occurrencesOfLang(lang, rdd))).sortWith((x, y) => x._2 > y._2)
def makeIndex(langs: List[String], rdd: RDD[WikipediaArticle]): RDD[(String, Iterable[WikipediaArticle])] = {
rdd.map((w) => (w, langs.filter((o) => w.mentionsLanguage(o)).toList))
.map(x => x._2.map((ls) => (ls, x._1)))
.flatMap(x => x)
.groupByKey()
}
def rankLangsUsingIndex(index: RDD[(String, Iterable[WikipediaArticle])]): List[(String, Int)] = {
index.map((o) => (o._1, o._2.size)).sortBy(_._2, false).collect().toList
}
def rankLangsReduceByKey(langs: List[String], rdd: RDD[WikipediaArticle]): List[(String, Int)] = {
rdd.map((w) => (w, langs.filter((o) => w.mentionsLanguage(o)).toList))
.map(x => x._2.map((ls) => (ls, x._1)))
.flatMap(x => x)
.map((m) => (m._1, 1))
.reduceByKey(_ + _)
.sortBy(_._2, false)
.collect().toList
}
def main(args: Array[String]) {
val langsRanked: List[(String, Int)] = rankLangs(langs, wikiRdd)
val langsRanked2: List[(String, Int)] = rankLangsUsingIndex(makeIndex(langs, wikiRdd))
val langsRanked3: List[(String, Int)] = rankLangsReduceByKey(langs, wikiRdd)
println(timing)
sc.stop()
}
val timing = new StringBuffer
def timed[T](label: String, code: => T): T = {
val start = System.currentTimeMillis()
val result = code
val stop = System.currentTimeMillis()
timing.append(s"Processing $label took ${stop - start} ms.\n")
result
}
}

结论

通过以上优化,Spark RDD的处理效率得到了显著提升。无论是直接处理数据,还是通过构建索引和减少中间过程,都能够有效降低处理时间。选择合适的方法和优化策略,对于大数据项目的性能至关重要。

转载地址:http://urywk.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_实际操作_03---大数据之Nifi工作笔记0035
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>