hive自定义函数缺包报错,以及运行时与hive冲突解决

一.问题描述

仅描述了从配置到打包上传的过程,想要看解决请直接跳到下文的对应模块。

在使用hive设置自定义函数的时候在pom.xml中配置如下依赖,使其打包的时候带依赖打包:

bash 复制代码
<dependencies>
  <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>3.1.2</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>3.3.1</version>
  </dependency>

  <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.0</version>
  </dependency>

  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.50</version>
  </dependency>
</dependencies>
bash 复制代码
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin </artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.yunhe.UrlTransUdf</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

打包如下:

一个是纯代码的较小,而另一个较大的就是我们需要的带依赖的jar包。

打好的包放到hive的lib里然后尝试使用:

二.报错与解决

运行hive添加jar包,函数:

sql 复制代码
add jar /opt/installs/hive/lib/mymonth-1.0-SNAPSHOT-jar-with-dependencies.jar;
create temporary function hurl as 'org.bigdata.IpToLocation';

在虚拟机hive尝试:

发现报错如下,那根据报错可以看出jar包执行成功是我们的hive和hadoop有问题,

那么是我们的jar包配置打包了hive和hadoop的依赖,但是却在hive中执行时引起了冲突:

但是为了在编写java的时候却又需要使用这两个配置,比较的麻烦

那么在maven中依赖是有生命周期的,所以要通过这方面来入手:

A 依赖 B,需要在 A 的 pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围,依赖范围包括:

compile:编译范围,指 A 在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。

provided:provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用, provided 依赖在编译和测试时需要,在运行时不需要,比如:servlet api 被tomcat 容器提供。

runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc 的驱动包。由于运行时需要所以runtime 范围的依赖会被打包。

test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用, 比如:junit。由于运行时不需要所以test 范围依赖不会被打包。

system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定 systemPath 磁盘路径,system 依赖不推荐使用。

而我们的需求是编译需要,但是运行不需要以免与hive冲突,因此使用provided 。

在pom.xml添加如下后重新加载打包并且上传:

再次运行即可成功!

但是注意:如果是在可视化软件运行那么需要重启hive!否则你的更改不会生效。

相关推荐
ljs64827395120 小时前
VMware 中部署 HDFS 集群环境(Hadoop 3.4.3)完整指南
大数据·hadoop·hdfs
斯文的八宝粥2 天前
WPF企业内训全程实录(下)
大数据·hadoop·wpf
Zhu7582 天前
使用腾讯CNB构建Hadoop定制容器镜像
大数据·hadoop·分布式
TTBIGDATA2 天前
【Ambari Plus】13.Spark 安装
大数据·hadoop·分布式·spark·ambari·sqoop·ambari plus
sunxunyong2 天前
Hadoop租户创建
大数据·hadoop·分布式
AllData公司负责人2 天前
数据集成管理|AIIData数据中台实现MySQL、Hive、Oracle一键接入Doris
大数据·数据库·人工智能·hive·mysql·oracle·数据分析
泰克教育官方账号2 天前
泰涨知识 | Hive集群环境部署
数据仓库·hive·hadoop
婉然从物2 天前
Flink SQL 元数据持久化实战:从“每次重启表消失”到“Hive Metastore 永久存储”
hive·sql·flink
龙石数据2 天前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台
心中有国也有家3 天前
E-Brufen 技术选型全景:Flutter + 鸿蒙 + Hive CE
hive·hadoop·学习·flutter·华为·harmonyos