http://spark.apache.org/docs/latest/rdd-programming-guide.html#overview
SparkContext 可以想象成一个框,里面什么都可以放,放了之后,我们要什么直接去拿就行了。
如果要使用一个spark程序,第一件事就是创建一个SparkContext对象 。
SparkContext会告诉spark如何去连接集群。
创建SparkContext,首先还要构建一个 SparkConf对象 。
SparkConf包含了应用程序的信息。比如应用程序的名称、需要多少core、需要多少memory等。
在每个JVM里面,只有一个SparkContext 是active状态。如果你要创建一个新的,需要把之前的SparkContext 先stop掉。
In practice, 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.
不要在程序中试图去硬编码,比如不要这样:val conf = new SparkConf().setAppName(appName).setMaster(“local[2]”)。要用spark-submit这样的方式去设置。对于本地测试和单元测试,你可以通过本地去运行进程中的spark。
①开发的时候尽可能的使用local模式。②在生产上,一定不要硬编码我们的master,而是要把这个master通过spark的spark-submit的方式给它提交上去。这样的话,同一份代码,既可以跑在standalone上面,也可以跑在yarn、Mesos上面,而且不需要做任何代码的修改。
现在来创建一个maven项目
确定后等一下,会build
然后把相关东西删掉,最后剩这些:
如果想用IDEA去看spark源码,那么可以把它的包导进来,或者把源码导进来。
现在用maven把它的dependency加入进来。看官网描述:
你如果想要写一个spark程序,你需要添加一个spark的Maven 依赖。另外你如果需要访问HDFS集群,你需要添加hadoop-client for your version of HDFS的依赖,不需要则不用。最后你需要在程序中把spark的类导入进来。
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
这里我添加的是:
org.apache.spark
spark-core_2.11
2.4.0
然后在包下面创建一个scala的object
构建SparkContext的代码如下:
import org.apache.spark.{SparkConf, SparkContext}
object SparkContextApp {
def main(args: Array[String]): Unit = {
val SparkConf = new SparkConf().setAppName("SparkContextApp").setMaster("local[2]").set("spark.app.id","st-partition-id")
val sc = new SparkContext(SparkConf)
///中间是你要写的业务逻辑
sc.stop()
}
}
Spark的shell作为一个强大的交互式数据分析工具,提供了一个简单的方式学习API。它可以使用Scala(在Java虚拟机上运行现有的Java库的一个很好方式)或Python。在Spark目录里使用下面的方式开始运行:./bin/spark-shell
–master
上面已经讲到,不建议采用硬编码的方式来指定我们的master,而应该采用spark-submit提交的时候来指定。
–name 指定应用程序的名称
–jars jar之间用逗号分开
–conf 可以指定spark配置的一些参数
–driver-** 可以有memory、java-options、library-path、class-path
–executor-memory
–executor-cores
–driver-cores
–queue 队列,生产上都是以队列的方式进行提交
–num-executors 执行端的个数
举例:
[hadoop@hadoop001 bin]$ ./spark-shell --master local[2] //本地 两个core
....... WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable //不能读取本地的library,比如snappy、lzo等,因为没有配置,也没有编译,所以没有
Setting default log level to "WARN". //默认的日志级别是WARN,但是是可以设置的
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://hadoop001:4040 //这里是Web UI的地址
Spark context available as 'sc' (master = local[2], app id = local-1558707773428). //这个Spark context可以访问的到,它的别名是sc,它所指向的master是 local[2],对应的app id是...
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.2 //Spark版本
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45) //自己使用的Scala版本
Type in expressions to have them evaluated.
Type :help for more information.
scala>
一个spark shell 其实就是一个spark应用程序。一个spark应用程序用的必然是Spark context。
访问http://hadoop001:4040 这个地址:
上面启动的时候并没有设置AppName。
上图里面的 Spark shell application UI 里的Spark shell 的来源是哪里?
看一下bin/spark-shell.sh脚本就知道了。
可以在./spark-shell --master local --name SparkTest 这里指定它的名称(shell命令行里)。
或者 val SparkConf = new SparkConf().setAppName(“SparkContextApp”)(IDEA里)
指定了之后Web UI上就变化了:
spark.app.id = local-1558745475939 这个是怎么来的?
local模式:local开头,后面跟的是当前时间的时间戳
yarn模式:Application开头
spark.app.id 的来源:
看源码:TaskScheduler.applicationId()
程序的唯一标识,在创建SparkContext时设置(TaskScheduler启动后立即生成)
java.io.tmpdir这个参数是做什么的?
The default temporary-file directory is specified by the system property java.io.tmpdir.
操作系统缓存的临时目录,不同操作系统的缓存临时目录不一样, 在Windows的缓存目录为:C:\Users\登录用户~1\AppData\Local\Temp\, Linux为:/tmp
可以这样修改:java -Djava.io.tmpdir=/path/to/tmpdir
生产上这个参数肯定是要调整的。
spark on yarn提交作业时,大量的jar包传上去,开销很大,spark on yarn 提交的时候的优化点??
In the Spark shell, a special interpreter-aware SparkContext is already created for you, in the variable called sc. Making your own SparkContext will not work. 在上面启动的spark shell里,它会自动感知,会自动给你创建一个SparkContext,在shell里面,你自己再创建的话是不能工作的。
启动spark-shell之后,在里边再创建一个sparkcontext会报错:org.apache.spark.SparkException: Only one SparkContext may be running in this JVM。