1,partition 数目
spark 的输入可能以多个文件的形式存储在 HDFS 上, 每个 File 都包含了很多块, 称为 Block.
当 Spark 读取这些文件作为输入时, 会根据具体数据格式对应的 InputFormat 进行解析, 一般是将若干个 Block 合并成一个输入分片, 称为 InputSplit, 注意 InputSplit 不能跨越文件.
随后将为这些输入分片生成具体的 Task.InputSplit 与 Task 是一一对应的关系.
随后这些具体的 Task 每个都会被分配到集群上的某个节点的某个 Executor 去执行.
每个节点可以起一个或多个 Executor.
每个 Executor 由若干 core 组成, 每个 Executor 的每个 core 一次只能执行一个 Task.
每个 Task 执行的结果就是生成了目标 RDD 的一个 partiton.
注意: 这里的 core 是虚拟的 core 而不是机器的物理 CPU 核, 可以理解为就是 Executor 的一个工作线程.
而 Task 被执行的并发度 = Executor 数目 * 每个 Executor 核数.
至于 partition 的数目:
对于数据读入阶段, 例如 sc.textFile, 输入文件被划分为多少 InputSplit 就会需要多少初始 Task.
在 Map 阶段 partition 数目保持不变.
在 Reduce 阶段, RDD 的聚合会触发 shuffle 操作, 聚合后的 RDD 的 partition 数目跟具体操作有关, 例如 repartition 操作会聚合成指定分区数, 还有一些算子是可配置的.
2,spark 部署模式的对比
这篇博客中对三种部署模式做了对比, 请参考部署模式对比: 总结如下:
mesos 似乎是 Spark 更好的选择, 也是被官方推荐的
但如果你同时运行 hadoop 和 Spark, 从兼容性上考虑, Yarn 似乎是更好的选择, 毕竟是亲生的. Spark on Yarn 运行的也不错.
如果你不仅运行了 hadoop,spark. 还在资源管理上运行了 docker,Mesos 似乎更加通用.
standalone 小规模计算集群, 似乎更适合!
对于 yarn 模式下的 client 和 cluster 对比, 请参考 client 和 cluster 的对比:
理解 YARN-Client 和 YARN-Cluster 深层次的区别之前先清楚一个概念: Application Master. 在 YARN 中, 每个 Application 实例都有一个 ApplicationMaster 进程, 它是 Application 启动的第一个容器. 它负责和 ResourceManager 打交道并请求资源, 获取资源之后告诉 NodeManager 为其启动 Container. 从深层次的含义讲 YARN-Cluster 和 YARN-Client 模式的区别其实就是 ApplicationMaster 进程的区别
YARN-Cluster 模式下, Driver 运行在 AM(Application Master) 中, 它负责向 YARN 申请资源, 并监督作业的运行状况. 当用户提交了作业之后, 就可以关掉 Client, 作业会继续在 YARN 上运行, 因而 YARN-Cluster 模式不适合运行交互类型的作业
YARN-Client 模式下, Application Master 仅仅向 YARN 请求 Executor,Client 会和请求的 Container 通信来调度他们工作, 也就是说 Client 不能离开
(1)YarnCluster 的 Driver 是在集群的某一台 NM 上, 但是 Yarn-Client 就是在 RM 的机器上;
(2) 而 Driver 会和 Executors 进行通信, 所以 Yarn_cluster 在提交 App 之后可以关闭 Client, 而 Yarn-Client 不可以;
(3)Yarn-Cluster 适合生产环境, Yarn-Client 适合交互和调试.
来源: http://www.bubuko.com/infodetail-2592252.html