前言:关于hive的安装教程网上一大堆,但真正可用的凤毛麟角,当然不可否认这可能跟作者所处的不同的安装阶段有所关系,可能某一个点他已经处理过,只是没有记录下而已,而你刚好踩坑。但是也有个别作者一通乱抄,为了写博客而写博客,那就真的*了狗了。
本场景:Windows本地安装hive
开始
1.1 下载地址
1.2 下载说明
- Windows请下载对应版本的bin.tar.gz包(关于tar包和tar.gz包的区别,关于bin版和src版的区别),本教程使用 apache-hive-3.0.0-bin.tar.gz
-
注意最好与Hadoop大版本对应,比如Hadoop3.x 对应 hive3.x,否则会报错(亲测)
1.3 安装说明
- 免安装,解压即可(尽量避免路径中文、空格、特殊字符等情况)
- 由于包名太长建议重命名文件夹名,如:apache-hive-3.0.0
必要检查
- 检查bin目录下是否有可执行文件(.cmd)存在,否则会导致hive无法启动,提示找不到相关命令。正常情况下应当包含如下内容:
错误示例:
- 通常官网高版本hive都不包含可执行文件,需下载低版本(教程使用1.0.0)的src.tar.gz,解压后将bin文件夹替换高版本(3.0.0)的bin文件夹
配置环境变量
- HIVE_HOME(必要):D:\Soft\ApacheHive\apache-hive-3.0.0
- HIVE_CONF_DIR:D:\Soft\ApacheHive\apache-hive-3.0.0\conf
- 添加到Path变量:%HIVE_HOME%\bin、%HIVE_CONF_DIR%
一些准备工作
- 安装目录下新建文件夹备用:tmp
- 从本地maven仓库(或者官网下载)复制mysql的驱动程序到安装目录/lib下面:mysql-connector-java-5.1.39.jar
- 废弃与hadoop冲突的log4j jar包:将log4j-slf4j-impl-2.10.0.jar重命名为log4j-slf4j-impl-2.10.0.jar.template
- Mysql新建一个数据库,自定义名称,我的:sys_hive (注意,编码格选择:latin1 -- cp1252 West European,排序规则选择:latin1_german1_ci)
- 在hadoop上创建hdfs目录
hadoop fs -mkdir /tmp
hadoop fs -mkdir /user/
hadoop fs -mkdir /user/hive/
hadoop fs -mkdir /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
http://localhost:9870/explorer.html#/
修改Hive配置文件
- /conf目录下,把所有.template后缀结尾的文件去掉.template,并且把hive-default.xml 更名为——>hive-site.xml
- 配置hive-site.xml(修改)
<!-- 1. 新增部分:定义变量并赋值(否则启动报错找不到变量,不明白为什么明明下文中有使用但却不定义!) -->
<property>
<name>system:user.name</name>
<value>Zxl</value>
</property>
<property>
<name>system:java.io.tmpdir</name>
<value>D:/Soft/ApacheHive/apache-hive-3.0.0/tmp</value>
</property>
<!-- 2. 修改部分 -->
<!-- Hive临时文件,用于存储每个查询的临时/中间数据集,通常在完成查询后由配置单元客户端清除 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>${system:java.io.tmpdir}/${system:user.name}</value>
</property>
<!-- hive添加资源时的临时目录 -->
<property>
<name>hive.downloaded.resources.dir</name>
<value>${system:java.io.tmpdir}/${hive.session.id}_resources</value>
</property>
<!-- Hive运行时结构化日志文件的位置 -->
<property>
<name>hive.querylog.location</name>
<value>${system:java.io.tmpdir}/${system:user.name}</value>
</property>
<!-- 用于验证metastore和hivejar包是否一致问题,默认为true。false:hive升级版本不一致只会警告 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- 使用MySQL作为hive的元数据Metastore数据库 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true</value>
</property>
<!-- MySQL JDBC驱动程序类 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- 连接到MySQL服务器的用户名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- 连接MySQL服务器的密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- hive开启的thriftServer地址 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>localhost</value>
</property>
<!-- Thrift Metastore服务器的主机和端口 默认 <value/> -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>
</property>
<!-- 如果启用了日志功能,则存储操作日志的顶级目录 -->
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>${system:java.io.tmpdir}/${system:user.name}/operation_logs</value>
</property>
- 配置hive-env.sh(修改)
# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=D:\Soft\Hadoop\hadoop-3.0.0
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=D:\Soft\apache-hive-3.0.0\conf
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=D:\Soft\apache-hive-3.0.0\lib
初始化MySQL
- 首先启动Hadoop,执行指令:stall-all.cmd
- 初始化MySQL数据库:hive --service schematool -initSchema -dbType mysql
- 初始化 hive 元数据到MySQL数据库:hive --service metastore
目前为止,数据库应当如下:
测试
- 检测hive安装成功与否
#1. 启动metastore服务端
hive --service metastore
#2. hive进入测试(注意先进行上一步,否则报错!以下两个命令结果一致,并非打印版本号,而是直接进入hive,类似于进入mysql。)
hive version
hive
- 进入hive并创建一个测试库和测试表(参考:这篇文章的测试部分)
异常自检
—————— 关于安装后启动报错》》》
*** "Hive throws: WstxParsingException: Illegal character entity: expansion character (code 0x8)"
*** (原因):含特殊字符 for;
*** (解决):for;——> for;,参考:https://blog.csdn.net/zhangvalue/article/details/84313119
*** ".NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor.<init>"
*** (原因):disruptor-x.x.x.jar版本不匹配
*** (解决):
*** hive-site.xml文件中搜索关键字“disruptor”或“hive.async.log.enabled”,把true改为false(理由:看报错消息应该与disruptor和log同步异步有关)
*** https://blog.csdn.net/zhouzhiwengang/article/details/88189525(尝试无果)
*** "Error applying authorization policy on hive configuration: Couldn't create directory ${system:java.io.tmpdir}\${hive.session.id}_resources"
*** (原因):https://blog.csdn.net/leimengyuanlian/article/details/48140937 ————> 所以hive-site.xml建议参照:https://blog.csdn.net/qq262593421/article/details/104961689
*** (解决):https://stackoverflow.com/questions/42690210/error-applying-authorization-policy-on-hive-configuration-couldnt-create-direc
—————— 初始化 hive 元数据到MySQL数据库报错》》》
*** "Caused by: org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. Either your MetaData is incorrect, or you need to enable "datanucleus.schema.autoCreateTables""
*** (原因):
*** (解决):将hive-site.xml文件中datanucleus.schema.autoCreateAll属性改为true。
*** "javax.jdo.JDODataStoreException: Error executing SQL query "select "DB_ID" from "DBS""."
*** (原因):缺少一步初始化
*** (解决):
*** 先初始化MySQL:hive --service schematool -initSchema -dbType mysql ————> 再执行hive --service metastore初始化 hive 元数据到MySQL
*** (此方法应该针对Linux,至少在Windows下并没有卵用)https://blog.csdn.net/quiet_girl/article/details/75209070(附:schematool: 未找到命令的解决办法:https://blog.csdn.net/weixin_40521823/article/details/86657095)
值得参考的几篇文章: