Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Một vài rule để tuning Spark (và java/scala nói chung)
Tuning memory
Về cơ bản thì để tuning memory trong java hay scala nói chung thì bạn chỉ cần nhớ rõ một vài điều:
-
Tận dụng primitive object bất cứ khi nào có thể thay vì "box" nó vào java/scala class như là
String
hay làInteger
... - Tận dụng primitive array (có dạng T[]) bất cứ khi nào có thể thay vì List hay HashMap...
Tại sao nên làm như vậy thì có một vài lý do sau:
- Mỗi Java Object đều chứa "object header" trong đó có các thông tin như là pointer đến class. Phần header này có tới tận 16 byte, thế nên trong nhiều trường hợp header còn to hơn cả data chứa trong nó
- Java String class có tới tận 40byte overhead so với một chuỗi thông thường (String("foo") vs "foo")
- Một số cấu trúc dữ liệu như HashMap hay LinkedList sẽ dùng tới tận 8byte để chứa pointer trỏ tới object kế tiếp -> nếu không cần dùng đến các method liên quan thì đừng dùng các cấu trúc dữ liệu này.
Tuning GC
Với JVM thì
Cost mỗi khi chạy GC tỉ lệ thuận với số object trong heap
Thế nên để giảm cost này thì bạn nên giảm thiểu các cấu trúc dữ liệu mà bên trong lại chứa nhiều object con.
Spark sử dụng một khái niệm gọi là RDD
để lưu dữ liệu, RDD thường hay được "cached" lại trong RAM để giảm loading cost. Thế nên kiểm soát lượng memory được cấp cho RDD để cache sẽ ảnh hưởng đến GC khá nhiều. Điều này có thể được kiểm soát bằng cách thay đổi biến spark.executor.memory
trong Spark Config.
Để debug được GC thì bạn chỉ cần thêm vào java option lúc execute spark:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps





