1. 准备环境
准备环境包括:
(1)JDK安装包(exe、zip):http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
(2)Scala安装包(msi、zip):
http://www.scala-lang.org/download/
(3)IDEA安装包:
https://www.jetbrains.com/idea/
(6)Spark安装包:
https://spark.apache.org/downloads.html
安装JDK
配置环境变量(1.7以上版本)
JAVA_HOME = C:\\Program Files\\Java\\jdk1.7.0_71
CLASSPATH =.;%JAVA_HOME%\\lib;
PATH +=;%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;
进入cmd界面测试jdk是否安装成功。
C:\\Users\\admin>java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
安装Scala
安装完毕配置环境变量,增加PATH变量:
SCALA_HOME = C:\\Program Files\\scala-2.11.8
PATH += %SCALA_HOME%\\bin;
进入cmd界面测试scala是否安装成功。
C:\\Users\\admin>scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) -Bit Server VM, Java 1.7.0_71).
Type in expressions for evaluation. Or try :help.
spark安装
1.解压压缩文件至指定目录
spark-1.6.2-bin-hadoop2.6.tgz
2.配置环境变量
HADOOP_HOME = D:\\spark-1.6.2-bin-hadoop2.6
在path变量中增加;%HADOOP_HOME%\\bin
3.添加winutils.exe(注意32位和位不兼容)
将winutils.exe添加至目录bin中
4.验证
CMD输入:spark-shell
退出输入":quit"
2 构建IntelliJ IDEA开发环境
官方提供了Ultimate版和Community 版可供选择,主要区别:
1)Ultimate版功能齐全的IDE,支持Web和Enterprise,免费试用30天,由官方提供一个专有的开发工具集和架构支持。
2)Community 版支持Java、Groovy、Scala、Android的开发,免费并且开源,由社区进行支持;
本例使用的是ideaIC-2016.2,请选择适合的操作系统进行安装。
提示
如何去安装IntelliJ IDEA?
❒Windows :直接运行.exe文件,按照向导步骤操作即可。
❒Mac OS X:打开.dmg包,并复制IntelliJ IDEA到应用文件夹。
❒Linux:解压.tar.gz压缩包,并运行bin/idea.sh(需要在环境变量PATH中加入IDEA目录,并执行source命令使配置文件生效)
根据实际需求,我们选择Windows 系统的Community 版本,进行Scala程序的开发。步骤包括:安装Scala插件和创建项目并在IDEA中编写Scala代码。
安装Scala插件
①运行IDEA 并安装和配置IDEA 的Scala开发插件,启动程序界面如图3-2所示,此时需要选择“Configure”,然后进入IDEA的配置页面:
图3-2 选择“Configure”
②在IDEA的配置页面选择“Plugins”(见图3-3),进入插件安装界面。
图3-3 选择“Plugins”
③点击安装界面左下角的“Install JetBrains plugin”选项,进入JetBrains插件选择页面,如图3-4所示。
图3-4 JetBrains插件选择页面
(如果网络不稳定,可以提前下载,然后选择“Install plugin from disk”本地加载插件,下载地址:http://www.jetbrains.net/confluence/display/SCA/Scala+Plugin+for+IntelliJ+IDEA,见安装包文件压缩包:scala-intellij-bin-2016.2.1.zip)
④在左上方的输入框中输入“Scala”来查找Scala插件,此时点击右侧的“Install plugin”按钮,如图3-5所示。
图3-5 安装Scala Plugin
插件安装完毕,重启IDEA。
创建项目并在IDEA中编写Scala代码。
①进入首页(见图3-2),选择“Create New Project”命令,此时选择左侧列表中的“Scala”选项,为了方便以后的开发工作,选择右侧的“SBT”选项,如图3-6所示。
图3-6 建立Scala的SBT项目
②点击“Next”按钮进入下一步,设置Scala工程名称和本地目录(见图3-7),选择SDK、SBT、Scala版本,点击“Finish”按钮完成工程的创建:
图3-7 设置工程名称和本地目录
③由于在前面选择了“SBT”选项,所以此时IDEA智能地构建SBT工具:点击工程名称“HelloSpark”,可以看到SBT自动创建的一些目录,如图3-8所示。
图3-8 SBT自动创建的一些目录
④此时右击src目录的main中的Scala,在弹出的“New”菜单下选择“ScalaClass”,输入文件名“HelloSpark”,把Kinde选择为“Object”,点击“OK”按钮完成如图3-19所示。
图3-9 点击“OK”按钮确认创建Object
⑤编写“HelloSpark”的源代码,点击代码区,出现下拉菜单视图,选择Run “HelloSpark”来运行程序,如图3-10所示:
图3-10 选择运行程序的命令
加入Spark开发包
使用IDEA导入外部Jar包,具体步骤:File-> Project Structure-> Modules -> Dependencies ->+... -> Library... ->Select Library Type(Java)->Select Library Files ->Configure Library,以添加spark-assembly-1.6.2-hadoop2.6.0.jar为例,添加步骤如下:
1点击“File”,选择“Project Structure”,如图3-11所示。
图3-11选择Project Structure菜单
2点击“Modules”,选择“Dependencies”,增加“Library”,如图3-12所示。
图3-12选择添加依赖库
3选择依赖库类型“Java”,如图3-13所示。
图3-13选择依赖库类型(Java)
4通过“Select Library Files”,选择“spark-assembly-*-*.jar”,如图3-14所示。
图3-14选择spark-assembly-1.5.0-hadoop2.3.0.jar
选择完毕进行Spark开发包加载。
JDK路径错误处理
如果SBT出现如图3-15提示,这是由于没有设置Java的JDK路径的原因。
图3-15出现JDK路径错误
请点击最右侧的Project Structure,如图3-16所示,进入视图,并配置项目JDK。
图3-16配置Project Structure
选择最左侧的“Project”选项,并选择“No SDK”的“New”出现如图3-17所示,选择项目JDK为1.7。
图3-17选择JDK
重启IDEA,问题解决。
IDEA生成Jar包
使用IDEA编译成class文件,同时可以将class打包成Jar文件,方法如下:
①选择菜单File->Project Structure,弹出Project Structure的设置对话框。
②选择左边的Artifacts,点击上方的“+”按钮
③在弹出的对话框中选择Jar->from moduls with dependencies
④选择要启动的类,然后确定。
⑤应用之后选择菜单Build->Build Artifacts,选择Build或者Rebuild后即可生成,生成的Jar文件位于工程项目目录的out/artifacts下
1应用程序编程
不同于使用Spark Shell自动初始化SparkContext的例子,应用程序需要初始化一个SparkContext作为程序的一部分,然后将一个包含应用程序信息的SparkConf对象传递给SparkContext构造函数。
接下来编写简单应用程序SimpleApp,并描述一些简单的编码流程。
4.1创建SparkContext对象
编写一个Spark程序,首先创建SparkConf对象,该对象包含应用的信息。SparkConf对象构建完毕,需要创建SparkContext对象,该对象可以访问Spark集群。
//创建SparkConf对象
valconf = new SparkConf().setAppName("Simple Application")
// 创建SparkContext对象
valsc = new SparkContext(conf)
4.2编写简单应用程序
一个常见的Hadoop数据流模式是MapReduce,Spark可以轻易地实现MapReduce数据流,我们通过Spark API创建一个简单的Spark应用程序SimpleApp.scala。
importorg.apache.spark.SparkContext
importorg.apache.spark.SparkContext._
importorg.apache.spark.SparkConf
objectSimpleApp {
def main(args: Array[String]) {
vallogFile = "$YOUR_SPARK_HOME/README.md" // 测试文件
valconf = new SparkConf().setAppName("Simple Application")
valsc = new SparkContext(conf)
vallogData = sc.textFile(logFile, 2).cache()
valnumAs = logData.filter(line =>line.contains("a")).count()
valnumBs = logData.filter(line =>line.contains("b")).count()
println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
}
}
这个程序统计了Spark的README.md中含有“a”的行数和含有“b”的行数。实际需要用Spark的安装路径替换YOUR_SPARK_HOME。
4.3编译并提交应用程序到集群运行
可以采用IDEA生成Jar包的方式,也可以采取sbt或者mvn的方式打成Jar包。以sbtpackage为例,创建一个包含应用程序代码的Jar包。
一旦用户的应用程序被打包,就可以使用$SPARK_HOME/bin/spark-submit脚本启动应用程序。spark-submit脚本负责建立Spark的类路径和相关依赖,并支持不同的集群管理(Local、Standalone、YARN)和部署模式(client、cluster),通过提交参数进行区别。
1 使用sbt打成Jar包
使用sbt打成Jar包过程如下。
sbt package
...
[info] Packaging {..}/{..}/target/scala-2.10/simple-project_2.10-1.0.jar
2使用intellij打成Jar包
打包文件:
File-->>ProjectStructure -->点击Artificats-->>点击绿色加号 -->点击JAR-->>选择 From module with dependices
点击Output Layout 看看是否没有第三方jar包,因为你使用spark集群环境,所以你不需要第三方jar包
重新build:
Build-->>Build Artifcat ..--->>build 或者rebuild
执行后就会在D:\\mygit\\study-scala\\out\\artifacts\\study_scala_jar目录下看到study-scala.jar
2 应用程序提交模板
应用程序提交模板如下:
./bin/spark-submit \
--class --master --deploy-mode ... # other options [application-arguments] 选项解释说明: ❒--class:应用程序入口位置,如org.apache.spark.examples.SparkPi; ❒--master:集群的master的URL,如spark://xxx.xxx.xxx.xxx:7077;或使用local在本地单线程地运行,或使用local[N]在本地以N个线程运行。你应该由运行local进行测试开始。 ❒--deploy-mode:集群部署模式,cluster模式和client模式(默认模式); ❒application-jar:包含应用程序和所有依赖的Jar包的路径。该URL必须是在集群中全局可见的,比如,一个hdfs://路径或者一个在所有Worker节点都出现的file://路径。 ❒application-arguments:传递给主类的main函数的参数。 对于Python应用,在 注意 常见的部署策略是从同一物理位置,即同一个网关的服务器上提交你的应用程序。在这种设置中,采用Client模式比较合适。在Client模式中,Driver直接在用户的spark-submit进程中启动,应用程序的输入和输出连接到控制台(console)。因此,这个模式对于涉及REPL(Read-Eval-Print Loop,“读取-求值-输出”循环)的应用程序尤其合适。 另外,如果你的应用程序是从远离Worker机器的某台机器上提交的(如你的笔记本电脑上),一般要用cluster模式,使Drivers和Executors之间的网络延迟最小化。(目前部署模式、Mesos集群模式和Python编写的应用不支持cluster模式。) 传递给Spark的masterURl可以是如表3-1所示的某个格式。 表3-1Spark的master URl格式及说明 以local模式在4个CPU核上运行应用程序,命令如下 $ YOUR_SPARK_HOME/bin/spark-submit \ --class "com.ucas.bigdata.SimpleApp" \ --master local[4] \ target/scala-2.10/simple-project_2.10-1.0.jar ... 4以Standalone模式提交应用程序 以Standalone模式运行应用程序,命令如下 ./bin/spark-submit \ --class "com.ucas.bigdata.SimpleApp " \ --master spark://*.*.*.*:7077 \ --executor-memory 2G \ --total-executor-cores 10 \ target/scala-2.10/simple-project_2.10-1.0.jar 5以YARN模式提交应用程序 以Standalone模式运行应用程序,命令如下 ./bin/spark-submit \ --class "com.ucas.bigdata.SimpleApp " \ --master yarn-cluster \\ # 也可以是 `yarn-client` 模式 --executor-memory 2G \ --num-executors 10 \ target/scala-2.10/simple-project_2.10-1.0.jar 4.3读取配置文件的方式 在scala程序中将有些变化参数以配置文件的方式读入 1.在src目录下建立reference.conf文件格式如下 actionInPath="file:///E:\\\\falco_data\\\\actions.txt"这是从本地读取文件的方式 docInPath="file:///E:\\\\falco_data\\\\document.txt" dayCliRateOutPath="file:///E:\\\\result\\\\dayCliRate" dayChannelPath=”file:///E:\\\\result\\\\dayChannel” 2.从配置文件中读取属性 Config conf = ConfigFactory.load() //默认按顺序查看src文件目录下是否有application.confapplication.json application.properties reference.conf val bar1 = conf.getString("actionInPath ")下载本文
3以local模式提交应用程序Master URL 说明 local 以单线程在本地运行Spark(完全无并行) local[K] 在本地以K个Worker线程运行Spark(将这个数字设为你机器CPU核的数目比较理想) local[*] 以与你的机器上的逻辑核数目相同的Worker线程运行Spark spark://HOST:PORT 连接到一个给定的Spark模式集群上的Master。该端口必须是配置好、可供使用的,一般默认是7070 yarn-client 以Client模式连接到一个YARN集群。该集群的位置可以在HADOOP_CONF_DIR变量中找到 yarn-cluster 以Cluster模式连接到一个YARN集群。该集群的位置可以在HADOOP_CONF_DIR变量中找到