1. 为什么要在Kettle里打通Hive到HDFS这条链路
第一次接触这个需求的人,脑子里冒出来的第一个问题往往是:Hive表的数据本来就躺在HDFS上,为什么还要用Kettle再导一遍到HDFS?这不是脱裤子放屁吗?我当初也是这么想的,直到真正在项目里踩过一遍才明白,这个操作解决的是数据形态转换和跨层搬运的问题,而不是简单的复制粘贴。
Hive表在HDFS上的存储格式通常是ORC、Parquet、TextFile这类面向查询优化的列式或行式文件,文件名是000000_0这种没有业务含义的编号,目录结构按分区字段层层嵌套。而下游消费方——比如数据科学团队、外部合作方、或者另一个计算引擎——他们需要的是可读性强、格式规整、命名有意义的文件,比如按日期命名的CSV或JSON,放在一个约定好的目录里。Kettle在这里扮演的角色,就是一个带业务逻辑的搬运工:它从Hive里把数据读出来,在内存里做清洗、转换、字段映射,然后以指定的格式写到HDFS的目标路径。
这条链路的核心价值在于三点。第一,格式解耦。上游Hive表怎么存是数仓团队的事,下游要什么格式是消费方的事,Kettle在中间做翻译,两边不用互相迁就。第二,逻辑嵌入。搬运过程中可以加过滤条件、脱敏规则、字段重命名、类型转换,这些逻辑用Kettle的转换组件拖拽就能完成,不用写MapReduce或Spark作业。第三,调度可控。Kettle的作业(Job)可以串起多个转换(Transformation),配合定时调度,实现增量抽取、失败重试、邮件告警这一整套流程。
适合读这篇内容的人,我大致分三类。一类是数据仓库工程师,手头有Hive表,需要定期把结果数据推给下游系统;一类是ETL开发人员,公司技术栈里有Kettle,想把它和Hadoop生态打通;还有一类是数据平台运维,需要理解这条链路的资源消耗和调优空间。不管你是哪一类,接下来的内容会从环境准备一路讲到踩坑排查,尽量把每个环节的“为什么”说清楚。
注意:本文涉及的所有主机名、路径、库名均为示例,实际使用时请替换为你自己的环境配置。Kettle版本以8.x为基准,不同版本在Hadoop插件配置上略有差异。
2. 环境准备:Kettle连Hive之前必须搞定的几件事
2.1 Kettle的Hadoop生态插件到底装了没
Kettle本身是个Java应用,它要跟Hive、HDFS打交道,靠的是pentaho-hadoop-shims这套插件。很多人装完Kettle打开一看,转换里确实有“Hadoop Input”“Hive Input”这些步骤,就以为万事大吉了,结果一运行就报ClassNotFoundException。原因很简单:步骤存在不代表依赖完整。
Kettle的>