Day7 —— 大数据技术之Hive

Hive的概述

什么是Hive?

Hive 是一个基于 Hadoop 的数据仓库工具,用于处理大规模数据集。它提供了类似于 SQL 的查询语言 HiveQL,允许用户在 Hadoop 分布式存储中执行查询和分析数据。
Hive的本质就是将HiveQL语句转换为MapReduce任务后运行,非常适合做数据仓库的数据分析。

使用Hive的原因

  • Hive 使用类SQL 查询语法, 最大限度的实现了和SQL标准的兼容,大大降低了传统数据分析人员处理大数据的难度
  • 以MR 作为计算引擎(也可选择Spark计算引擎)、HDFS 作为存储系统,为超大数据集设计的计算/ 扩展能力

Hive架构

Hive架构中主要包括客户端(Client)、Hive Server、元数据存储(MetaStore)、驱动器(Driver)

在这里插入图片描述

Hive Client:

Hive 客户端是用户与 Hive 交互的接口,用户可以通过 Hive 客户端(如命令行界面、Hue 等)提交 HiveQL 查询和管理 Hive 表结构等操作。

Hive Driver:

Hive Driver 接收用户提交的 HiveQL 查询,并负责编译、优化和执行查询计划。它将查询转换为 MapReduce 作业或 Tez 任务,并与相应的执行引擎进行交互。

Hive Metastore:

Hive Metastore 存储了 Hive 表的元数据信息,包括表结构、分区信息、表位置等。这些元数据通常存储在关系型数据库中(如MySQL),Hive 客户端和服务通过 Metastore 访问和管理表的元数据。

Hive安装

先安装MySQL(以在线安装方式为例)

下载mysql的repo源

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

安装mysql-community-release-el7-5.noarch.rpm包

rpm -ivh mysql-community-release-el7-5.noarch.rpm

查看下载的文件

ls -1 /etc/yum.repos.d/mysql-community*

安装MySQL

yum install mysql-server

启动MySQL服务

systemctl start mysql.service

使用MySQL

mysql -uroot -p

密码直接回车就进入了,若想设置密码,则

set password for 用户名@localhost = password(‘新密码’);

退出mysql 下次登录就是新密码了

exit;

再安装Hive

解压apache-hive-3.1.3-bin.tar.gz到指定目录,例如:

tar -xzvf apache-hive-3.1.3-bin.tar.gz -C /export/servers

配置环境变量(在全局配置文件/etc/profile)

export HIVE_HOME=/export/servers/apache-hive-3.1.3-bin
export HIVE_CONF_DIR=/export/servers/apache-hive-3.1.3-bin/conf
export PATH=$ PATH:$ HIVE_HOME/bin

使配置生效

source /etc/profile

Hive配置文件修改

在hive根目录的conf目录,创建一个hive-site.xml文件,并添加如下内容:

<?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>
    <!-- 数据库 start -->
    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://localhost:3306/hive_meta?useSSL=false</value>
      <description>mysql连接</description>
    </property>

    <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>com.mysql.jdbc.Driver</value>
      <description>mysql驱动</description>
    </property>

    <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>root</value>
      <description>数据库使用用户名</description>
    </property>

    <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>123456</value>
      <description>数据库密码</description>
    </property>
    <!-- 数据库 end -->

    <property> 
      <name>hive.metastore.warehouse.dir</name>
      <value>/hive/warehouse</value>
      <description>hive使用的HDFS目录</description>
    </property>

    <property> 
      <name>hive.cli.print.current.db</name>
      <value>true</value>
    </property>
    <property>
      <name>hive.support.concurrency</name>
      <value>true</value>
      <description>开启Hive的并发模式</description>
    </property>
    <property>
      <name>hive.txn.manager</name>
      <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
      <description>用于并发控制的锁管理器类</description>
    </property>
    <property>
      <name>hive.server2.thrift.bind.host</name>
      <value>my2308-host</value>
      <description>hive开启的thriftServer地址</description>
    </property>

    <property>
      <name>hive.server2.thrift.port</name>
      <value>10000</value>
      <description>hive开启的thriftServer端口</description>
    </property>

    <property>
      <name>hive.server2.enable.doAs</name>
      <value>true</value>
    </property>
    <!-- 其它 end -->
</configuration>

修改$HADOOP_HOME/etc/hadoop/core-site.xml 开启hadoop代理功能

<property>
       <name>hadoop.proxyuser.root.groups</name>
       <value>*</value>
       <description>配置超级用户允许通过代理用户所属组</description>
   </property>
   <property>
       <name>hadoop.proxyuser.root.hosts</name>
       <value>*</value>
       <description>配置超级用户允许通过代理访问的主机节点</description>
   </property>
   <property>
       <name>hadoop.proxyuser.root.users</name>
       <value>*</value>
   </property>

拷贝hive-env.sh.template模版配置文件为hive-env.sh

cp hive-env.sh.template hive-env.sh

在hive-env.sh文件中添加Hadoop目录位置

HADOOP_HOME=/export/servers/hadoop-3.2.0

对日志文件改名

mv hive-log4j2.properties.template hive-log4j2.properties

在MySQL中创建hive用的元数据库hive_meta

create database hive_meta default charset utf8 collate utf8_general_ci;

拷贝mysql驱动jar 到/export/servers/apache-hive-3.1.3-bin/lib

cp mysql-connector-java-5.1.40-bin.jar /export/servers/apache-hive-3.1.3-bin/lib

删除冲突的log4j(log4j-slf4j-impl-2.4.1.jar)

rm -f /export/servers/apache-hive-3.1.3-bin/lib/log4j-slf4j-impl-2.4.1.jar

hive初始化mysql

schematool -dbType mysql -initSchema

启动Hive

以命令行方式启动(在$HIVE_HOME/bin目录下)

hive

以JDBC连接启动(beeline方式连接)

先启动hiveserver2服务(在$HIVE_HOME/bin目录下)

方式一:前台启动启动hiveserver2服务:
hiveserver2

方式二:后台启动hiveserver2服务:
nohup hiveserver2 > /dev/null 2>&1 &

第一种:在hive的bin目录中执行:beeline
然后:!connect jdbc:hive2://localhost:10000
输入操作hadoop集群的用户名和密码(本次以root用户名,123456为密码)

第二种:beeline -u jdbc:hive2://localhost:10000 -n root

Hive基本操作

Hive数据库操作

  • 创建数据库
    CREATE DATABASE [IF NOT EXISTS] database_name
    [COMMENT database_comment]
    [LOCATION hdfs_path]
    [WITH DBPROPERTIES (property_name=property_value, …)];

其中:WITH DBPROPERTIES ,用来指定数据属性数据。

–创建带有属性的数据库
create database testdb WITH DBPROPERTIES (‘creator’ = ‘tp’,‘date’=‘2024-06-12’);
– 显示创建语句
show create database testdb;
– 显示所有数据库
show databases;

  • 删除数据库

RESTRICT:严格模式,若数据库不为空,则会删除失败,默认为该模式。
CASCADE:级联模式,若数据库不为空,则会将库中的表一并删除。

Hive表操作

  • 建表语法

– EXTERNAL 代表外部表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
– 分区表设置 分区的字段和类型
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
– 桶表设置 按照什么字段进行分桶
[CLUSTERED BY (col_name, col_name, …)
– 桶内的文件 是按照 什么字段排序 分多少个桶
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
– 分隔符 + 序列化反序列化
[ROW FORMAT row_format]
– 输入输出格式
[STORED AS file_format]
– 表所对应的hdfs目录
[LOCATION hdfs_path]

  • 表分类

内部表

内部表又称受控表,当删除内部表的时候,存储在文件系统上的数据(例如HDFS上的数据)和元数据都会被删除。先有内部表,再向表中插入数据。
–创建inner_test表(内部表)
CREATE TABLE inner_test(word string, num int);

删除内部表,表对应的hdfs目录也一并删除
– 创建emp职工表(内部表)
CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;

外部表

创建外部表需要使用EXTERNAL关键字,当删除外部表的时候,只删除元
数据,不删除数据。
使用场景,例如:某个公司的原始日志数据存放在一个目录中,多个部门对原始数据进行分析,那么创建外部表就是比较好的选择了,因为即使删除了外部表,原始数据并不会被删除。

分区表

分区表是为了防止暴力扫描全表,提高查询效率。分区字段在源文件中是不存在的,需要在添加数据的时候手动指定。
每一个分区对应一个目录。通过partitioned by来在创建分区表的时候添加分区字段。分区表可以是内部表,也可以是外部表。
使用场景:可以通过分区表,将每天搜集的数据进行区分,查询统计的时候通过指定分区,提高查询效率。

导入数据到表中

追加Linux本地文件里的数据到emp表

load data local inpath ‘/root/data/emp.txt’ into table emp;

overwrite覆盖操作,使用Linux本地文件里的数据覆盖掉原来emp表的数据

load data local inpath ‘/root/data/emp.txt’ overwrite into table emp;

将hdfs上某文件里的数据追加到emp表(此操作完毕后,hdfs上的该文件就自动删除)

load data inpath ‘hdfs://my2308-host:9000/data/emp.txt’ into table emp;

overwrite覆盖操作,使用hdfs上某文件里的数据覆盖掉emp表的数据(此操作完毕后,hdfs上的该文件就自动删除)

load data inpath ‘hdfs://my2308-host:9000/data/emp.txt’ overwrite into table emp;

Hive应用简单示例:WorldCount

创建一个data目录准备worldcount计算的文件data1.txt、data2.txt

[root@BigData01 ~]# mkdir data
[root@BigData01 ~]# cd data
[root@BigData01 data]# vim data1.txt
hello world
hello hadoop
hello java
[root@BigData01 data]# vim data2.txt
welcome to hadoop
hello java hadoop

进入hive环境,编写HiveQL语句实现WordCount算法

[root@BigData01 data]# hive
hive> create database if not exists testdb;
hive> use testdb;
hive> create table if not exists docs(line string);
hive> load data local inpath ‘/root/data/’ overwrite into table docs;
hive> create table wordcount as
select word,count(1) as count from
(select explode(split(line,’ ')) as word from docs) w
group by word
order by word;

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值