Tôi thấy một số vấn đề về hiệu suất trong khi chạy truy vấn bằng cách sử dụng các khung dữ liệu. Tôi đã thấy trong nghiên cứu của tôi, rằng nhiệm vụ cuối cùng chạy lâu có thể là dấu hiệu cho thấy dữ liệu không bị quấy rầy một cách tối ưu, nhưng chưa tìm thấy một quy trình chi tiết để giải quyết vấn đề này.Nhiệm vụ cuối cùng của Spark mất 100x lần dài hơn 199 đầu tiên, cách cải thiện
Tôi bắt đầu tải hai bảng dưới dạng các khung dữ liệu và sau đó tôi sẽ tham gia các bảng đó trên một trường. Tôi đã cố gắng để thêm phân phối bởi (phân vùng), và sắp xếp theo, để cải thiện hiệu suất, nhưng tôi vẫn thấy nhiệm vụ cuối cùng dài chạy duy nhất này. Đây là một phiên bản đơn giản của mã của tôi, lưu ý rằng một và hai truy vấn không thực sự đơn giản và sử dụng các UDF này để tính toán một số giá trị.
Tôi đã thử một vài cài đặt khác nhau cho spark.sql.shuffle
. Tôi đã thử 100, nhưng nó thất bại (tôi đã không thực sự gỡ lỗi này đến nhiều để được trung thực). Tôi đã thử 300, 4000 và 8000. Hiệu suất giảm với mỗi lần tăng. Tôi đang chọn một ngày dữ liệu, trong đó mỗi tệp là một giờ.
val df1 = sqlContext.sql("Select * from Table1")
val df2 = sqlContext.sql("Select * from Table2")
val distributeDf1 = df1
.repartition(df1("userId"))
.sortWithinPartitions(df1("userId"))
val distributeDf2 = df2
.repartition(df2("userId"))
.sortWithinPartitions(df2("userId"))
distributeDf1.registerTempTable("df1")
distributeDf2.registerTempTable("df2")
val df3 = sqlContext
.sql("""
Select
df1.*
from
df1
left outer join df2 on
df1.userId = df2.userId""")
Do dường như phân vùng theo userId không lý tưởng nên tôi có thể phân vùng bằng dấu thời gian thay thế. Nếu tôi làm điều này, tôi có nên làm Date + Hour không? Nếu tôi có ít hơn 200 combo độc đáo cho điều này, liệu tôi sẽ có những người thực thi trống không?
Tác vụ nào của trang web Spark báo cáo mất nhiều thời gian nhất? –
Công việc này chỉ được dán nhãn là saveAsTable, tôi không chắc chắn cách phân biệt nhiệm vụ trong công việc. Tôi thấy người thực hiện chiếm nhiều thời gian nhất có giá trị trộn cao nhất. –
Có phải 'userId' là loại văn bản hay kiểu số không? Nếu văn bản, tôi thực sự khuyên bạn nên thử một loại số. –