使用Scala编写第一个Spark程序

演示目标

在Windows环境中使用Scala编写一个spark工程(WordCount),并分别使用”本地“、”提交到Spark集群中“两种方式运行。在开始之前,请确保HDFS与YARN环境已搭建完毕,HDFS与YARN环境搭建可参考下列博文:
从0开始搭建Hadoop2.x高可用集群(HDFS篇)
从0开始搭建Hadoop2.x高可用集群(YARN篇)

演示环境

软件备注
JDKjdk-8u211(Linux)
Scala2.13.1(Linux)
Spark1.6.0(Linux)
下载地址若有需要请按需下载上述软件
  • 节点部署情况:
Spark
vm1worker
vm2worker
vm3master

创建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_HOMEHADOOP_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.shslaves两个文件,具体配置如下:
# 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

运行结果

在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Scala编写Spark Word2Vec两个列表的文本相似度的代码示例: ```scala import org.apache.spark.ml.feature.{Word2Vec, Word2VecModel} import org.apache.spark.sql.SparkSession object Word2VecListSimilarity { def main(args: Array[String]): Unit = { val spark = SparkSession.builder .appName("Word2VecListSimilarity") .master("local[*]") .getOrCreate() val input1 = Seq("This is a sample sentence", "Another sample sentence") val input2 = Seq("This is another sentence", "Yet another sentence") val input = (input1 ++ input2).map(_.split(" ")) val word2Vec = new Word2Vec() .setVectorSize(100) .setMinCount(0) .setInputCol("text") .setOutputCol("result") val model = word2Vec.fit(input) val vectors = model.getVectors val input1Vectors = model.transform(input1.map(_.split(" ")).toDF("text")) val input2Vectors = model.transform(input2.map(_.split(" ")).toDF("text")) val similarity = input1Vectors.crossJoin(input2Vectors) .selectExpr("text as text1", "text as text2", "result as result1", "result as result2") .selectExpr("text1", "text2", "cosineSimilarity(result1, result2) as similarity") similarity.show() spark.stop() } } ``` 这个示例代码中,我们使用Spark MLlib的Word2Vec算法来实现文本相似度。我们首先将两个文本列表组合成一个输入列表,并使用Word2Vec算法训练一个模型,将单词序列转换为向量空间中的向量。然后,我们将第一个文本列表和第二个文本列表分别转换为向量,使用`cosineSimilarity`函数计算它们之间的相似度,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值