百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Apache Hive入门

bigegpt 2024-08-26 11:15 3 浏览

简介

Apache Hive 是一个基于 Hadoop 的数据仓库工具,它提供了一种类似于 SQL 的查询语言(HiveQL),使用户能够在大规模分布式存储和计算框架上进行复杂的数据分析。

主要特点

  1. SQL-Like 查询语言: Hive 使用类似于 SQL 的查询语言(HiveQL),这使得用户无需学习新的语法就能够进行数据查询和分析。
  2. 分布式存储和计算: Hive建立在Hadoop生态系统之上,利用Hadoop的HDFS(分布式文件系统)和MapReduce(分布式计算模型)来处理大规模数据。
  3. Schema on Read: 与传统的关系型数据库不同,Hive 使用"Schema on Read"的模型,这意味着数据在存储时不需要预定义的模式,而是在读取时根据用户的查询动态解析。
  4. 支持分区表: Hive 支持分区表,可以根据表中的某个列将数据分隔成不同的子目录,提高查询性能。
  5. 用户自定义函数(UDF): Hive 允许用户编写自定义函数(User Defined Functions),这样用户可以根据自己的需求扩展 Hive 的功能。
  6. 元数据存储: Hive 使用元数据存储来记录表结构、分区信息等,这使得它能够对数据进行元数据管理。
  7. 优化器: Hive 包含一个查询优化器,它可以优化用户的查询计划以提高查询性能。
  8. 可扩展性: Hive 是一个可扩展的框架,可以通过添加新的存储插件(如 HBase、Apache Cassandra)和执行引擎(如 Apache Tez)来扩展其功能。

架构组成

  1. Hive CLI(Command Line Interface): 提供了一个命令行界面,允许用户通过命令行输入 HiveQL 查询。
  2. Hive Metastore: 存储 Hive 的元数据信息,包括表结构、分区信息等。默认情况下,元数据存储在关系型数据库中(如 MySQL)。
  3. Hive Server: 提供了 Thrift 和 JDBC 接口,允许远程客户端连接到 Hive 并执行查询。
  4. Hive Query Processor: 包括查询编译器和执行引擎,负责将 HiveQL 查询转换为 MapReduce 任务或其他执行引擎的任务。
  5. Hadoop Distributed File System (HDFS): 作为底层存储系统,存储 Hive 表的数据。
  6. MapReduce: 在较早的版本中,Hive 使用 MapReduce 作为执行引擎,但随着发展,它也支持其他执行引擎,如 Apache Tez。

HiveQL

-- 创建表
CREATE TABLE employees (
  id INT,
  name STRING,
  salary FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','; 

-- 加载数据
LOAD DATA LOCAL INPATH '/path/to/employees.csv' INTO TABLE employees;

-- 查询数据
SELECT name, AVG(salary) FROM employees GROUP BY name;

上述 HiveQL 查询演示了创建表、加载数据以及执行聚合查询的基本语法。

nodejs连接hive

以下是个简单的查询工具实例,涉及到了http和websocket两种连接方式,由于hive的慢查询性质,需要维护连接池,建议使用异步连接,并且使用模板过滤掉不友好的输入

npm install express body-parser node-thrift-hive ws generic-pool
<!-- frontend/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hive Query</title>
</head>
<body>
  <textarea id="queryInput" rows="5" cols="50"></textarea>
  <button onclick="executeQuery()">Execute Query</button>
  <div id="queryResult"></div>

  <script>
    const socket = new WebSocket('ws://localhost:3000');

    function executeQuery() {
      const queryInput = document.getElementById('queryInput');
      const query = queryInput.value;

      // 发送查询到服务器
      socket.send(JSON.stringify({ query }));
    }

    socket.onmessage = function(event) {
      // 处理从服务器接收到的查询结果
      const queryResult = document.getElementById('queryResult');
      queryResult.innerText = `Query Result: ${event.data}`;
    };
  </script>
</body>
</html>
// backend/server.js
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const bodyParser = require('body-parser');
const thrift = require('thrift');
const Hive = require('node-thrift-hive');
const genericPool = require('generic-pool');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

// 创建 Hive 连接池
const hivePool = genericPool.createPool({
  create: function () {
    return new Promise((resolve, reject) => {
      const connection = thrift.createConnection('localhost', 10000, {
        transport: thrift.TBufferedTransport,
        protocol: thrift.TBinaryProtocol,
      });

      const client = thrift.createClient(Hive, connection);

      connection.on('connect', function () {
        console.log('Connected to Hive');
        resolve({ connection, client });
      });

      connection.on('error', function (err) {
        console.error('Error connecting to Hive:', err);
        reject(err);
      });
    });
  },
  destroy: function (resource) {
    resource.connection.end();
  },
}, {
  max: 10, // 最大连接数
  min: 2,  // 最小连接数
});

// 处理静态文件
app.use(express.static('frontend'));
app.use(bodyParser.json());

// 处理 HTTP 请求
app.post('/executeQuery', async (req, res) => {
  const query = req.body.query;

  if (!query) {
    return res.status(400).json({ error: 'Query is required' });
  }

  let connection;
  try {
    // 从连接池中获取连接
    connection = await hivePool.acquire();
    
    // 执行 Hive 查询
    connection.client.execute(query, function (err, response) {
      if (err) {
        console.error('Error executing Hive query:', err);
        res.status(500).json({ error: 'Error executing Hive query' });
      } else {
        console.log('Hive query result:', response);
        res.json({ result: response });
      }
    });
  } catch (err) {
    console.error('Error acquiring Hive connection:', err);
    res.status(500).json({ error: 'Error acquiring Hive connection' });
  } finally {
    // 将连接释放回连接池
    if (connection) {
      hivePool.release(connection);
    }
  }
});

// 处理 WebSocket 连接
wss.on('connection', (ws) => {
  console.log('WebSocket connection established');

  ws.on('message', (message) => {
    const { query } = JSON.parse(message);

    // 在这里可以执行一些逻辑,然后将查询结果通过 WebSocket 推送给前端
    ws.send(`Query Result: ${query}`);
  });
});

// 启动服务器
const PORT = 3000;
server.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});
const express = require('express');
const bodyParser = require('body-parser');
const thrift = require('thrift');
const Hive = require('node-thrift-hive');
const genericPool = require('generic-pool');

const app = express();
const port = 3000;

const pool = genericPool.createPool({
  create: function () {
    return new Promise((resolve, reject) => {
      const connection = thrift.createConnection('localhost', 10000, {
        transport: thrift.TBufferedTransport,
        protocol: thrift.TBinaryProtocol,
      });

      const client = thrift.createClient(Hive, connection);

      connection.on('connect', function () {
        console.log('Connected to Hive');
        resolve({ connection, client });
      });

      connection.on('error', function (err) {
        console.error('Error connecting to Hive:', err);
        reject(err);
      });
    });
  },
  destroy: function (resource) {
    resource.connection.end();
  },
}, {
  max: 10, // 最大连接数
  min: 2,  // 最小连接数
});

app.use(bodyParser.json());

// 提供查询的HTTP接口
app.post('/executeQuery', async (req, res) => {
  const query = req.body.query;

  if (!query) {
    return res.status(400).json({ error: 'Query is required' });
  }

  let connection;
  try {
    // 从连接池中获取连接
    connection = await pool.acquire();
    
    // 执行Hive查询
    connection.client.execute(query, function (err, response) {
      if (err) {
        console.error('Error executing Hive query:', err);
        res.status(500).json({ error: 'Error executing Hive query' });
      } else {
        console.log('Hive query result:', response);
        res.json({ result: response });
      }
    });
  } catch (err) {
    console.error('Error acquiring Hive connection:', err);
    res.status(500).json({ error: 'Error acquiring Hive connection' });
  } finally {
    // 将连接释放回连接池
    if (connection) {
      pool.release(connection);
    }
  }
});

// 启动服务器
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...