首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >windows 11系统调试hive metastore 3.1.2源码新姿势

windows 11系统调试hive metastore 3.1.2源码新姿势

作者头像
从大数据到人工智能
发布于 2022-03-22 00:19:03
发布于 2022-03-22 00:19:03
1.2K00
代码可运行
举报
文章被收录于专栏:大数据-BigData大数据-BigData
运行总次数:0
代码可运行

由于工作原因,需要深入了解一下hive metastore相关源码,这几天尝试了在windows中运行hive metastore代码,这边记录一下踩坑的过程以及解决方法。

window中编译遇到的问题

hive在3.0之后,独立提供hive metastore服务,我们可以直接下载hive standalone metastore相关源码即可,这边以3.1.2版本为例:

源码下载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://repo1.maven.org/maven2/org/apache/hive/hive-standalone-metastore/3.1.2/hive-standalone-metastore-3.1.2-src.tar.gz

由于hive使用thrift相关技术栈,直接运行hive standalone metastore中的HiveMetaStore主类会报相关包找不到的问题,需要先对源码进行编译然后再再idea中启动该主类。

然而在windows系统对hive standalone metastore源码编译过程中,由于需要执行shell脚本,而如果我们windows如果没有安装cygwin的话是无法完成编译的,会有如下报错:

中间乱码的内容为:

由上述信息可知,我们无法在windows中执行shell脚本,但是上述提示又告诉我们可以通过安装linux子系统来解决这个问题。所以我们可以通过在ubuntu子系统中对hive standalone metastore源码进行编译,在windows中打开该项目来运行。

安装ubuntu子系统

我们首先打开Microsoft Store,搜索Ubuntu on Windows,点击安装即可(我这边已经安装好了):

安装完成之后,点击打开,初次打开的时候会需要花几分钟的时间进行自动安装以及设置ubuntu系统的账号密码等操作。安装完成之后,再次打开ubuntu 终端,结果如下:

然后再安装一下jdk8

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt update
sudo apt install openjdk-8-jre-headless
sudo apt install openjdk-8-jdk-headless

对于maven,如果你在windows系统已经装了,默认在ubuntu子系统也是可以直接用的,不需要再ubuntu中再重新安装。

安装完成之后,输入mvn命令可以看到如下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn --version 

hive Standalone metastore源码编译

安装完ubuntu子系统之后,我们便可以用这个系统进行编译了。进入刚刚我们下载的hive standalone metastore源码目录,执行bash命令进入ubuntu子系统

执行编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn clean install -DskipTests

在编译过程中,我们可能会遇到无法修改文件权限的问题,

这是因为项目在打hive standalone metastore二进制包时,对相关文件以及文件夹权限进行了修改,但是我们在源码编译时是不需要进行打包的,所以可以将pom.xml文件中的下述插件部分注释掉:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>${maven.assembly.plugin.version}</version>
        <executions>
          <execution>
            <id>assemble</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <finalName>apache-hive-metastore-${project.version}</finalName>
              <descriptors>
                <descriptor>src/assembly/bin.xml</descriptor>
                <descriptor>src/assembly/src.xml</descriptor>
              </descriptors>
              <tarLongFileMode>gnu</tarLongFileMode>
            </configuration>
          </execution>
        </executions>
      </plugin>

编译成功

执行HiveMetaStore主类

编译完成之后便可以在idea中打开上述目录运行HiveMetaStore主类。我们使用mysql数据库作为元数据存储,所以我们还需要在mysql中初始化源数据库。

我这边的mysql数据库信息为:

mysql verson:5.7

mysql ip:192.168.1.3

mysql port:3306

mysql username:root

mysql password:password

在apache-hive-metastore-3.1.2-src源码目录下新建warehouse目录,修改src/main/resources/metastore-site.xml文件,修改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--><configuration>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>file:///e:/code/data/apache-hive-metastore-3.1.2-src/warehouse</value>
  </property>
  <property>
    <name>hive.metastore.local</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://192.168.1.3:3306/metastore_2?useSSL=false&serverTimezone=UTC</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>password</value>
  </property>
  <property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
  </property>
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://localhost:9083</value>
    <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
  </property>

</configuration>

同时还要还要修改pom.xml文件中的如下部分,新增metastore-site.xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <includes>
          <include>package.jdo</include>
        </includes>
      </resource>
    </resources>

改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <includes>
          <include>package.jdo</include>
          <include>metastore-site.xml</include>
        </includes>
      </resource>
    </resources>

同时新增如下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <dependency>
      <groupId>com.lmax</groupId>
      <artifactId>disruptor</artifactId>
      <version>3.4.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.49</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>3.1.2</version>
      <scope>runtime</scope>
    </dependency>

做完上述修改之后,重新编译hive standalone metastore源码,重新运行HiveMetaStore类,即可成功运行:

使用hive metastore java client访问 hive standalone metastore

我们在文章通过Java API获取Hive Metastore中的元数据信息说到如何通过Java API访问Hive Metastore。本文以上述文章为例,使用java客户端访问刚刚idea中运行的metastore

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zh.ch.bigdata.hms;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.metastore.IMetaStoreClient;
import org.apache.hadoop.hive.metastore.RetryingMetaStoreClient;
import org.apache.hadoop.hive.metastore.api.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HMSClient {

    public static final Logger LOGGER = LoggerFactory.getLogger(HMSClient.class);

    /**
     * 初始化HMS连接
     * @param conf org.apache.hadoop.conf.Configuration
     * @return IMetaStoreClient
     * @throws MetaException 异常
     */
    public static IMetaStoreClient init(Configuration conf) throws MetaException {
        try {
            return RetryingMetaStoreClient.getProxy(conf, false);
        } catch (MetaException e) {
            LOGGER.error("hms连接失败", e);
            throw e;
        }
    }

    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();
        conf.set("hive.metastore.uris", "thrift://localhost:9083");

        IMetaStoreClient client = HMSClient.init(conf);

        boolean enablePartitionGrouping = true;
        String tableName = "test_table_2";

        List<FieldSchema> columns = new ArrayList<>();
        columns.add(new FieldSchema("foo", "string", ""));
        columns.add(new FieldSchema("bar", "string", ""));
        List<FieldSchema> partColumns = new ArrayList<>();
        partColumns.add(new FieldSchema("dt", "string", ""));
        partColumns.add(new FieldSchema("blurb", "string", ""));
        SerDeInfo serdeInfo = new SerDeInfo("LBCSerDe",
                "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", new HashMap<>());
        StorageDescriptor storageDescriptor
                = new StorageDescriptor(columns, null,
                "org.apache.hadoop.hive.ql.io.RCFileInputFormat",
                "org.apache.hadoop.hive.ql.io.RCFileOutputFormat",
                false, 0, serdeInfo, null, null, null);
        Map<String, String> tableParameters = new HashMap<>();
        tableParameters.put("hive.hcatalog.partition.spec.grouping.enabled", enablePartitionGrouping ? "true":"false");
        Table table = new Table(tableName, "default", "", 0, 0, 0, storageDescriptor, partColumns, tableParameters, "", "", "");

        client.createTable(table);

        System.out.println("----------------------------查看表是否创建成功-------------------------------------");
        System.out.println(client.getTable("default", tableName).toString());

        client.close();
    }
}

执行结果:

查看先前在metastore-site.xml文件中设置的本地路径,查看相关表

由于我们已经在hive metastore中的default库创建了test_table这个表,如果重新创建则会报错,接下来我们看一下重新执行上述java代码。

在客户端,我们可以看到如下报错,

而在hive metastore服务端,则是如下报错

结论

在文章的上述部分中,我们讲了如何在windows中调试hive standalone metastore 3.1.2源码,其中包括以下两个部分:

  1. 安装widnows中的ubuntu子系统
  2. 修改hive standalone metastore源码
  3. 创建mysql源数据库

在实际测试过程中,如果修改了代码,还需要使用ubuntu子系统对源码进行重新编译,然后才能更好再IDEA中成功运行。相信通过上述部分,也能够对hive standalone metastore源码运行与调试有一个基本的理解。

本文为从大数据人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://cloud.tencent.com/developer/article/1960686

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring异步核心@Async注解的前世今生
可以很明显的发现,它使用的是线程池SimpleAsyncTaskExecutor,这也是Spring默认给我们提供的线程池(其实它不是一个真正的线程池,后面会有讲述)。下面原理部分讲解后,你就能知道怎么让它使用我们自定义的线程池了。
大忽悠爱学习
2022/09/29
1.3K0
Spring异步核心@Async注解的前世今生
SpringBoot线程池开发最佳实践!
即ThreadPoolTaskExecutor,但SpringBoot不同版本有区别。
JavaEdge
2025/06/01
3870
SpringBoot线程池开发最佳实践!
Spring Boot(5) @Async异步线程池详解
在Spring4中,Spring中引入了一个新的注解@Async,这个注解让我们在使用Spring完成异步操作变得非常方便。
黄规速
2022/04/14
5.7K0
Spring Boot(5) @Async异步线程池详解
不看绝对后悔的@Async深度解析【不仅仅是源码那么简单】
在整理老的业务逻辑代码时候发现好多接口实现上面都标记了 @Async注解。我本身对这个注解使用的比较少,异步逻辑我都习惯自定义ThreadPoolExecutor工具类。正好借着这次梳理代码结构,来看看 @Async这个注解到底在玩什么?
柏炎
2022/08/23
1.9K0
不看绝对后悔的@Async深度解析【不仅仅是源码那么简单】
springboot之线程池ThreadPoolTaskExecutor以及@Async异步注解
最近项目当中有需求,要进行异步的处理,需要使用到线程池,很久没有使用到线程池了,一来是做JAVAweb开发基本上很少用到异步处理,二来是发现有的老项目里面,线程和线程池的使用比较混乱,有好几个线程池,有的线程池是通过spring管理的,有的是自己创建的,然后有的地方是直接创建的线程。所以这里记录下自己在项目当中如何优雅的使用线程池!避免项目当中到处都是线程池!!!
海加尔金鹰
2020/06/08
36.8K0
Spring 异步实现原理与实战分享
最近因为全链路压测项目需要对用户自定义线程池 Bean 进行适配工作,我们知道全链路压测的核心思想是对流量压测进行标记,因此我们需要给压测的流量请求进行打标,并在链路中进行传递,那么问题来了,如果项目中使用了多线程处理业务,就会造成父子线程间无法传递压测打标数据,不过可以利用阿里开源的 ttl 解决这个问题。
张乘辉
2020/06/19
8430
Async的线程池使用的哪个?
在Spring中我们经常会用到异步操作,注解中使用 @EnableAsync 和 @Async 就可以使用它了。但是最近发现在异步中线程号使用的是我们项目中自定义的线程池 ThreadPoolTaskExecutor 而不是之前熟悉的 SimpleAsyncTaskExecutor
青衫染红尘
2022/08/02
1.3K0
你知道 @Async 是怎么让方法异步执行的吗?
@Async 是通过注解标记来开启方法的异步执行的;对于注解的底层实现,除了 java 原生提供那种依赖编译期植入的之外,其他的基本都差不多,即运行时通过反射等方式拦截到打了注解的类或者方法,然后执行时进行横切拦截;另外这里还有一个点就是方法异步执行,所以对于 @Async 的剖析,就一定绕不开两个基本的知识点,就是代理和线程池。 在了解到这些之后,我们来拆解下 @Async 的基本原理。
科技新语
2022/12/06
1K0
你知道 @Async 是怎么让方法异步执行的吗?
强烈反对使用Spring封装的多线程类!
在很久很久之前,我有一段痛苦的记忆。那种被故障所驱使的感觉,在我脑海里久久无法驱散。
xjjdog
2022/04/06
3500
强烈反对使用Spring封装的多线程类!
异步编程 - 08 Spring框架中的异步执行_TaskExecutor接口和@Async应用篇
在Spring Framework中分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象。
小小工匠
2023/09/09
2.1K0
异步编程 - 08 Spring框架中的异步执行_TaskExecutor接口和@Async应用篇
关于Spring中的@Async注解以及为什么不建议使用 - Java技术债务
Async 注解是 Java 8 中的一个注解,用于标识一个方法是异步执行的。当一个方法被标记为 Async 时,该方法将在一个新的线程中执行,并且可以立即返回一个 CompletableFuture 对象。使用 CompletableFuture 可以更轻松地管理异步计算的结果。下面是一个使用 Async 注解的示例代码:
Java技术债务
2024/06/21
4720
Spring源码之Async注解
实现了 BeanFactoryAware 接口,初始化 AsyncAnnotationBeanPostProcessor 时会调用内部的**setBeanFactory() **方法设置切面
全栈程序员站长
2022/09/18
5260
Spring源码之Async注解
Spring中的多线程魔法:探索@Async注解的妙用
异步编程是一种编程模式,允许应用程序在执行某个操作的同时执行其他任务,而不必等待该操作完成。这提高了应用程序的性能和响应速度,特别是在需要执行长时间操作(例如网络请求或数据库查询)时。
一只牛博
2025/05/30
2630
线上问题-关于@Async
线程数统计:32278 个SimpleAsyncTaskExecutor,开了好多线程啊! 应该是线程太多
温安适
2022/01/10
5770
【小家Spring】Spring异步处理@Async的使用以及原理、源码分析(@EnableAsync)
在开发过程中,我们会遇到很多使用线程池的业务场景,例如异步短信通知、异步记录操作日志。大多数使用线程池的场景,就是会将一些可以进行异步操作的业务放在线程池中去完成。
YourBatman
2019/09/03
7.3K1
【小家Spring】Spring异步处理@Async的使用以及原理、源码分析(@EnableAsync)
新手也能看懂的 SpringBoot 异步编程指南
异步编程在处理耗时操作以及多任务处理的场景下非常有用,我们可以更好的让我们的系统利用好机器的 CPU 和 内存,提高它们的利用率。多线程设计模式有很多种,Future模式是多线程开发中非常常见的一种设计模式,本文也是基于这种模式来说明 SpringBoot 对于异步编程的知识。
Guide哥
2020/05/08
1.4K0
深入浅出Spring的@Async异步执行机制
在现代应用开发中,响应速度和吞吐量是衡量系统性能的关键指标。当面对耗时操作时,传统的同步执行方式会导致请求线程被阻塞,严重影响系统整体性能。Spring框架提供的异步执行机制正是为了解决这一痛点而生。
用户6320865
2025/08/27
1400
深入浅出Spring的@Async异步执行机制
Spring Boot启用异步线程
Spring中存在一个接口AsyncConfigurer接口,该接口就是用来配置异步线程池的接口,它有两个方法,getAsyncExecutor和getAsyncUncaughtExceptionHandler,第一个方法是获取一个线程池,第二个方法是用来处理异步线程中发生的异常。它的源码如下所示:
itlemon
2020/04/03
2.4K0
Spring 异步调用,一行代码实现!舒服,不接受任何反驳~
在日常开发中,我们的逻辑都是同步调用,顺序执行。在一些场景下,我们会希望异步调用,将和主线程关联度低的逻辑异步调用,以实现让主线程更快的执行完成,提升性能。例如说:记录用户访问日志到数据库,记录管理员操作日志到数据库中。
芋道源码
2020/05/25
6.1K0
Springboot使用线程池demo
创建一个线程池的配置,让Spring Boot加载,使用@Configuration和@EnableAsync这两个注解,表示这是线程池配置类
高大北
2022/06/14
7410
推荐阅读
相关推荐
Spring异步核心@Async注解的前世今生
更多 >
交个朋友
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入架构与运维趋势交流群
技术趋势前瞻 架构演进方向
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验