第一步,需要在CDH上安裝Spark 2,由於我的CDH是5.15.x,只能通過CDS的方式安裝。官方指導在https://docs.cloudera.com/documentation/spark2/latest/topics/spark2.html。
總結下,需要手動下載cds文件上傳到CM服務器並修改owner,然后重啟系統的cmservice,之后可能還需要登錄到CM管理端,從頁面重啟CM服務,這兩者的關系我還不是很清楚囧
其次,配置下remote parcel repo,加上spark2的地址,然后如果頁面顯示需要重啟就重啟,重啟之后到cluster->parcels頁面check for new parcels應該就能看到spark2的選項,download之。
如果CM無法訪問外網,方法1,配置CM的proxy,使用http代理;方法2,下載spark2的parcel文件和sha文件,以及!manifest.json,然后上傳到CM的local parcel repo目錄,重新check for new parcels,應該就OK了。
如果要使用structured streaming,spark2當然是選擇最新版,因為foreach這個功能的python版只有2.4才支持。我選擇的是最新的2.4.0.cloudera2-1.cdh5.13.3.p0.1041012。
第二步,CM中Add service,添加spark2,添加一個spark history節點,gateway節點自行選擇,把所有spark可能運行的節點都選上好了。如果要讓spark默認就能訪問hive表,需要把hive和spark的gateway角色賦予同一台機器。
第三步,驗證,找一台gateway,運行pyspark2(scala或java自行選擇),如果出現spark 2.4,0的字樣,則安裝成功。
問題記錄:
1,雖然我在提交spark作業時制定了spark-kafka的版本,
--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.0
還是會報錯(類似):
java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(Ljava/util/Collection;)V
at org.apache.spark.sql.kafka010.SubscribeStrategy.createConsumer(ConsumerStrategy.scala:63)
解決方案(原因未深究,我懷疑是CDH原來裝了Spark 1,而這次我並沒有卸載的緣故,CDH允許兩個版本並存):
export SPARK_KAFKA_VERSION=0.10
2,中文處理的問題,雖然在python中是古老的問題了,spark中一樣會遇到,大概長下面這樣:
UnicodeEncodeError: 'ascii' codec can't encode character '\u2013' in position 9741: ordinal not in range(128)
解決方案:
設置python文件編碼,針對python 2.x,如下。
# -*- coding: utf-8 -*- from __future__ import print_function import sys reload(sys) sys.setdefaultencoding('utf8')
3,運行spark的節點很可能不能連接外網,需要proxy,然后會發現各種http_proxy環境變量都沒有用,ANT_OPTS也沒有用,生效的是spark.driver.extraJavaOptions,如下:
spark2-submit --conf "spark.driver.extraJavaOptions=-Dhttp.proxyHost=xxx -Dhttp.proxyPort=xxx -Dhttps.proxyHost=xxx -Dhttps.proxyPort=xxx"