Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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/3/apache-spark/6.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
Spark/scala大小中的SQL查询超过Integer.MAX\u值_Sql_Apache Spark_Amazon Ec2_Emr - Fatal编程技术网

Spark/scala大小中的SQL查询超过Integer.MAX\u值

Spark/scala大小中的SQL查询超过Integer.MAX\u值,sql,apache-spark,amazon-ec2,emr,Sql,Apache Spark,Amazon Ec2,Emr,我正在尝试使用Spark创建一个关于S3事件的简单sql查询。我正在加载约30GB的JSON文件,如下所示: val d2 = spark.read.json("s3n://myData/2017/02/01/1234"); d2.persist(org.apache.spark.storage.StorageLevel.MEMORY_AND_DISK); d2.registerTempTable("d2"); 然后,我尝试将查询结果写入文件: val users_count = sql("s

我正在尝试使用Spark创建一个关于S3事件的简单sql查询。我正在加载约30GB的JSON文件,如下所示:

val d2 = spark.read.json("s3n://myData/2017/02/01/1234");
d2.persist(org.apache.spark.storage.StorageLevel.MEMORY_AND_DISK);
d2.registerTempTable("d2");
然后,我尝试将查询结果写入文件:

val users_count = sql("select count(distinct data.user_id) from d2");
users_count.write.format("com.databricks.spark.csv").option("header", "true").save("s3n://myfolder/UsersCount.csv");
但是Spark抛出了以下异常:

java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:869)
at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:103)
at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:91)
at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1287)
at org.apache.spark.storage.DiskStore.getBytes(DiskStore.scala:105)
at org.apache.spark.storage.BlockManager.getLocalValues(BlockManager.scala:439)
at org.apache.spark.storage.BlockManager.getOrElseUpdate(BlockManager.scala:672)
at org.apache.spark.rdd.RDD.getOrCompute(RDD.scala:330)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:281)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:283)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:283)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:283)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:79)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:47)
at org.apache.spark.scheduler.Task.run(Task.scala:85)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

请注意,相同的查询适用于较小的数据量。这里有什么问题?

没有任何Spark shuffle块可以大于2GB(Integer.MAX_VALUE字节),因此需要更多/更小的分区

您应该调整spark.default.parallelism和spark.sql.shuffle.partitions(默认值200),使分区的数量能够容纳您的数据,而不会达到2GB限制(您可以尝试将目标定为256MB/分区,因此对于200GB,您可以获得800个分区)。数千个分区是非常常见的,所以不要害怕按照建议将分区重新划分为1000个

仅供参考,您可以使用类似RDD.getNumPartitions(即d2.RDD.getNumPartitions)的内容检查RDD的分区数

有一个故事可以追踪解决各种2GB限制的努力(已经开放了一段时间):


有关此错误的更多信息,请参阅。

当我使用Spark core处理200G数据时,请设置
--conf Spark.default.parallelism=2000
.repartition(100)
,但会出现错误,最后,我使用以下设置来解决:

val conf = new SparkConf()
         .setAppName(appName)
         .set("spark.rdd.compress", "true")


我希望它能帮助您

最有可能的问题是分区大小超出限制,请尝试
。重新分区(100)
等,这应该可以解决它。在读取数据后,请尝试重新分区
val d2=spark.read.json(“s3n://myData/2017/02/01/1234”)。重新分区(1000)
参考作为旁注,您可能希望研究使用较新的
s3a
而不是
s3n
;请参阅,例如,感谢您的回答。该查询工作了30GB。现在,我正在尝试对±200GB的数据运行查询,我看到:
未能将RPC 6395111411946395180发送到/x.x.x.x:yyyy:java.nio.channels.ClosedChannelException
,并且`尝试获取RPC地址x.x.x.x:yyyyyyy处执行器id 165的执行器丢失原因,但未得到响应。标记为奴隶迷路了。“有什么想法吗?我正在加载100个重新分区中的数据。感谢您的解释!还可以查看如何编辑默认分区的数量。