如何添加UDF
在Hive 中,当内置函数无法满足需求时,可以编写用户自定义函数(User Defined Function)来插入自己的处理代码,并在查询中使用它们。
根据函数的输入和输出,用户编写的函数可以分为如下几种类型:
1、普通的(UDF):用于操作单个数据行,生成单个输出数据行;
2、用户定义聚合函数(UDAF):接受多个输入数据行,并生成一个输出数据行;
3、用户定义表生成函数(UDTF):操作单个输入数据行,并生成多个输出数据行。
根据函数的生命周期可以分为如下两类:
1、临时函数:仅在当前会话中可用,重启会话后需要重新创建;
2、永久函数:可以在多个会话中使用,不需要每次创建。
添加自定义函数的步骤如下:
1、将自己写的程序打成 Jar 包;
2、将 Jar 包上传到 hdfs 并赋予对应权限;
hdfs dfs -put hdfs://path/to/jar
hdfs dfs -chmod 777 hdfs://path/to/jar3、登录 Hive 客户端;
4、输入 CREATE TEMPORARY FUNCTION <function_name> AS '<full_path_of_class>' using jar 'hdfs://path/to/jar' 创建自定义函数;
CREATE TEMPORARY FUNCTION <function_name> AS '<full_path_of_class>' USING JAR 'hdfs://path/to/jar';
5、使用创建好的函数 function_name。
未进行Kerberos 认证直接连接 Hive 报错
现象:连接客户端抛出javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided ...] 异常。
处理:先通过klist -kt <keytab路径> 获取 principal,再执行 kinit -kt <keytab路径> <principal> 完成认证,然后重新登录客户端。
Beeline 连接 HiveServer2 失败
现象:beeline 连接超时或报 ZooKeeper 中找不到 hiveserver2 节点。
处理步骤:
1、检查连接串中的 zookeeper 地址与端口是否正确;
2、检查 serviceDiscoveryMode 与 zooKeeperNamespace 参数是否与服务端配置一致;
3、检查 principal 是否为集群实际配置的 principal,注意大小写与 realm。
查询执行缓慢或发生数据倾斜
现象:SQL 长时间运行,某个 Reduce 任务持续接近 100% 而其他任务已结束。
处理:
1、大小表关联场景开启 MapJoin(hive.auto.convert.join=true);
2、group by 倾斜场景设置 hive.groupby.skewindata=true;
3、关联前过滤空 key 或用随机值打散倾斜 key;
MR 作业内存不足(OOM)报错
现象:作业失败,日志中出现java.lang.OutOfMemoryError 或 Container killed by YARN for exceeding memory limits。
处理:
1、调大 mapreduce.map.memory.mb / mapreduce.reduce.memory.mb;
2、同步调大 mapreduce.map.java.opts / mapreduce.reduce.java.opts,建议为容器内存的 80% 左右;
3、仍不满足时降低作业并行度,或优化 SQL 减少单任务处理数据量。
动态分区报错
现象:动态分区插入报exceeds maximum partition number 或类似异常。
处理:按业务适当调大hive.exec.max.dynamic.partitions(节点总动态分区上限)与 hive.exec.max.dynamic.partitions.pernode(单节点上限),或分批执行插入。
小文件过多导致作业变慢
现象:表目录下小文件数量巨大,作业启动与调度耗时明显增加。
处理:
1、开启 hive.merge.mapfiles / hive.merge.mapredfiles 合并输出小文件;
2、ORC 表定期执行 ALTER TABLE <表名> CONCATENATE;
3、避免对超大范围分区执行全量动态分区写入。