欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spark基础篇(三)- 创建RDD的前提(先创建SparkContext、SparkConf)

程序员文章站 2024-03-22 17:27:58
...

一、RDD五大特性回顾

二、创建Spark应用程序前需要创建SparkContext

三、使用idea构建SparkContext

四、一些思考题

一、RDD五大特性回顾

面试相关:
1、RDD是什么?为什么是分布式?为什么是弹性?
谈一下你对RDD的理解?结合RDD.scala进行理解;RDD五大特性与源码中的方法对应。

RDD是一个抽象类,它是没有办法直接使用的,只能通过子类访问;以jdbcRDD来看,通过jdbcRDD去访问数据,hadoopRDD:通过recorderreader去获取hdfs上的split,一个文件先拿到split,通过key-value把值取出来。

二、创建Spark应用程序前需要创建SparkContext

  • The first thing a Spark program must do is to create a SparkContext object, which tells Spark how to access a cluster. To create a SparkContext you first need to build a SparkConf object that contains information about your application.

1)、常用的context有哪些?

ServletContext
StrutsContext
jbpmCOntext(工作流中的上下文)
SpringContext			---> SpringBoot

如何理解Context?

  • context是一个框,可以理解为它是一个容器,我们使用spark的时候首先需要构建一个SparkContext.

2)、SparkContext的作用: 告诉Spark如何去连接集群(tell Spark how to access cluster)

3)、创建SparkContext前需要创建SparkConf对象(包含一些程序信息,application name、core、memory)

2.1、官网对于SparkConf的描述

  • 网址:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.SparkConf

1、SparkConf用key-value键值对的方式来设置Spark参数的;

2、通过new SparkConf的方式来new出来sparkconf对象;

3、所有的set方法在这个类中都支持链式,val conf = new SparkConf().setAppName(appName).setMaster(master);

4、仅仅只有一个SparkContext在进程中是active状态的,如果我们要创建一个新的SparkContext的时候一定要先把旧的关掉;

5、能够运行我们的Spark使用线程的方式,local[2]:线程数量只要大于2就行了。

2.2、Spark-submit的最佳实践

1、in practise, when running on a cluster, you will not want to hardcode master in the program, but rather launch the application with spark-submit and receive it there. However, for local testing and unit tests, you can pass “local” to run Spark in-process.

  • 在代码中不要采用硬编码的方式,意思是在代码中不要写一个local[2],而是应该在启动应用程序的时候使用spark-submit来指定local和master进行提交。对于本地模式和单元测试来说,能够通过local模式来运行Spark在一个进程中。
  • 在生产环境下,通过spark-submit的方式把master提交上去,这样的话这份代码可以跑在yarn、mesos、standalone这几个场景上且不用做代码的修改。

三、使用idea构建SparkContext

  • idea创建项目参考此篇博客:https://blog.csdn.net/zhikanjiani/article/details/90740153
 <spark.version>2.4.2</spark.version>
<!--Spark Core的依赖-->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.11</artifactId>
      <version>${spark.version}</version>
    </dependency>

new一个SparkContextApp.scala

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

object SparkContextApp {
  def main(args: Array[String]): Unit = {
    val sparkconf = new 					    SparkConf().setAppName("SparkContextApp").setMaster("local[2]")
    val sc = new SparkContext()
    
  }
}

//sparkconf提示declaration is never used,主要原因是没放进SparkContext中去
val sc = new SparkContext(sparkconf)


--------------------------
import org.apache.spark.{SparkConf, SparkContext}

object SparkContextApp {
  def main(args: Array[String]): Unit = {
    //如下就是SparkConf的链式编程
    val sparkconf = new SparkConf().setAppName("SparkContextApp").setMaster("local[2]")
    
    //创建SparkContext前需要创建一个SparkConf
    val sc = new SparkContext(sparkconf)
    
    //打开后养成习惯关掉
    sc.stop()
  }
}

3.1、spark-shell查看命令帮助&&在客户端上的使用

1、不会就去查看命令帮助:

scala> [aaa@qq.com bin]$ ./spark-shell --help
Usage: ./bin/spark-shell [options]

Scala REPL options:
  -I <file>                   preload <file>, enforcing line-by-line interpretation

spark-shell中的重要参数:
--master
--name
--jars,以逗号分隔的一系列的本地的jar包
--conf	用来指定配置的一堆参数
--driver-**
--executor-memory
--executor-cores
--driver=cores
--quene
跑生产都用yarn,本地都用local

在Spark客户端上使用:
[aaa@qq.com bin]$ ./spark-shell local[2]
20/06/05 00:19:12 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://hadoop001:4040
Spark context available as 'sc' (master = local[*], app id = local-1591287568151).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.2
      /_/
         
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45)
Type in expressions to have them evaluated.
Type :help for more information.

scala> 

剖析:
1、一个spark-shell就是一个应用程序,它创建了一个spark-context,它的别名是sc,master=local[2],它的id是local-1591283460827

打开webui,注意使用的是云主机还是本地自行使用虚拟机搭建的环境,如果是云主机的话,记得放开对应的端口;如果是虚拟机,记得关闭防火墙。

进入WebUI界面下查看相应信息:
Spark基础篇(三)- 创建RDD的前提(先创建SparkContext、SparkConf)

3.2、此处涉及的参数调优点

  • 在Spark UI界面下的environment中,下方有一列参数:
    Classpath Entries(类路径目录):

  • 这个目录下展示的是如下两个目录下的信息:

    $SPARK_HOME/conf/
    $SPARK_HOME/jars/*.jar

这个目录在spark1.x和spark2.x中的区别:

  • 在spark1.x中,将其打成了一个包;在Spark2.x中,目录下有很多的jar包

此处的调优点:如果是以spark on yarn的模式运行,每执行一次作业都要把这些包上传对于作业的开销是非常大的

进行RDD的操作前需要先构建SparkContext,而构建SparkContext前要先构建SparkConf,直接通过spark-shell的方式创建一个应用程序,应用程序默认给我们创建了SparkContext,它的别名是sc.

四、一些思考题

1、application ui在源码中的位置?

  • https://github.com/apache/spark/blob/master/bin/spark-shell

2、spark.app.id在源码中的位置?

name value
spark.app.id local-1591287568151

3、为什么spark.app.name=spark-shell?

4、java.io.tmpdir:/tmp -->这个目录需要进行调整

5、在spark-shell中,再构建一个SparkContext,他是不能工作的

6、shell脚本中@和#的区别?

$#	打印输入参数的个数
aaa@qq.com	有几个参数输入,就有几个参数输出
相关标签: SparkCore