Spark基础篇(三)- 创建RDD的前提(先创建SparkContext、SparkConf)
二、创建Spark应用程序前需要创建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界面下查看相应信息:
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 有几个参数输入,就有几个参数输出