Databricks推荐的Spark GraphX库的入门学习资料。原书共7章,这里翻译了前4章。后面几章有时间的话可能会继续,可以关注我的blog了解进度,但不保证哈~。昨晚上传了一版后发现保存后的目录乱的很,这是修改过的,重新上传。译序嗯,继上一本《 Learning Spark》之后,又一个译序,脸皮又厚∫一些了。上·本《 Learning spark》计划是翻译第三章到第九章,实际上完成到第八章。我在译序中写道:“因为没有讲我最喜欢的 GraphX,所以这几章我也不想再继续翻了”。后来,看到了这本《 Apache Spark Graph Processing》,全书总共有七章。看标题就知道我蛮喜欢的哈,于是给自己订了个小目标,就是翻译前四章后上传。已经忘∫是哪天开始的,大概是过乍那阵子吧,年后来北京出差都已绎好几个月了,反正有好久啦。在来北京出差之前,就已绎边看边翻译完了前三章。出差还是挺忙的,有一阵没一阵的,总算是把第四章看完了,写了下米。不啰嗦了,跟上一本一样,翻译的时候,我尽量保持内容和原作所在的页码一致,方便各位对照原文纠错。没翻译的章节是第5章创建自定义的图聚合架作,第6章用 Pregel进行图的并行送代处理,以及第7章学习图的结构。有兴趣的可以看看原书吧。或者我以后也会更新,不着急的可以关注下我的blog。但是不保证哈~~另外,本书算是 Spark的入门内容,看本书的应该也是初学者。推荐 Databricks提供的一个压缩包:htt:training.databricks.com//workshop/usbzip。这是个Spark的练习环境,有代码样例,测试数据。只需要你有个单机的 Linux环境,然后下载这个压缩包,解压后就能用∫。顺便也广告一下 Spark的入门书籍 Learning Spark.》的中文版PDF版本还可以在CSDN下载:http://download.csdnnet/detail/codinghello/9161615放上去以后,看到下载次数也有几百次了,还有人评论说翻得不错。我也还蛮厂心的,哈哈”大家好才是真的好哈很明显英语不是我的母语,所以翻译的不正确请原谅,我只能说我尽力了,谢谢!当然,如果你愿意告诉我哪里错了,那真是太感谢了,好人一牛平安~!如果有啥要指教我的,可以emai: coding hello@126.cm有更新的话,会放在我的CSDN博客http://blog.csdnnet/codinghello/article!或者直接在CSDN资源里搜书名吧,那里也会放份方便查找下载的。祝各位阅读愉快,欢迎交流!ding2016-07-31初识 Spark和GraphXApache Spark是处理大型分布式数据集的集群计算平台。在 Spark中进行数据乂快又简单,这归功于其优化的并行计算引擎和灵活而统一的APl。 Spark的核心抽象是基于弹性分布式数据集(RDD的概念。通过扩展 Map Reduce框架, Spark的核心AP使得分析任务更易于编写。在核心API的顶层, Spark提供了一组综合的高级库,可用于一些特定任务,如图计算和机器学习。其中, GraphX就是Spark处理图并行计算的库。本章中将通过构建一个社交网络和探索该网终中人之间的关系来介绍 Spark和GraphX。另外,你也将学到川 Scala build too|(SBT)来构建和运行 Spark程序。在本站最后,你将了解如何:成功安装 Spark到你的计算机用 Shark shel实验,回顾 Spark的数据抽象创建图并基于RDD和图操作来探索这些联系用SBT构建和提交独立的Spak应用下载和安装 Spark141接下来的章节,我们将整理 Spark安装的详细过程。 Spark是构建于Sca|a,运行在Java虚拟机(VM)里。在安装 Spark前,你应该先安装 Java Development kit(JDK)在你电脑上[1]确定你安装的是」DK,而不是 Java Runtime Environment(JRE)。你可以从http://www.oracle.com/technetwork/java/javase/downloads/idk7-downloads-1880260hm下载。下一步,从 Spark项目网站htts:// spark. apache.org./ downloads. htm下载最新发布的 Spark版本。执行下亩三步来安装 Spark到你的电脑里1.选择包类型:Pre- built for Hadoop26 and later,然后选择下载类型: DirectDownload。确定你选择的是 Hadoop预编译版本,而不是源代码2.下载压缩的TAR文件 spark-1.4.1-bin- hadoop26tgz,放到休电脑上的一个目录中3.打开一个终端,进入到刚才的目录。用下面的命令解压TAR文件,重命名 Spark根目录为 spark-141,然后列示安装的文件和子目录:tar-Xf spark-1.4.1-bin-hadoop26 t gzmv spark-1. 4.1-bin-hadoop 2.6 spark-1 4.1cd spark-1.4.1就是这样!现在你已经安装了 Spark和它的库到你的电脑上了。注意在 spark-141的主目录中的下列文件和子目录:core:该目录包含了Spak核心组件和API的源代码bin:该目录包含了一些可执行文件,用于提交和分发Spak应用程序或者在 Spark shel中与Spak交互graphx,mib,sol和 streaming:这些是 Spark的库,提供∫做不同类型的数据处理的统一的接口,即图处理,机器学习,查询和流处理。● examples:该目录包含了demo和Spak应用的示例。创建快捷方式到 Spark主目录和示例目录通常会很方便。在Lnux或者Mac中,打开或创建/bash_ profile文件,插入如下几行export SPARKHOME="/TWhere you put Spark]/spark-141/export SPARKSCALAEX="Is /spark1.4. 1/examples/ src/main/scala/org/apache/spark/examples/然后执行下面的命令使之前的快捷方式生效:source/bash_profile结果就是,你可以在终端或者 Spark shell中快速的访问这些目录了。例如,名为Livejourna| PageRank. sca|a的小例可以被访问为:SSPARKSCALAEX/graphx / LiveJournalPage Rank scala试用 Spark shell学习 Spark的最好的途径就是通过 Spark shell。这有Scaa和 Python两种不同的she。但是由于本书编写时, GraphX库大部分是用 Scala完成,所以我们要使用的 Spark shel!是 Scala shell。让我们用命令行从 SSPARKHOME/bn里面启动 Sparkshe吧SSPARKHOME/bin/spark-shell如果你设置当前目录(cd)到 SSPARKHOME,你可以简单的启动she像这样:cd SSPARKHOME./bin/spark-shell如果你碰巧遇到错误提示类似: Failed to find Spark assembly inspark-1.4.1/assembly/target/scala-210 You need to build Sparkbefore running this program,那就意味着你下载的是源代码而不是 Spark的预编译版本。这种情况下,回到项目网站再选择个Spak预编译版木下载。如果你启动 Spark she成功了,你应该会看到像这样的欢迎信息Welcome to,/!!八\ versIOn1.4.1Using Scala version 2.10.4 (Java HotSpot (TM)64-Bit Server vM, Java)[3]要来个完整性检査,你可以输入一些 Scala表达式或声明并求值。现在就在shel中输入一些命令吧:scala> scres1: org. apache. spark. SparkContext =org. apache. spark. Spark Context@52e52233scala> val myRDD sc parallelize ( List(1, 2 3, 4, 5))myRDD: org. apache. spark rdd RDD[Int]= ParallelCollection RDD[o] at parallelize at: 12scala> sc text File( REAdme. md").filter(line = line contains"Spark").countOres2: Long= 21以下就是上述代码表达的内容:首先,我们显示了被定义为变量sc的 SparkContext,该变量在你启动 Spark shel时被自功创建。 SparkContext是 Spark aP的入口点。其次,我们创建了名为 my RDD的RDD对象,是通过对一个5个数字的|st调川 parallelize函数获得的。最后,我们加载」 README md文件到RDD对象,过滤出了包含单词” Spark"的行,最后对过滤后的RDD调用 count动作来计算这些行数这里期待你已绎熟悉基本的RDD变换和动作,如map, reduce和 filter。如果不熟,我建议你先学习那些。可以通过阅读编程向导htts:/ park. apache。org/docs/ latest/ programming-guide. html或阅读入门书籍,比如 Packt出版的 Fast Data Processing withSpark或 O Relly Media出版的 Learning spark2即使你完全不了解RDD背后的机制也不要慌,下面的补习会帮你记住重点。RDD是 Spark中的核心数据抽象,用来表达大型分布式数据集可以被分区并且被跨集群的机器并行处理。 Spark ap|提供」一组统一的操作来变换和规约RDD中的数据。在这些抽象和操作上层, GraphX库也提供了灵活的AP|允许我们创建图并轻松地处理之。也许当你在sh中运行过之前那些命令,你就被那些NFO开头的长长的日志语句清单吓坏了。这里有个办法可以减少 shell f Spark输出的信息量译者注,《 Learning Spark》的主要章节的中文版可以在CSDN资源下载,或者在我的 csdn Blog里找到你可以像下面这样来降低 Spark shel的口志级别:●首先,进入到 SSCALAHOME/onf目录然后,创建一个新文件log4 j- properties在conf目录甲,打开模板文件log4j, properties template并复制其内容到log4j. properties中查找log4 cocAtegory= NFO console这一行,并用下面两行中的一行替换:log 4j. rootCategory=WARN, console. root Category=ERROR, console●最后,重新启动 Spark shel,可以看到shel的输出较少的日志消息Graphx入门现在我们已经安装了Spak并使用了 Spark shell,让我们通过在she中编写代码来创建我们在 Spark中的第一个图,并依靠这些代码开发和运行一个独立程序。木节中我们有三个学习目标1.首先,你将通过个具体的例子来学习如何用 Spark core和 GraphX AP来构建和研究图。2.然后,你将复习一些 Scala编程的重要特性,这些特性在 Spark中进行图处理时是需要重点掌握的。3.最后,你将学习如何开发和运行一个独立的Spak应用构建小型社交网络让我们来创建一个小型社交网络并研究网络中不同人之间的关系吧。再次提醒,学习 Spark最好的方式是使用 shell。所以我们的工作流是先在hel中试验,然后迁移我们的代码到独立 Spark应用。启动she前确认当前目录是 SSPARKHOME。首先我们需要如下所示的导λ GraphX和RDD模块,这样我们就能用更短的名字调用APl:scala> import org. apache. spark graphxscala> import org. apache. spark rdd RDD[5]之前说过 SparkContext是 Spark程序的主入口点,并且是在 Spark shell|启动时被自动创建的。它还提供了有用的方法来从本地集合创建RDD,从本地或 Hadoop文件系统加载数据到rdd,以及保存输出数据到磁盘。加载数据在本例中,我们将处理两个文件 people.CSV和 links. csy,这俩文件包含在目录SSPARKHOME/data中。我们输入以下的命令来加载这些文件到 Spark:scala> val people =sc text File /data/people. cspeople: org. apache. spark rdd RDD[String]=/ data/people.CSvMappedRDD[81] at text File at : 33scala> val links = sc text File( ". data/links. csv)links: org. apache. spark rdd RDD[String ] /data/links. csv MappedRDD[83at text File at : 33加载这些Csⅴ文件返回给我们两个字符串RDD。要创建图,我们需要解析这些字符串到两个定点和边的适当的集合。She中的当前目录是 SSPARKHOME十分重要。否则的话,你后亩会遇到错误。因为 Spark找不到那俩文件属性图在深入之前,先介绍一些关键定义和图抽象。在 Spark中,图被表示为属性图,定义在 Graph类,如下:class graph[vD, ED]val vertices: VerteXRDD[VDIval edges: EdgeRDD[EDVD[6]这表示 Graph类提供了访问它的顶点和边的get方法。这些是后来被抽象的RDD子类 VerteXRDD[VD]和 EdgeRDD[ED, VD]注意,这里的VD和ED指的是 VerteXRDD,EdgeRDD和 Graph类的一些 Scala类型参数。这些参数类型可以说基木类型,如String,或者是用户自定义类型,如我们的社交图示例中的 Person类。这里要重点指出的是 Spark中的属性图是有向多重图。这表示在任意组顶点间允许有多条边。同时,每条边都是有向的,定义了一个单向关系。这很容易理解,例如,在一个 Twitter图中,一个用户可以粉另一个用户,但是反过来不需要一定是这样。对于双向连接模型,比如 Facebook的朋友关系,我们需要在节点间定义两条边,并且这两条边指向相对的方向。关于关系的额外属性可以保存为边的属性。所谓属性图就是有用户定义对象附加到顶点和边的图。这些(对象类描述了图的属性。在实践中是通过参数化 Graph,VertexRdd, EdgeRDD类来实现。并且图中的每条边定义个单向关系,但是任意一对顶点间可以存在多条边转换RDD到 VertexRDD和 EdgeRDD回到我们的例子,用三个步骤构建图,如下所示1.我们定义一个 case class person,带一个age和一个name的参数。Case类在我们后面需要对 Person对象做模式匹配时非常有用。case class Person( name: String, age: Int)2.下一步,我们要解析 people和link中的每一行CsyV文本到对应的类型为Person和Edge的新对象,并收集结果到RDD( Vertexld, person和RDD[Edge[string]中。val peopleRDD: RDD[(Vertexld, Person)]= people map i lineval row =line split(row().toInt, Person(row(1), row(2).tolnt))[7]