java-Apache Spark无法处理大型Cassandra列系列
作者:互联网
我正在尝试使用Apache Spark处理我的大型(〜230k条目)cassandra数据集,但是我经常遇到各种错误.但是,当在约200个数据集上运行时,我可以成功运行应用程序.我有一个包含3个节点的Spark设置,其中有1个主节点和2个worker,并且2个worker还安装了一个cassandra群集,其索引索引的复制因子为2.我的2个spark作业在Web界面上显示2.4 GB和2.8 GB的内存,我在运行应用程序时将spark.executor.memory设置为2409,以获得4.7 GB的组合内存.这是我的WebUI主页
任务之一的环境页面
在这个阶段,我只是尝试使用spark处理存储在cassandra中的数据.这是我用来在Java中执行此操作的基本代码
SparkConf conf = new SparkConf(true)
.set("spark.cassandra.connection.host", CASSANDRA_HOST)
.setJars(jars);
SparkContext sc = new SparkContext(HOST, APP_NAME, conf);
SparkContextJavaFunctions context = javaFunctions(sc);
CassandraJavaRDD<CassandraRow> rdd = context.cassandraTable(CASSANDRA_KEYSPACE, CASSANDRA_COLUMN_FAMILY);
System.out.println(rdd.count());
为了成功运行,在一个小的数据集(200个条目)上,事件界面看起来像这样
但是,当我在大型数据集上运行相同的操作时(即,仅更改CASSANDRA_COLUMN_FAMILY),该作业就永远不会在终端内终止,日志看起来像这样
大约2分钟后,执行者的标准输出看起来像这样
大约7分钟后,我得到
线程“主”中的异常java.lang.OutOfMemoryError:超出了GC开销限制
在我的终端中,我必须手动终止SparkSubmit进程.但是,大型数据集是从仅占用22 MB的二进制文件中索引的,并且在执行nodetool状态时,我可以看到在我的两个cassandra节点中仅存储了约115 MB的数据.我也尝试在数据集上使用Spark SQL,但是也得到了类似的结果.对于Transformation-Action程序和使用Spark SQL的程序,我的设置哪里出错了,应该怎么做才能成功处理我的数据集.
我已经尝试了以下方法
>使用-Xms1G -Xmx1G来增加内存,但是程序失败,并出现异常,提示我应该设置我拥有的spark.executor.memory.
>使用spark.cassandra.input.split.size,它不能说不是一个有效选项,而类似的选项是spark.cassandra.input.split.size_in_mb,我将其设置为1,没有任何效果.
编辑
基于this的答案,我还尝试了以下方法:
>将spark.storage.memoryFraction设置为0
>不要将spark.storage.memoryFraction设置为零,并与MEMORY_ONLY,MEMORY_ONLY_SER,MEMORY_AND_DISK和MEMORY_AND_DISK_SER结合使用.
版本:
> Spark:1.4.0
>卡桑德拉:2.1.6
> spark-cassandra连接器:1.4.0-M1
解决方法:
我认为最新的spark-cassandra连接器存在问题.参数spark.cassandra.input.split.size_in_mb的默认值为64 MB,在代码中被解释为64个字节.这将导致创建过多的分区,而这些分区无法通过spark进行调度.尝试将conf值设置为
spark.cassandra.input.split.size_in_mb=67108864
标签:apache-spark,apache-spark-sql,cassandra,spark-cassandra-connector,java 来源: https://codeday.me/bug/20191028/1950426.html