THB

新人刚开始写博客,本博客记录学习内容,如果有问题欢迎提出,会及时更改,由于很多资料是在网上查询的,会有些相同或类似的部分,由于当时没有记录是来源于哪里,所以没有指出,以后会注意这点的。在OpenStack和hadoop方面是纯粹的菜鸟,欢迎大家指点...

基于spark的实时流数据需跟历史数据进行对比时所遇到的问题

(注:在csdn上也发表过该文章....还是喜欢lofter的风格,但csdn能解决问题...)

环境:

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的性能造成的影响,不过根据https://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还没有调试完成)

 
评论