我正在尝试使用Spark Streaming从位于NFS上的CSV文件中收集数据。 我的代码非常简单,到目前为止我只在spark-shell中运行它,但即使在那里我也遇到了一些问题。
我正在运行带有6个worker的独立Spark master的spark-shell,并将以下参数传递给spark-shell:
- master spark://master.host:7077 --num-executors 3 --conf spark.cores.max = 10
这是代码:
val schema = spark.read.option("header", true).option("mode", "PERMISSIVE").csv("/nfs/files_to_collect/schema/schema.csv").schema
val data = spark.readStream.option("header", true).schema(schema).csv("/nfs/files_to_collect/jobs/jobs*")
val query = data.writeStream.format("console").start()
该NFS路径中有2个文件,每个文件大小约为200MB。 当我调用writeStream时,我收到以下警告:
" 17/11/13 22:56:31 WARN TaskSetManager:阶段2包含一个非常大的任务(106402 KB)。建议的最大任务大小为100 KB。"
查看Spark主UI,我看到只使用了一个执行程序 - 创建了四个任务,每个任务读取每个CSV文件的50%。
我的问题是:
1)NFS路径中的文件越多,驱动程序似乎需要的内存越多 - 使用2个文件时,它会崩溃,直到我将内存增加到2g。有4个文件,它需要不少于8克。什么是驱动程序需要这么多内存?
2)如何控制读取CSV文件的并行度?我注意到文件越多,创建的任务就越多,但是可以手动控制吗?