设为首页 加入收藏

TOP

Spark(3)
2019-03-20 13:06:14 】 浏览:66
Tags:Spark

一.Spark用到序列化的地方

默认情况下使用的是Java的序列化,我们可以用别的方式序列化任如kryo
方法一:修改spark-default.conf配置文件
spark.serializer org.apache.spark.serializer.KryoSerializer
方法二:启动spark-shell或者spark-submit时配置
conf spark.serializer=org.apache.spark.serializer.KryoSerializer
方法三:在代码中

二.配置多临时目录文件

1.spark.local.dir参数
问题: 当shuffle,归并排序(sort,merge)时都会产生临时文件,这些文件会在指定的目录下。那这个文件夹有很多临时文件,如果都发生读写操作,有线程在读写这个文件,磁盘I/O性能就非常低。
**解决方法:**可以创建多个文件夹,每个文件夹都对应一个真实的硬盘。这个配置是配置多个路径就可以。

2.启用推测执行机制:
可以设置spark.speculation true
开启后,spark会检测执行较慢的Task,并复制这个Task在其他节点运行,最后哪个节点先运行完,就用其结果,然后将慢Task杀死

3.collect速度慢
注意collect只适合于测试**,**原因****它会把结果收集到Driver服务器上,数据要跨网络传输,同时要要求Driver服务器内存大,所以收集过程慢,解决方法就是直接输出到分布式文件系统中

4.有些情况下,RDD操作使用MapPartitions替代map
原因:map方法对RDD的每一条记录逐一操作,这样频繁的连接断开数据库,效率差。

rdd.map{ x=>conn=getDBConn.conn;write(x.toString);conn close;

这样就一次连接一次断开,中间批量操作,效率提升
rdd.mapPartitions{(record:=>conn.getDBConn;for(item<-recorders;
write(item.toString);conn close;}

一.SparkConf(Spark配置文件)

SparkContext实例化的时候需要传进一个SparkConf作为参数,SparkConf描述整个Spark应用程序的配置信息,Sparkconf可以进行链式的调用

二.SparkContext(spark 环境)

SparkContext是整个Spark功能的入口,代表了应用程序与整个集群的连接点,Spark应用程序是通过SparkContext发布到Spark集群的,并且Spark程序的运行都是在SparkContext为核心的调度指挥下进行的,SparkContext崩溃或者结束就代表Spark应用程序执行结束,所以SparkContext在Spark中是非
常重要的一个类。

其实SparkContext中最主要的3大核心对是,DAGScheduler,TaskScheduler,SchedulerBackend
1)DAGScheduler主要负责分析依赖关系,然后将DAG划分为不同的Stage(阶段),其中每个Stage由可以并发
执行的一组Task构成,这些Task的执行逻辑完全相同,只是作用于不同的数据。
2)TaskScheduler作用是为创建它的SparkContext调度任务,即从DAGScheduler接收不同Stage的任务,并且向集群提交这些任务,并为执行特别慢的任务启动备份任务
3)SchedulerBackend作用是依据当前任务申请到的可用资源,将Task在Executor进程中启动并执行,完成计算的调度过程。

三。SparkEnv(Spark环境对象)

SparkEnv是Spark的执行环境对象,其中包括但不限于:
1)serializer
2)RpcEnv
3)BlocManager
4)MapOutPutTracker(shuffle过程中非常重要)等
在local模式下Driver会创建Executor,在Standalone部署模式下,Worker上创建Executor。所以SparkEnv存在于Spark任务调度时的每个Executor中,SparkEnv中的环境信息是对一个job中所有的Task都是可见且一致的。确 保运行时的环境一致。

SparkEnv的构造步骤如下:
1.创建安全管理器SecurityManager→2.创建RpcEnv→3.创建ShuffleManager→4.创建Shuffle Map Task 任务输出跟踪器MapOutputTracker→5.内存管理器MemoryManager→6.创建块传输NettyBlockTransferService→7.创建BlockManagerMaster→8.创建块管理器BlockManager→9.创建广播管理器BroadcastManager→10.创建缓存管理器CachManager→11.创建监听总线ListenerBus和检测系统MetricsSytem→创建SparkEnv

**Spark的广播机制:**当声明一个广播变量时最终的结果是所有的节点都收到这个广播变量,Spark底层的实现细节如下:


SparkStreaming 是一种构建Spark上的实时计算框架,它扩展了Spark处理大规模流式数据能力,以吞吐量和容错能力强著称。

架构设计

Spark Streaming是一个对实时数据流进行高通量,容错处理的流式处理系统。

Spark Streaming是将流式计算分解成一系列短小的批处理作业,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据DStream(Discretized-离散化Stream),每一段数据都转换成Spark中的RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的Transformations操作变为针对Spark中对RDD的
Transformations操作,将RDD经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加或者存储到外部设备。对DStream的处理,每个DStream都要按照数据流到达的先后顺序依次进行处理。即SparkStreaming天然确保了数据处理的顺序性。这样使所有的批处理具有了一个顺序的特性,其本质是转换成RDD的血缘关系。所以,SparkStreaming对数据天然具有容错性保证。为了提高SparkStreaming的工作效率,你应该合理的配置批的时间间隔, 最好能够实现上一个批处理完某个算子,下一个批子刚好到来。

  1. StreamingContext
    StreamingContext是Spark Streaming编程的最基本环境对象,就像Spark编程中的SparkContext一
    样。StreamingContext提供最基本的功能入口,包括从各途径创建最基本的对象DStream(就像Spark编程中的
    RDD)。
    创建StreamingContext的方法很简单,生成一个SparkConf实例,设置程序名,指定运行周期(示例中是5秒),
    这样就可以了:
    val conf = new SparkConf().setAppName(“SparkStreamingWordCount”)
    val sc=new SparkContext(conf)
    val ssc = new StreamingContext(sc, Seconds(5))
    运行周期为5秒,表示流式计算每间隔5秒执行一次。这个时间的设置需要综合考虑程序的延时需求和集群的工作负
    载,应该大于每次的运行时间。
    StreamingContext还可以从一个现存的org.apache.spark.SparkContext创建而来,并保持关联,比如上面示例
    中的创建方法:
    val ssc = new StreamingContext(sc, Seconds(5))
    StreamingContext创建好之后,还需要下面这几步来实现一个完整的Spark流式计算:
    (1)创建一个输入DStream,用于接收数据;
    (2)使用作用于DStream上的Transformation和Output操作来定义流式计算(Spark程序是使用
    Transformation和Action操作);
    (3)启动计算,使用streamingContext.start();
    (4)等待计算结束(人为或错误),使用streamingContext.awaitTermination();
    (5)也可以手工结束计算,使用streamingContext.stop()。
  2. DStream抽象
    DStream(discretized stream)是Spark Streaming的核心抽象,类似于RDD在Spark编程中的地位。DStream
    表示连续的数据流,要么是从数据源接收到的输入数据流,要求是经过计算产生的新数据流。DStream的内部是一
    个RDD序列,每个RDD对应一个计算周期。比如,在上面的WordCount示例中,每5秒一个周期,那么每5秒的数
    据都分别对应一个RDD,如图所示,图中的时间点1、2、3、4代表连续的时间周期。
    所有应用在DStream上的操作,都会被映射为对DStream内部的RDD上的操作,比如上面的WordCount示例中
    对lines DStream的flatMap操作
    RDD操作将由Spark核心来调度执行,但DStream屏蔽了这些细节,给开发者更简洁的编程体验。当然,我们也可
    以直接对DStream内部的RDD进行操作(后面会讲到)。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spark之   Spark Streaming.. 下一篇spark核心题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目