暑假生活周报7
这周继续跟Hadoop这套东西打交道,感觉像是从“知道怎么用”慢慢转向“知道为什么会这样”了。之前搭的环境总算没白折腾,这周主要深入折腾了Hive的性能调优和用Flume做数据采集,真是没少遇到头疼的事。
时间上,这周差不多花了三十多个小时。得有将近二十个小时花在跟Hive的性能问题较劲上。写好的HQL查询,有时候跑起来慢得让人怀疑人生,得不停地开YARN的Web UI监控页面,盯着那些Map和Reduce任务的进度条,看哪个环节卡住了。经常是因为数据倾斜,某个Reduce任务处理的数据量特别大,远远超过其他任务,整个作业就在那儿干等它一个。调了半天参数,比如试着调整hive.exec.reducers.bytes.per.reducer,想让数据分布均匀点,但效果时好时坏,有时候还得回头去改SQL写法本身。另外十多个小时则花在了配置和调试Flume,想实现一个把本地日志文件实时采集到HDFS的需求。配那个.conf文件的时候,Source、Channel、Sink哪个环节出点错都不行,尤其是Sink类型写成hdfs后,一堆关于文件滚动策略(rollInterval, rollSize)、文件格式(DataStream还是SequenceFile)的参数等着你,配错一个就可能导致HDFS上一堆小文件或者根本写不进去,查日志查得眼花。
遇到的问题也挺典型的。最大的问题还是Hive查询的不可预测性,有时候一个看着挺简单的查询,底层生成的MapReduce任务却特别复杂,运行时间远超预期,排查起来成本很高,得靠EXPLAIN命令看执行计划,一点点分析。另一个头疼的问题是Flume的稳定性,测试时Agent进程偶尔会莫名其妙挂掉,日志里也找不到特别清晰的错误原因,重启之后又好了,让人不太放心在生产环境用。环境的复杂性也是一个考验,Hadoop生态里的组件太多,版本依赖关系又比较严格,有时候新装一个插件或者改个配置,可能会影响到其他组件的正常运行。
虽然过程有点折磨,但收获也是实实在在的。对Hive的底层执行原理有了更感性的认识,不再只是单纯写SQL了。也终于把数据采集的初步流程给跑通了,看到日志文件能自动进到HDFS里,还是有点成就感的。算是明白了Hadoop这套东西为什么说“运维成本高”,真需要很细心也很耐心。
下周打算开始接触Spark了,听说它在处理速度和开发效率上比MapReduce强很多,想试试用Spark SQL去跑同样的Hive查询,对比一下效果。另外,数据采集方面,也想了解一下Sqoop,看看它从关系型数据库里导数据会不会更方便点。