一、写在前面
由于Spark 的速度,API 的易用性,Spark在行业中的使用越来越广泛。
Hbase 在2.0 alpha 版之后也加入对Spark的支持;
ElasticSearch也找加入对Spark的支持;
Spark天然的分布式内存计算的优势基本上能向程序猿们完全隐藏分布式编程技术的细节。对于大数据量的计算 约等于 写SQL。未来Spark 将更会流行。那么如何构建Spark开发环境呢?
二、开发套件
- IDE: IntelJ IDEA
- 依赖管理:SBT
- 版本控制:Git
- 操作系统:Mac/Linux/windows
因为大量的测试工具需要上传Jar到集群环境,shell的支持是必须的。
首选类Unix系统,windows 也可,最好能选用win10(支持Shell的版本)
三、环境搭建
应按照下来步骤按照
1.JDK 1.8
2.Scala 2.11 以上版本
3.SBT: 0.13 以上(推荐0.13.8)
4.Git
5.IntelJ IDEA
tips:
- 在 Mac/linux 下可通过 homebrew 命令按照 git 和sbt。在windows 下载 msi 文件默认安装。最好不要改变安装路径,否则会造成git 命令无法识别
- 高级玩家强烈推荐命令行。oh my zsh 这一类的工具,简直不能再强大。
四、创建工程
目前SBT并未集成打包工具,需在全局的SBT依赖路径中配置打包工具的依赖包。
在~/.sbt/0.13/plugins 下的build.sbt 文件中增加:
resolvers += "Sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.7.0-SNAPSHOT")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
完成上述工作之后,
1.创建一个测试的SBT 工程。特别注意SBT版本(0.13.8),JDK 1.8 , scala 2.11.x
- 配置build.sbt 依赖
依赖库一般在http://mvnrepository.com 中搜索,如果无法满足,可在GitHub上找开源代码。
注意选择SBT的依赖路径,同时注意依赖的版本
如果发生冲突,需解决冲突。刷新依赖,即可编写代码。
一个可用的build.sbt 配置如下:
// 以下要求sbt 版本必须是0.13,否则无法找到依赖包
import _root_.sbtassembly.Plugin.AssemblyKeys
import sbt._
import Keys._
import sbtassembly.Plugin._
import AssemblyKeys._
assemblySettings
name := "SparkAppExamples"
version := "0.1"
scalaVersion := "2.11.8"
// Resolvers
resolvers += "SnowPlow Repo" at "http://maven.snplow.com/releases/"
resolvers += "Twitter Maven Repo" at "http://maven.twttr.com/"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.0.0" % "provided",
"org.apache.spark" %% "spark-sql" % "2.0.0" % "provided",
"org.apache.spark" %% "spark-hive" % "2.0.0" % "provided",
"org.apache.spark" %% "spark-streaming" % "2.0.0" % "provided",
"org.apache.spark" %% "spark-graphx" % "2.0.0" % "provided",
"org.apache.spark" %% "spark-mllib" % "2.0.0" % "provided",
"com.snowplowanalytics" %% "scala-maxmind-iplookups" % "0.2.0"
)
// 冲突处理
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => {
case "META-INF/MANIFEST.MF" => MergeStrategy.discard
case "META-INF/io.netty.versions.properties" => MergeStrategy.last
case PathList(ps@_*) if ps.last endsWith "eclipse.inf" => MergeStrategy.last
case PathList(ps@_*) if ps.last endsWith "pom.xml" => MergeStrategy.last
case PathList(ps@_*) if ps.last endsWith "pom.properties" => MergeStrategy.last
case PathList("com", "sun", xs@_*) => MergeStrategy.last
case PathList("javax", xs@_*) => MergeStrategy.last
case PathList("org", "apache", xs@_*) => MergeStrategy.last
case PathList("org", "aopalliance", xs@_*) => MergeStrategy.last
case PathList("org", "w3c", xs@_*) => MergeStrategy.last
case "overview.html" => MergeStrategy.last
case x => old(x)
}
}
五、提高效率
- 使用Shell
- 版本控制使用Shell
- 版本控制命令编辑成 alias
- 文件上传脚本化
- 测试执行脚本化
# git 命令别名
alias gl="git pull"
alias gh="git push"
alias gc="git commit -m"
alias ga="git add ."
#免密上传jar包, 需研究ssh-gen-key 或spwan命令
scp /../xx.jar 10.120.1.1:/home/spark/hhl/lib/
#spark submit 脚本化
#!/bin/sh
CLASS="要运行对应的路径"
/opt/spark-2.1.1-bin-spark-2.1.1-hadoop2.6.4/bin/spark-submit \
# 运行参数配置,核数,内存
--master yarn \
--queue xx \
--deploy-mode cluster \
--num-executors 12 \
--executor-cores 5 \
--executor-memory 30G \
--conf spark.driver.maxResultSize=2G \
--conf spark.driver.memory=30G \
# 优化选项 GC策略
--conf spark.executor.extraJavaOptions=-XX:+UseParallelGC \
--conf spark.executor.extraJavaOptions=-XX:ParallelGCThreads=8 \
--conf spark.driver.extraJavaOptions="-XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly" \
--class $CLASS \
--files hdfs://namenodeha/user/processuser/hive-site.xml \ #需要上传的配置文件
/home/spark/hhl/lib/ #jar 包位置
- 充分利用Github 上的源码,不要自己造轮子
- 保护好颈椎,身体是革命的本钱!!!