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!否则你的更改不会生效。

相关推荐
想ai抽10 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
starfalling102411 小时前
【hive】一种高效增量表的实现
hive
顧棟13 小时前
【Yarn实战】Yarn 2.9.1滚动升级到3.4.1调研与实践验证
hadoop·yarn
D明明就是我15 小时前
Hive 拉链表
数据仓库·hive·hadoop
嘉禾望岗50319 小时前
hive join优化和数据倾斜处理
数据仓库·hive·hadoop
yumgpkpm19 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
大数据·hive·hadoop·elasticsearch·zookeeper·big data·cloudera
忧郁火龙果20 小时前
六、Hive的基本使用
数据仓库·hive·hadoop
忧郁火龙果21 小时前
五、安装配置hive
数据仓库·hive·hadoop
chad__chang1 天前
dolphinscheduler安装过程
hive·hadoop
莫叫石榴姐2 天前
字节数开一面
大数据·数据仓库·职场和发展