分享

使用IntelliJ IDEA开发Spark1.0.0应用程序

问题导读:
1.IntelliJ IDEA如何下载安装,有几种方式安装scala插件?
2.如何建立spark应用程序?
3.如何部署spark程序?








本篇是Spark1.0.0 开发环境快速搭建中关于客户端IDE部分的内容,将具体描述:
  • 如何安装scala开发插件
  • 如何创建项目和配置项目属性
  • 如何编写源代码
  • 如何将生成的程序包

      至于如何运行程序包,请参见应用程序部署工具spark-submit
      注意,客户端和虚拟集群中hadoop、spark、scala的安装目录是一致的,这样开发的spark应用程序的时候不需要打包spark开发包和scala的库文件,减少不必要的网络IO和磁盘IO。当然也可以不一样,不过在使用部署工具spark-submit的时候需要参数指明classpath。
1:IDEA的安装
      官网jetbrains.com下载IntelliJ IDEA,有Community Editions 和& Ultimate Editions,前者免费,用户可以选择合适的版本使用。
根据安装指导安装IDEA后,需要安装scala插件,有两种途径可以安装scala插件:
  • 启动IDEA -> Welcome to IntelliJ IDEA -> Configure -> Plugins -> Install JetBrains plugin... -> 找到scala后安装。
  • 启动IDEA -> Welcome to IntelliJ IDEA -> Open Project -> File -> Settings -> plugins -> Install JetBrains plugin... -> 找到scala后安装。

如果你想使用那种酷酷的黑底界面,在File -> Settings -> Appearance -> Theme选择Darcula,同时需要修改默认字体,不然菜单中的中文字体不能正常显示。
1.jpg

  
2:建立Spark应用程序
      下面讲述如何建立一个Spark项目week2(,正在录制视频),该项目包含3个object:
  • 取自spark examples源码中的SparkPi
  • 计词程序WordCount1
  • 计词排序程序WordCount2

A:建立新项目
  • 创建名为dataguru的project:启动IDEA -> Welcome to IntelliJ IDEA -> Create New Project -> Scala -> Non-SBT -> 创建一个名为week2的project(注意这里选择自己安装的JDK和scala编译器) -> Finish。
  • 设置week2的project structure
    • 增加源码目录:File -> Project Structure -> Medules -> week2,给week2创建源代码目录和资源目录,注意用上面的按钮标注新增加的目录的用途。
2.png

  • 增加开发包:File -> Project Structure -> Libraries -> + -> java ->  选择
    • /app/hadoop/spark100/lib/spark-assembly-1.0.0-hadoop2.2.0.jar
    • /app/scala2104/lib/scala-library.jar可能会提示错误,可以根据fix提示进行处理

B:编写代码
      在源代码scala目录下创建1个名为week2的package,并增加3个object(SparkPi、WordCoun1、WordCount2):
3.png

  • SparkPi代码
  1. package week2  
  2.   
  3. import scala.math.random  
  4. import org.apache.spark._  
  5.   
  6. /** Computes an approximation to pi */  
  7. object SparkPi {  
  8.   def main(args: Array[String]) {  
  9.     val conf = new SparkConf().setAppName("Spark Pi")  
  10.     val spark = new SparkContext(conf)  
  11.     val slices = if (args.length > 0) args(0).toInt else 2  
  12.     val n = 100000 * slices  
  13.     val count = spark.parallelize(1 to n, slices).map { i =>  
  14.       val x = random * 2 - 1  
  15.       val y = random * 2 - 1  
  16.       if (x*x + y*y < 1) 1 else 0  
  17.     }.reduce(_ + _)  
  18.     println("Pi is roughly " + 4.0 * count / n)  
  19.     spark.stop()  
  20.   }  
  21. }  
复制代码

  • WordCount1代码



  1. package week2  
  2.   
  3. import org.apache.spark.{SparkContext, SparkConf}  
  4. import org.apache.spark.SparkContext._  
  5.   
  6. object WordCount1 {  
  7.   def main(args: Array[String]) {  
  8.     if (args.length == 0) {  
  9.       System.err.println("Usage: WordCount1 <file1>")  
  10.       System.exit(1)  
  11.     }  
  12.   
  13.     val conf = new SparkConf().setAppName("WordCount1")  
  14.     val sc = new SparkContext(conf)  
  15.     sc.textFile(args(0)).flatMap(_.split(" ")).map(x => (x, 1)).reduceByKey(_ + _).take(10).foreach(println)  
  16.     sc.stop()  
  17.   }  
  18. }  
复制代码

  • WordCount2代码

  1. package week2  
  2.   
  3. import org.apache.spark.{SparkContext, SparkConf}  
  4. import org.apache.spark.SparkContext._  
  5.   
  6. object WordCount2 {  
  7.   def main(args: Array[String]) {  
  8.     if (args.length == 0) {  
  9.       System.err.println("Usage: WordCount2 <file1>")  
  10.       System.exit(1)  
  11.     }  
  12.   
  13.     val conf = new SparkConf().setAppName("WordCount2")  
  14.     val sc = new SparkContext(conf)  
  15.     sc.textFile(args(0)).flatMap(_.split(" ")).map(x => (x, 1)).reduceByKey(_ + _).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).take(10).foreach(println)  
  16.     sc.stop()  
  17.   }  
  18. }  
复制代码

C:生成程序包
      生成程序包之前要先建立一个artifacts,File -> Project Structure -> Artifacts  -> + -> Jars -> From moudles with dependencies,然后随便选一个class作为主class。
4.jpg

按OK后,对artifacts进行配置,修改Name为week2,删除Output Layout中week2.jar中的几个依赖包,只剩week2项目本身。
5.jpg

按OK后, Build -> Build Artifacts -> week2 -> rebuild进行打包,经过编译后,程序包放置在out/artifacts/week2目录下,文件名为week2.jar。

3:Spark应用程序部署
      将生成的程序包week2.jar复制到spark安装目录下,切换到用户hadoop,然后切换到/app/hadoop/spark100目录,进行程序包的部署。具体的部署参见应用程序部署工具spark-submit








已有(24)人评论

跳转到指定楼层
tt7734 发表于 2014-11-5 17:07:36
谢谢分享,学习了
回复

使用道具 举报

hbbtym 发表于 2015-1-4 23:31:24
对于程序依赖除了spark的jar包之外的其他jar包的情况,怎么提交
回复

使用道具 举报

pig2 发表于 2015-1-5 01:57:11
hbbtym 发表于 2015-1-4 23:31
对于程序依赖除了spark的jar包之外的其他jar包的情况,怎么提交
如果环境变量不需要提交。第三方可以自己打包到jar里面,或则在集群配置
回复

使用道具 举报

hbbtym 发表于 2015-1-6 13:44:51
pig2 发表于 2015-1-5 01:57
如果环境变量不需要提交。第三方可以自己打包到jar里面,或则在集群配置

通过我的测试盒摸索,需要把除了集群的依赖的包自己摘出来,通过命令指定依赖的包,提交代码如下
spark-submit --class com.cloudera.sparkwordcount.SparkWordCount \
  --deploy-mode client \
  --master yarn \
  --executor-memory 400M \
  --num-executors 10 \
  --jars (这里指定依赖的jar)commons-pool-1.6.jar,kafka_2.10-0.8.0.jar,metrics-annotation-2.2.0.jar,metrics-core-2.2.0.jar,spark-streaming_2.10-1.1.0.jar,spark-streaming-kafka_2.10-1.1.0.jar,zkclient-0.3.jar,jedis-2.1.0.jar,scala-redis-client_2.10-1.16.0.jar,redisclient_2.10-2.14.jar,config-1.2.1.jar,akka-actor_2.10-2.2.3-shaded-protobuf.jar \
    ../wordcount.jar

回复

使用道具 举报

小南3707 发表于 2015-1-9 11:43:55
为什么我的iead out目录下没有artifacts目录呢?
回复

使用道具 举报

小南3707 发表于 2015-1-9 11:53:54
又有了。。。。。
但是 之前的是这个样子的 1.jpg


之后是这个样子的
2.jpg

回复

使用道具 举报

小南3707 发表于 2015-1-9 12:00:48
可是运行结果出这个问题啊
大神帮忙给解决下,跪求~~~
3.jpg 4.jpg

跪求啊,纠结好几天了
回复

使用道具 举报

stark_summer 发表于 2015-1-9 13:31:44
赞赞赞赞赞赞+++
回复

使用道具 举报

EASONLIU 发表于 2015-1-13 10:46:57
就是编译源码有点难度
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条