spark01

spark01

spark的特点

搭建spark的集群

提交spark的任务

spark的运行机制

spark wordcount

spark的官网spark.apache.org

spark运行速度比较快:因为使用内存

mr存在昂贵的shuffle

mr 只有两个算子 (map  reduce)*N

mr每次计算的时候中间结果落地到磁盘中

spark 算子比较多

不需要落地中间结果到磁盘上

spark支持多种语言

spark DAG有向无环图 可以先生成图,然后将图进行切分整理,然后按照图进行优化执行

spark存在容错 mr不存在容错,spark是一次性运行完毕的

 

 

spark的部署模式

spark部署模式分为四种

local 本地模式,开箱即用

standalonespark自带的模式,这个模式是最常用的模式

yarn:资源管理框架

mesos:和yarn一样

 

按照spark集群

下载安装包

官网中下载

 

部署spark  master  worker worker worker

spark -- scala --- jdk1.8

 

根据进程号查看任务的端口号

7077master的通信端口,这个端口tcp

6066restful风格的http请求接口

8080master的监控页面

 

8081worker的监控页面

7077woker连接master的地址

 

master里面的每个worker都是8cores 1G

 

 

 

 

 

 

查看系统内存

worker cores = all cores   memory =  all memory minus 1G

 

spark任务的提交

spark-submit 提交的是jar

spark-shell 交互式命令行

 

spark-shell中含有spark-submit的内容。其实spark-shell提交任务是使用的spark-submit

spark-submit的使用:

spark-submit [options] <app jar | python file> [app arguments]

--master 提交任务到哪个集群中

--class 运行jar包中的哪个类

--name 运行的任务再监控页面中可以看到任务的名字

spark-submit --master spark://master02:7077 --class org.apache.spark.examples.SparkPi /home/ghostwowo/Downloads/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 10

spark-submit --master local本地模式的单个cores local[N]本地模式的n个核数  local[*]

executor执行其

 

每个worker默认启动一个executor,每个executor默认使用1g内存所有的cores

 

sparks-shell交互式命令行

spark-shell --master spark://master02:7077 这个命令是再集群中开启一个长应用,但是不会运行任务,交互式命令行

任务的监控页面是4040端口,任务运行的时候spark集群的上下文文件对象是sc实例,通过使用sc就可以和集群进行沟通会话

 

spark版本的wordcount

spark中读取文件的时候发现文件不存在

因为spark是集群模式,sc.textFile(“”)读取文件的时候,每台机器都读取自身的文件

为什么读取的时候不报错?

读取的数据都是rddrdd上面的操作方法都叫做算子,算子分为两种 转换类的算子  行动类的算子

将一个rdd转换为另一个rdd的算子就是转换类算子,是懒加载的

行动类算子,一旦一个应用中遇见了行动类的算子,那么才会真正的执行

transformation  action

其实spark任务读取文件的时候都从hdfs中读取

scala> sc.textFile("hdfs://master:9000/aaa.txt")

res8: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/aaa.txt MapPartitionsRDD[8] at textFile at <console>:25

 

scala> res8.flatMap(_.split(" "))

res9: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[9] at flatMap at <console>:27

 

scala> res9.map((_,1))

res10: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[10] at map at <console>:29

 

scala> res10.groupBy(_._1)

res11: org.apache.spark.rdd.RDD[(String, Iterable[(String, Int)])] = ShuffledRDD[12] at groupBy at <console>:31

 

scala> res11.mapValues(_.size)

res12: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[13] at mapValues at <console>:33

 

scala> res12.collect

res13: Array[(String, Int)] = Array((tom,1), (hello,4), (jerry,1), (rose,2), (jack,2))

 

一般的算子都是转换类算子

collect将数据从多个rdd中收集起来

saveAsTextFile(“”)将数据保存到一个文件介质中

foreach(println)遍历每一个元素,进行处理

 

idea中的wordcount

def main(args: Array[String]): Unit = {
  val conf = new SparkConf()
  conf.setAppName("wc")
  conf.setMaster("local")
  val sc = new SparkContext(conf)
  val rdd1:RDD[String] =sc.textFile("hdfs://master:9000/aaa.txt")
  val rdd2:RDD[String] =rdd1.flatMap(_.split(" "))
  val rdd3:RDD[(String,Int)] = rdd2.map((_,1))
  val rdd4:RDD[(String,Iterable[(String,Int)])] = rdd3.groupBy(_._1)
  val rdd5:RDD[(String,Int)] = rdd4.mapValues(_.size)
  rdd5.saveAsTextFile("hdfs://master:9000/aaares")
}

运行内存不足的时候-Xmx512M增加运行内存

spark-submit --master spark://master02:7077 --class com.bw.spark.WordCount Spark1807-1.0-SNAPSHOT.jar hdfs://master:9000/aaa.txt hdfs://master:9000/aaares1

提交任务到集群中,如果已经有任务再运行了,那么就不存在足够的资源;需要等待资源分配

 

再提交任务的时候查看spark的集群进程

 

 

 

 

 

master02上面多了一个spark-submit的进程,这个进程主要是提交的进程,再什么位置提交任务就会多了一个spark-submit的进程

CoarseGrainedExecutorBackEnd 简称为executor,每个worker都会生成一个executor的执行器

 

 

 

Driver是一个应用的进程老大,管理所有的应用执行和切分以及分配,再standalone模式中driver就在client端,driver负责初始化工作,初始化sc,初始化很多运行时候需要的组件,再哪里提交的任务,哪里就是客户端,spark on yarn 这个driver就在集群中

 

任务的资源分配

worker的资源分配 一个worker再启动的时候,本台机器上的所有cores all memory-1G

worker启动一个executor,一个executor占用的资源是多少?

 

 

 

 

executor默认使用的cores是所有的核数  memory1G

再运行spark-shell脚本的时候,运行spark-submit提交的任务,这个任务没有资源分配,所以一直处于等待状态

 

这就是资源占用的提示

 

自定义资源分配

cores  memory

all cores  and 1G  executor占用worker的资源分配

spark-shell  spark-submit

8cores  1G

spark-shell  3 executor  4cores  512M

spark-submit  3 executor  4cores  512M

以上资源分配就可以形成两个应用并行运行

--executor-cores executor再启动的时候使用的cores核数

--executor-memory executor再启动的时候需要的内存

--total-executor-cores 所有的executor再启动的时候需要的总的cores

spark-shell --master spark://master02:7077 --executor-cores 4 --executor-memory 512M

spark-shell --master spark://master02:7077 --executor-cores 4 --executor-memory 512M --total-executor-cores 12

posted @ 2019-09-16 14:41  lilixia  阅读(223)  评论(0编辑  收藏  举报