为什么我收到错误:"大小超过Integer.MAX_VALUE"什么时候使用spark + cassandra?

时间:2016-03-08 09:22:53

标签: apache-spark spark-cassandra-connector cassandra-2.1

我有7个cassandra节点(5 nodes with 32 cores and 32G memory, and 4 nodes with 4 cores and 64G memory),并在此群集上部署了spark worker,spark的主人位于8th node。我使用了spark-cassandra-connector。现在我的cassandra有近10亿条记录和30个字段,我写scala包括以下片段:

def startOneCache(): DataFrame = {
val conf = new SparkConf(true)
  .set("spark.cassandra.connection.host", "192.168.0.184")
  .set("spark.cassandra.auth.username", "username")
  .set("spark.cassandra.auth.password", "password")
  .set("spark.driver.maxResultSize", "4G")
  .set("spark.executor.memory", "12G")
  .set("spark.cassandra.input.split.size_in_mb","64")

val sc = new SparkContext("spark://192.168.0.131:7077", "statistics", conf)
val cc = new CassandraSQLContext(sc)
val rdd: DataFrame = cc.sql("select user_id,col1,col2,col3,col4,col5,col6
,col7,col8 from user_center.users").limit(100000192)
val rdd_cache: DataFrame = rdd.cache()

rdd_cache.count()
return rdd_cache
}

在spark的主人中,我使用spark-submit来运行上面的代码,在执行语句:rdd_cache.count()时,我在一个工作节点中得到ERROR:{ {1}}:

192.168.0.185

我只是认为最后的错误16/03/08 15:38:57 INFO ShuffleBlockFetcherIterator: Started 4 remote fetches in 221 ms 16/03/08 15:43:49 WARN MemoryStore: Not enough space to cache rdd_6_0 in memory! (computed 4.6 GB so far) 16/03/08 15:43:49 INFO MemoryStore: Memory use = 61.9 KB (blocks) + 4.6 GB (scratch space shared across 1 tasks(s)) = 4.6 GB. Storage limit = 6.2 GB. 16/03/08 15:43:49 WARN CacheManager: Persisting partition rdd_6_0 to disk instead. 16/03/08 16:13:11 ERROR Executor: Managed memory leak detected; size = 4194304 bytes, TID = 24002 16/03/08 16:13:11 ERROR Executor: Exception in task 0.0 in stage 1.0 (TID 24002) java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE 是由警告Size exceeds Integer.MAX_VALUE引起的,但我不知道为什么,或者我是否应该设置大于16/03/08 15:43:49 WARN MemoryStore: Not enough space to cache rdd_6_0 in memory! (computed 4.6 GB so far)我应该怎么做才能纠正这个问题?

1 个答案:

答案 0 :(得分:2)

No Spark shuffle block can be greater than 2 GB.

  

Spark使用ByteBuffer作为存储块的抽象,其大小受Integer.MAX_VALUE(20亿)的限制。

分区数量少会导致较高的随机块大小。要解决此问题,请尝试使用rdd.repartition()rdd.coalesce()或。

增加分区数

如果这没有帮助,则意味着至少有一个分区仍然太大,您可能需要使用一些更复杂的方法来缩小它 - 例如使用随机性来均衡个体之间的RDD数据分布分区。