环境准备:
centos 7
centos可以上网
Hadoop正常运行 详情见:Hadoop完全分布式
MySQL正常运行 详情见:Centos安装MySQL
前言:下文操作均以图文形式展现,对照自己的路径进行配置
案例目标:
- 安装Hive 3.1.2版
- 搭建Hive环境
- 配置MySQL jar包驱动 5.1.37版
- 关联MySQL 和 Hive
案例实施:
一、下载
由于使用wget命令下载直接会下载到此目录,且我的安装全部都在 /opt/software目录下,所以先进入下载目录再进行下载,省麻烦移动。
1、下载Hive 3.1.2包:
wget https://mirrors.bfsu.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
2、下载MySQ 5.1.37驱动包(虚拟机地址栏):
https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.37
二、安装
1、解压:
2、重命名:
3、移动MySQL驱动包到 /...../hive/lib目录下:
三、环境配置
1、环境变量:
vim /etc/profile
2、 使环境变量立即生效:
source /etc/profile
3、配置 hive-env.sh
(1)拷贝hive-env.sh.template并命名为hive-env.sh:
cp hive-env.sh.template hive-env.sh
(2)修改hive-env.sh 文件
原文件:
现文件:
注:第一个为Hadoop目录,第二个为Hive配置目录,最后一个为驱动jar包路径
4、配置hive-site.xml
(1)新建hive-site.xml:
直接将此文件内容拷入hive-site.xml ,将如下hive-site.xml中<name>对应的<value>值替换为自己的真实数据值,其余标签无需修改
<configuration>
<!-- jdbc 连接的 URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value>
</property><!-- jdbc 连接的 Driver-->
<!--新版本8.0版本的驱动为com.mysql.cj.jdbc.Driver-->
<!--旧版本5.x版本的驱动为com.mysql.jdbc.Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property><!-- jdbc 连接的 username(MySQL用户名)-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property><!-- jdbc 连接的 password(MySQL密码) -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>dang</value>
</property><!-- Hive 元数据存储版本的验证(Hive元数据默认是存储在Derby中,正常开启时它会去校验Derby,现在要使用MySQL存储元数据,
就需要把这个关闭即可,如果开启,MySQL和Derby会导致Hive启动不起来的) -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property><!-- Hive 默认在 HDFS 的工作目录(可以不配置,因为默认就是/user/hive/warehouse,如果不使用默认的位置,可以进行手动修改) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
(2)创建HDFS文件夹(必须要创建,hive-site.xml文件中有此路径,此路径很重要):
A、启动Hadoop各节点:
B、离开安全模式,创建两个文件夹并赋予权限:
(3)创建temp文件夹并赋予权限,路径为 /....../hive/temp:
5、配置log日志文件
(1)拷贝并重命名hive-log4j2.properties.template为 hive-log4j2.properties文件:
cp hive-log4j2.properties.template hive-log4j2.properties
(2)修改日志文件:
vim hive-log4j2.properties
修改内容 property.hive.log.dir =/....../hive/temp/root 上面创建的目录/temp加一个root就可以了
6、MySQL进行远程连接:
(1)登录MySQL
(2)使用mysql数据库
(3)执行: update user set host = '%' where user='root';
(4)退出MySQL
(5)重启MySQL服务:
systemctl stop mysqld.service
systemctl start mysqld.service
四、初始化元数据库
Hive中的元数据,其默认存储在 Derby 中,由于MySQL性能有明显优势,此处以MySQL作为元数据库;
进入 /....../hive/bin 目录进行mysql初始化操作:
schematool -dbType mysql -initSchema
如图所示即为初始化成功
五、检查
进入/....../hive/bin目录直接输入hive:
显示数据库:
创建表,插入数据:
centos安装Hive3.1.2完成
六、问题
1、第一次进入hive发现:
解决: NameNode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例,则系统会一直处于安全模式状态即只读状态,直接关闭安全模式即可: hdfs dfsadmin -safemode leave
2、执行查看表命令报错:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
解决:进入/...../hive/lib 目录下将 guava-19.0.jar 换为 gua-13.0.jar
链接:https://mvnrepository.com/artifact/com.google.guava/guava/13.0
3、初始化报错:Failed to load driverFailed to load driver:
Metastore connection URL: jdbc:mysql://cit-server2-s2-120:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8
Metastore Connection Driver : com.mysql.jc.jdbc.Driver
Metastore connection User: root
org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver
Underlying cause: java.lang.ClassNotFoundException : com.mysql.jc.jdbc.Driver
解决:驱动jar包版本不对应,没放在正确的位置(/....../hive/lib下);
4、Hadoop未启动导致hive链接失败:
Exception in thread "main" java.lang.RuntimeException: java.net.ConnectException: Call From master.hadoop/192.168.140.138 to master.hadoop:9000 failed on connection exception: java.net.Connect
解决:启动Hadoop集群
5、multiple SLF4J bindings
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/apache-hive-3.1.1-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/hadoop-3.2.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
解决: Hive和Hadoop的slf4j-log4j包冲突,删除/....../hive/lib 下的slf4j-log4j包(Hive的包)
6、expansion character
Exception in thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
at [row,col,system-id]: [3210,96,"file:/usr/local/hive/apache-hive-3.1.1-bin/conf/hive-site.xml"]Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
at [row,col,system-id]: [3210,96,"file:/usr/local/hive/apache-hive-3.1.1-bin/conf/hive-site.xml"]
at org.apache.hadoop.conf.Configuration$Parser.parseNext(Configuration.java:3277)
at org.apache.hadoop.conf.Configuration$Parser.parse(Configuration.java:3071)
解决:hive-site.xml文件第3210行有特殊字符,删除特殊字符 for
vim hive-site.xml +3210
7、not allowed to connect to this MySQL server
原因:服务器不允许远程连接
解决: 进行本文第二大点第6小点操作
8、Access denied for user ‘root’@‘DW1’
org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.
Underlying cause: java.sql.SQLException : Access denied for user 'root'@'DW1' (using password: YES)
SQL Error code: 1045
原因:创建用户的时候为root登录localhost
解决:进入MySQL端执行 alter user 'root'@'localhost' identified by '123456';
注意: 修改主机名及其密码
不能打败你的,必将使你愈发强大。