云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

数据库服务器_网页域名解析错误_哪家好

小七 141 0

apachespark:开发人员的乐事

本文被交叉发布在Cloudera开发者博客中。apachespark以其优于MapReduce的性能优势以及多功能性而闻名于世。然而,另一个不那么重要的好处是优雅的发展。在这篇文章中,您将学习到Spark中使开发纯粹是一种乐趣的一些特性。语言灵活性Spark本机为各种流行的开发语言提供支持。开箱即用,它支持Scala、Java和Python,并且正在进行一些有希望的工作来支持R。这些语言中的一个共同点(除了Java的临时例外,它将很快以java8的形式进行重大更新)是它们都提供了使用"闭包"和lambda函数来表达操作的简洁方法。闭包允许用户根据应用程序的核心逻辑定义函数,从而保留应用程序流,并使代码简洁易读:Python中带有Spark的闭包:行=sc.TEXT文件(...)线路.过滤器(lambda s:s中的"ERROR").count()Scala中带Spark的闭包:val行=sc.TEXT文件(...)线路.过滤器(s=>s.contains("ERROR")).count()Java中的闭包与Spark:JavaRDD行=sc.TEXT文件(...);线路.过滤器(新函数(){布尔调用(字符串s){return s.contains("错误");}}).count();在性能方面,已经做了大量的工作来优化这三种语言在Spark引擎上高效运行。Spark是用Scala编写的,Scala在JVM上运行,因此Java可以在同一个JVM容器中高效地运行。通过巧妙地使用Py4J,Python访问Scala中管理的内存的开销也很小。符合用户目标的API在MapReduce中开发时,您经常被迫将基本操作缝合为自定义的Mapper/Reducer作业,因为没有内置的功能来简化此过程。因此,许多开发人员转向apachecrunch或Cascading等框架提供的高级api来编写MapReduce作业。相比之下,Spark本机提供了丰富且不断增长的操作员库。Spark API包括以下功能:笛卡尔协同组收集计数计数值不同的滤波器平面图折叠分组键参加地图映射分区减少还原比基样品索特比基减去拿联盟还有更多。事实上,在Spark中有超过80个运营商可以开箱即用!虽然其中许多操作通常归结为映射/减少等效操作,但是高级API与用户意图非常匹配,允许您编写更简洁的代码。这里需要注意的一点是,虽然像apachepig这样的脚本框架也提供了许多高级操作符,但是Spark允许您在完整编程语言的上下文中访问这些操作符,因此,您可以像在典型编程环境中那样使用控制语句、函数和类。复杂流的自动并行化在构建复杂的MapReduce作业管道时,正确地并行化作业序列的任务就交给您了。因此,经常需要apacheoozie这样的调度工具来仔细构造这个序列。在Spark中,一系列单独的任务被表示为一个单独的程序流,这个程序流被延迟地计算,这样系统就有了执行图的完整图像。这种方法允许核心调度器正确地映射应用程序中不同阶段的依赖关系,并自动并行化操作符流,而无需用户干预。此功能还具有对引擎进行某些优化的特性,同时减轻应用程序开发人员的负担。赢了,又赢了!例如,考虑以下工作:rdd1.map(拆分线).filter("错误")rdd2.map(拆分线).groupBy(键)rdd2.join(rdd1,key).take(10)这个简单的应用程序表达了六个阶段的复杂流程。但是实际的流程对用户是完全隐藏的-系统会自动确定跨阶段的正确并行化,并正确地构造图形。相反,备用引擎将要求您手动构造整个图形,并指示适当的并行化。交互式外壳Spark还允许您通过一个简单而专用的Scala和Python的sparkshell访问数据集。有了sparkshell,开发人员和用户就可以开始访问他们的数据和操作数据集,而无需编写一个端到端的应用程序。在不编译一行代码的情况下探索TB级的数据意味着您可以通过在编写程序之前对程序进行测试来理解应用程序流。只要打开一个shell,输入几个命令,你就可以开始比赛了!性能虽然这篇文章关注的是Spark如何不仅提高性能,而且提高可编程性,但我们不应忽视提高开发人员效率的最佳方法之一:性能!开发人员经常需要在开发周期中多次运行应用程序,使用数据子集以及完整的数据集,以反复遵循开发/测试/调试周期。在大数据环境中,每个周期都非常繁重,例如,每个测试周期都要数小时。虽然有各种方法可以缓解这个问题,但最好的方法之一就是快速运行程序。由于Spark的性能优势,开发生命周期可以大大缩短,这仅仅是因为测试/调试周期要短得多。你的最终用户也会爱你的!示例:字数为了让您在一个具体的例子中了解这些好处的实际影响,下面两段代码反映了MapReduce中的WordCount实现和Spark中的WordCount实现。区别是不言而喻的:用MapReduce方法计算字数:公共静态类WordCountMapClass扩展了MapReduceBase实现映射器{private final static IntWritable one=newIntWritable(1);私有文本word=newText();public void map(LongWritable key,文本值,输出集电极输出,记者)抛出IOException{字符串行=值.toString();StringTokenizer itr=newStringTokenizer(行);同时(哈斯莫尔代币()) {单词集(下一个目标());输出.收集(一个字);}}}公共静态类WordCountReduce扩展了MapReduceBase机具减速器{public void reduce(文本键,迭代器值,输出集电极输出,记者)抛出IOException{整数和=0;同时(值.hasNext()) {总和+=值。下一个().get();}输出.收集(键,newIntWritable(sum));}}字数的火花方式:val spark=newSparkContext(master、appName、home、jars)val文件=spark.text文件("hdfs://。。。")val计数=文件.flatMap(行=>线.分割(" ")).map(单词=>(单词,1)).reduceByKey(+\u)counts.saveAsTextFile("hdfs://。。。")Cloudera的一位脾气暴躁的数据科学家urilaserson最近写了他的第一份PySpark工作,此前他与原始MapReduce进行了几年的斗争。在Spark发布两天后,他宣布他不想再写另一个MapReduce作业了。乌里,我们支持你了,伙计:Spark将在CDH 5内装运。进一步阅读火花快速启动Scala的Spark APISpark API for JavaPython的Spark APIJai Ranganathan是Cloudera的产品总监。Matei Zaharia是Databricks的首席技术官。免费试用Databricks。今天就开始吧