Spark程序如何打成、jar包如何提交应用【本地运行测试、jar包本地模式提交、jar包集群模式提交】


基础环境准备

Hadoop 生态集群
Spark Standalone集群
IDEA 配置


基础配置

本文使用 IDEA 进行开发

首先注意的是目录结构,根据个人分组分类,目录清晰间接即可。本人建议命名、和结构可以仿造 Spark 官方所提供的样式。

由于 scala 的编程环境需要 Hadoop、Spark 集群上的配置文件信息,所以需要将资源文件导入到 resources 资源管理目录下。IDEA 功能强大,可以直接远程连接集群,并不需要借助其它工具。如下图:可以直接进行远程连接。
在这里插入图片描述
在这里插入图片描述
之后将需要的配置文件导入到 资源管理目录下(resources)
分别是:

  • Hadoop下的俩个文件(core-site.xml 、 hdfs-site.xml
  • Spark下的一个日志文件(log4j.properties

如下图所示:
在这里插入图片描述
注意:配置文件直接用鼠标拖入即可。

Maven依赖

如下图是模块的 Maven依赖:
在这里插入图片描述

    <!-- 指定仓库位置,依次为aliyun、cloudera和jboss仓库 -->
    <repositories>
        <repository>
            <id>aliyun</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
        <repository>
            <id>jboss</id>
            <url>http://repository.jboss.com/nexus/content/groups/public</url>
        </repository>
    </repositories>
    <properties>
        <scala.version>2.11.12</scala.version>
        <scala.binary.version>2.11</scala.binary.version>
        <spark.version>2.4.5</spark.version>
        <hadoop.version>2.7.3</hadoop.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.binary.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
    </dependencies>
    <build>
        <outputDirectory>target/classes</outputDirectory>
        <testOutputDirectory>target/test-classes</testOutputDirectory>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
            </resource>
        </resources>
        <!-- Maven 编译的插件 -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


基础案例演示

WordCount & TopKey



应用提交


应用提交语法

使用 【spark-submit】 提交应用语法如下:

Usage: spark-submit [options] <app jar | python file> [app arguments]

在下面这篇文章中的 测试案例(供参考)则是使用的上述语法:

Spark 部署,案例测试


jar包提交运行

如果使用 Java 或者 Scala 语言编写程序,需要将应用编译后打成 jar包 形式,提交运行。

bug(下面是本人踩的破坑)

代码运行之前,本人一定要提醒各位,因为所要的程序jar包是集群模式下的,所以当你在测试运行的时候,千万记得要在 IDEA 中的资源目录下导入相应的集群配置文件,如下图所示:
在这里插入图片描述
在这里插入图片描述

提示:

  • 1.前面俩个 xml 文件是Hadoop主目录下存放 Hadoop配置文件的目录。
  • 2.log4j.properties 是 Spark主目录下的 conf 目录下的文件。

文件导入之后,还有一个非常注意的点,那就是导入之后文件是否编译,如上图中的 target 目录中具有刚刚导入的文件,如果没有说明并没有编译,没有编译运行依旧会报错。如果没有编译,重建项目进行编译,如下图所示。
在这里插入图片描述


本地模式

下面是要打成 jar 包的代码:

(注意:下面代码内容是要打成jar包的集群模式代码,要在本地云心需要修改一行代码,就是将 //.setMaster(“local[2]”)取消注释 ,设置成本地模式,这样代码运行才不会报错)

import org.apache.spark.rdd.RDD
import org.apache.spark.{
    
    SparkConf, SparkContext}

/**
 * 基于Scala语言使用SparkCore编程实现词频统计:WordCount
 *      从HDFS上读取数据,统计WordCount,将结果保存到HDFS上
 */
object SparkSubmit {
    
    

  def main(args: Array[String]): Unit = {
    
    

    if(args.length < 2){
    
    
      println("Usage: SparkSubmit <input> <output> ................")
      System.exit(1)
    }

    // TODO: 创建SparkContext实例对象,需要传递SparkConf对象,设置应用配置信息
    val sparkConf: SparkConf = new SparkConf()
      .setAppName(this.getClass.getSimpleName.stripSuffix("$"))
      //.setMaster("local[2]") // 设置运行本地模式
    val sc: SparkContext = new SparkContext(sparkConf)

    // TODO: 第一步、读取数据,封装数据至RDD集合
    val inputRDD: RDD[String] = sc.textFile(args(0))

    // TODO: 第二步、分析数据,调用RDD中函数
    val resultRDD: RDD[(String, Int)] = inputRDD
      // 将每行数据按照分隔符进行分割
      .flatMap(line => line.split("\\s+"))
      // 转换为二元组,表示每个单词出现一次
      .map(word => (word, 1))
      // 按照单词word分组,再进行组内聚合
      .reduceByKey((tmp, item) => tmp + item)

    // TODO: 第三步、保存数据,将最终RDD结果数据保存至外部存储系统
    resultRDD.saveAsTextFile(s"${args(1)}-${System.currentTimeMillis()}")

    // 应用运行结束, 关闭资源
    sc.stop()
  }
}

设置代码参量:在HDFS上的输出路径,如下操作
在这里插入图片描述
在这里插入图片描述
在打成jar包之前运行测试一下:

代码运行之后,在HDFS集群上查看:
在这里插入图片描述
如图所示,会生成一个文件目录。


如何打成 jar 包(快捷方式)

接下来演示 jar包 方式。

首先在Maven中运行clean清空一下,然后在用package进行打包,出现 BUILD SUCCESS 之后会在 target目录下出现所要的 jar包,然后将 jar包上传至集群当中。如下图:
在这里插入图片描述

hdfs dfs -put spark-day02_2.11-1.0-SNAPSHOT.jar /spark/apps

上传完成可以先在本地运行测试一下,如下命令:(注意:集群的三台机器在哪台运行都可以)

SPARK_HOME=/export/server/spark
${SPARK_HOME}/bin/spark-submit \
--master local[2] \
--class cn.kaizi.spark.start.SparkSubmit \
hdfs://master:9000/spark/apps/spark-day02_2.11-1.0-SNAPSHOT.jar \
/datas/wordcount.data /datas/swc-output

运行之后可以通过历史服务器查看执行情况。


集群模式

然后在集群模式下运行(同样,命令在哪台主机运行都可以):

SPARK_HOME=/export/server/spark
${SPARK_HOME}/bin/spark-submit \
--master spark://master:7077,slave1:7077 \
--class cn.kaizi.spark.start.SparkSubmit \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1 \
--total-executor-cores 2 \
hdfs://master:9000/spark/apps/spark-day02_2.11-1.0-SNAPSHOT.jar \
/datas/wordcount.data /datas/swc-output

注意:上述命令中用到了 高可用(HA) 。下面这篇文章中有 Spark HA 的部署测试说明。

Spark HA

在历史服务器上查看执行情况:
在这里插入图片描述
在这里插入图片描述
在 master Web也查看应用提交情况:
在这里插入图片描述

nice !!!



基本参数配置

提交运行Spark Application时,有些基本参数需要传递值,如下所示:
在这里插入图片描述
动态加载Spark Applicaiton运行时的参数,通过–conf进行指定,如下使用方式:
在这里插入图片描述

Driver Program 参数配置

每个Spark Application运行时都有一个Driver Program,属于一个JVM Process进程,可以设置内存Memory和CPU Core核数。
在这里插入图片描述

Executor 参数配置

每个Spark Application运行时,需要启动Executor运行任务Task,需要指定Executor个数及每个Executor资源信息(内存Memory和CPU Core核数)。
在这里插入图片描述

官方案例

Spark 官方提供一些针对不同模式运行Spark Application如何设置参数提供案例,具体如下:

# Run application locally on 8 cores
./bin/spark-submit \
 --class org.apache.spark.examples.SparkPi \
 --master local[8] \
 /path/to/examples.jar \
 100
 
# Run on a Spark standalone cluster in client deploy mode
./bin/spark-submit \
 --class org.apache.spark.examples.SparkPi \
 --master spark://207.184.161.138:7077 \
 --executor-memory 20G \
 --total-executor-cores 100 \
 /path/to/examples.jar \
 1000
 
# Run on a Spark standalone cluster in cluster deploy mode with supervise
./bin/spark-submit \
 --class org.apache.spark.examples.SparkPi \
 --master spark://207.184.161.138:7077 \
 --deploy-mode cluster \
 --supervise \
--executor-memory 20G \
--total-executor-cores 100 \
 /path/to/examples.jar \
 1000
 
# Run on a YARN cluster
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
 --class org.apache.spark.examples.SparkPi \
 --master yarn \
	--deploy-mode cluster \ # can be client for client mode
 --executor-memory 20G \
 --num-executors 50 \
/path/to/examples.jar \
 1000
 
# Run a Python application on a Spark standalone cluster
./bin/spark-submit \
 --master spark://207.184.161.138:7077 \
 examples/src/main/python/pi.py \
 1000
 
# Run on a Mesos cluster in cluster deploy mode with supervise
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master mesos://207.184.161.138:7077 \
 --deploy-mode cluster \
 --supervise \
 --executor-memory 20G \
 --total-executor-cores 100 \
 http://path/to/examples.jar \
 1000
 
# Run on a Kubernetes cluster in cluster deploy mode
./bin/spark-submit \
 --class org.apache.spark.examples.SparkPi \
--master k8s://xx.yy.zz.ww:443 \
 --deploy-mode cluster \
 --executor-memory 20G \
 --num-executors 50 \
 http://path/to/examples.jar \
 1000

谢谢观看!!!

猜你喜欢

转载自blog.csdn.net/shuyv/article/details/116521186
今日推荐