在本地文件系统(不是HDFS)中使用Scala读取Apache Spark中的文件时如何更改输入块大小[重复]
Posted
技术标签:
【中文标题】在本地文件系统(不是HDFS)中使用Scala读取Apache Spark中的文件时如何更改输入块大小[重复]【英文标题】:How to change input block size when reading a file in Apache Spark with Scala in a localfilesystem ( not HDFS ) [duplicate] 【发布时间】:2018-04-12 13:07:28 【问题描述】:我有一个从本地文件系统读取 CSV 文件的程序。 Spark(以本地模式运行)实际使用了实例的所有 16 个内核。所以我有 16 个任务并行运行。
现在,我要做的是在读取文件时调整其性能。
在查看 Spark UI 时,我发现每个任务读取 128MB 的文件作为输入大小(Hadoop 的块大小的默认值)。由于实例有 120GB 的 RAM,我想增加每个任务的输入大小。
我应该运行什么配置来做到这一点?
【问题讨论】:
您打算更改整个集群的块大小还是只需要更改您的工作?还是您想在工作中使用更少的任务? 任务总数减少,但我想保持 16 个任务并行运行,同时利用块大小来加快处理速度:) 【参考方案1】:您可以尝试通过在 hdfs-site.xml 中设置以下属性来更改块大小值:
<property>
<name>dfs.block.size<name>
<value>134217728<value>
<description>Block size<description>
<property>
【讨论】:
我尝试通过以下方式以编程方式执行此操作:spark.sparkContext.set("dfs.block.size","256") 但没有成功 如果您有兴趣增加并行度,那么您应该增加执行器的数量。在 spark 中,分区被分配给执行者,而执行者又被映射为任务。你看到有多少个执行器在 Spark UI 中运行? 由于您的机器上有 16 个内核可用,您可以启动 3 个执行器,每个执行器有 4 个内核,每个内核有 20g 内存。这只是一个粗略的计算。您可以根据您的应用程序性能调整这些数字。 是本地模式,所以只有一个jvm进程在运行:executor=driver,并且driver/executor会使用所有的core,所以配置executors不会生效【参考方案2】:你可以做两个选择:-
1) 阅读时减少任务数:-
val file = sc.textFile("/path/to/file.txt.gz", < less num of partitions>);
2) 如果要设置更大的块大小:-
conf.set("dfs.block.size", "128m")
您也可以尝试设置:-mapreduce.input.fileinputformat.split.minsize
mapreduce.input.fileinputformat.split.maxsize
【讨论】:
以上是关于在本地文件系统(不是HDFS)中使用Scala读取Apache Spark中的文件时如何更改输入块大小[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用文件系统将数据从scala中的本地复制到远程hdfs位置时,hadoop权限被拒绝