Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 将大型文本文件导入Spark_Apache Spark_Pyspark_Bigdata - Fatal编程技术网

Apache spark 将大型文本文件导入Spark

Apache spark 将大型文本文件导入Spark,apache-spark,pyspark,bigdata,Apache Spark,Pyspark,Bigdata,我有一个管道分隔的文本文件,它是360GB的压缩文件(gzip)。该文件位于S3存储桶中。 这是我第一次使用Spark。我知道您可以对一个文件进行分区,以便允许多个工作节点对数据进行操作,从而获得巨大的性能提升。但是,我正在尝试找到一种有效的方法,将一个360GB的文件转换为分区文件。有没有一种方法可以使用多个spark worker节点来处理我的一个压缩文件以对其进行分区?不幸的是,我无法控制我只是得到一个大文件的事实。我可以自己解压文件并将其分解为多个文件(比如360 1GB文件),但我只需

我有一个管道分隔的文本文件,它是360GB的压缩文件(gzip)。该文件位于S3存储桶中。 这是我第一次使用Spark。我知道您可以对一个文件进行分区,以便允许多个工作节点对数据进行操作,从而获得巨大的性能提升。但是,我正在尝试找到一种有效的方法,将一个360GB的文件转换为分区文件。有没有一种方法可以使用多个spark worker节点来处理我的一个压缩文件以对其进行分区?不幸的是,我无法控制我只是得到一个大文件的事实。我可以自己解压文件并将其分解为多个文件(比如360 1GB文件),但我只需要使用一台机器就可以了,速度会非常慢。我需要使用Spark对数据运行一些昂贵的转换,所以我认为分区文件是必要的。我在Amazon Glue内部使用Spark,所以我知道它可以扩展到大量机器。另外,我正在使用python(pyspark)


谢谢。

如果我没弄错的话,如果您使用
SparkContext.textFile
读取文件,Spark将使用Hadoop的
TextInputFormat
。如果设置了压缩编解码器,
TextInputFormat
通过检查代码是否为
SplittableCompressionCodec
的实例来确定文件是否可拆分

我相信GZIP是不可拆分的,Spark只能生成一个分区来读取整个文件

您可以做的是:
1.在
SparkContext.textFile
之后添加一个重新分区,这样您至少有一个以上的转换处理数据的一部分。
2.请求多个文件,而不仅仅是一个GZIP文件
3.在运行Spark应用程序之前,编写一个应用程序,将文件解压缩并拆分为多个输出文件
4.为GZIP编写自己的压缩编解码器(这稍微复杂一点)

请查看以下链接:

TextInputFormat

gzip代码


这些都是用java编写的,但我确信它们有相当于Python/Scala的版本。

首先,我建议您必须将ORC格式与zlib压缩一起使用,这样您可以获得几乎70%的压缩,根据我的研究,ORC是最适合最快数据处理的文件格式。因此,您必须加载您的文件,并通过重新分区将其写入orc格式

df.repartition(500).write.option("compression","zlib").mode("overwrite").save("testoutput.parquet")

一种可能的解决方案是,作为EMR集群上的一个步骤,在集群上可用的HDFS文件系统中复制360GB文件(这需要在EMR上部署Hadoop)

S3DistCp的一个优点是,您可以更改输出文件的编解码器,并将原始gzip文件转换为允许Spark为其RDD生成多个分区的格式


但是,我不确定S3DistCp执行该操作需要多长时间(这是一个Hadoop Map/Reduce over S3。从EMR运行时,它受益于优化的S3库,但我担心Hadoop在生成Map任务时将面临与Spark相同的限制).

您是否已经知道如何对其进行分区?您是否已经有一个好的分区候选者(列)?您希望将来如何处理此数据?是的,数据具有DMA。共有210个DMA。这并不完美,因为有些DMA比其他DMA拥有更多的数据,但我认为这是我最好的选择。我的问题是,如何有效地处理这个360GB的文件。但是这个CSV文件不是已经分区了吗?它是如何写入/保存的?不,我导入的文件没有分区。这是一个单独的、gzip格式的360GB管道分隔文件。不幸的是,我没有使用S3存储的经验。是否可以使用S3方法对其进行分区?我不认为你能从使用Spark中获益,除非这个文件被分区了,这样你就可以使用多个worker来处理它。一旦分区-您可以通过
DMA
column对其进行重新分区您还可以将使用的压缩类型更改为可拆分的类型,如bzip2您可以根据数据大小更改重新分区值。