网上查找的kafka通过spark streaming落地到HIVE的方案一般都是Scala写的,为此碰到了很多的坑,特此记录一下使用pyspark来实现实时落地到HIVE的方案
说在前面
spark Streaming 接受kafka的数据落地HIVIE有2个原生的问题
- 偏移量管理问题:一般建议都是使用直连的方式连接kafka,而不是接收器的方式,所以需要直接来管理偏移量
- 小文件问题:每个batch都会产生和kafka partition个数等同的parquet,如果直接落地的话会产生很多小文件,导致数据查询缓慢和文件系统崩溃
知识面准备
- spark的streaming官方文档建议先看一下:http://spark.apache.org/docs/2.2.1/streaming-programming-guide.html 至少有个基本的了解。
- 还有kafka的集成文档:http://spark.apache.org/docs/2.2.1/streaming-kafka-integration.html, 这里有2个版本,分别是0.8和1.0,1.0那个不支持Python就不用看了。
- 以及pyspark中的streaming文档:http://spark.apache.org/docs/2.2.1/api/python/pyspark.streaming.html,重点看一下kafkaUtil模块
环境准备
- 需要确认自己的spark版本,因为需要下载指定的依赖jar包才能正常的使用streaming,我的是spark2.2.1的,所以至少需要以下jar包:
--jars org.scala-lang_scala-reflect-2.10.4.jar,\
org.slf4j_slf4j-api-1.7.7.jar,\
com.typesafe.scala-logging_scala-logging-api_2.10-2.1.2.jar,\
com.typesafe.scala-logging_scala-logging-slf4j_2.10-2.1.2.jar,\
spark-streaming-kafka-0-8_2.11-2.2.1.jar,\
spark-streaming-kafka-0-8-assembly_2.11-2.2.1.jar
这些jar包都可以通过maven的库去下载,例如:https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-8_2.11/2.2.1 是下载park-streaming-kafka-0-8_2.11-2.2.1.jar
,其他的类似,自己在maven库里面搜一下下载好,在spark-submit的时候需要引用进来。一定要注意版本,版本不对会报莫名的错误,我之前就是用来2.3.1的版本,代码一直调试不通。
代码流程
- 主流程:
def kafka_to_hive(