在本地文件系统(不是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 读取输入 xml 数据

如何从 Scala 代码中读取 HDFS 文件

使用文件系统将数据从scala中的本地复制到远程hdfs位置时,hadoop权限被拒绝

scala怎么读取hdfs中的文件

sc.textFile()默认读取本地系统文件还是HDFS系统文件?

如何使用 Sqoop 从 RDBMS 将数据导入本地文件系统,而不是 HDFS?