暑假生活周报5
这周算是跟Hadoop较上劲了,继续深挖了它的几个核心环节,尤其是Hive和性能调优这块儿,练得越深越觉得这框架像个带刺的宝藏——功能强但处处要手艺。
技术落地终于有了点手感:重点折腾了Hive,把它架到Hadoop上当SQL翻译官是真的香。原来要写Java MapReduce搞半天的操作,现在一句CREATE TABLE ... STORED AS ORC加SELECT ... WHERE就搞定了,连复杂点的JOIN加窗口函数都能跑。特别试了ORC格式的威力,同一份日志数据,存成TextFile要200GB,转成ORC带Zlib压缩直接缩到30GB,查询速度肉眼可见地快了一截。但架Hive Metastore时就被现实教育了——用嵌入式Derby只能单用户玩,切MySQL当元数据库时hive-site.xml里配JDBC连错一次,整个Hive CLI就罢工,报的错还是云里雾里的Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient,查了半小时日志才发现是MySQL驱动jar包没放进Hive的lib目录。
性能调优简直是参数地狱:原先伪集群里跑MapReduce卡得像老牛拉车,这周狠下心来调优。YARN的yarn.scheduler.maximum-allocation-mb和yarn.nodemanager.resource.memory-mb必须严丝合缝对齐,差1MB就可能让任务饿死;Map阶段疯狂爆Container被强杀,最后发现是mapreduce.map.memory.mb设了1024但-Xmx堆参数只给了768M,JVM自杀触发YARN杀容器,调成-Xmx768m才消停。还试了开LZO压缩(mapreduce.map.output.compress.codec配成LzopCodec),中间数据量直接砍半,但Linux现装lzop依赖又卡了半小时权限问题。最头疼的是排错成本,一个Task失败得翻三个地方:YARN的Web UI找stderr日志、DataNode看块健康状态、HDFS查fsck有没有损坏副本,头发差点薅秃。
对比痛感特别真实:MapReduce写个按用户分组的访问次数统计,Java版要写Mapper/Reducer/Driver三个类,Hive一句SELECT user_id, COUNT(*) FROM logs GROUP BY user_id完事儿。但Hive查着查着突然报个FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask,又得回头查Tez引擎或者MapReduce的配置,里外里时间也没省多少。
收获倒是很实在:摸清了生产级参数怎么调(比如dfs.blocksize设128MB还是256MB要看文件大小分布),HQL调试也有了套路(先用EXPLAIN看执行计划有没有乱JOIN)。下周准备用Flume吞点实时日志进HDFS,再拿Spark SQL跑同样的Hive查询,看看能不能把MapReduce的棺材板钉得更死一点——这玩意儿写作业效率实在太劝退了。顺便还想试试HDFS的HA方案,上周伪集群NameNode一挂就全瘫的阴影还在呢。
总之,Hadoop生态这玩意儿就像个重型机甲,操纵杆多到令人发指,但一旦调顺了,处理PB级数据时的暴力美感确实让人上头——虽然调优时真的很想给它一扳手。