CSDN话题挑衅赛第2期
参赛话题:大数据技能分享
Hadoop MapReduce虽然已经可以满意大数据的应用场景,但是其执行速率和编程复杂度并不让人们满意。Spark因其拥有更快的执行速率和更友爱的编程接口,在推出后短短两年就迅速抢占MapReduce的市场份额,成为主流的大数据计算框架。
Spark和MapReduce相比,有更快的执行速率。下图是Spark和MapReduce举行逻辑回归呆板学习的性能比较,Spark比MapReduce快100多倍。
除了速率更快,Spark和MapReduce相比,另有更简朴易用的编程模型。利用Scala语言在Spark上编写WordCount程序,重要代码只必要三行。
- val textFile = sc.textFile("hdfs://...")
- val counts = textFile.flatMap(line => line.split(" "))
- .map(word => (word, 1))
- .reduceByKey(_ + _)
- counts.saveAsTextFile("hdfs://...")
复制代码 第1行代码:根据HDFS路径天生一个输入数据RDD。
第2行代码:在输入数据RDD上执行3个利用,得到一个新的RDD。
- 将输入数据的每一行文本用空格拆分成单词。
- 将每个单词举行转换,天生<Key, Value>的结构。
- 雷同的Key举行统计。
第3行代码:将这个RDD生存到HDFS。
RDD是Spark的焦点概念,是弹性数据集(Resilient Distributed Datasets)的缩写。RDD既是Spark面向开发者的编程模型,又是Spark自身架构的焦点元素。
我们先来看看作为Spark编程模型的RDD。我们知道,大数据计算就是在大规模的数据集上举行一系列的数据计算处置惩罚。MapReduce针对输入数据,将计算过程分为两个阶段,一个Map阶段,一个Reduce阶段,可以理解成是面向过程的大数据计算。我们在用MapReduce编程的时候,思考的是,如何将计算逻辑用Map和Reduce两个阶段实现,map和reduce函数的输入和输出是什么,这也是我们在学习MapReduce编程的时候一再强调的。
而Spark则直接针对数据举行编程,将大规模数据集合抽象成一个RDD对象,然后在这个RDD上举行各种计算处置惩罚,得到一个新的RDD,继续计算处置惩罚,直到得到最后的结果数据。所以Spark可以理解成是面向对象的大数据计算。我们在举行Spark编程的时候,思考的是一个RDD对象必要颠末什么样的利用,转换成另一个RDD对象,思考的重心和落脚点都在RDD上。
所以在上面WordCount的代码示例里,第2行代码现实上举行了3次RDD转换,每次转换都得到一个新的RDD,因为新的RDD可以继续调用RDD的转换函数,所以一连写成一行代码。究竟上,可以分成3行。
- val rdd1 = textFile.flatMap(line => line.split(" "))
- val rdd2 = rdd1.map(word => (word, 1))
- val rdd3 = rdd2.reduceByKey(_ + _)
复制代码 RDD上界说的函数分两种,一种是转换(transformation)函数,这种函数的返回值照旧RDD;另一种是执行(action)函数,这种函数不再返回RDD。
RDD界说了很多转换利用函数,比如有计算map(func)、过滤filter(func)、归并数据集union(otherDataset)、根据Key聚合reduceByKey(func, [numPartitions])、毗连数据集join(otherDataset, [numPartitions])、分组groupByKey([numPartitions])等十几个函数。
我们再来看看作为Spark架构焦点元素的RDD。跟MapReduce一样,Spark也是对大数据举行分片计算,Spark分布式计算的数据分片、任务调度都是以RDD为单元睁开的,每个RDD分片都会分配到一个执行进程去处置惩罚。
RDD上的转换利用又分成两种,一种转换利用产生的RDD不会出现新的分片,比如map、filter等,也就是说一个RDD数据分片,颠末map大概filter转换利用后,结果还在当前分片。就像你用map函数对每个数据加1,得到的照旧如许一组数据,只是值不同。现实上,Spark并不是按照代码写的利用次序去天生RDD,比如rdd2 = rdd1.map(func)如许的代码并不会在物理上天生一个新的RDD。物理上,Spark只有在产生新的RDD分片时候,才会真的天生一个RDD,Spark的这种特性也被称作惰性计算。
另一种转换利用产生的RDD则会产生新的分片,比如reduceByKey,来自不同分片的雷同Key必须聚合在一起举行利用,如许就会产生新的RDD分片。现实执行过程中,是否会产生新的RDD分片,并不是根据转换函数名就能判断出来的,详细我们下一期再讨论。
总之,你必要记住,Spark应用程序代码中的RDD和Spark执行过程中天生的物理RDD不是一一对应的,RDD在Spark内里是一个非常灵活的概念,同时又非常重要,必要认真理解。
当然Spark也有自己的生态体系,以Spark为基础,有支持SQL语句的Spark SQL,有支持流计算的Spark Streaming,有支持呆板学习的MLlib,另有支持图计算的GraphX。利用这些产品,Spark技能栈支撑起大数据分析、大数据呆板学习等各种大数据应用场景。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |