基于IDEA构建Spark应用并部署

前言
本章将介绍如何通过IDEA构建Spark应用,并最终部署。


构建应用
Java应用
1、新建一个maven项目,并在POM中添加如下依赖:
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency> <!-- Spark dependency -->
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.3.0</version>
    </dependency>
</dependencies>

<build>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>

</build>
2、基于java8编写一个main类,读取spark的README.md文件,统计包含a、b分别有多少行:
public class SimpleJavaApp {
    public static void main(String[] args) {
        String logFile = "D:/spark-2.3.0-bin-hadoop2.7/README.md";
        SparkConf conf = new SparkConf().setMaster("local[8]");
        SparkSession spark = SparkSession.builder().config(conf).appName("Simple Application").getOrCreate();
        Dataset<String> logData = spark.read().textFile(logFile).cache();
        long numAs = logData.filter((FilterFunction<String>) str -> str.contains("a")).count();
        long numBs = logData.filter((FilterFunction<String>) str -> str.contains("b")).count();

        System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
        spark.stop();
    }
}
Note:
  • 通过SparkConf设定master参数,即可设定运行计算模式,先主要介绍Local模式:
Local模式就是运行在一台计算机上的模式,通常就是用于在本机上练手和测试,有如下几个方式:
  • local: 所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式;
  • local[K]: 指定使用几个线程来运行计算,比如local[4]就是运行4个worker线程。通常我们的cpu有几个core,就指定几个线程,最大化利用cpu的计算能力;
  • local[*]: 这种模式直接帮你按照cpu最多cores来设置线程数了;
实际的大规模计算还是需要cluster模式。

3、控制台打印:


Scala应用
Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。而Spark正是由Scala开发的,所以天然通过Scala构建的应用将是最佳方案,本小节将直接在当前项目中采用scala实现相同功能。

1、在idea中添加scala类库配置:
2、编写main方法如下:
object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "D:/spark-2.3.0-bin-hadoop2.7/README.md"
    val conf = new SparkConf().setMaster("local[8]")
    val spark = SparkSession.builder.config(conf).appName("Simple Application").getOrCreate()
    val logData = spark.read.textFile(logFile).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println(s"Lines with a: $numAs, Lines with b: $numBs")
    spark.stop()
  }
}
3、控制台打印:


Local模式部署
>spark-submit --class com.shf.spark.SimpleJavaApp --master local[4] --name demo D:\learnworkspace\spark-demo\target\spark-demo-1.0-SNAPSHOT.jar
查看到如下打印信息表明部署成功:



扩展
上述的开发环境调试和部署均采用local模式,实际生产者中必须采用cluster模式,先简单介绍下概念:
cluster模式
cluster模式肯定就是运行很多机器上了,但是它又分为以下三种模式,区别在于谁去管理资源调度。
这种模式下,Spark会自己负责资源的管理调度。它将cluster中的机器分为master机器和worker机器,master通常就一个,可以简单的理解为那个后勤管家,worker就是负责干计算任务活的苦劳力。具体怎么配置可以参考 Spark Standalone Mode
使用standalone模式示例:
/bin/spark-submit --cluster cluster_name --master spark://host:port ...
--master就是指定master那台机器的地址和端口,我想这也正是--master参数名称的由来吧。
mesos模式
这里就很好理解了,如果使用mesos来管理资源调度,自然就应该用mesos模式了,示例如下:
/bin/spark-submit --cluster cluster_name --master mesos://host:port ...
yarn模式
同样,如果采用yarn来管理资源调度,就应该用yarn模式,由于很多时候我们需要和mapreduce使用同一个集群,所以都采用Yarn来管理资源调度,这也是生产环境大多采用yarn模式的原因。yarn模式又分为yarn cluster模式和yarn client模式:
  • yarn cluster: 这个就是生产环境常用的模式,所有的资源调度和计算都在集群环境上运行。
  • yarn client: 这个是说Spark Driver和ApplicationMaster进程均在本机运行,而计算任务在cluster上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值