apache-spark - Spark - 我无法在本地模式下增加任务数量
问题描述
我尝试提交我的应用程序并coalese[k]
通过不同的组合更改我的代码:
首先,我从本地磁盘读取了一些数据:
val df = spark.read.option("encoding", "gbk").option("wholeFile",true).option("multiline",true).option("sep", "|+|").schema(schema).csv("file:///path/to/foo.txt")
情况一
我认为 local[*] 意味着总共有 56 个核心。我指定 4 * 4 = 16 个任务:
火花提交:
spark-submit --master local[*] --class foo --driver-memory-8g --executor-memory 4g --executor-cores 4 --num-executors 4 foo.jar
spark.write:
df.coalesce(16).write.mode("overwrite").partitionBy("date").orc("hdfs://xxx:9000/user/hive/warehouse/ods/foo")
但是当我查看 spark 历史日志服务器 UI 时,只有 1 个任务。在数据集中,“日期”列只有一个值。
所以我尝试了另一种组合并删除了partitionBy
:
情况2
火花提交:
spark-submit --master local[*] --class foo foo.jar
spark.write:
df.coalesce(16).write.mode("overwrite").orc("hdfs://xxxx:9000/user/hive/warehouse/ods/foo")
但是历史服务器显示仍然只有 1 个任务。
我的本地机器上有 56 个内核和 256GB 内存。我知道在本地模式下,spark 为驱动程序和执行程序创建了一个 JVM,因此这意味着我们有一个执行程序,其内核数(假设为 56)我们的计算机(如果我们使用 Local[*] 运行它)。
以下是问题:
- 谁能解释为什么我的任务号总是1?
- 如何增加任务数量以便利用并行性?
- 我的本地文件会被读入不同的分区吗?
解决方案
Spark 只能使用一个执行程序读取 csv 文件,因为只有一个文件。
与位于分布式文件系统(如 HDFS)中的文件相比,单个文件可以存储在多个分区中。这意味着您生成的 Dataframedf
只有一个分区。您可以使用df.rdd.getNumPartitions
. 另请参阅我对Spark Dataframe 默认情况下如何分区的回答?
请注意,这coalesce
将折叠同一工作人员上的分区,因此调用coalesce(16)
根本不会产生任何影响,因为您的 Dataframe 的一个分区无论如何已经位于单个工作人员上。
为了增加并行度,您可能需要repartition(16)
改用。
推荐阅读
- javascript - 无法在 ASP.NET Core 和 React 中创建包含 jwt 的 httponly cookie
- django - 我想获取在公司注册的所有员工的名单及其名称
- python - 如何在 Telehton newMessage 事件中识别和下载图像?
- react-native - 错误:运行 react-native run-android 命令时
- java - 配置了 feign 但在请求超时时,它不使用给定的 ErrorDecoder 类
- python-3.x - 使用 Tensorboard 实时监控训练并可视化模型架构
- javascript - Highcharts - 以 html div 为中心的饼图
- javascript - 使用递归返回嵌套对象 - Javascript
- c# - 如何将 C# 的 IList(集合)存储为 DynamoDb 中的 Json 文档
- scroll - 如何阻止 Sapper 在嵌套路由中滚动回顶部?