基于IDEA构建Spark应用并部署

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


构建应用
Java应用
1、新建一个maven项目,并在POM中添加如下依赖:

    UTF-8
    1.8



    
        junit
        junit
        3.8.1
        test
    
     
        org.apache.spark
        spark-sql_2.11
        2.3.0
    




    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            
                ${java.version}
                ${java.version}
            
        
    

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 logData = spark.read().textFile(logFile).cache();
        long numAs = logData.filter((FilterFunction) str -> str.contains("a")).count();
        long numBs = logData.filter((FilterFunction) 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上。

你可能感兴趣的:(spark)