zhixingheyitian 2020-05-15
第一步,需要在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"