环境:
HDP-2.3
Hadoop 2.7.1.2.3
HBase 1.1.1.2.3
Spark 1.4.1.2.3
Kafka 0.8.2.2.3
Solr 5.3.0
项目需求:
实时的流数据需要和每个用户前一个数据进行比较,得出值是否相同。
方案1:
只有一个spark streaming的任务,在该任务中,Spark streaming从Kafka中获取到数据后进行数据清洗,将清洗后的数据存入HBase。再对该DStream进行map,根据用户ID到HBase中查找上一时刻的值并进行比对,如果不相同则保留,相同则设置为空之后filter掉。
问题:
在执行前3~5次是成功的,之后就不继续进行了,猜想可能是HBase的性能造成的影响,不过根据
http://www.jdon.com/46128这篇帖子的性能比较,我们的项目需要同时读写操作,所以HBase还是比较适合的,只能换Spark算法。
方案2:
第一个spark streaming任务实时将数据写入HBase,第二个spark批处理任务每隔一段时间对HBase进行一次批处理。
HBase的原始数据表以用户ID作为行健,时间作为列,需要对比的数据作为值,只有一个列簇。
问题:
任务成功,但执行时间过长,当HBase表中数据增加时,任务执行时间明显增加。
方案3:
在方案2的基础上进行改进,在第二个spark批处理任务执行的过程中,将本次每行的列的长度记录在HBase表的第二个列簇中,供下个任务使用。
问题:
任务执行时间还是没有减少。
方案4:
在方案2的基础上进行改进,在第二个spark批处理任务执行的过程中,将除了最后一位值的其他列全部删除,减小HBase表的大小。
问题:
只有少量数据的时候HBase也会遇到请求失败,无法访问所有表,该方法不成功。
方案5:
在方案3的基础上进行改进,在第一个Spark streaming任务中通过Solr对HBase进行实时增量索引供第二个spark批处理任务查询使用,还未测试。(目前遇到的问题是solr的scala API还没有调试完成)