2015-10-27 19 views
5

Tôi có một cụm tia lửa mà tôi đã tạo thông qua google dataproc. Tôi muốn có thể sử dụng thư viện cs1 csv từ databricks (xem https://github.com/databricks/spark-csv). Vì vậy, tôi lần đầu tiên thử nghiệm nó như thế này:sử dụng thư viện bên ngoài trong công việc pyspark trong cụm Spark từ google-dataproc

tôi bắt đầu một phiên ssh với nút chính của cụm của tôi, sau đó tôi đầu vào:

pyspark --packages com.databricks:spark-csv_2.11:1.2.0 

Sau đó, nó đưa ra một vỏ pyspark trong đó tôi đầu vào:

df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('gs:/xxxx/foo.csv') 
df.show() 

Và nó hoạt động.

bước tiếp theo của tôi là để khởi động công việc này từ máy chính của tôi bằng cách sử dụng lệnh:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> my_job.py 

Nhưng ở đây Nó không làm việc và tôi nhận được một lỗi. Tôi nghĩ bởi vì tôi đã không đưa ra các đối số --packages com.databricks:spark-csv_2.11:1.2.0, nhưng tôi đã thử 10 cách khác nhau để cung cấp cho nó và tôi đã không quản lý.

Câu hỏi của tôi là:

  1. được thư viện databricks csv cài đặt sau khi tôi gõ pyspark --packages com.databricks:spark-csv_2.11:1.2.0
  2. tôi có thể viết một dòng trong job.py tôi để import nó?
  3. hoặc những thông số nào tôi nên cung cấp cho lệnh gcloud của mình để nhập hoặc cài đặt nó?
+2

Có lỗi trong Dataproc trong đó JARS không được chọn cho công việc Pyspark. Tôi đang tìm kiếm một giải pháp thay thế. Tôi chỉ muốn cho bạn biết rằng chúng tôi đang xem xét lỗi lớn hơn và tôi đang xem liệu chúng tôi có thể xác định bản sửa lỗi tạm thời cho bạn hay không. :) – James

+0

hy vọng cho cả hai cách giải quyết và sửa lỗi ở đây nữa, thx @James! chúng tôi đang cố gắng sử dụng dataproc với các kết nối cassandra từ cả python và scala – navicore

Trả lời

9

ngắn trả lời

Có quirks trong Trật tự của các đối số nơi --packages không được chấp nhận bởi spark-submit nếu nó đưa ra sau khi tranh luận my_job.py. Để workaround này, bạn có thể làm những điều sau đây khi nộp từ CLI Dataproc của:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \ 
    --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py 

Về cơ bản, chỉ cần thêm --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 trước .py tập tin trong lệnh của bạn.

dài trả lời

Vì vậy, đây thực sự là một vấn đề khác với việc thiếu tiếng hỗ trợ cho --jars trong gcloud beta dataproc jobs submit pyspark; có vẻ như không có Dataproc công nhận rõ ràng --packages là cờ đặc biệt spark-submit, nó cố gắng vượt qua sau các đối số ứng dụng để cho phép gửi tia sáng cho phép đối số ứng dụng thay vì phân tích cú pháp chính xác như một bài nộp- tùy chọn cấp độ.Thật vậy, trong một phiên SSH, sau đây không không công việc:

# Doesn't work if job.py depends on that package. 
spark-submit job.py --packages com.databricks:spark-csv_2.11:1.2.0 

Nhưng chuyển đổi thứ tự của các đối số không hoạt động trở lại, mặc dù trong trường hợp pyspark, cả orderings làm việc:

# Works with dependencies on that package. 
spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py 
pyspark job.py --packages com.databricks:spark-csv_2.11:1.2.0 
pyspark --packages com.databricks:spark-csv_2.11:1.2.0 job.py 

Vì vậy, mặc dù spark-submit job.py được cho là một thay thế cho tất cả mọi thứ trước đây được gọi là pyspark job.py, sự khác biệt trong phân tích cú pháp đặt hàng cho những thứ như --packages có nghĩa là nó không thực sự là di chuyển tương thích 100%. Đây có thể là thứ để theo dõi với phía Spark. Tuy nhiên, may mắn thay, có một cách giải quyết khác, vì --packages chỉ là một bí danh khác cho thuộc tính Spark spark.jars.packages và CLI của Dataproc hỗ trợ các thuộc tính tốt. Vì vậy, bạn chỉ có thể làm như sau:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \ 
    --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py 

Lưu ý rằng --properties phải đến trước các my_job.py, nếu không nó được gửi như một tham số ứng dụng chứ không phải là một lá cờ cấu hình. Hy vọng rằng sẽ làm việc cho bạn! Lưu ý rằng tương đương trong phiên SSH sẽ là spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py.

+0

Điều này đã giúp tôi, nhưng bây giờ tôi đang đấu tranh để đăng ký một kho lưu trữ mới ngoài gói của tôi. Tôi đã thử thêm '' --properties spark.jars.packages = org.elasticsearch: elasticsearch-hadoop: 2.4.0, spark.jars.ivy = http: // conjars.org/repo'' nhưng bằng cách nào đó, hai dấu gạch chéo về phía trước được chuyển đổi thành một và lỗi trình điều khiển thông qua bên dưới. Bạn có bất kỳ suy nghĩ về lỗi này/cách thích hợp để cung cấp một url đủ điều kiện với hai dấu gạch chéo chuyển tiếp: '' Ngoại lệ trong chuỗi "chính" java.lang.IllegalArgumentException: basedir phải tuyệt đối: http: /conjars.org/repo/local'' – aeneaswiener

2

Ngoài ra vào @Dennis.

Lưu ý rằng nếu bạn cần phải nạp nhiều gói bên ngoài, bạn cần phải xác định một nhân vật thoát tùy chỉnh như sau:

--properties ^#^spark.jars.packages=org.elasticsearch:elasticsearch-spark_2.10:2.3.2,com.data‌​bricks:spark-avro_2.10:2.0.1 

Lưu ý^#^ngay trước khi danh sách gói. Xem gcloud topic escaping để biết thêm chi tiết.

Các vấn đề liên quan