使用Scala编写第一个Spark程序
演示目标
在Windows环境中使用Scala编写一个spark工程(WordCount),并分别使用”本地“、”提交到Spark集群中“两种方式运行。在开始之前,请确保HDFS与YARN环境已搭建完毕,HDFS与YARN环境搭建可参考下列博文:
从0开始搭建Hadoop2.x高可用集群(HDFS篇)
从0开始搭建Hadoop2.x高可用集群(YARN篇)
演示环境
软件 | 备注 |
---|---|
JDK | jdk-8u211(Linux) |
Scala | 2.13.1(Linux) |
Spark | 1.6.0(Linux) |
下载地址 | 若有需要请按需下载上述软件 |
- 节点部署情况:
Spark | |
---|---|
vm1 | worker |
vm2 | worker |
vm3 | master |
创建Spark工程
-
首选安装Windows下的Scala SDK,然后安装IDEA的Scala插件,使IDEA支持Scala语言开发,安装过程不再重复,安装完成后如图所示:
-
打开Project Structure(快捷键:alt+ctrl+shift+s),查看Global Libraries是否添加了Scala SDK,如果没有则进行添加,添加完成后如下所示:
-
使用Scala原型骨架创建Maven工程,创建完毕后删除测试用例中的两个类
-
修改pom.xml,将下列代码直接复制到工程的pom.xml中,注意保留自己的
<groupId>
与<artifactId>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>nick.spark</groupId>
<artifactId>practice_01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.specs</groupId>
<artifactId>specs</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.10</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 编写Spark代码
object App extends {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.ERROR)
val conf = new SparkConf().setAppName("wordcount")
val sc = new SparkContext(conf)
//数据文件从HDFS上读取
//val rdd = sc.textFile("hdfs://vm1:8020/wordcount")
//模拟数据
val data: List[String] = List("abc abc bcd bcd", "111 111 111 111")
sc.parallelize(data)
.flatMap(_.split(" "))
.map((_, 1))
.reduceByKey(_ + _)
.sortBy(x => x._2, false)
.map(x => x._1 + "\t" + x._2)
.saveAsTextFile("hdfs://vm1:8020/wordcount")
}
}
本地运行
- 修改代码
/**
* 将new SparkConf().setAppName("wordcount")修改为如下代码
*/
new SparkConf().setMaster("local").setAppName("wordcount")
- 本地运行时需要配置
HADOOP_HOME
与HADOOP_USER_NAME
系统变量,并且需要hadoop-2.6.5.tar.gz、hadoop.dll、winutils.exe工具,完整教程可参考博文:使用IDEA本地调试MapReduce程序
Spark集群运行
安装Spark
- 将
spark-1.6.0-bin-hadoop2.6.tgz
解压到虚拟机中的目录下并在%SPARK_HOME%/conf
下分别配置spark-env.sh
与slaves
两个文件,具体配置如下:
# spark-env.sh
# 配置中的具体路径以各自为准
export SCALA_HOME=/opt/scala-2.11.4
export JAVA_HOME=/opt/jdk1.8.0_172
export HADOOP_HOME=/opt/hadoop-2.6.5
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_MASTER_IP=vm3
SPARK_LOCAL_DIRS=/opt/spark-1.6.0-bin-hadoop2.6
SPARK_DRIVER_MEMORY=1G
# slaves
# 配置从节点Worker,此处vm1、vm2分别对应了两台从节点虚拟机并做了hosts映射
vm1
vm2
-
将整个
%SPARK_HOME%
复制到所有节点,vm1、vm2、vm3,并启动Spark集群%SPARK_HOME%/sbin/start-all.sh
-
修改代码
/**
* 将new SparkConf().setMaster("local").setAppName("wordcount")修改为如下代码
*/
new SparkConf().setAppName("wordcount")
- 使用
mvn package
进行工程打包并上传到Linux服务器,将spark-1.6.0-bin-hadoop2.6.tgz
上传到Linux服务器并解压
Spark standalone
- 提交Spark任务
# 具体配置以各自为准
/opt/spark-1.6.0-bin-hadoop2.6/bin/spark-submit \
--master spark://vm3:7077 \
--num-executors 2 \
--executor-memory 1g \
--executor-cores 1 \
--class nick.spark.App /opt/jars/practice_01-1.0-SNAPSHOT.jar
- 运行结果如下:
Spark on yarn
yarn-client模式
该模式主要用于Spark任务在服务器集群环境下的试运行和调试,并且可以即时反馈日志信息
- 提交Spark任务
# 具体配置以各自为准
/opt/spark-1.6.0-bin-hadoop2.6/bin/spark-submit \
--master yarn-client \
--num-executors 2 \
--executor-memory 1g \
--executor-cores 1 \
--class nick.spark.App /opt/jars/practice_01-1.0-SNAPSHOT.jar
yarn-cluster模式
该模式主要用于生产环境,可最大限度的利用服务器资源
- 提交Spark任务
# 具体配置以各自为准
/opt/spark-1.6.0-bin-hadoop2.6/bin/spark-submit \
--master yarn-cluster\
--num-executors 2 \
--executor-memory 1g \
--executor-cores 1 \
--class nick.spark.App /opt/jars/practice_01-1.0-SNAPSHOT.jar