Hive基础入门篇

Hive基础入门篇 第1章 Hive 概述与核心概念1.1 什么是 HiveHive是由 Facebook 开源用于解决海量结构化日志数据统计工具。它是基于 Hadoop 的数据仓库工具可以将结构化的数据文件映射为一张表并提供类 SQL 查询功能HQLHive Query Language。核心本质Hive 将 HQL 转化为 MapReduce 程序。用 Hive 能解决的问题MR 一定能解决但用 MR 能解决的问题Hive 不一定能解决。Hive 三大核心依赖存储数据存储在 HDFS 上计算分析数据底层实现是 MapReduce资源调度执行程序运行在 Yarn 上1.2 Hive 的优缺点✅ 优点优点说明类 SQL 语法提供快速开发能力简单容易上手避免写 MapReduce减少开发人员学习成本适合数据分析执行延迟较高适合对实时性要求不高的场合处理大数据优势对于小数据没有优势因为启动开销大支持 UDF用户可根据需求自定义函数❌ 缺点1) HQL 表达能力有限迭代式算法无法表达数据挖掘方面不擅长由于 MapReduce 数据处理流程限制效率更高的算法无法实现2) 效率比较低Hive 自动生成的 MapReduce 作业通常不够智能化Hive 调优比较困难粒度较粗1.3 Hive 与数据库的比较虽然 Hive 采用了类似 SQL 的查询语言 HQL但从结构上看Hive 和数据库除了拥有类似的查询语言再无类似之处。对比维度Hive传统数据库应用场景数据仓库读多写少Online 在线应用数据更新不建议改写加载时确定支持 INSERT/UPDATE/DELETE执行延迟高无索引MR框架低数据规模小时数据规模建立在集群上支持大规模数据支持数据规模较小索引无有第2章 Hive 架构原理2.1 整体架构图2.2 核心组件详解1) 用户接口ClientHive 提供多种用户交互方式CLIcommand-line interface命令行接口JDBC/ODBC通过 JDBC 访问 HiveWEBUI浏览器访问 Hive2) 元数据Metastore元数据包括表名、表所属的数据库默认是 default、表的拥有者、列/分区字段、表的类型是否是外部表、表的数据所在目录等。⚠️注意默认存储在自带的 Derby 数据库中推荐使用 MySQL 存储 Metastore。3) HadoopHDFS用于存储数据MapReduce用于计算4) 驱动器Driver组件功能说明解析器 (SQL Parser)将 SQL 字符串转换成抽象语法树 AST对 AST 进行语法分析表是否存在、字段是否存在、SQL 语义是否有误编译器 (Physical Plan)将 AST 编译生成逻辑执行计划优化器 (Query Optimizer)对逻辑执行计划进行优化执行器 (Execution)把逻辑执行计划转换成可运行的物理计划MR/Spark2.3 Hive 的运行机制执行流程用户创建表建立表与数据的映射关系用户编写 SQL 分析语句如select ... from table where ...Hive 中的解析器将 SQL 语言解析成对应的 MapReduce 程序并生成相应的 jar 包解析器查询 Metastore 中输入文件的 pathMetastore 中记录着表对应文件的 path通过映射关系向表中导数据数据存储在 HDFS 上最终通过 MapReduce 体系架构执行返回 resultHive 通过给用户提供的一系列交互接口接收到用户的指令(SQL)使用自己的 Driver结合元数据(MetaStore)将这些指令翻译成 MapReduce提交到 Hadoop 中执行最后将执行返回的结果输出到用户交互接口。第3章 Hive 安装部署3.1 安装前准备资源地址Hive 官网http://hive.apache.org/文档查看https://cwiki.apache.org/confluence/display/Hive/GettingStarted下载地址http://archive.apache.org/dist/hive/GitHubhttps://github.com/apache/hive3.2 Hive 安装步骤1) 上传并解压# 上传到 /opt/software 目录tar-zxvf/opt/software/apache-hive-3.1.2-bin.tar.gz-C/opt/module/# 重命名mv/opt/module/apache-hive-3.1.2-bin/ /opt/module/hive2) 配置环境变量编辑/etc/profile.d/my_env.sh# HIVE_HOMEexportHIVE_HOME/opt/module/hiveexportPATH$PATH:$HIVE_HOME/bin3) 解决日志 Jar 包冲突mv$HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar$HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar.bak4) 初始化元数据库Derby 模式bin/schematool-dbTypederby-initSchema3.3 启动并使用 Hive# 启动 Hivebin/hive# 使用 Hivehiveshow databases;hiveshow tables;hivecreate table test(id int);hiveinsert intotestvalues(1);hiveselect* fromtest;⚠️Derby 的缺陷开启 Hive 后会占用元数据库且不与其他客户端共享数据。如果另开窗口启动 Hive会报错Another instance of Derby may have already booted the database。因此生产环境必须使用 MySQL。3.4 MySQL 安装元数据库替代方案1) 检查并卸载 MariaDBrpm-qa|grepmariadb# 如果存在则卸载sudorpm-e--nodepsmariadb-libs2) 安装 MySQL按顺序执行sudorpm-ivhmysql-community-common-5.7.28-1.el7.x86_64.rpmsudorpm-ivhmysql-community-libs-5.7.28-1.el7.x86_64.rpmsudorpm-ivhmysql-community-libs-compat-5.7.28-1.el7.x86_64.rpmsudorpm-ivhmysql-community-client-5.7.28-1.el7.x86_64.rpmsudorpm-ivhmysql-community-server-5.7.28-1.el7.x86_64.rpm如果提示缺少libaio.so.1执行yum install -y libaio3) 初始化并启动 MySQL# 删除旧数据如果有cd/var/lib/mysqlsudorm-rf./*# 初始化数据库sudomysqld--initialize--usermysql# 查看临时密码sudocat/var/log/mysqld.log|greppassword# 启动服务sudosystemctl start mysqld# 登录mysql-uroot-p4) 修改密码并授权远程访问-- 修改 root 密码setpasswordpassword(000000);-- 允许任意 IP 连接updatemysql.usersethost%whereuserroot;flushprivileges;3.5 Hive 元数据配置到 MySQL1) 拷贝 MySQL JDBC 驱动cp/opt/software/mysql-connector-java-5.1.37.jar$HIVE_HOME/lib2) 配置hive-site.xml在$HIVE_HOME/conf目录下新建hive-site.xml?xml version1.0??xml-stylesheet typetext/xsl hrefconfiguration.xsl?configuration!-- JDBC 连接的 URL --propertynamejavax.jdo.option.ConnectionURL/namevaluejdbc:mysql://hadoop102:3306/metastore?createDatabaseIfNotExisttrue/value/property!-- JDBC 连接的 Driver --propertynamejavax.jdo.option.ConnectionDriverName/namevaluecom.mysql.jdbc.Driver/value/property!-- JDBC 连接的 username --propertynamejavax.jdo.option.ConnectionUserName/namevalueroot/value/property!-- JDBC 连接的 password --propertynamejavax.jdo.option.ConnectionPassword/namevalue000000/value/property!-- Hive 元数据存储版本的验证 --propertynamehive.metastore.schema.verification/namevaluefalse/value/property!-- 元数据存储授权 --propertynamehive.metastore.event.db.notification.api.auth/namevaluefalse/value/property!-- Hive 默认在 HDFS 的工作目录 --propertynamehive.metastore.warehouse.dir/namevalue/user/hive/warehouse/value/property/configuration3) 在 MySQL 中创建 Hive 元数据库mysql-uroot-p000000 mysqlcreatedatabasemetastore;mysqlquit;4) 初始化 Hive 元数据库schematool-initSchema-dbTypemysql-verbose5) 再次启动 Hivebin/hive hiveshow databases;hiveshow tables;hivecreate table test(id int);hiveinsert intotestvalues(1);hiveselect* fromtest;此时可以开启多个窗口共享数据了3.6 三种访问方式总结访问方式启动命令特点CLI 直接访问bin/hive最简单直接连接内嵌 MetastoreMetastore 服务方式hive --service metastore多客户端共享元数据需先启动 metastore 服务JDBC 方式hive --service hiveserver2支持 Beeline、Java 程序等远程连接Metastore 服务方式配置在hive-site.xml中添加!-- 指定存储元数据要连接的地址 --propertynamehive.metastore.uris/namevaluethrift://hadoop102:9083/value/property启动# 启动 metastore窗口会阻塞需另开窗口hive--servicemetastore# 启动 hivebin/hiveJDBC 方式配置在hive-site.xml中添加!-- 指定 hiveserver2 连接的 host --propertynamehive.server2.thrift.bind.host/namevaluehadoop102/value/property!-- 指定 hiveserver2 连接的端口号 --propertynamehive.server2.thrift.port/namevalue10000/value/property启动# 启动 hiveserver2bin/hive--servicehiveserver2# 使用 beeline 连接需等待一会bin/beeline-ujdbc:hive2://hadoop102:10000-natguigu3.7 Hive 服务启动脚本生产环境推荐编写hiveservice.sh脚本管理启动和关闭#!/bin/bashHIVE_LOG_DIR$HIVE_HOME/logsif[!-d$HIVE_LOG_DIR]thenmkdir-p$HIVE_LOG_DIRfi# 检查进程是否运行正常functioncheck_process(){pid$(ps-ef2/dev/null|grep-vgrep|grep-i$1|awk{print $2})ppid$(netstat-nltp2/dev/null|grep$2|awk{print $7}|cut-d/-f1)echo$pid[[$pid~$ppid]][$ppid]return0||return1}functionhive_start(){metapid$(check_process HiveMetastore9083)cmdnohup hive --service metastore $HIVE_LOG_DIR/metastore.log 21 [-z$metapid]eval$cmd||echoMetastore 服务已启动server2pid$(check_process HiveServer210000)cmdnohup hiveserver2 $HIVE_LOG_DIR/hiveServer2.log 21 [-z$server2pid]eval$cmd||echoHiveServer2 服务已启动}functionhive_stop(){metapid$(check_process HiveMetastore9083)[$metapid]kill$metapid||echoMetastore 服务未启动server2pid$(check_process HiveServer210000)[$server2pid]kill$server2pid||echoHiveServer2 服务未启动}case$1instart)hive_start;;stop)hive_stop;;restart)hive_stopsleep2hive_start;;status)check_process HiveMetastore9083/dev/nullechoMetastore 服务运行正常||echoMetastore 服务运行异常check_process HiveServer210000/dev/nullechoHiveServer2 服务运行正常||echoHiveServer2 服务运行异常;;*)echoInvalid Args!echoUsage: $(basename$0) start|stop|restart|status;;esac使用chmodx hiveservice.sh ./hiveservice.sh start第4章 Hive 常用交互命令与配置4.1 常用交互命令bin/hive-help参数说明-e quoted-query-stringSQL from command line不进入交互窗口执行 SQL-f filenameSQL from files执行脚本中的 SQL-d,--define keyvalue变量替换--database databasename指定使用的数据库--hiveconf propertyvalue使用给定属性值-S,--silent静默模式-v,--verbose详细模式1)-e不进入交互窗口执行 SQLbin/hive-eselect id from student;2)-f执行脚本中的 SQL# 创建 SQL 脚本touch/opt/module/hive/datas/hivef.sql# 写入select * from student;# 执行bin/hive-f/opt/module/hive/datas/hivef.sql# 执行并将结果写入文件bin/hive-f/opt/module/hive/datas/hivef.sql/opt/module/hive/datas/hive_result.txt4.2 其他常用命令-- 退出 hive 窗口hive(default)exit;hive(default)quit;-- 查看 HDFS 文件系统hive(default)dfs-ls/;-- 查看历史命令在 ~/.hivehistory 文件中!cat~/.hivehistory;4.3 Hive 常见属性配置4.3.1 运行日志信息配置Hive 的 log 默认存放在/tmp/用户名/hive.log目录下。修改日志存放位置到/opt/module/hive/logs# 1) 修改配置文件名cd/opt/module/hive/confmvhive-log4j2.properties.template hive-log4j2.properties# 2) 修改日志存放位置# 在 hive-log4j2.properties 中修改property.hive.log.dir/opt/module/hive/logs4.3.2 打印当前库和表头在hive-site.xml中加入propertynamehive.cli.print.header/namevaluetrue/value/propertypropertynamehive.cli.print.current.db/namevaluetrue/value/property效果hive (default) select * from emp; OK empno ename job mgr hiredate sal comm deptno 7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20 ...4.3.3 参数配置三种方式配置方式命令/文件作用范围优先级配置文件hive-default.xml、hive-site.xml对所有 Hive 进程有效低命令行参数hive -hiveconf paramvalue仅对本次 Hive 启动有效中参数声明hive set paramvalue仅对本次 Hive 启动有效高优先级配置文件 命令行参数 参数声明查看所有配置hiveset;命令行参数方式bin/hive-hiveconfmapred.reduce.tasks10;参数声明方式hive(default)setmapred.reduce.tasks100;注意某些系统级参数如 log4j 相关必须用前两种方式设定因为那些参数的读取在会话建立以前已经完成了。本章小结知识点核心内容Hive 是什么基于 Hadoop 的数据仓库工具将 HQL 转为 MapReduce架构组件Client、Metastore、Driver解析器/编译器/优化器/执行器、Hadoop安装重点Derby → MySQL 元数据库配置、三种访问方式常用命令-e、-f、退出、查看 HDFS、历史命令参数配置三种方式的优先级和适用场景下章预告第5章《Hive 数据类型详解》—— 基本数据类型、集合类型ARRAY/MAP/STRUCT、类型转换规则。本专栏持续更新中欢迎关注收藏