这几天用spark和es写了点统计和查询,记录下这过程中踩过的一些坑。
先说说spark中的坑吧,记得之前在书上看spark算子的时候,是这么说action和transformation的区别的:transformation变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理。action行动算子:这类算子会触发 sparkcontext 提交 job 作业。
当时看过之后也没太在意这句话,可是这几天真正实践的时候出现了一个百思不得其解的问题。好吧,当我信心满满的写完一堆map,filter,groupby的时候开始调试,问题来了,map函数的断点死活进不去,顿时开始怀疑人生......后来偶然间和一个网友讨论这事儿,才得知这里的奥秘,map属于transformation,它是会延迟加载的,只有当你调用了rdd.collect才会触发map去执行,也就是上面说的那两类算子的区别。
第二个问题,我要从es里面查询每天的流量数据,然后拿到里面的每条数据根据ip分组统计该ip的访问次数,然后就噌噌写完了,当时想的是用es查询,分组统计直接spark reducebykey。写惯了java面向对象的代码,自然而然的就在循环里调了连接spark-es的context,然后reducebykey了。很显然这样功能是实现了,但是性能却会有很大影响,而且spark的函数有点类似于面向过程的思想,这么调用显然不符合思想,最终换成了es的分组聚合。
最后一个es的奇葩的问题,按照时间范围搜索的时候,明明有数据在那个范围内,死活就是搜索不出来,后来发现mapping里这个字段竟然是string类型的,好坑,然后各种删mapping,再重建。最后把那个字段的日期定义成了date,再次搜索完美解决,还需要注意一个地方,时间的查询条件最好写成毫秒值,那样的话就不会出现什么日期转化异常,省的在这上面浪费时间了。
刚接触es好多坑还需要继续踩,欢迎有用到这些技术的朋友一起探讨!