Viết hơn 50 triệu từ Pyspark df đến PostgresSQL, cách tiếp cận hiệu quả nhất


16

Điều gì sẽ là cách hiệu quả nhất để chèn hàng triệu bản ghi nói 50 triệu từ khung dữ liệu Spark vào Bảng Postgres. Tôi đã thực hiện điều này từ tia lửa đến MSSQL trong quá khứ bằng cách sử dụng tùy chọn kích thước hàng loạt và kích thước hàng loạt cũng thành công.

Có một cái gì đó tương tự có thể ở đây cho Postgres?

Thêm mã tôi đã thử và thời gian để chạy quy trình:

def inserter():
    start = timer()
    sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\
    .option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \
    .option("dbtable", "public.full_load").option("user", "root").option("password", "password").save()
    end = timer()
    print(timedelta(seconds=end-start))
inserter()

Vì vậy, tôi đã thực hiện cách tiếp cận trên cho 10 triệu bản ghi và có 5 kết nối song song theo quy định numPartitionsvà cũng đã thử kích thước lô 200k .

Tổng thời gian cần cho quá trình là 0: 14: 05.760926 (mười bốn phút và năm giây).

Có cách tiếp cận hiệu quả nào khác sẽ làm giảm thời gian không?

Điều gì sẽ là kích thước lô hiệu quả hoặc tối ưu tôi có thể sử dụng? Sẽ tăng kích thước lô của tôi làm công việc nhanh hơn? Hoặc mở nhiều kết nối tức là> 5 giúp tôi thực hiện quy trình nhanh hơn?

Trung bình 14 phút cho 10 triệu hồ sơ không phải là xấu , nhưng tìm kiếm những người ngoài kia đã làm điều này trước đây để giúp trả lời câu hỏi này.


1
Trước tiên, bạn có thể chuyển dữ liệu sang tệp CSV cục bộ và sau đó sử dụng các công cụ nhập riêng của PostgreQuery để nhập dữ liệu - điều này phụ thuộc vào việc nút cổ chai ở đâu: xuất chậm từ Pyspark hay chậm nhập vào Postgres, hay cái gì khác? (Điều đó nói rằng, 14 phút cho 50 triệu hàng dường như không tệ với tôi - chỉ số nào được xác định trên bảng?).
Đại

Dai, tôi có một df là 52 triệu và bây giờ tôi đang viết nó cho Postgres, đó là một bảng mới tôi đang tạo thông qua đoạn mã trên. Tôi đã không tạo bảng trong Postgres và sau đó viết ở đó. Có khả năng nào tốt hơn nếu tôi có thể tạo bảng trước và lập chỉ mục cho nó trong Postgres và sau đó gửi dữ liệu từ spark df?
Chetan_Vasudevan

2
(Đó là cách khác - các chỉ mục làm chậm các thao tác chèn trên các bảng, nhưng tăng tốc các truy vấn chọn)
Dai

Dai, vì vậy tôi chỉ tạo bảng trong Postgres mà không có chỉ mục và sau đó thử chèn và đo hiệu suất của tôi?
Chetan_Vasudevan

Câu trả lời:


4

Tôi thực sự đã làm công việc tương tự trước đây nhưng sử dụng Apache Sqoop.

Tôi muốn nói rằng để trả lời câu hỏi này, chúng ta phải cố gắng tối ưu hóa giao tiếp giữa Spark và PostgresQuery, cụ thể là dữ liệu chảy từ Spark sang PostgreSql.

Nhưng hãy cẩn thận, đừng quên bên Spark. Sẽ không có nghĩa khi thực hiện mapPartitions nếu số lượng phân vùng quá nhiều so với số lượng kết nối tối đa mà PostgreQuery hỗ trợ, nếu bạn có quá nhiều phân vùng và bạn đang mở một kết nối cho mỗi phân vùng, có thể bạn sẽ gặp lỗi sau org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

Để điều chỉnh quá trình chèn, tôi sẽ tiếp cận vấn đề theo các bước tiếp theo:

  • Hãy nhớ số lượng phân vùng là quan trọng. Kiểm tra số lượng phân vùng và sau đó điều chỉnh nó dựa trên số lượng kết nối song song bạn muốn có. Bạn có thể muốn có một kết nối cho mỗi phân vùng, vì vậy tôi sẽ đề nghị kiểm tra coalesce, như được đề cập ở đây .
  • Kiểm tra số lượng kết nối tối đa mà cá thể postgreQuery của bạn hỗ trợ và bạn muốn tăng số lượng .
  • Để chèn dữ liệu vào PostgreSQL được khuyến nghị sử dụng lệnh COPY . Đây cũng là một câu trả lời chi tiết hơn về cách tăng tốc độ chèn postgreSQL.

Cuối cùng, không có viên đạn bạc để làm công việc này. Bạn có thể sử dụng tất cả các mẹo tôi đã đề cập ở trên nhưng nó thực sự sẽ phụ thuộc vào dữ liệu và trường hợp sử dụng của bạn.


Dbustosp Tôi chắc chắn sẽ thử các lời khuyên ở trên, cho đến lúc đó bạn xứng đáng nhận được một upvote chắc chắn.
Chetan_Vasudevan

@chetan_vasudevan nếu bạn cung cấp thêm chi tiết về dữ liệu bạn đang sử dụng, kích thước trên mỗi bản ghi, v.v ... Nếu dữ liệu là công khai, tôi có thể tự mình thử một cái gì đó và so sánh thời gian.
dbustosp

Dbustosp dữ liệu có 80 cột và 55 triệu bản ghi của nó. Tôi đã bắt đầu làm việc trên các đề xuất mà bạn đã cho tôi.
Chetan_Vasudevan

@Chetan_Vasudevan Tổng kích thước của tập dữ liệu? Định dạng của dữ liệu đầu vào là gì?
dbustosp

@Chetan_Vasudevan Có bản cập nhật nào không?
dbustosp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.