Spark - 性能优化详解1(查看数据cache到内存后占用的大小)
作者:hangge | 2024-07-25 08:38
一、查看数据 cache 到内存后占用的大小
1,基本介绍
(1)Spark 是一个基于内存的计算引擎,所以对它来说,影响最大的可能就是内存,一般我们的任务如果遇到了性能瓶颈大概率都是内存的问题。
(2)当把原始文件中的数据转化为内存中的对象之后,占用的内存会比原始文件中的数据要大。
- 每个 Java 对象,都有一个对象头,会占用 16 个字节,主要是包括了一些对象的元信息,比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个 int 类型的 field,那么它的对象头实际上比对象自身还要大。
- Java 的 String 对象的对象头,会比它内部的原始数据,要多出 40 个字节。因为它内部使用 char 数组来保存内部的字符序列,并且还要保存数组长度之类的信息。
- Java 中的集合类型,比如 HashMap 和 LinkedList,内部使用的是链表数据结构,所以对链表中的每一个数据,都使用了 Entry 对象来包装。Entry 对象不光有对象头,还有指向下一个 Entry 的指针,通常占用 8 个字节。
2,查看程序需要消耗多少内存
(1)通过 cache 方法,可以看到 RDD 中的数据 cache 到内存中之后占用多少内存,这样就能看出程序需要消耗多少内存。下面是一个样例代码,读取的时一个 2G 的数据文件:
import org.apache.spark.{SparkConf, SparkContext} object TestMemoryScala { def main(args: Array[String]): Unit = { val conf = new SparkConf() conf.setAppName("TestMemoryScala") .setMaster("local") val sc = new SparkContext(conf) val dataRDD = sc.textFile("D:\\student.dat").cache() val count = dataRDD.count() println(count) //while循环是为了保证程序不结束,方便在本地查看4040页面中的storage信息 while(true){ ; } } }
(2)执行代码,访问 localhost 的 4040 端口界面。这个界面其实就是 spark 的任务界面,在本地运行任务的话可以直接访问 4040 界面查看。我们点击 stages 可以看到任务的原始输入数据确实是 2G:
(3)点击 storage 可以看到将数据加载到内存,生成 RDD 之后的大小。可以看到这一份数据在 RDD 中占用了 3.5G 内存。
(4)通过测试,我们就能知道如果想要把数据全部都加载进内存,需要给这个任务分配多少内存。
提示:当然我们分配少一些也可以,只不过这样计算效率会变低,因为 RDD 中的部分数据内存放不下就会放到磁盘了。
全部评论(0)