Beeline的使用和Hive JDBC

目录

  • 1. 引言
    • 1.1 Hadoop
    • 1.2 HBase
    • 1.3 Hive
  • 2. Beeline
    • 2.1 使用Beeline访问Hive
      • 2.1.1 通过beeline直接连接Hive
      • 2.1.2 先进入beeline客户端再连接Hive
      • 2.1.3 先进入beeline客户端再连接MySQL
    • 2.2 Beeline命令
  • 3. Hive JDBC
    • 3.1 pom.xml中依赖配置
    • 3.2 Util工具类
    • 3.3 代码
    • 3.4 结果
  • 参考

1. 引言

  尽管Hadoop和HBase都提供了对应的启动和停止脚本,但是启动的过程都很繁琐。而Hive没有提供对应的启动和停止脚本,因此它的启动和停止比Hadoop和HBase更加困难。下面将展示如何把Hadoop、HBase和Hive配置成系统服务,然后通过service name start[/stop]进行启停。
  创建Hadoop、HBase、Hive服务脚本的命令:

cd /etc/init.d
touch hadoop hbase hive
chmod +x hadoop hbase hive

1.1 Hadoop

  用vim hadoop编辑hadoop,输入如下内容后,然后按ESC输入:wq!保存。

#!/bin/bash
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

LOG_FILE=/var/log/hadoop-service.log
RED='\033[0;31m'
NC='\033[0m'

case "$1" in
start)
    echo "$(date '+%Y-%m-%d %H:%M:%S') Starting Hadoop cluster..." >>$LOG_FILE
    if start-dfs.sh >>$LOG_FILE 2>&1; then
        if start-yarn.sh >>$LOG_FILE 2>&1; then
            echo "Cluster started successfully."
        else
            echo "${RED}YARN failed to start, Check $LOG_FILE.${NC}"
            exit 1
        fi
    else
        echo "${RED}HDFS failed to start, Check $LOG_FILE.${NC}"
        exit 1
    fi
    ;;
stop)
    echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping Hadoop cluster..." >>$LOG_FILE
    stop-yarn.sh >>$LOG_FILE 2>&1
    stop-dfs.sh >>$LOG_FILE 2>&1
    echo "Cluster stopped."
    ;;
*)
    echo "Usage: $0 {start|stop}."
    exit 1
    ;;
esac

exit 0

1.2 HBase

  用vim hbase编辑hbase,输入如下内容,然后按ESC输入:wq!保存。由于HBase依赖Hadoop,因此在HBase服务启动之前必须检查Hadoop是否启动,下面脚本中的check_dependencies函数实现了检查Hadoop是否启动的功能。
  (下面的Hive同样依赖于Hadoop,同样需要该函数)

#!/bin/bash
LOG_FILE=/var/log/hbase-service.log
RED='\033[0;31m'
NC='\033[0m'

check_dependencies() {
        if ! hdfs dfsadmin -report &>/dev/null; then
                echo -e "${RED}Error: HDFS didn't run!${NC}"
                return 1
        fi

        if ! yarn node -list &>/dev/null; then
                echo -e "${RED}Error: YARN didn't run!${NC}"
                return 1
        fi
}

case "$1" in
start)
        if ! check_dependencies; then
                exit 1
        fi

        echo "$(date '+%Y-%m-%d %H:%M:%S') Starting HBase cluster..." >>$LOG_FILE
        if start-hbase.sh >>$LOG_FILE 2>&1; then
                echo "HBase started successfully."
        else
                echo "${RED}HBase failed to start, Check $LOG_FILE.${NC}"
                exit 1
        fi
        ;;
stop)
        echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping HBase cluster..." >>$LOG_FILE
        stop-hbase.sh >>$LOG_FILE 2>&1
        echo "HBase stopped."
        ;;
*)
        echo "Usage: $0 {start|stop}."
        exit 1
        ;;
esac

exit 0

1.3 Hive

  由于Hive没有官方提供的启动和停止脚本,因此Hive服务脚本比上面两个更加复杂。因为在使用Beeline访问Hive之前,必须启动MetaStore和HiveServer2。官方提供的启动方法是:

nohup hive --service metastore &
nohup hive --service hiveserver2 &

接着通过运行jps命令,就会发现多了两个RunJar进程——它们就是MetaStore和Hiveserver2。而停止的方法是通过jps命令查看这两个进程的pid——即jps命令显示出的第一列中的数据,然后通过kill -9 pid1 pid2(pid1,pid2代指这两个RunJar的pid)。因此Hive的启动与停止非常繁琐。
  用vim hive编辑hive,输入如下内容,然后按ESC输入:wq!保存。下面的check_dependencies函数实现了检查Hadoop是否启动的功能,start_metastore函数实现了MetaStore服务的启动,start_hiveserver2实现了HiveServer2服务的启动,stop_process实现了这两个服务的停止,脚本中停止这两个服务的具体调用命令是:

stop_process "MetaStore" "metastore"
stop_process "HiveServer2" "hiveserver2"

此外,在start_metastore和start_hiveserver2中通过nc命令来检查MetaStore和HiveServer2的指定端口是否开放,以达到判断这两个服务是否启动的目的。并且由于端口开放可能存在延迟的原因,在这两个函数设置RETRY_TIMES来进行多次判断。

#!/bin/bash
LOG_DIR=/var/log/hive
if [ ! -d $LOG_DIR ]; then
        mkdir -p $LOG_DIR
fi

HOST=$(hostname -I)
START_LOG=$LOG_DIR/hive-start.log
STOP_LOG=$LOG_DIR/hive-stop.log
METASTORE_PORT=9083
HIVESERVER2_PORT=10000
RETRY_TIMES=3

RED='\033[0;31m'
NC='\033[0m'

check_dependencies() {
        if ! nc --version &>/dev/null; then
                echo -e "${RED}Please use apt to install ncat!${NC}"
                return 1
        fi

        if ! pgrep --version &>/dev/null; then
                echo -e "${RED}Please use apt to install procps-ng!${NC}"
                return 1
        fi

        if ! hdfs dfsadmin -report &>/dev/null; then
                echo -e "${RED}Error: HDFS didn't run!${NC}"
                return 1
        fi

        if ! yarn node -list &>/dev/null; then
                echo -e "${RED}Error: YARN didn't run!${NC}"
                return 1
        fi
}

start_metastore() {
        local retry=0

        echo "$(date '+%Y-%m-%d %H:%M:%S') Starting metastore service..." >>$START_LOG
        nohup hive --service metastore -p $METASTORE_PORT >>$START_LOG 2>&1 &
        while [ $retry -lt $RETRY_TIMES ]; do
                sleep 5
                if nc -z $HOST $METASTORE_PORT; then
                        return 0
                fi
                ((retry++))
        done

        if [ $retry -eq $RETRY_TIMES ]; then
                echo -e "${RED}MetaStore failed to start, Check $START_LOG.${NC}"
                return 1
        fi
}

start_hiveserver2() {
        local retry=0

        echo "$(date '+%Y-%m-%d %H:%M:%S') Starting hiveserver2 service...)" >>$START_LOG
        nohup hive --service hiveserver2 >>$START_LOG 2>&1 &
        while [ $retry -le $RETRY_TIMES ]; do
                sleep 5
                if nc -z $HOST $HIVESERVER2_PORT; then
                        return 0
                fi
                ((retry++))
        done

        if [ $retry -eq $RETRY_TIMES ]; then
                echo -e "${RED}HiveServer2 failed to start, Check $START_LOG.${NC}"
                return 1
        fi
}

stop_process() {
        local name=$1
        local pattern=$2
        local pid
        pid=$(pgrep -f "$pattern")

        if [[ -n $pid ]]; then
                echo "Stopping $name..." >>$STOP_LOG
                kill $pid
                sleep 10
                if pgrep -f "$pattern" &>/dev/null; then
                        kill -9 $pid
                fi
        fi
}

case "$1" in
start)
        echo "$(date '+%Y-%m-%d %H:%M:%S') Starting Hive Cluster..." >>$START_LOG
        if ! check_dependencies; then
                exit 1
        fi

        if ! start_metastore; then
                exit 1
        fi

        if ! start_hiveserver2; then
                exit 1
        fi

        echo -e "Hive started successfully."
        ;;
stop)
        echo "$(date '+%Y-%m-%d %H:%M:%S') Stopping Hive Cluster..." >>$STOP_LOG
        stop_process "MetaStore" "metastore"
        stop_process "HiveServer2" "hiveserver2"
        echo "Hive stopped."
        ;;
*)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit 0

2. Beeline

  Beeline是Hive目前的客户端,可以通过JDBC连接远程服务。

2.1 使用Beeline访问Hive

  首先必须启动MetaStore服务和HiveServer2服务,如果你在/etc/init.d中配置了上面提到的Hadoop、HBase、Hive服务的话,就可以通过service hadoop start && service hive start来启动MetaStore服务和HiveServer2服务。
在这里插入图片描述

2.1.1 通过beeline直接连接Hive

  beeline -u 'jdbc:hive2://172.18.0.2:10000' -n root,退出的话需要输入beeline命令!exit
在这里插入图片描述

2.1.2 先进入beeline客户端再连接Hive

  先输入hive进入beeline客户端,然后输入!connect 'jdbc:hive2://172.18.0.2:10000,接着输入对应的用户名root和密码123456,最后同样通过!exit退出。
在这里插入图片描述

2.1.3 先进入beeline客户端再连接MySQL

  输入!connect 'jdbc:mysql://172.18.0.3:3306',然后输入用户名root和密码123456,最后用!close结束连接。
在这里插入图片描述

2.2 Beeline命令

在这里插入图片描述
在这里插入图片描述

3. Hive JDBC

3.1 pom.xml中依赖配置

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-service</artifactId>
      <version>4.0.1</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-slf4j-impl</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>4.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client-runtime</artifactId>
      <version>3.3.6</version>
    </dependency>
  </dependencies>

3.2 Util工具类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Util {
    public static Connection getConnection(String driverName, String url, String user, String password) throws ClassNotFoundException, SQLException {
        Class.forName(driverName);
        Connection conn = DriverManager.getConnection(url, user, password);
        return conn;
    }

    public static Statement getStatement(Connection conn) throws SQLException {
        return conn.createStatement();
    }

    public static void closeStatement(Statement stmt) throws SQLException {
        stmt.close();
    }

    public static void closeConnection(Connection conn) throws SQLException {
        conn.close();
    }
}

3.3 代码

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class App {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection conn = Util.getConnection("org.apache.hive.jdbc.HiveDriver", "jdbc:hive2://172.18.0.2:10000", "root",
                "123456");
        Statement stmt = Util.getStatement(conn);
        stmt.execute("drop table if exists users");
        stmt.execute(
                "create table users (user_id int, fname string, lname string) row format delimited fields terminated by ','");
        stmt.execute("insert into users (user_id, fname, lname) values(222, 'yang', 'yang2')");
        stmt.execute("load data local inpath '/root/CodeProject/hive-advance/data.txt' into table users");

        String sql = "select * from users";
        ResultSet res = stmt.executeQuery(sql);
        ResultSetMetaData meta = res.getMetaData();
        for (int i = 1; i <= meta.getColumnCount(); i++) {
            System.out.print(meta.getColumnName(i) + "\t");
        }
        System.out.println();

        while (res.next()) {
            System.out.print(res.getInt(1) + "\t\t");
            System.out.print(res.getString(2) + "\t\t");
            System.out.print(res.getString(3));
            System.out.println();
        }

        sql = "show tables";
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.print(res.getString(1));
        }
        System.out.println("");

        sql = "desc users";
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1) + "\t" + res.getString(2));
        }

        Util.closeStatement(stmt);
        Util.closeConnection(conn);
    }
}

3.4 结果

在这里插入图片描述

参考

吴章勇 杨强著 大数据Hadoop3.X分布式处理实战
https://stackoverflow.com/questions/60943753/new-hiveconf-exception-noclassdeffounderror-com-ctc-wstx-io-inputbootstrapper通过添加hadoop-client-runtime依赖解决了这个问题。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982014.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式多卡训练(DDP)踩坑

多卡训练最近在跑yolov10版本的RT-DETR&#xff0c;用来进行目标检测。 单卡训练语句&#xff08;正常运行&#xff09;&#xff1a; python main.py多卡训练语句&#xff1a; 需要通过torch.distributed.launch来启动&#xff0c;一般是单节点&#xff0c;其中CUDA_VISIBLE…

30秒从零搭建机器人管理系统(Trae)

1. 安装 [Trae官网】(https://www.trae.com.cn/) 2. 提示词 创建一个BS架构的机器人远程操控系统&#xff0c;具备机器人状态及位置实时更新&#xff0c;可以实现机器人远程遥控&#xff0c;可以对机器人工作日志进行统计分析&#xff0c;以及其它管理系统的常用功能3. 模型…

软考-数据库开发工程师-3.1-数据结构-线性结构

第3章内容比较多&#xff0c;内容考试分数占比较大&#xff0c;6分左右 线性表 1、线性表的定义 一个线性表是n个元素的有限序列(n≥0)&#xff0c;通常表示为(a1&#xff0c;a2, a3,…an). 2、线性表的顺序存储(顺序表) 是指用一组地址连续的存储单元依次存储线性表中的数据元…

解锁数据潜能,永洪科技以数据之力简化中粮可口可乐决策之路

企业数字化转型是指企业利用数字技术和信息通信技术来改变自身的商业模式、流程和增值服务&#xff0c;以提高企业的竞争力和创新能力。数字化转型已经成为企业发展的重要战略&#xff0c;尤其在当前信息技术高速发展的时代。数字化转型还涉及到企业与消费者之间的互动和沟通。…

Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践

本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器&#xff0c;实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor&#xff1f; 作为国内流行的开源富文本编辑器&#xff0c;WangEditor 具有以下优势&#xff1a; 轻量高效&#xff1a;压缩后仅…

游戏引擎学习第137天

演示资产系统中的一个 bug 我们留下了个问题&#xff0c;你现在可以看到&#xff0c;移动时它没有选择正确的资产。我们知道问题的原因&#xff0c;就在之前我就预见到这个问题会出现。问题是我们的标签系统没有处理周期性边界的匹配问题。当处理像角度这种周期性的标签时&…

监听 RabbitMQ 延时交换机的消息数、OpenFeign 路径参数传入斜杠无法正确转义

背景 【MQ】一套为海量消息和高并发热点消息&#xff0c;提供高可用精准延时服务的解决方案 我现在有一个需求&#xff0c;就是监听 RabbitMQ 一个延时交换机的消息数&#xff0c;而 RabbitTemplate 是不存在对应的方法来获取的。 而我们在 RabbitMQ 的控制台却可以发现延时交…

大数据学习(56)-Impala

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

开发环境搭建-01.前端环境搭建

一.整体结构 Nginx目录必须放在没有中文的目录中才能正常运行&#xff01;&#xff01;&#xff01;

Redis 常见数据类型

官方文档 RedisCommands 1&#xff09;Redis 的命令有上百个&#xff0c;如果纯靠死记硬背比较困难&#xff0c;但是如果理解 Redis 的一些机制&#xff0c;会发现这些命令有很强的通用性。 2&#xff09;Redis 不是万金油&#xff0c;有些数据结构和命令必须在特定场景下使用…

Redis7——进阶篇(三)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

云原生时代的技术桥梁

在数字化转型的大潮中&#xff0c;企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享&#xff0c;也影响了企业对外部市场变化的响应速度。当前&#xff0c;这一转型过程从IT角度来看&#xff0c;已然迈入云原生时…

ICLR 2025|香港浸会大学可信机器学习和推理课题组专场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; AITIME 01 ICLR 2025预讲会团队专场 AITIME 02 专场信息 01 Noisy Test-Time Adaptation in Vision-Language Models 讲者&#xff1a;曹晨涛&#xff0c;HKBU TMLR Group一年级博士生&#xff0c;目前关注基础…

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…

016.3月夏令营:数理类

016.3月夏令营&#xff1a;数理类&#xff1a; 中国人民大学统计学院&#xff1a; http://www.eeban.com/forum.php?modviewthread&tid386109 北京大学化学学院第一轮&#xff1a; http://www.eeban.com/forum.php?m ... 6026&extrapage%3D1 香港大学化学系夏令营&a…

使用IDEA如何隐藏文件或文件夹

选择file -> settings 选择Editor -> File Types ->Ignored Files and Folders (忽略文件和目录) 点击号就可以指定想要隐藏的文件或文件夹

通过微步API接口对单个IP进行查询

import requests import json# 微步API的URL和你的API密钥 API_URL "https://api.threatbook.cn/v3/ip/query" API_KEY "***" # 替换为你的微步API密钥 def query_threatbook(ip):"""查询微步API接口&#xff0c;判断IP是否为可疑"…

第七节:基于Winform框架的串口助手小项目---协议解析《C#编程》

介绍 目标 代码实现 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){if (isRxShow false) return;// 1,需要读取有效的数据 BytesToReadbyte[] dataTemp new byte[serialPort1.BytesToRead];serialPort1.Read(dataTemp,0,dataTemp.Le…

关于tresos Studio(EB)的MCAL配置之GPT

概念 GPT&#xff0c;全称General Purpose Timer&#xff0c;就是个通用定时器&#xff0c;取的名字奇怪了点。定时器是一定要的&#xff0c;要么提供给BSW去使用&#xff0c;要么提供给OS去使用。 配置 General GptDeinitApi控制接口Gpt_DeInit是否启用 GptEnableDisable…

C语言基础要素(011):增量、减量运算

让变量自身加一或减一是一种常用的运算&#xff0c;C语言提供了增量与减量运算符支持这些操作。 增量运算() 让变量自身加1&#xff0c;可以这样实现&#xff1a; int size 3; size size 1; // 语句执行后 size 值为 4 size 1; // 语句执行后 size 值为 5使…