现在的互联网公司大都会采用集群工作,一是为了应对同一时间大量用户的访问请求,一方面是后台运算的速度。hadoop作为比较优秀的分布式系统应用比较广泛。
hadoop使用经典的map+reduce组合。
最近几天在使用过程中,遇到了一些问题,其缘由主要是数据量大导致的。在开发一个模块的运行过程中,其中一轮hadoop运算的reduce特别慢,出现这个问题后,一直在检查逻辑,做优化。可是效果不大。后来发现还是因为输出的数据量过大导致。解决方法就是再对输出数据做一次过滤,根据需求,将一些无关的数据不做输出以减少IO。
第二个问题接踵而至,reduce整体比较快了,但是卡在了其中几个reducer上面。reduce的完成度都达到了99%。但就是卡在其中一个reducer慢慢运行。马上追查原因,发现这个reducer上分配的key太多了,这些都是比较特殊的key,我们都知道,hadoop 做了map操作后,会把同一个key的数据放到一个reducer里面,这就导致如果出现一个key的数据量巨大无比,就会拖慢整个reduce的速度。也就是一个瓶颈。深深发现在做调研时应该明确这种情况,而现在再更改就非常难了。会动到很多其他代码。解决方法有一个可以尝试,就是采用keybasedpartition。但怕影响项目上线,还是采取了权宜之计:对这个特殊的key进行过滤处理。
这也算一个经验总结吧,首先在前期做好调研,考虑到尽可能多的情况。然后就是慢慢总结,在以后的使用过程中比较顺利。