GCP 系列-新增/啟動 Dataproc clusters 時帶入多個 properties 套件

How to launch/create Dataproc clusters with multi properties (jars, packages)?

在本範例你會學到:

  • 如何在 GCP Dataproc properties 中帶入多個需要安裝的套件,本範例將會示範:
    • kafka(Prefix:spark)
    • stackdriver(Prefix:dataproc)
    • clickhouse(Prefix:spark)

上方所列的 Prefix將會在下方說明。

在本範例你需要先準備好:

  • 對 GCP (Google Cloud Platform) 有基礎認識
  • 有需要在 cluster 使用多種套件的需求

1.一般使用方式

根據 Google 官方文件,有定義了可以帶入的相關套件的Prefix,ex: Spark, pig, hdfs等等的項目,更詳細的定義請見文件。

在網路上其實有相當多的使用方式,也看得眼花撩亂,其實官方文件最近已經把它定義的很清楚了,讓我來帶大家一探究竟:

懶得聽我廢話也可以自己看:

https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/cluster-properties

基礎定義:

file_prefix1:property1=value1,file_prefix2:property2=value2,...
  • 此定義的前提是沒有重複使用到相同的 prefix 中的不同套件
  • 兩個 prefix 之間是用逗號隔開
  • prefix 後會接一個冒號(:),再接 property名稱,再接(=)來放入值

是不是沒有很懂,來簡單示範一次:

  • 第一個要使用的套件dataproc:dataproc.monitoring.stackdriver.enable=true
  • 第二個要使用的套件 spark:spark.jars.packages=ru.yandex.clickhouse:clickhouse-jdbc:0.2
  • 接起來的方式就是簡單用逗號(,)分開
--properties 'spark:spark.jars.packages=ru.yandex.clickhouse:clickhouse-jdbc:0.2,dataproc:dataproc.monitoring.stackdriver.enable=true'

大家可能會注意到,剛剛官網不是說只有三個符號,冒號、等號跟逗號而已嗎?怎麼上面例子一大堆符號,這就來拿 clickhouse 的套件來簡單說明一下:

# 這個 clickhouse 例子等號後面又有兩個冒號
spark:spark.jars.packages=ru.yandex.clickhouse:clickhouse-jdbc:0.2

某些套件本身就已經有定義好他的名稱了,其中可能包含版本號碼,只要是等號後面的可以就當成一串 string 代表是某個套件名稱的組合喔,其中的標點符後就照抄官網上的就好! 上方範例等號後面 ru.yandex.clickhouse:clickhouse-jdbc:0.2 的字串就代表套件名稱與版本號!不屬於 properties 本身的結構喔!

2.需要使用相同 prefix 的方式

大家可能會覺得,這跟 prefix 一不一樣有什麼關係,沒錯,我一開始也是這樣想的,所以延續上方的例子,我要再加入一個 kafka 的套件(也是來自 prefix:spark)的時候,第一直覺會這樣寫:

--properties 'spark:spark.jars.packages=ru.yandex.clickhouse:clickhouse-jdbc:0.2,dataproc:dataproc.monitoring.stackdriver.enable=true,spark:org.apache.spark:spark-sql-kafka-0-10_2.11:2.3.2'

延續上面例子直接用,在分開第三個套件就好了,是不是很直覺。真的去啟動 dataproc 的時候也不會有任何錯誤,但在 submit job 的時候就會發現,同一個 prefix 他只會認得一個喔,而且他會認得最後一個,也就是我最後只會成功帶入 stackdriverkafkaclickhouse是會安裝失敗的!

對此狀況官網也有提出相對應的撰寫格式:

--properties ^#^file_prefix1:property1=part1,part2#file_prefix2:property2=value2

觀察一下整句語法,多了兩種符號的寫法:

  • ^#^:當遇到會使用相同 prefix 時的開頭寫法
  • 中間的 #:分隔兩個不同的 prefix
  • =part1,part2: 剛剛上方講到的同套件問題,就可以直接用逗號解決囉!

我們把剛剛錯誤的用法來稍微修正一下:

--properties ^#^spark:spark.jars.packages=ru.yandex.clickhouse:clickhouse-jdbc:0.2,org.apache.spark:spark-sql-kafka-0-10_2.11:2.3.2#dataproc:dataproc.monitoring.stackdriver.enable=true

第一次看到的人應該還是會覺得很亂,不過懂了官方定義的格式其實就很明瞭了,相同共用 spark prefix 的 clickhouse 及 kafka 就在等號後面用逗號分隔,而不同prefix之間就用井字號分隔。

3.完整寫法

gcloud dataproc clusters create test-cluster \
    --region=global \
    --master-machine-type n1-highmem-4  \
    --master-boot-disk-size 100GB \
    --num-workers 2 \
    --worker-boot-disk-size 500GB  \
    --worker-machine-type n1-highmem-4  \
    --zone asia-east1-b  \
    --image-version=1.4 \
    --properties ^#^spark:spark.jars.packages=ru.yandex.clickhouse:clickhouse-jdbc:0.2,org.apache.spark:spark-sql-kafka-0-10_2.11:2.3.2#dataproc:dataproc.monitoring.stackdriver.enable=true

參考資料

properties 其實還有相當多的功用,此篇就著重於額外套件的使用,以後有機會再跟大家分享其他有趣的功能!

官方文件:https://cloud.google.com/sdk/gcloud/reference/dataproc/clusters/create#--properties

properties格式定義 https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/cluster-properties

若有任何問題與指教歡迎與我聯繫,若覺得我的內容不錯麻煩幫我隨便點個廣告,謝謝。


 上一篇
Python 系列- 如何乾淨移除網址url中的追蹤碼? Python 系列- 如何乾淨移除網址url中的追蹤碼?
How to remove/parse utm tags from urls to get clean url in python?在本範例你會學到: 如何使用 python 得到乾淨的 url 使用 urllib.parse 移除不想要
2020-07-06
下一篇 
pyspark系列-如何於 dataframe 增加索引(index)值或 row number pyspark系列-如何於 dataframe 增加索引(index)值或 row number
How to add a index number column in pyspark dataframe?在本範例你會學到: 常見的 function monotonically_increasing_id () 本範例重點 row_n
2020-06-04
  目錄