这周继续跟Hadoop死磕,感觉像是从“新手村”走到了“实战演练场”。之前搭好的伪分布式环境终于派上了大用场,但各种问题也接踵而至,真是痛并快乐着。
主要时间都花在了搞明白Hive和MapReduce的实战配合上。之前觉得用Hive写SQL比写Java MapReduce程序省事太多了,一个GROUP BY或者JOIN就能搞定统计。但真正跑起来才发现,HQL背后还是转换成了MapReduce任务在跑。最头疼的就是性能调优,一个看似简单的查询,跑起来可能巨慢。这周大部分调试都花在查为什么卡住了:是数据倾斜了?还是内存爆了?得不停地翻YARN的Web UI看任务进度,查JobHistory里的日志,有时候还得去HDFS上瞅一眼中间数据是不是分布不均。参数调得头晕,mapreduce.map.memory.mb、mapreduce.reduce.memory.mb、还有一堆关于 shuffle 和排序的配置,每个都得小心翼翼地调,数值设小了容器动不动就被YARN给“杀”了,报一些让人摸不着头脑的容器退出错误;设大了又浪费资源,伪集群资源本就不多,真是左右为难。
另一个深坑是数据格式和压缩。听别人说用ORC或者Parquet这类列式存储格式能大幅提升查询性能,还能省空间。兴致勃勃地试着把原始文本数据转成ORC,过程就挺曲折的,建表时STORED AS ORC那堆语法要写对,还要注意压缩编解码器的配置。转换成功后查询速度确实快了不少,文件体积也缩小很多,算是这周最有成就感的一件事了。但过程中也因为没配置好SerDe(序列化/反序列化)或者压缩库没装对,导致表查询报错,又得去查文档和社区帖子。
总的来说,这周的学习让我更清晰地认识到Hadoop体系的庞大和复杂。它不再是一个简单的工具,而是一个需要精心维护和调优的生态系统。虽然过程充满了各种“坑”,比如排查性能瓶颈时的心力交瘁,或者配置参数时的如履薄冰,但每次解决一个问题,都对底层机制多了一分理解。感觉就像是终于不再只是知道怎么开车,而是开始学着打开引擎盖,看看里面是怎么运作的了,虽然有时候会被溅一身油污。
下周准备不再死磕MapReduce了,想开始试试Spark,听说它在内存计算和开发效率上比MapReduce强很多,希望能让日子好过一点。另外,数据采集工具比如Flume或者Sqoop也得安排上,总不能老是手动往HDFS里扔数据吧。