Hadoop部署

1 原理

https://blog.csdn.net/aohun0743/article/details/101702331

https://cloud.tencent.com/developer/article/1924241?from=article.detail.1336692

本地模式

单机运行,只是用来演示一下官方案例。生产环境不用。

伪分布式模式

也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。

完全分布式模式

多台服务器组成分布式环境。生产环境使用。

搭建:

https://blog.csdn.net/a1786742005/article/details/104104983

高可用完全分布式模式

HA高可用是Hadoop2.x才开始引入的机制,是为了解决Hadoop的单点故障问题。主要有两种部署方式,一种是NFS(Network File System)方式,另外一种是QJM(Quorum Journal Manager)方式。用得较多的是QJM方式,稳定性更好。实际操作中,生产环境的Hadoop集群搭建一般都会做HA部署。

2 使用

配置客户端访问集群

3 问题

RDD,DataFrame,Dataset

https://blog.knoldus.com/spark-rdd-vs-dataframes/

https://blog.csdn.net/hellozhxy/article/details/82660610

https://www.cnblogs.com/lestatzhang/p/10611320.html#Spark_16

https://www.jianshu.com/p/77811ae29fdd

https://zhuanlan.zhihu.com/p/379578271

https://spark.apache.org/docs/3.2.0/sql-programming-guide.html#content

1 DataFrame 和 RDDs 应该如何选择?

DataFrame 和 RDDs 最主要的区别在于一个面向的是结构化数据,一个面向的是非结构化数据

  • 如果你的数据是结构化的 (如 RDBMS 中的数据) 或者半结构化的 (如日志),出于性能上的考虑,应优先使用 DataFrame。
  • 如果你的数据是非结构化的 (比如流媒体或者字符流),则使用 RDDs,

2 为什么出现Dataset?

1.相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,实在是想骂人,这也是引入Dataset的一个重要原因。

2.RDD转换DataFrame后不可逆,但RDD转换Dataset是可逆的(这也是Dataset产生的原因)

注意:

The Dataset API is available in Scala and Java. Python does not have the support for the Dataset API. But due to Python’s dynamic nature, many of the benefits of the Dataset API are already available (i.e. you can access the field of a row by name naturally row.columnName).

RDD依赖关系

1 为什么要提出宽窄依赖

根据rdd的依赖关系构建dag,根据dag划分stage

2 如何区别宽窄依赖

蓝色框是rdd分区

父rdd -> 子rdd

区分宽窄依赖主要就是看父RDD数据流向,要是流向一个的话就是窄依赖,流向多个的话就是宽依赖。

3 划分stage

https://blog.csdn.net/weixin_40271036/article/details/79996516

整体思路是:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中

4 参考

https://www.jianshu.com/p/5c2301dfa360

https://zhuanlan.zhihu.com/p/67068559

https://blog.csdn.net/m0_49834705/article/details/113111596

https://lmrzero.blog.csdn.net/article/details/106015264?spm=1001.2014.3001.5502

5 问题

为啥宽依赖有shuffle 窄依赖没有shuffle

shuffle

https://www.cnblogs.com/arachis/p/Spark_Shuffle.html

https://zhuanlan.zhihu.com/p/70331869

https://www.educba.com/spark-shuffle/

https://lmrzero.blog.csdn.net/article/details/106015264?spm=1001.2014.3001.5502

https://blog.csdn.net/zp17834994071/article/details/107887292

https://zhuanlan.zhihu.com/p/431015932

0 shuffle是什么,什么时候shuffle

what:多个partition的数据流向一个partition

when:宽依赖会有shuffle

shuffle分为两个阶段:shuffle read , shuffle write

map端-》shuffle read-》 shuffle write-》reduce端

1 mapreduce shuffle

2 spark shuffle

1 简介

2 分类

https://www.51cto.com/article/703950.html#

过去hash shuffle ,现在sort shuffle

1.Hash Shuffle

2.Sort Shuffle

1 普通机制的SortShuffleManager

2 bypass

此时task会为每个reduce端的task都创建一个临时磁盘文件,并将数据按key进行hash,然后根据key的hash值,将key写入对应的磁盘文件之中。当然,写入磁盘文件时也是先写入内存缓冲,缓冲写满之后再溢写到磁盘文件的。最后,同样会将所有临时磁盘文件都合并成一个磁盘文件,并创建一个单独的索引文件。
该过程的磁盘写机制其实跟未经优化的HashShuffleManager是一模一样的,因为都要创建数量惊人的磁盘文件,只是在最后会做一个磁盘文件的合并而已。因此少量的最终磁盘文件,也让该机制相对未经优化的HashShuffleManager来说,shuffle read的性能会更好。

3 总结

bypass与普通SortShuffleManager运行机制的不同在于:
第一,磁盘写机制不同;
第二,不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。

3 对比

https://www.zhihu.com/question/27643595

4 优化

因此在我们的开发过程中,能避免则尽可能避免使用会进行shuffle的算子,尽量使用非shuffle算子

1 shuffle算子:

https://blog.csdn.net/py_tamir/article/details/95457813

reduceByKey、join、distinct、repartition

2 非shuffle算子

map,flatMap

spark部署方式

https://blog.csdn.net/qq_37163925/article/details/106260434

https://spark.apache.org/docs/latest/cluster-overview.html

https://book.itheima.net/course/1269935677353533441/1270998166728089602/1270999667882074115

通过设置mater来选择部署方式。这是Spark程序需要连接的集群管理器所在的URL地址。如果这个属性在提交应用程序的时候没设置,程序将会通过System.getenv(“MASTER”)来获取MASTER环境变量;但是如果MASTER环境变量没有设定,那么程序将会把master的值设定为local[*]

local为单机

standalone是Spark自身实现资源调度

yarn为使用hadoop yarn来实现资源调度

1 local

本地模式就是以一个独立的进程,通过其内部的多个线程来模拟整个Spark运行时环境

local【N】:N为线程数量,通常N为cpu的core的数量

local【*】:cpu的core数量

跑local可以不依赖hadoop

https://blog.csdn.net/wangmuming/article/details/37695619

https://blog.csdn.net/bettesu/article/details/68512570

2 Standalone

https://sfzsjx.github.io/2019/08/26/spark-standalone-%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86

2.1 client

执行流程

  1. client 模式提交任务后,会在客户端启动Driver进程。
  2. Driver 会向Master申请启动Application启动资源。
  3. 资源申请成功后,Driver端会将task发送到worker端执行。
  4. worker端执行成功后将执行结果返回给Driver端

2.2 cluster

执行流程:

  1. 客户端使用命令spark-submit –deploy-mode cluster 后会启动spark-submit进程
  2. 此进程为Driver向Master 申请资源。
  3. Master会随机在一台Worker节点来启动Driver进程。
  4. Driver启动成功后,spark-submit关闭,然后Driver向Master申请资源。
  5. Master接收到请求后,会在资源充足的Worker节点上启动Executor进程。
  6. Driver分发Task到Executor中执行。

2.3 高可用HA

3 Mesos

a general cluster manager that can also run Hadoop MapReduce and service applications. (Deprecated)

4 YARN

为什么要YARN?

Spark On YARN是有两种运行模式的,一种是Cluster模式一种是Client模式.这两种模式的区别就是Driver运行的位置.

Cluster模式即:Driver运行在YARN容器内部, 和ApplicationMaster在同一个容器内

Client模式即:Driver运行在客户端进程中, 比如Driver运行在spark-submit程序的进程中

4.1 cluster

具体流程步骤如下:
1)、任务提交后会和ResourceManager通讯申请启动ApplicationMaster;
2)、随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster就是Driver;
3)、Driver启动后向ResourceManager申请Executor内存,ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后在合适的NodeManager上启动Executor进程;
4)、Executor进程启动后会向Driver反向注册;
5)、Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行;

4.2 client

具体流程步骤如下:
1)、Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster;
2)、随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存;
3)、ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程;
4)、Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数;
5)、之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分Stage,每个Stage生成对应的TaskSet,之后将Task分发到各个Executor上执行。

5 Kubernetes

an open-source system for automating deployment, scaling, and management of containerized applications.

spark优化

8 Performance Optimization Techniques Using Spark

https://www.syntelli.com/eight-performance-optimization-techniques-using-spark#

Spark性能优化指南(美团)

https://tech.meituan.com/2016/04/29/spark-tuning-basic.html

https://tech.meituan.com/2016/05/12/spark-tuning-pro.html

0 分析web ui

分析时间的消耗

1.多个map合并(??)

1
rdd1.map().map() ->  rdd1.map() 

2.减少action算子

说白了就是多个action操作,transformation逻辑可以写一起,最后action

3 增加分区 增加并行度

分数是说rdd分区

并行度是说executor num*executor core num

Spark架构

https://zhuanlan.zhihu.com/p/70424613

https://zhuanlan.zhihu.com/p/348024116

https://spark.apache.org/docs/latest/cluster-overview.html

https://www.zhihu.com/question/437293024

https://blog.csdn.net/mzqadl/article/details/104217828

https://www.cnblogs.com/ExMan/p/14358363.html

客户端指的是提交任务的机器

一个worker可以有多个excutor,默认情况下,只会启动一个Executor 一个excutor就是一个进程

一个executor包含多个线程,一个线程执行一个task


:D 一言句子获取中...