当前位置: 首页 > news >正文

01、Hive从入门到放弃,第一章:简单入门与安装

Hive从入门到放弃,第一章:简单入门与安装

一、概念

   Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,
并提供类SQL查询功能。

【作用:海量数据的分析和计算】

###为什么要有Hive
实现WordCount功能:
1、Hadoop需要写  Mapper Reduce  Driver
2、Hive只需要:SELECT COUNT(*) FROM XXX;

###Hive的本质:
Hive的本质就是一个Hadoop的客户端,用于将HQL转换成MapReduce程序。
> Hive中每张表的数据存储在HDFS
> Hive分析数据底层的实现是MapReduce(也可配置为Spark或者Tez)
> 执行程序运行在Yarn上

二、核心架构

> Metastore只提供元数据的访问接口,不负责存储。(只记录表结构和数据的存储路径)(默认derby数据库,推荐Mysql)

> HiveServer2提供ODBC/JDBC的接口+用户认证的功能。

在这里插入图片描述

> 元数据包括:数据库(默认是default)、表名、表的拥有者、列/分区字段、表的类型(是否是外部表)、
           表的数据所在(HDFS)目录等。

默认存储在自带的derby数据库中,由于derby数据库只支持单客户端访问,生产环境中为了多人开发,推荐使用MySQL存储Metastore。

> 使用HDFS进行存储,可以选择MapReduce/Tez/Spark进行计算。

三、Hive安装

> Hive官网地址
   http://hive.apache.org/

> 文档查看地址
https://cwiki.apache.org/confluence/display/Hive/GettingStarted

> 下载地址
http://archive.apache.org/dist/hive/

3.1、最小化安装

[注意:不适合生产环境,只适合测试]

> 解压:
tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/module/

> 修改名称:
cd /opt/module
mv apache-hive-3.1.3-bin/ hive-3.1.3

> 配置环境变量
vim /etc/profile.d/my_env.sh

#hive conf
export HIVE_HOME=/opt/module/hive-3.1.3
export PATH=$PATH:$HIVE_HOME/bin

> 刷新配置使其生效
source /etc/profile.d/my_env.sh

> 初始化元数据(默认使用Derby数据库)
bin/schematool -dbType derby -initSchema

【初始化好后,hive目录下会多出来一个metastore_db的文件夹,用来存放元数据】

在这里插入图片描述

【hive的日志默认存放在 /tmp/当前用户名/hive.log】

> 启动:
bin/hive
> 常用命令 同 mysql 一样,如:
show databases;
use default;
show tables;
create table stu(id int, name string);
insert into stu values(1,"ss");
select * from stu;

【如果create 语句没有指定HDFS的存放路径,默认会存放在/usr/hive/warehouse/下】

【注意:derby数据库的特点是同一时间只允许一个客户端访问。如果多个Hive客户端同时访问,就会报错。】

3.2、元数据存储到MySQL

> 先干掉 上面derby存储的元数据
rm -rf derby.log metastore_db
hadoop fs -rm -r /user

> 再MySQL中创建元数据存储库
create database metastore;

> 将MySQL的JDBC驱动拷贝到Hive的lib目录下
cp /opt/software/mysql-connector-java-5.1.37.jar $HIVE_HOME/lib

> 在$HIVE_HOME/conf目录下新建hive-site.xml文件
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- jdbc连接的URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://192.168.73.107:13306/metastore?useSSL=false</value>
    </property>
    
    <!-- jdbc连接的Driver-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    
	<!-- jdbc连接的username-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>

    <!-- jdbc连接的password -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>admin123</value>
    </property>

    <!-- Hive默认在HDFS的工作目录 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
</configuration>


> 初始化Hive元数据库(修改为采用MySQL存储元数据)
bin/schematool -dbType mysql -initSchema -verbose

> 验证
启动 hive
显示库  show databases;
显示表  show tables;
创建表  create table stu(id int, name string);
		insert into stu values(1,"ss");
		select * from stu;
其中
> DBS 表: MYSQL数据库的连接信息
> TBLS 表: HIVE中创建的表
> SDS 表: HIVE中创建表的 存储路径信息等(包括inputFormat和outputFormat)->HQL转MapReduce的时候用到
> COLUMNS_V2表: HIVE中创建表的表结构

3.3、Hive服务部署

3.3.1、hiveserver2服务部署
【注意:hiveserver2必须部署在能够直接访问到Hadoop集群的节点上】

##hiveserver2是干什么的

Hive的hiveserver2服务的作用是提供jdbc/odbc接口,为用户提供远程访问Hive数据的功能。
例如用户期望在个人电脑中访问远程服务中的Hive数据,就需要用到Hiveserver2。


可以理解为hiveserver2会将HQL语句转换成MapReduce程序代码,然后经由Hadoop执行,返回结果。
同时它还具有用户认证的功能。
##思考:

我们在远程访问Hive数据时,客户端并未直接访问Hadoop集群,而是由Hivesever2代理访问。由于Hadoop集群中的数据
具备访问权限控制,所以此时需考虑一个问题:那就是访问Hadoop集群的用户身份是谁?是Hiveserver2的启动用户?还是
客户端的登录用户?

答案是都有可能,具体是谁,由Hiveserver2的hive.server2.enable.doAs参数决定,该参数的含义是是否启用
Hiveserver2用户模拟的功能。若启用,则Hiveserver2会模拟成客户端的登录用户去访问Hadoop集群的数据,不启用,
则Hivesever2会直接使用启动用户访问Hadoop集群数据。

【模拟用户的功能,默认是开启的。】
【生产环境,推荐开启用户模拟功能,因为开启后才能保证各用户之间的权限隔离。】

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

##部署:
1、Hadoop端配置:

hivesever2的模拟用户功能,依赖于Hadoop提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟
其他用户的身份访问Hadoop集群。

因此,需要将hiveserver2的启动用户设置为Hadoop的代理用户。


core-site.xml

<!--配置所有节点的root用户都可作为代理用户-->
<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>

<!--配置root用户能够代理的用户组为任意组-->
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

<!--配置root用户能够代理的用户为任意用户-->
<property>
    <name>hadoop.proxyuser.root.users</name>
    <value>*</value>
</property>


2、Hive端配置

hive-site.xml

<!-- 指定hiveserver2连接的host -->
<property>
	<name>hive.server2.thrift.bind.host</name>
	<value>hadoop102</value>
</property>

<!-- 指定hiveserver2连接的端口号 -->
<property>
	<name>hive.server2.thrift.port</name>
	<value>10000</value>
</property>
##启动测试
1、多种方式启动:
 > bin/hiveserver2    (关闭当前进程之后 hiveserver2就关闭了)
 > nohup bin/hiveserver2 1>/dev/null  2>&1 &
   【0 标准输入  1 标准输出  2 标准错误】
 > bin/hive --service hiveserver2

【jps -ml 查看启动情况】

在这里插入图片描述

##命令行客户端
bin/beeline
> !connect jdbc:hive2://hadoop102:10000
> Enter username for jdbc:hive2://hadoop102:10000: lee
> Enter password for jdbc:hive2://hadoop102:10000: 空就好

在这里插入图片描述

在这里插入图片描述

3.3.2、metastore服务部署
Hive的metastore服务的作用是为Hive CLI或者Hiveserver2提供元数据访问接口。

(可以理解为 hiveserver2在编译HQL语句转为MapReduce的时候获取元数据和HDFS路径等信息)
(都是需要通过metastore读取MySQL获取的)

## 两种运行模式

> 嵌入式模式 :(不推荐)
    · 每个Hive CLI都需要直接连接元数据库,当Hive CLI较多时,数据库压力会比较大
    · 每个客户端都需要用户元数据库的读写权限,元数据库的安全得不到很好的保证

> 独立服务模式 (推荐)
    

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

##需求:我们要将metastore部署在 hadoop102上,将hiveserver2部署在 hadoop102和hadoop103上

> 102上已经有连接 MYSQL的配置了就不需要再额外配置了

> 启动 nohup hive --service metastore &

> 将 hive 复制到 Hadoop103
  scp -r /opt/module/hive-3.1.3  hadoop103:/opt/module
  删除 hive-site.xml 中 关于 MYSQL相关的配置
  只保留
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   
     <!-- 指定metastore服务的地址 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hadoop102:9083</value>
    </property>

    <!-- Hive默认在HDFS的工作目录 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>


    <!-- 指定hiveserver2连接的host -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>hadoop102</value>
    </property>

    <!-- 指定hiveserver2连接的端口号 -->
    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>

</configuration>

> 测试
hadoop103 直接启动hive就行
./hive
show databases;
show tables;
select * from stu;

>hadoop103开启 hiveserver2
nohup bin/hiveserver2 1>/dev/null 2>&1 &
然后 dbeaver连接hadoop103测试下
3.3.3、编写Hive服务启动脚本
在/opt/bin下创建hiveservices.sh

#!/bin/bash

HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
	mkdir -p $HIVE_LOG_DIR
fi

#检查进程是否运行正常,参数1为进程名,参数2为进程端口
function check_process()
{
    pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
    ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
    echo $pid
    [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}

function hive_start()
{
    metapid=$(check_process HiveMetastore 9083)
    cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
    [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
    server2pid=$(check_process HiveServer2 10000)
    cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
    [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}

function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
    [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
    server2pid=$(check_process HiveServer2 10000)
    [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}

case $1 in
"start")
    hive_start
    ;;
"stop")
    hive_stop
    ;;
"restart")
    hive_stop
    sleep 2
    hive_start
    ;;
"status")
    check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
    check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
    ;;
*)
    echo Invalid Args!
    echo 'Usage: '$(basename $0)' start|stop|restart|status'
    ;;
esac
##添加执行权限:
chmod +x hiveservices.sh

##命令
hiveservices.sh  stop 或 start 或 restart 或 status

3.4、Hive使用技巧

3.4.1、非交互式使用
如不需要看结果,就直接执行命令:

hive -e "insert into stu (2,'bb')"

如果 SQL语句非常复杂,可以把SQL写到一个文件里,然后执行
hive -f stuInsert.sql
3.4.2、参数配置方式
##1、修改配置文件的方式 (全局有效)
conf/hive-default.xml.template 模板配置文件里包含了几乎所有的配置信息,可以将使用到的配置  复制到 hive-site.xml中
【hive会默认加载hive-site.xml,不会默认加载hive-default.xml】

##2、命令行参数配置方式
如:启动Hive时,可以在命令行添加-hiveconf param=value来设定参数
bin/hive -hiveconf mapreduce.job.reduces=10;
【仅对本次Hive启动有效】

##3、参数声明方式

> set mapreduce.job.reduces=10;  //设置
> set mapreduce.job.reduces;  //查看
【仅对本次Hive启动有效】


优先级:参数声明方式 > 命令行参数配置方式 > 修改配置文件的方式
3.4.3、常用的配置
##显示当前库和表头
hive-site.xml

<!--select 的时候展示 字段名-->
<property>
    <name>hive.cli.print.header</name>
    <value>true</value>
    <description>Whether to print the names of the columns in query output.</description>
</property>

<!--select 的时候展示 库名-->
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
    <description>Whether to include the current database in the Hive prompt.</description>
</property>
##日志路径
Hive的log默认存放在/tmp/root/hive.log目录下(当前用户名下)

> $HIVE_HOME/conf/hive-log4j2.properties.template文件名称为 hive-log4j2.properties  (默认就会加载)

> 修改其内容
  property.hive.log.dir = /opt/module/hive-3.1.3/logs
##hive的堆内存设置

新版本的Hive启动的时候,默认申请的JVM堆内存大小为256M,JVM堆内存申请的太小,导致后期开启本地模式,执行复杂的SQL时经常会报错:
java.lang.OutOfMemoryError: Java heap space,因此最好提前调整一下HADOOP_HEAPSIZE这个参数。

>修改$HIVE_HOME/conf下的hive-env.sh.template为hive-env.sh (默认就会加载)

>修改其内容
 export HADOOP_HEAPSIZE=1024
##关闭Hadoop虚拟内存检查
> 在yarn-site.xml中关闭虚拟内存检查
> 添加内容如下:
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

相关文章:

  • 引入其他 YML 配置源 —— Spring Boot 中的 `import` 功能
  • Leetcode-146.LRU缓存
  • Oracle RAC环境下自动清理归档日志实战指南
  • vscode更新后: 适用于 Linux 的 Windows 子系统必须更新到最新版本才能继续。可通过运行 “wsl.exe --update” 进行更新
  • 【从零开始学习计算机科学】操作系统(九)大容量存储器
  • Fast DDS Security--仿问控制
  • 《OpenCV》—— dlib(换脸操作)
  • Figma桌面客户端安装与协作设计入门指南(附官方下载链接)
  • 《React 属性与状态江湖:从验证到表单受控的实战探险》
  • Apache Hudi 性能测试报告
  • MVCC的理解(Multi-Version Concurrency Control,多版本并发控制)
  • 蓝桥杯备考:排队顺序(链表)
  • Spring Boot 整合 Redis
  • Python数据分析之数据可视化
  • 数据结构——堆
  • 使用异或完成两个整数的交换
  • 如何使用 CSS 实现黑色遮罩效果
  • VMware安装Windows server 2016
  • 使用const声明常量】
  • 如何为项目选择合适的EMI滤波器——共模与差模干扰分析
  • 浙江美术馆馆长人民日报撰文:打开更辽阔的审美场域
  • 上市公司重大资产重组新规九要点:引入私募“反向挂钩”,压缩审核流程
  • 马上评|科学红毯,让科学家成为“最亮的星”
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 既是工具又是食物,可食用机器人开启舌尖上的新科技
  • 魔都眼|锦江乐园摩天轮“换代”开拆,新摩天轮暂定118米