我正在尝试使用spark处理10GB的数据,它给了我这个错误,
java.lang.OutOfMemoryError:超出GC开销限制
笔记本电脑配置为:4CPU,8个逻辑核,8GB RAM
提交火花作业时的火花配置。
spark = SparkSession.builder.master('local[6]').config("spark.ui.port", "4041").appName('test').getOrCreate()
spark.conf.set("spark.executor.instances", 1)
spark.conf.set("spark.executor.cores", 5)
在互联网上搜索这个错误后,我有几个问题
如果得到回答,那将是一个很大的帮助。
1( Spark是内存计算引擎,对于处理10gb的数据,系统应该有10+gb的RAM。Spark将10gb的数据加载到10+gb的RAM内存中,然后完成这项工作?
2( 如果第1点是正确的,那么大公司处理100 TB数据的方式是什么?他们是否通过集群多个系统来形成100 TB以上的RAM,然后处理100 TB的数据?
3( 通过设置适当的火花配置,他们是否没有其他方法来处理8gb RAM和8Cores的50gb数据?如果是什么方式,应该是什么火花配置。
4( 如果系统性能为8gb RAM和8核,那么理想的火花配置应该是什么?用于处理8gb的数据
火花配置将在火花配置中定义。
spark = SparkSession.builder.master('local[?]').config("spark.ui.port", "4041").appName('test').getOrCreate()
spark.conf.set("spark.executor.instances", ?)
spark.conf.set("spark.executor.cores", ?)
spark.executes.cores=?
spark.executes.memory=?
spark.yarn.exexecute.memoryOverhead=?
spark.driver.memory=?
spark.driver.cores=?
spark.executer.instances=?
核心实例数=?
spark.default.parallleism=?
如果不能澄清一切,我希望以下内容会有所帮助。
1(Spark是一个内存计算引擎,为了处理10 GB的数据,系统应该有10 GB以上的RAM。Spark将10gb的数据加载到10+GB的RAM内存中,然后完成这项工作?
Spark是一个内存计算引擎,它从底层数据湖或分布式存储系统获取输入/源。10Gb文件将被分成更小的块(对于基于Hadoop的数据湖,块大小为128Mb或256Mb(,Spark Driver将获得许多执行器/内核来从集群的工作节点读取它们。如果你试图用笔记本电脑或单个节点加载10Gb数据,它肯定会耗尽内存。在处理之前,它必须将所有数据加载到一台机器或多个从属/工作节点中。
2(如果第1点是正确的,那么大公司处理100 TB数据的方式是什么?他们是否通过集群多个系统来形成100 TB以上的RAM,然后处理100 TB的数据?
大型数据处理项目用大量的设计模式设计存储和访问层。它们只是不将GB或TB的数据转储到像HDFS这样的文件系统中。它们使用分区(就像销售交易数据是按月/周/天分区一样(,对于结构化数据,有不同的文件格式可用(尤其是列格式(,这有助于只填充处理所需的列。因此,正确的文件格式、分区和压缩是大文件的关键特性。
3(通过设置适当的火花配置,他们是否没有其他方法来处理8gb RAM和8核的50gb数据?如果是什么方式,应该是什么火花配置。
如果没有分区,但有一些方法,则不太可能。它还取决于它是什么类型的文件。你可以创建一个自定义的流文件读取器,可以读取逻辑块并对其进行处理。然而,企业不会读取50Gb的单个文件,即一个单元。即使您通过Office工具在机器中加载10Gb的excel文件,它也会耗尽内存。
4(如果系统属性为8gb RAM和8核,那么理想的火花配置应该是什么?用于处理8gb的数据
保留1个核心&操作系统为1-Gb或2-Gb,其余部分用于处理。现在,根据正在执行的转换类型,您必须决定驱动程序和辅助进程的内存。您的驱动程序应该有2Gb的RAM。但笔记本电脑主要是为操场探索代码语法,不适合大型数据集。最好使用dataframe.sample((构建逻辑,然后将代码推送到更大的机器上生成输出。