海豚版本升级之hive的udf函数踩坑

前提条件:前一段时间应用的海豚为了支持一些新特性做了版本升级,从3.0.0的版本升级到到了3.1.6版本,使用hive的UDF自定义函数碰到了一些问题,现记录如下:

1、使用UDF函数后会导致运行时报空指针异常

经过一系列排查发现是在master节点生成工作流实例时初始化获取字段为空,涉及到BaseTaskProcessor和HadoopUtils类(涉及到海豚源码结构及运行逻辑后续会专门整理篇幅说明),话不多说,上对应位置代码。

海豚初始化工作流实例的udf函数代码如下:

    private void setTaskUdfFuncResourceInfo(Map<Integer, AbstractResourceParameters> map) {
        if (MapUtils.isEmpty(map)) {
            return;
        }
        List<UdfFunc> udfFuncList = processService.queryUdfFunListByIds(map.keySet().toArray(new Integer[map.size()]));

        udfFuncList.forEach(udfFunc -> {
            UdfFuncParameters udfFuncParameters = JSONUtils.parseObject(JSONUtils.toJsonString(udfFunc), UdfFuncParameters.class);
            udfFuncParameters.setDefaultFS(HadoopUtils.getInstance().getDefaultFS());
            String tenantCode = processService.queryTenantCodeByResName(udfFunc.getResourceName(), ResourceType.UDF);
            udfFuncParameters.setTenantCode(tenantCode);
            map.put(udfFunc.getId(), udfFuncParameters);
        });
    }

在运行过程中HadoopUtils.getInstance().getDefaultFS()会返回为空导致再SqlTask执行逻辑中创建UDF函数会抛出空指针异常,可以观察一下两个版本的defaultFS的初始化逻辑:

3.0.0-HadoopUtils

            String defaultFS = configuration.get(Constants.FS_DEFAULT_FS);

            if (StringUtils.isBlank(defaultFS)){
                defaultFS= PropertyUtils.getString(Constants.FS_DEFAULT_FS);
            }

            //first get key from core-site.xml hdfs-site.xml ,if null ,then try to get from properties file
            // the default is the local file system
            if (StringUtils.isNotBlank(defaultFS)) {
                Map<String, String> fsRelatedProps = PropertyUtils.getPrefixedProperties("fs.");
                configuration.set(Constants.FS_DEFAULT_FS, defaultFS);
                fsRelatedProps.forEach((key, value) -> configuration.set(key, value));
            } else {
                logger.error("property:{} can not to be empty, please set!", Constants.FS_DEFAULT_FS);
                throw new NullPointerException(
                        String.format("property: %s can not to be empty, please set!", Constants.FS_DEFAULT_FS)
                );
            }

3.1.6-HadoopUtils

            String defaultFS = configuration.get(Constants.FS_DEFAULT_FS);

            if (StringUtils.isBlank(defaultFS)) {
                defaultFS = PropertyUtils.getString(Constants.FS_DEFAULT_FS);
            }

            // first get key from core-site.xml hdfs-site.xml ,if null ,then try to get from properties file
            // the default is the local file system
            if (StringUtils.isNotBlank(defaultFS)) {
                Map<String, String> fsRelatedProps = PropertyUtils.getPrefixedProperties("fs.");
                configuration.set(Constants.HDFS_DEFAULT_FS, defaultFS);
                fsRelatedProps.forEach((key, value) -> configuration.set(key, value));
            } else {
                logger.error("property:{} can not to be empty, please set!", Constants.FS_DEFAULT_FS);
                throw new NullPointerException(
                        String.format("property: %s can not to be empty, please set!", Constants.FS_DEFAULT_FS));
            }

对应获取的方法为:

    /**
     * @return DefaultFS
     */
    public String getDefaultFS() {
        return getConfiguration().get(Constants.FS_DEFAULT_FS);
    }

3.1.6版本set的key值由Constants.FS_DEFAULT_FS变为了Constants.HDFS_DEFAULT_FS,就会导致获取defaultFS为空,3.2.0版本给出了解决方案,代码如下:

    /**
     * @return DefaultFS
     */
    public String getDefaultFS() {
        String defaultFS = PropertyUtils.getString(Constants.FS_DEFAULT_FS);
        if(StringUtils.isBlank(defaultFS)){
            defaultFS = getConfiguration().get(Constants.HDFS_DEFAULT_FS);
        }
        return defaultFS;
    }

可以通过修改代码重新打包代码替换master项目中的对应jar包可以解决此问题

2、使用kerbros认证后提交hiveSQL运行失败,提示kerbros认证不通过

这个问题是属于配置问题了,开启kerbros认证后我们直接执行sql加上kerbros认证可以执行,加上UDF函数后提示认证不通过,初次排查是因为执行引擎我们集群默认使用的是tez,修改为mr之后就可以执行,再进一步排查是海豚配置文件中的resource.hdfs.fs.defaultFS没有配置为大数据集群的域名导致,配置完重启后,完美解决!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache DolphinScheduler是一个新一代分布式大数据工作流任务调度系统,致力于“解决大数据任务之间错综复杂的依赖关系,整个数据处理开箱即用”。它以 DAG(有向无环图) 的方式将任务连接起来,可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及 Kill任务等操作。目前已经有像IBM、腾讯、美团、360等400多家公司生产上使用。 调度系统现在市面上的调度系统那么多,比如老牌的Airflow, Oozie,Kettle,xxl-job ,Spring Batch等等, 为什么要选DolphinScheduler ? DolphinScheduler 的定位是大数据工作流调度。通过把大数据和工作流做了重点标注. 从而可以知道DolphinScheduler的定位是针对于大数据体系。DolphinScheduler 发展很快 很多公司调度都切换到了DolphinScheduler,掌握DolphinScheduler调度使用势在必行,抓住新技术机遇,为跳巢涨薪做好准备。 优秀的框架都是有大师级别的人写出来的,包含了很多设计思想和技术。DolphinScheduler也不例外,它是一个非常优秀的框架,用到很多技术和设计思想,本课程会带大家深入DolphinScheduler框架源码,包括设计的思想和技术都会讲解,DolphinScheduler源码很多,会按照模块进行讲解,学习完课程后,不仅可以熟悉DolphinScheduler使用,而且可以掌握很多优秀的设计思想和技术,给自己的技术带来很大提升,为跳巢涨薪做好准备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值