Spark快速数据处理
Spark快速数据处理文档~Spark集群1.1 单机运行Spark1.2 在EC2上运行Spark1.3 在ElasticMapReduce上部署Spark1.4 用Chef(opscode)部署Spark1.5 在Mesos上部署Spark1.6 在Yarn上部署Spark1.7 通过SSH部署集群1.8 链接和参考1.9 小结第1章安装 Spark以及构建 Spark集群的根目录,然后将 Scala根目录下的bin目录路径加到PATH环境变量中。 Scala设置如下wgethttp://www.scala-lang.org/files/archive/scala-2.9.3.tgz&&tar-xvfscala-2.9.3. tgz & cd scala-293&& export PATH= pwd /bin: $PATH&&export SCALA HOME=pwd也可以在. basho文件中加入export PATH= pwd/bin: \SPATHexport SCALA HOME=pwdSpark用sbt(即 simple build tool,现在已经不是个简单工具了)构建,编译源码的时候会花点时间,如果没有安装sbt,Spark构建脚本将会为你下载正确的sbt版本。台双核且安装有SSD的笔记本性能不算高,在它之上安装Spark的最新版本花了大概7分钟。如果从源码开始构建0.7版的 Spark,而不是直接下载编译好的压缩包。可以执行thttp://www.spark-project.org/download-spark-0.7.0-sources-tgz&&vf download- spark-0. 7.0-sources-tgz & cd spark-0.7.0&& sbt/sbtpackage如果底层存储采用HDFS,而其版本又和 Spark中的默认HDFS版本不一致,则需要修改 Spark根目录下 project/SparkBui1d. scala文件中的 HADOOP VERSION,然后重新编译:sbt/sbt clean compile虽然sbt工具在依赖性解析方面已经做得非常好了,但是还是强烈推荐开发者去做一次 clean,而不是增量编译。因为增量编译仍然不能保证毎次完全正确。从源码构建 Spark将花费一些时间,当编译过程停止在" Resolving[XYz].."很长时间(大概五分钟)之后,停止第1章安装 Spark以及构建 Spark集群然后重新执行sbt/ sbt package安装。如果对HDFS版本没有特殊要求,只需要下载 Spark已经编译好的压缩包,解压就能使用wgethttp://www.spark-project.org/download-spark-0.7.0-prebuilt-tgz&&vf download-spark-0.7.0-prebuilt-tgz & cd spark-0.7.0org. apache命名空间下包名的变化。些有用的链接和参考如下:http://spark-project.org/docs/latesthttp://spark-project.org/download/http://www.scala-lang.org1.1单机运行Spak单机运行是使用 Spark最简单的方式,同时也是检查 Spark构建是否有误的明智方法。在 Spark的根目录下,有个名为run的shel|脚本,能够用来提交一个 Spark作业。run脚本的输入是一个代表 Spark作业的类名和一些参数。./ examples/src/main/scala/ spark/ examples/目录下含有大量 Spark样例作业。所有的样例程序都有一个输入参数 master, master参数是分布式集群中 master节点的URL,在本地模式下则是1oca1[N](N是线程的个数)。本地模式下用四线程运行GroupBytest样例的命令如下/run spark examples. GroupBy Test local[4]如果出现错误,可能是因为 SCALA HOME没有设置。在bash1.2在EC2上运行 Spark5中,能通过 export SCALA HOME=[ pathyouextractscalato]设置。如果出现如下错误,可能是你在使用 Scala2.10版,然而Spark07版本还不支持2.10版的 Scala[literal]"Exception in thread "main"java. lang NoclassDefFoundErrorscala/reflect/classManifest"[/literalScaa的开发者决定重新组织介于29版和2.10版之间的一些类。要解决上面的错误,你可以降低 Scala版本,也可以等待新版本的 Spark构建支持 Scala2.10版。2在EC2上运行SpakSpark提供了很多在EC2环境下运行的脚本,脚本文件都存储在根目录下的ec2目录中。这些脚本可以用来同时运行多个 Spark集群,甚至是运行n-the-spot实例。 Spark也可以运行在EMR( Elastic Mapreduce)上,EMR是 Amazon关于Mapreduce集群管理的解决方案,它将会给你扩展实例更大的灵活度。在EC2上用脚本运行 Spark开始之前,你应该确保有EC2账号,如果没有,请访[ohttps://portal.awsamazoncom/gp/aws/manageYourAccount注册,对于Spark集群,最好访问https://portal. aws. amazon. com/gp/aws/securityCredentialsR生成一个单独访问密钥对。同时也需要生成一个EC2的密钥对,这样 Spark的脚本能够sh到其他已经启动的机器上,这通过访问第1章安装 Spark以及构建 Spark集群https://console.awsamazoncom/ec2/home并且选择“ Network& Security”下的“ Key pairs”选项来实现。注意密钥对是以区域来创建的。所以你需要确保创建的密钥对和将要使用的 Spark实例在同一个区域。别忘了给密钥对命名(我们将在本章接下来的内容中使用 spark- keypair来命名示例中的密钥对),因为将要在脚本中使用它。也可以将你SSH公钥上传,从而就不需要重新生成密钥对。这些公钥属于安全敏感信息,所以确保它不被泄露,对于 Amazon的EC2的脚本,也需要设置环境变量AWSACCESS KEY FH AWS SECRET KEYchmod 400 spark-keypair pemexport AWS ACCESS KEY=port AWS SECRET KEY=Mhttp://aws.amazoncom/developertools/Amazon-EC2/351下载 amazon提供的EC2脚本非常有用,解压zp文件后,将bin目录直接加到PATH环境变量中,就像对Spark中的bin目录所做的一样:wgethttp://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zipunzip ec2-api-tools zipcd ec2-api-tools-*export EC2 HOME= pwdexport PATH=$PATH: pwd:/binSpark的EC2脚本自动地创建一个用来运行 Spark集群的隔离安全组和防火墙规则。默认情况下 Spark的外部通用端口为8080,这种方式并不好,不幸的是 spark ec2.py脚本暂时还不提供限制访问你机器的简单方法。如果你有一个静态P地址,强烈建议在 spark ec2.py中限制访问,简单地用[ yourip]/32替换所有的0.0.0.0/0。这将不会影响集群内的通信,因为在一个安全组内的所有机器都默认能够和其他机器通信。12在EC2上运行Spak7然后,启动一个EC2上的集群:/ec2/spark-ec2 -k spark-keypair -i pk-[....]. pem -s 1 launchmyfirstcluster如果遇到错误:" The requested Availability Zone iscurrently constrained and..",你可以通过传递zone标记指向另一个zone。如果不能SSH到集群 master上的话,请确保只有你有权限去读取私钥,否则SSH将会拒绝使用私钥。由于当节点报告它们自己状态的时候,由于竞争条件你还有可能遇到上面的错误,但是 Spark-ec2脚本还不能SSH过去。关于这个问题,在https://github.com/mesos/spark/pu11/555上有个修复办法。在 Spark下一个版本出来之前,有个临时解决问题的简单方法,就是让 setup c1 uster在启动的时候睡眠120秒00K8如果启动集群的时候遇到一个短暂的错误,可以用下面命令提供的恢复功能完成启动/ec2/spark-ec2.Aspark-keypair pem launch myfirstsparkcluster- resume万事俱备,你将看到屏幕截图的内容,如图1-1所示。这将分配给你最基本的一个 master实例和一个 worker实例的集群,两个实例都是默认配置。接下来,确认 master节点的8080端口没有防火墙规则并确认其已经启动。能看见上面屏幕最后输出 master的名字。第1章安装 Spark以及构建 Spark集群holden@h-d-n: -/repos/sparkcd /root/spark/bin/.; /root/spark/bin/start-sLave sh 1 spark: //ec2-54-227-84-111. compute-1. amazonas. Com: 7077ec2-184-73-75-228.compute-1.amazonaws.com:startingsparkdeploy.worker.WorkerLogging to /root/spark/bin/./Logs /spark-root-spark deploy worker. Worker-1-ip-10118-133-169.ec2. internal outRSYNC'ing /etc/ganglia to slavesec2-184-73-75-228.compute-1.amazonaws.comShutting down GANGLIA gmondAILEDstarting GANGLIA gmond:shutting down GANGLIA gnStarting GANGLIA gmond.ond:Connection to ec2-184-73-75-228 compute-1. amazonas. com closed. JLn: creating symbolic link '/var/lib/ganglia/conf/default. json': File exist:Shutting down GANGLIA gmetad:starting GANGLIA gmetadStoppinghttpdFAILED]Connectiontoec2-54-227-84-111.compute-1.amazonaws.comclosed.jSparkstandaloneclusterstartedathttp://ec2-54-227-84-111.compute-1.amazonaws8080Gangliastartedathttp://ec2-54-227-84-111.compute-1.amazonaws.com5080/gangliaDoneholdengh-d-n:-/repos/sparks图1-1尝试运行一个 Spark样例作业来确保配置没有问题sparkuser@h-d-n:-/repos/sparks ssh -i -/spark-keypair pem root@ec2-10722-48-231. compute-1 amazonasLast login: Sun Apr 703:00: 20 2013 from 50-197-136-90-static hfccomcastbusiness. netAmazon Linux AMIhttps://aws.amazoncom/amazon-linux-ami/2012.03-release-notes/There are 32 security update(s)out of 272 total update(s)availableRun "sudo yum update"to apply all updatesinux version 2013.03 is available[root@domu-12-31-39-16-B6-08~]#1sephemeral-hdfs hive-0.9.0-bin mesos mesos-ec2 persistent-hdfsscala-2.9.2 shark-02 spark spark-ec2[root@domu-12-31-39-16-B6-08 -] cd spark[root@domU-12-31-39-16-B6-08 spark]#./run spark examples. GroupByTest13/04/ 03: 11: 38 INFO slf4j. slf4jEventHandler: slf4jEventHandler started13/0470703: 11: 39 INFO storage. BlockManagerMaster: RegisteredBlockManagerMaster Actor1.2在EC2上运行Spak913/04/07 03: 11: 50 INFo spark. SparkContext: Job finished: count atGroupByTest. scala: 35, took 1. 100294766s2000既然已经能够在EC2的集群上运行一个简单的 Spark作业,现在就可以针对具体 Spark作业配置一下你的EC2集群了。下面是用 Spark-ec2脚本配置集群的多种配置选项。首先,考虑所需要的实例类型,EC2提供一个不断丰富的实例集合,能针对 master和 worker选择不同的实例类型。实例类型的选择对 Spark集群性能有较大影响。如果一个 Spark作业需要很大内存,最好选择一个含有更大内存的实例。可以通过特指--instance-type=( name of instance type)来指定实例类型。默认情况下, master和 worker的实例类型是一样的。当作业是计算密集型的话,将会出现浪费,因为 master的资源不能充分被利用。你能通过-- master- instance-type=( name ofinstance)来指定不同的 master实例类型。EC2也有对于 worker十分有用的GPU实例类型。但对master来说完全是浪费。注意,由于虚拟机管理程序的高IO负载,EC2的GPU性能将比你本地测试的低。下载实例代码本书中所有的实例程序都在三个独立的 github repo中:gom/holden/fastdataprocessingwithspark-sharkexampleshttps://github.com/holdenk/fastdataprocessingwithsparkexampleshttps://githulSpark的EC2脚本使用 Spark组提供的AMI( Amazon machineImages)。这些AM往往跟不上 Spark版本的更新速度,如果有对10今第1章安装Spak以及构建 Spark集群于 Spark的自定义补丁(比如要用不同版本的HDFS),将不会被包含在机器镜像中。目前,AMⅠ也只能在美国东部地区使用,如果想在其他地区运行它,需要复制AMI,或者自己在不同的地区制作你的AMI。为了使用 Spark的EC2脚本,你所在的地区要有AMI。为了将默认的 Spark的EC2AMI复制到一个新的地区,通过查看spark ec2py脚本中最新 Spark ami是什么,这又是通过查看LATEST AMT URL指向的URL。对于 Spark0.7,运行下面的命令获得最新AMI:curlhttps://s3.amazonaws.com/mesos-images/ids/latest-spark-0.7ec2-copy- Image脚本包含你希望获得的复制镜像的功能,但是不能复制不属于自己的镜像。所以必须登录一个前面AMI的实例,然后记录它的快照,通过运行以下命令可以获得当前正在运行的镜像的描述信息:00K8ec2-describe-images ami -a60193cf这将显示一个基于EBS( Elastic block store)的镜像,需要参照EC2的命令创建基于EBS的实例。通过已获得的启动实例的脚本,可以启动一个EC2集群上的实例,然后将其快照记录下来通过以下命令找到你运行的实例ec2-describe-instances -h可以复制i-[ string]实例名字,然后保存留有它用如果想用 spark的一个普通版本,或者安装工具和依赖,并让它们成为你的AMI的一部分,需要在快照复制之前这样做:
用户评论