一、在 Spark Shell 中运行代码
Spark shell 提供了简单的方式来学习 API,并且提供了交互的方式来分析数据。你可以输入一条语句,Spark shell会立即执行语句并返回结果,这就是我们所说的REPL(Read-Eval-Print Loop,交互式解释器),为我们提供了交互式执行环境,表达式计算完成就会输出结果,而不必等到整个程序运行完毕,因此可即时查看中间结果,并对程序进行修改,这样可以在很大程度上提升开发效率。Spark Shell 支持 Scala 和 Python,这里使用 Scala 来进行介绍。
前面已经安装了Hadoop和Spark,如果Spark不使用HDFS和YARN,那么就不用启动Hadoop也可以正常使用Spark。如果在使用Spark的过程中需要用到 HDFS,就要先启动 Hadoop
假设不需要用到HDFS,因此,就没有启动Hadoop。现在我们直接开始使用Spark。
spark-shell命令及其常用的参数如下:
./bin/spark-shell --master <master-url>
Spark的运行模式取决于传递给SparkContext的Master URL的值。Master URL可以是以下任一种形式:
* local 使用一个Worker线程本地化运行SPARK(完全不并行)
* local[*] 使用逻辑CPU个数数量的线程来本地化运行Spark
* local[K] 使用K个Worker线程本地化运行Spark(理想情况下,K应该根据运行机器的CPU核数设定)
* spark://HOST:PORT 连接到指定的Spark standalone master。默认端口是7077.
* yarn-client 以客户端模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR 环境变量中找到。
* yarn-cluster 以集群模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR 环境变量中找到。
* mesos://HOST:PORT 连接到指定的Mesos集群。默认接口是5050。
这里我们采用“本地模式”(local)运行Spark,Spark也可以在集群模式下运行。
Spark中采用本地模式启动Spark Shell的命令主要包含以下参数:
–master:这个参数表示当前的Spark Shell要连接到哪个master,如果是local[*],就是使用本地模式启动spark-shell,其中,中括号内的星号表示需要使用几个CPU核心(core);
–jars: 这个参数用于把相关的JAR包添加到CLASSPATH中;如果有多个jar包,可以使用逗号分隔符连接它们;
##Spark命令使用方法介绍
##采用本地模式,在4个CPU核心上运行spark-shell:
cd /usr/local/spark-1.6.3-bin-hadoop2.6
./bin/spark-shell --master local[4]
##可以在CLASSPATH中添加code.jar
cd /usr/local/spark
./bin/spark-shell --master local[4] --jars code.jar
##可以执行“spark-shell –help”命令,获取完整的选项列表
cd /usr/local/spark
./bin/spark-shell --help
##命令进入spark-shell环境
bin/spark-shell
##该命令省略了参数,系统默认是“bin/spark-shell –master local[*]”
即采用本地模式运行,使用本地所有的CPU核心。
为了操作方便,这里建议为Spark添加系统变量:
vi /etc/profile
##添加下列于最后:
#spark
export PATH=$PATH:/usr/local/spark-1.6.3-bin-hadoop2.6/bin
source /etc/profile
启动spark-shell后,就会进入“scala>”命令提示符状态,如下图:
现在就可以在里面输入scala代码进行调试。
scala> 8*2+5 #测试计算
res0: Int = 21
scala>:quit #scla退出
二、Spark独立应用程序编程
我们通过一个简单的应用程序 SimpleApp 来演示如何通过 Spark API 编写一个独立应用程序。使用 Scala 编写的程序需要使用 sbt 进行编译打包,相应的,Java 程序使用 Maven 编译打包,而 Python 程序通过 spark-submit 直接提交。
安装了spark,可以编写Scala独立应用程序以及Java独立应用编程。这样由于我的eclipse及maven在windows下,这里先介绍第一部分编写Scala独立应用程序。
编写Scala独立应用程序这一部分主要分为以下几块:1.安装sbt;2.编写Scala应用程序;3.使用sbt打包Scala程序;4.通过 spark-submit 运行程序。下面:
1.安装sbt
sbt是一款Spark用来对scala编写程序进行打包的工具,这里简单介绍sbt的安装过程,感兴趣的读者可以参考官网资料了解更多关于sbt的内容。Spark 中没有自带 sbt,这里是sbt的下载地址sbt-launch.jar,直接点击下载即可。
mkdir /usr/local/sbt #/usr/local下创建sbt文件夹
sudo chown -R hadoop /usr/local/sbt # 此处的 hadoop 为你的当前用户
cd /usr/local/sbt 切入到sbt目录
##用winscp或其他连接工具将sbt-launch.jar上传至服务器master端
vi ./sbt ##在/usr/local/sbt 中创建 sbt 脚本,添加内容:
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
chmod u+x ./sbt #保存后,为./sbt 脚本增加可执行权限
./sbt sbt-version #运行命令,检验 sbt 是否可用
确保电脑处于联网状态,首次运行会处于 “Getting org.scala-sbt sbt 0.13.11 …” 的下载状态,请耐心等待。我在这里等待了近十分钟才出现第一条下载提示。总之整体时间会很漫长~
得到如下图的版本信息就成功了!
2.编写Scala应用程序
##在终端中创建一个文件夹 sparkapp 作为应用程序根目录
cd ~ # 进入用户主文件夹
mkdir ./sparkapp # 创建应用程序根目录
mkdir -p ./sparkapp/src/main/scala # 创建所需的文件夹结构
##在 ./sparkapp/src/main/scala 下建立一个名为SimpleApp.scala的文件
vi ./sparkapp/src/main/scala/SimpleApp.scala
##添加代码:
/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object SimpleApp {
def main(args: Array[String]) {
val logFile = "file:///usr/local/spark-1.6.3-bin-hadoop2.6/README.md" // Should be some file on your system
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sc.textFile(logFile, 2).cache()
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()
println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
}
}
##说明:
##该程序计算 /usr/local/spark/README 文件中包含 “a” 的行数 和包含 “b” 的行数。代码
的/usr/local/spark 为 Spark 的安装目录,如果不是该目录请自行修改。不同于 Spark shell,独立应用
程序需要通过 val sc = new SparkContext(conf) 初始化 SparkContext,SparkContext 的参数
SparkConf 包含了应用程序的信息。
3.使用sbt打包Scala程序
该程序依赖 Spark API,因此需要通过 sbt 进行编译打包。
vi ./sparkapp/simple.sbt
##添加内容来声明该独立应用程序的信息以及与 Spark 的依赖关系:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.10.5"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.3"
##文件 simple.sbt 需要指明 Spark 和 Scala 的版本。在上面的配置信息中,scalaVersion用来指定scala
##的版本,sparkcore用来指定spark的版本,这两个版本信息都可以在之前的启动 Spark shell 的过程中,从
##屏幕的显示信息中找到
##为保证 sbt 能正常运行,先执行如下命令检查整个应用程序的文件结构:
cd ~/sparkapp
find .
文件结构应如下图所示:
##我们可以通过如下命令将整个应用程序打包成 JAR(首次运行同样需要下载依赖包)
/usr/local/sbt/sbt package
对于刚安装好的Spark和sbt而言,第一次运行上面的打包命令时,会需要几分钟的运行时间(很慢长~~),因为系统会自动从网络上下载各种文件。后面再次运行上面命令,就会很快,因为不再需要下载相关文件。打包成功的话,会输出如下内容:
第一次打包时间(比较久)
##第二次打包成功(比较快)
root@master:~/sparkapp$ /usr/local/sbt/sbt package
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] Set current project to Simple Project (in build file:/home/hadoop/sparkapp/)
[success] Total time: 2 s, completed 2017-2-19 15:45:29
生成的 jar 包的位置为 ~/sparkapp/target/scala-2.11/simple-project_2.11-1.0.jar。
4.通过 spark-submit 运行程序
最后,我们就可以将生成的 jar 包通过 spark-submit 提交到 Spark 中运行了,命令如下:
/usr/local/spark-1.6.3-bin-hadoop2.6/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/scala-2.10/simple-project_2.10-1.0.jar
#上面命令执行后会输出太多信息,可以不使用上面命令,而使用下面命令查看想要的结果
/usr/local/spark-1.6.3-bin-hadoop2.6/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/scala-2.10/simple-project_2.10-1.0.jar 2>&1 | grep "Lines with a:"
最终得到的结果如下:
Lines with a: 58, Lines with b: 26
自此,你就完成了你的第一个 Spark 应用程序了。