Scala 我可以在多个executor中使用Spark从Google Storage读取csv文件吗?
我在一个google bucket中压缩了几个csv文件,它们按小时分组在文件夹中,这意味着另一个应用程序将其中几个文件保存在以小时为名称的文件夹中 基本上,我有一个Spark应用程序读取所有这些文件(数千个文件),代码如下:Scala 我可以在多个executor中使用Spark从Google Storage读取csv文件吗?,scala,apache-spark,google-cloud-storage,google-cloud-dataproc,Scala,Apache Spark,Google Cloud Storage,Google Cloud Dataproc,我在一个google bucket中压缩了几个csv文件,它们按小时分组在文件夹中,这意味着另一个应用程序将其中几个文件保存在以小时为名称的文件夹中 基本上,我有一个Spark应用程序读取所有这些文件(数千个文件),代码如下: sparkSession.read .format("csv") .option("sep", "\t") .option("header", false) .option("inferSchema", false)
sparkSession.read
.format("csv")
.option("sep", "\t")
.option("header", false)
.option("inferSchema", false)
.csv(path))
阅读需要一个多小时,这是因为它们被压缩了吗
我还注意到,在Spark UI中,我只有一个执行者,从不超过一个。我不能使用多个执行器并行读取这些文件并加快处理速度吗?怎么做?我基本上是在尝试创建一个临时视图,其中包含Spark的SQL语句的文件
我使用默认的纱线配置在Dataproc中运行。根据这一点,如果您想提高集群性能,有十件事情需要考虑
通过将Spark.dynamicAllocation.enabled
参数设置为true
,让Spark自动缩放执行器的数量可能是个好主意。请注意,此配置还需要启用参数spark.shuffle.service.enabled
,请参阅
第二种方法解释了执行器,如果您想尝试此配置,另一种方法解释了如何在Dataproc中配置warn.scheduler.capacity.resource calculator
参数
编辑:
我重新创建了您的场景,从GCS存储桶读取了许多文件,并且我能够看到使用了多个执行器来执行此操作
怎么做?
使用RDD
弹性分布式数据集(RDD)是分布在Apache Spark集群中的不可变JVM对象的集合。RDD中的数据根据一个键被分成块,然后分散在所有执行器节点上。RDD具有很高的弹性,也就是说,当相同的数据块跨多个executor节点复制时,可以从任何问题中快速恢复。因此,即使一个执行器失败,另一个执行器仍将处理数据
创建RDD有两种方法:并行化现有集合,或引用外部存储系统中的数据集(GCS bucket)。可以使用SparkContext的textFile()
/wholeTextFile()
方法创建RDD
SparkContext.wholeTextFiles
用于读取包含多个小文件的目录,并以(文件名、内容)对的形式返回每个小文件。这与SparkContext.textFile
形成对比,后者在每个文件中每行返回一条记录
我用Python编写代码,并在Dataproc中运行pySpark作业:
import pyspark
sc = pyspark.SparkContext()
rdd_csv = sc.wholeTextFiles("gs://<BUCKET_NAME>/*.csv")
rdd_csv.collect()
我希望它能帮助你。如果您还有更多问题,请提问。根据这一点,如果您想提高集群性能,有十件事需要考虑
通过将Spark.dynamicAllocation.enabled
参数设置为true
,让Spark自动缩放执行器的数量可能是个好主意。请注意,此配置还需要启用参数spark.shuffle.service.enabled
,请参阅
第二种方法解释了执行器,如果您想尝试此配置,另一种方法解释了如何在Dataproc中配置warn.scheduler.capacity.resource calculator
参数
编辑:
我重新创建了您的场景,从GCS存储桶读取了许多文件,并且我能够看到使用了多个执行器来执行此操作
怎么做?
使用RDD
弹性分布式数据集(RDD)是分布在Apache Spark集群中的不可变JVM对象的集合。RDD中的数据根据一个键被分成块,然后分散在所有执行器节点上。RDD具有很高的弹性,也就是说,当相同的数据块跨多个executor节点复制时,可以从任何问题中快速恢复。因此,即使一个执行器失败,另一个执行器仍将处理数据
创建RDD有两种方法:并行化现有集合,或引用外部存储系统中的数据集(GCS bucket)。可以使用SparkContext的textFile()
/wholeTextFile()
方法创建RDD
SparkContext.wholeTextFiles
用于读取包含多个小文件的目录,并以(文件名、内容)对的形式返回每个小文件。这与SparkContext.textFile
形成对比,后者在每个文件中每行返回一条记录
我用Python编写代码,并在Dataproc中运行pySpark作业:
import pyspark
sc = pyspark.SparkContext()
rdd_csv = sc.wholeTextFiles("gs://<BUCKET_NAME>/*.csv")
rdd_csv.collect()
我希望它能帮助你。如果您还有更多问题,请询问。资源应该已经动态缩放到您的应用程序,通常您不需要显式设置执行者编号
在您的情况下,取决于您的数据集有多大,可能是群集大小,或者虚拟机太小,无法处理增加的输入数据大小,可能尝试增加群集中虚拟机/节点的数量,或者使用具有更多RAM的虚拟机。资源应该已经动态缩放到您的应用程序中,通常,您不需要显式设置执行器编号
在您的情况下,取决于数据集的大小,可能是群集大小,或者虚拟机太小,无法处理增加的输入数据大小,可能尝试增加群集中虚拟机/节点的数量,或者使用具有更多RAM的虚拟机。这些属性都已设置为true。感谢这篇文章,我以前读过,但仍然无法将我的情况与这些观点联系起来。你能告诉我你在使用什么类型的机器吗(通过描述规格)?主节点是n1-highmem-4,然后我
gcloud dataproc jobs submit spark \
--cluster=${CLUSTER} \
--class <CLASS> \
--jars gs://${BUCKET_NAME}/<PATH>.jar \
-- gs://${BUCKET_NAME}/input/