分享

Spark集成开发环境搭建-eclipse

本帖最后由 pig2 于 2014-4-4 14:40 编辑
(1) 准备工作
在正式介绍之前,先要以下软硬件准备:
软件准备:
Eclipse Juno版本(4.2版本),可以直接点击这里下载:Eclipse 4.2
Scala 2.9.3版本,Window安装程序可以直接点击这里下载:Scala 2.9.3
Eclipse Scala IDE插件,可直接点击这里下载:Scala IDE(for Scala 2.9.x and Eclipse Juno)
硬件准备
装有Linux或者Windows操作系统的机器一台
(2) 构建Spark集成开发环境

我是在windows操作系统下操作的,流程如下:步骤1:安装scala 2.9.3:直接点击安装即可。
步骤2:将Eclipse Scala IDE插件中features和plugins两个目录下的所有文件拷贝到Eclipse解压后对应的目录中
步骤3:重新启动Eclipse,点击eclipse右上角方框按钮,如下图所示,展开后,点击“Other….”,查看是否有“Scala”一项,有的话,直接点击打开,否则进行步骤4操作                                        

spark-eclipse1.jpg


步骤4:在Eclipse中,依次选择“Help” –> “Install New Software…”,在打开的卡里填入http://download.scala-ide.org/sdk/e38/scala29/stable/site,并按回车键,可看到以下内容,选择前两项进行安装即可。(由于步骤3已经将jar包拷贝到eclipse中,安装很快,只是疏通一下)安装完后,重复操作一遍步骤3便可。
                                                   

spark-eclipse-2.jpg


(3) 使用Scala语言开发Spark程序

在eclipse中,依次选择“File” –>“New” –> “Other…” –>  “Scala Wizard” –> “Scala Project”,创建一个Scala工程,并命名为“SparkScala”。
右击“SaprkScala”工程,选择“Properties”,在弹出的框中,按照下图所示,依次选择“Java Build Path” –>“Libraties” –>“Add External JARs…”,导入文章“Apache Spark学习:将Spark部署到Hadoop 2.2.0上”中给出的
assembly/target/scala-2.9.3/目录下的spark-assembly-0.8.1-incubating-hadoop2.2.0.jar,这个jar包也可以自己编译spark生成,放在spark目录下的assembly/target/scala-2.9.3/目录中。





跟创建Scala工程类似,在工程中增加一个Scala Class,命名为:WordCount,整个工程结构如下:


                                                            spark-eclipse-scala-ide5.jpg

WordCount就是最经典的词频统计程序,它将统计输入目录中所有单词出现的总次数,Scala代码如下:
  1. import org.apache.spark._
  2. import SparkContext._
  3. object WordCount {
  4.   def main(args: Array[String]) {
  5.     if (args.length != 3 ){
  6.       println("usage is org.test.WordCount <master> <input> <output>")
  7.       return
  8.     }
  9.     val sc = new SparkContext(args(0), "WordCount",
  10.     System.getenv("SPARK_HOME"), Seq(System.getenv("SPARK_TEST_JAR")))
  11.     val textFile = sc.textFile(args(1))
  12.     val result = textFile.flatMap(line => line.split("\\s+"))
  13.         .map(word => (word, 1)).reduceByKey(_ + _)
  14.     result.saveAsTextFile(args(2))
  15.   }
  16. }
复制代码
在Scala工程中,右击“WordCount.scala”,选择“Export”,并在弹出框中选择“Java” –> “JAR File”,进而将该程序编译成jar包,可以起名为“spark-wordcount-in-scala.jar”,我导出的jar包下载地址是 spark-wordcount-in-scala.jar。

该WordCount程序接收三个参数,分别是master位置,HDFS输入目录和HDFS输出目录,为此,可编写run_spark_wordcount.sh脚本:
  1. # 配置成YARN配置文件存放目录
  2. export YARN_CONF_DIR=/opt/hadoop/yarn-client/etc/hadoop/
  3. SPARK_JAR=./assembly/target/scala-2.9.3/spark-assembly-0.8.1-incubating-hadoop2.2.0.jar \
  4. ./spark-class org.apache.spark.deploy.yarn.Client \
  5. –jar spark-wordcount-in-scala.jar \
  6. –class WordCount \
  7. –args yarn-standalone \
  8. –args hdfs://hadoop-test/tmp/input \
  9. –args hdfs:/hadoop-test/tmp/output \
  10. –num-workers 1 \
  11. –master-memory 2g \
  12. –worker-memory 2g \
  13. –worker-cores 2
复制代码
需要注意以下几点:WordCount程序的输入参数通过“-args”指定,每个参数依次单独指定,第二个参数是HDFS上的输入目录,需要事先创建好,并上传几个文本文件,以便统计词频,第三个参数是HDFS上的输出目录,动态创建,运行前不能存在。

直接运行run_spark_wordcount.sh脚本即可得到运算结果。

在运行过程中,发现一个bug,org.apache.spark.deploy.yarn.Client有一个参数“–name”可以指定应用程序名称:



spark-yarn-client-cli6.jpg

但是使用过程中,该参数会阻塞应用程序,查看源代码发现原来是个bug,该Bug已提交到Spark jira上:
  1. // 位置:new-yarn/src/main/scala/org/apache/spark/deploy/yarn/ClientArguments.scala
  2.         case ("--queue") :: value :: tail =>
  3.           amQueue = value
  4.           args = tail
  5.         case ("--name") :: value :: tail =>
  6.           appName = value
  7.           args = tail //漏了这行代码,导致程序阻塞
  8.         case ("--addJars") :: value :: tail =>
  9.           addJars = value
  10.           args = tail
复制代码
因此,大家先不要使用“–name”这个参数,或者修复这个bug,重新编译Spark。

(4) 使用Java语言开发Spark程序

方法跟普通的Java程序开发一样,只要将Spark开发程序包spark-assembly-0.8.1-incubating-hadoop2.2.0.jar作为三方依赖库即可。

(5) 总结

初步试用Spark On YARN过程中,发现问题还是非常多,使用起来非常不方便,门槛还是很高,远不如Spark On Mesos成熟。




来自群组: Hadoop技术组

已有(9)人评论

跳转到指定楼层
zhujun182104906 发表于 2015-3-22 23:46:03
回复

使用道具 举报

YLV 发表于 2015-3-27 13:38:34
回复

使用道具 举报

guxingyu 发表于 2015-3-27 16:00:55
楼主,我打成jar包是,选那个Main运行类的时候,由于scala选不到那个,导致不能打成jar包,不知道这个错误怎么解决啊
回复

使用道具 举报

刚果 发表于 2015-4-21 22:34:39
guxingyu 发表于 2015-3-27 16:00
楼主,我打成jar包是,选那个Main运行类的时候,由于scala选不到那个,导致不能打成jar包,不知道这个错误 ...

我也是,我都无语了,这篇文章到底怎么写出来的?
不引入spark-assmbly包的话,wordcount程序import那里报错;
引入spark-assmbly包的话,工程出现红叉,并提示有两个scala编译路径,根本没法运行(提示找不到main方法),此时要是强行打包jar,运行还是会出错(提示找不到main)
回复

使用道具 举报

cqranbihong 发表于 2015-5-7 16:01:21
刚果 发表于 2015-4-21 22:34
我也是,我都无语了,这篇文章到底怎么写出来的?
不引入spark-assmbly包的话,wordcount程序import那里 ...

你可以将spark-assmbly包里面的scala目录删了,这就不会报有重复文件了,在打包的时候选不了main就不选,直接打包,然后手动去给jar包里面的MANIFEST.MF文件增加一个Main-Class: WordCount,这样就可以运行了:java -Xbootclasspath/a:spark-assembly-hadoop2.2.0.jar -jar WordCount.jar
回复

使用道具 举报

yunge2016 发表于 2017-7-13 17:11:56
楼主  请问这个spark-assembly-0.8.1-incubating-hadoop2.2.0.jar  在哪里呢 找不到啊 ,wordcount不能运行哎。代码中sparkcontext 报错。
回复

使用道具 举报

a530491093 发表于 2017-8-22 17:35:38
不错感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条