鉴于实在是比较少python相关是spark streaming的例子,对于自己实现的测试例子分享上来一起讨论。另外如果做spark streaming应用程序,强烈建议使用scala,python写日常的spark批处理程序还好
这个例子为一个简单的收集hive的元数据日志,监控各个hive客户端访问表的统计。例子简单,但是涉及到不同的组件的应用,结构图(不含红色方框)如下
这也是Linkedln技术高管Jay Kreps:Lambda架构剖析中指的架构的一种实现,据了解很多公司也是按照这一套来走,具体在应用上也会灵活选用。
在实际应用中会有个疑惑:不管是写入hdfs还是利用streaming读取数据,flume或者kafka都能独立实现,包括负载均衡容错,那么为什么要两个一起上。下面是一些个人的总结,归根结底就是方便,方便用方便管
在应用上 flume 1、配置简单不用自己开发 2、可直接拦截屏蔽数据 3、通过channel对数据进行分发
kafka 1、支持副本事件 2、topic可以被重复使用,是一个非常通用的系统
架构上flume提供一个管道流和数据分发的功能,收集数据后能够将数据分发到不同的系统中,
如同一份数据同时写入hdfs和kafka,这样就没有必要自己实现自己的消费者。
kafka则作为一个兼容且高可靠平台存储一段时间内的数据
flume
flume作为一个日志收集组件,可以简单的通过配置化文档将不同源的数据写入到类似hdfs、kafka等目标。有些时候flume未必能解决数据源整合的问题,就像日志重复这个问题。可以根据需要选择其他东西,比如统一将所有日志都按照一定格式写到redis上去,后台另起服务不断地拉取数据到kafka,甚至直接从业务代码上不断往kafka写数据,相对来说flume感觉可能更适合做一些离线的非实时数据的收集。
这里采用的是单机模式直接用exec监控日志文件,并将日志发送到kafka上,topic为mytopic。下面是其配置文件
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.channels = c1
a1.sources.r1.command = tail -F /var/log/hive/hadoop-cmf-hive1-HIVEMETASTORE-master.log.out
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1