Spark: Convert Text (CSV) to Parquet để tối ưu hóa Spark SQL và HDFS
Lưu trữ dữ liệu dưới dạng Columnar như Apache Parquet [1] (https://parquet.apache.org) góp phần tăng hiệu năng truy xuất trên Spark lên rất nhiều lần. Bởi vì nó có thể tính toán và chỉ lấy ra 1 phần dữ liệu cần thiết (như 1 vài cột trên CSV), mà không cần phải đụng tới các phần khác của data row. Ngoài ra Parquet còn hỗ trợ flexible compression do đó tiết kiệm được rất nhiều không gian HDFS.
Nếu bạn chứa dữ liệu dạng text trên HDFS và dùng Spark SQL để xử lý, một biện pháp tối ưu bạn nên thử là chuyển đổi text đó sang Parquet, tăng tốc độ truy xuất và tối ưu bộ nhớ.
Theo một bài viết của IBM[2], chuyển đổi sang Parquet giúp tăng tốc độ truy xuất lên 30 lần (hoặc hơn) tùy trường hợp, bộ nhớ tiết kiệm đến 75%!
Let’s convert to Parquet!
Spark SQL hỗ trợ đọc và ghi Parquet files, và giữ nguyên được meta data. Parquet schema cho phép data files "self-explanatory" to the Spark SQL applications.
Đoạn chương trình sau sử dụng databricks.csv để đọc flat file, sau đó lưu lại dạng Parquet kèm Schema.
Đoạn mã trên tự động convert tất cả các file hadoopdsPath+"/catalog_page/* và lưu Parquet vào thư mục /user/spark/data/parquet/
, mặc định Spark sử dụng chuẩn nén gzip
, bạn có thể sử dụng compression codec uncompressed
, snappy
, hoặc lzo
.
Convert 1TB mất bao lâu?
Mất 50 phút, tức khoảng 20GB/phút khi sử dụng 6-datanode Spark 1.5.1. Tổng lượng bộ nhớ sử dụng là 500GB. Kết quả Parquet files trên HDFS có dạng:
hdfs:///user/spark/data/parquet1000g/catalog_page/_SUCCESS
hdfs:///user/spark/data/parquet1000g/catalog_page/_common_metadata
hdfs:///user/spark/data/parquet1000g/catalog_page/_metadata
hdfs:///user/spark/data/parquet1000g/catalog_page/part-r-00000-a9341639-a804-45bd-b594-8e58220190f4.gz.parquet
hdfs:///user/spark/data/parquet1000g/catalog_page/part-r-00001-a9341639-a804-45bd-b594-8e58220190f4.gz.parquet
Bộ nhớ tiết kiệm được
$ hadoop fs -du -h -s /user/spark/data/text1000g897.9 G /user/spark/data/text1000g
$ hadoop fs -du -h -s /user/spark/data/parquet1000g231.4 G /user/spark/data/parquet1000g
Từ 897.9GB text, với Parquet chỉ còn lại 231.4GB, tiết kiệm được khoảng 75%.