一、背景
系统:CentOS7 Linux 64位
目的:在Hadoop系统上安装Hive,终结Hive安装乱象
版本:apache-hive-1.2.2-bin.tar.gz
路径:/opt #放置到Linux的/opt/路径下,若更改路径,下方相关配置也需要更改!!!
排版:简单
二、Hive 介绍
Hive 是构架在 hadoop 之上的 数据仓库工具,提供简单的 sql 查询功能,被称为HiveQL 或 HQL,然后将 sql 语句转换为 MapReduce 任务进行运行,来处理结构化数据
优点:
1)操作接口采用类SQL语法,容易上手
2)避免了用 Java 写 MapReduce,降低开发人员的学习成本;通过SQL可轻松访问数据,从而实现数据仓库任务,如提取-转换-加载(ETL),报告和数据分析
3)统一的元数据管理,可与 impala/spark 等共享元数据
4)数据的离线处理,如日志分析,海量结构化数据离线分析
缺点:
1)Hive执行延迟比较高,因此 hive 常用于数据分析的,不适合实时性要求高的场景
2)因为Hive的执行延迟比较高,对于处理小数据没有优势,适合处理大数据
三、准备工作
1. 检查Java JDK 是否安装
输入 ** java -version**
若显示以上信息,则说明有安装;若没有安装,先进行 jdk 的安装
Java JDK 下载和安装过程链接文章的步骤3:原创|Linux|CentOS|Inst Hadoop
2. 检查 Hadoop 是否安装
输入 ** hadoop version**
若没有安装hadoop,则安装以下步骤进行 hadoop 的下载和部署: 原创|Linux|CentOS|Inst Hadoop
3. 检查 Mysql 是否安装
输入 **find / -name 'mysql' **
安装Mysql链接:原创|Linux|Inst Mysql
4.安装vim
yum -y install vim
三、Hive下载
1. 官网下载 Hive
Hive官网链接:http://hive.apache.org/downloads.html
step1:在DOWNLOADS下点击 Download a release now! 进入
step2:在 HTTP 下可看到多个下载 Hive 的链接,选择一个进入
step3:点击需要下载的版本,进入
step4:选择 apache-hive-bin.tac.gz 下载到本地
注:
xx-bin.tac.gz 是 class 文件,java 已编译过
xx-src.tac.gz 是 java 文件,是 java源代码
.tac.gz 是 linux 下的安装包
2. 将本地下载的 Hive 安装包上传到 Linux 上
通过 Xshell 的Xftp软件上传文件
将文件上传到 /opt/ 目录下
四、Hive 安装
1. 安装Hive
step1:进入到opt目录
cd /opt
step2:解压 hive 安装包到 hive目录下
tar -zxf /opt/apache-hive-1.2.2-bin.tar.gz
mv apache-hive-1.2.2-bin hive #重命名文件夹
将存放在 /opt/目录下的安装包 apache-hive-1.2.2-bin.tar.gz 解压到 当前目录下
2. 加载 mysql 驱动包
链接:mysql-connector-java驱动包下载地址
step3: 下载 mysql 驱动包后,放入到 hive安装目录的 lib 目录下
cd /hive/lib #进入到 lib 目录
rz
弹出一个文件选择窗口,从本地选择mysql 驱动包上传到服务器
上传完毕后,可在 lib 目录下,看到上传的 mysql-connector-java-8.0.15.jar包
3. 配置 Hive 环境变量
step4:进入 /etc/profile 文件,配置环境变量
sudo vim /etc/profile #进入到 profile 配置文件
输入 i 键 进入编辑模式
输入 export HIVE_HOME=/opt/hive
export PATH=HIVE_HOME/conf
/opt/hive 是hive目录路径
输入 Esc 键,输入 **:wq ** 保存并退出
step5:重新执行 profile 文件
输入 source /etc/profile 刷新配置,生效配置
4. 修改 Hive 的 hive-env.sh 、hive-site.xml 和 hive-log4j2.properties 配置文件
step6:进入到 hive安装目录的 /conf 目录下
cd /opt/hive/conf
问题一:/conf 目录下木有hive-env.sh 、 hive-site.xml 和 hive-log4j2.properties,但是看到 hive-env.sh.template 、 hive-default.xml.template 和 hive-log4j2.properties.template 文件
解决方法:可直接复制,并分别重命名为 hive-env.sh 、 hive-site.xml 和 hive-log4j2.properties
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
step7:修改 hive-env.sh 文件
vim hive-env.sh #编辑 hive-env.sh文件
输入 i 键 进入编辑模式
末尾输入(可在 /etc/profile查询,适当修改得到如下信息)
#hadoop_home路径
HADOOP_HOME=/opt/hadoop-3.1.2
#hive配置文件存放路径
export HIVE_CONF_DIR=/opt/hive/conf
#hive相关jar存放路径
export HIVE_AUX_JARS_PATH=/opt/hive/lib
分别添加你安装的 java jdk 路径、hadoop路径和hive路径
输入 Esc 键,输入 :wq 保存并退出
输入 **source hive-env.sh ** 重新执行 hive-env.sh 文件使其生效
step8:在修改 hive-site.xml 前,先创建warehouse、tmp、log目录
cd /opt/hive
mkdir warehouse #存储表数据
mkdir tmp # 存储临时文件
mkdir log # 存储日志文件
step9:修改 hive-site.xml 文件
cd /opt/hive/conf #进入到 conf 目录下
vim hive-site.xml #编辑 hive-site.xml 文件
输入 i 键 进入编辑模式
1)首先添加以下信息,配置 mysql 数据库相关内容(在末尾之前)
>
>
> javax.jdo.option.ConnectionURL
>
> jdbc:mysql://localhost:3306/test?3useUnicode=true;characterEncoding=utf8;
>
>
>
> JDBC connect string for a JDBC metastore
>
>
>
>
>
> javax.jdo.option.ConnectionDriverName
>
> com.mysql.cj.jdbc.Driver
>
> Driver class name for a JDBC metastore
>
>
>
>
>
> javax.jdo.option.ConnectionUserName
>
> root
>
> username to use against metastore database
>
>
>
>
>
> javax.jdo.option.ConnectionPassword
>
> mysql数据库登录密码(需要修改成密码)
>
> password to use against metastore database
>
>
2)修改 hive.metastore.warehouse.dir 配置
搜索hive.metastore.warehouse.dir
先按 Esc 键退出编辑模式,然后输入** /hive.metastore.warehouse.dir**
定位到 hive.metastore.warehouse.dir 位置,按 i 键进入编辑
修改 value 值,填写你所创建的 warehouse 的路径,配置数据目录
3)修改 hive.exec.scratchdir 配置
按 2)的修改步骤,修改临时文件路径
4)修改 hive.querylog.location 配置
按 2)修改步骤,修改日志路径
5)修改 system:java.io.tmpdir 的路径
搜索 system:java.io.tmpdir ,定位到多处含有 system:java.io.tmpdir 的地方(搜索功能按小写 n可切换到下一处;按大写 N 可切换到上一处)
全部替换成 /opt/hive/tmp(这个是我存放临时文件的路径,替换成你所创建的)
修改完以上全部内容后,输入 Esc 键,输入 **:wq ** 保存并退出
**6)删除;异常值
Esc / 定位到; 删除即可,注意有;号。
step10:修改 hive-log4j.proprties 文件
输入 ** vim hive-log4j2.properties**
修改 log.dir 属性,配置存放log文件路径,其他属性默认即可
hive.log.dir=/opt/hive/log/${username}
step11:在hdfs中创建文件并授权
hive中存储的数据和产生的临时文件需要存储在hdfs中,因此需要再hdfs中创建相应文件
存放hive中具体数据目录
hadoop fs -mkdir /opt/hive/warehouse
存放hive运行产生的临时文件
hadoop fs -mkdir /opt/hive/tmp
存放hive日志文件
hadoop fs -mkdir /opt/hive/log
修改文件权限
hadoop fs -R -chmod 777 /opt/hive/warehouse
hadoop fs -R -chmod 777 /opt/hive/tmp
hadoop fs -R -chmod 777 /opt/hive/log
五、Hive 启动
step11: 启动 hadoop
cd
start-all.sh
jps #查看是否启动成功
step12: 启动 mysql
service mysql start #若不行,使用service mysqld start
若碰到问题:mysqld_safe A mysqld process already exists
参考方法:1、ps aux |grep mysqld 2、kill -9 [PID]
step13:初始化mysql数据库
schematool -initSchema -dbType mysql
若碰到问题,参考:https://jyao.iteye.com/blog/1915561
step14: 启动 hive
cd
hive
问题1:遇到Class path contains multiple SLF4J bindings.该如何解决
方法:https://blog.csdn.net/chuyouyinghe/article/details/79134894
问题2:# [在Hadoop 中用 hive 命令启动时报错:expansion character (code 0x8 at [row,col,system-id]: ]
方法:https://ask.hellobi.com/blog/tianshanbpf/14368
常见问题:
1、Failed with exception Java.io.IOException:java.lang.IllegalArgumentException: java.NET.URI
参考:https://blog.csdn.net/wodedipang_/article/details/72720257
2、failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
原因:namenode没有启动
方法:
1、hdfs namenode -format
2、stop-all.sh
3、start-all.sh
3、FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask. Unable to move source file:/opt/t_access_times.dat to destination hdfs://bigdata:9000/opt/hive/warehouse/hive.db/t_access/t_access_times.dat
原因:datenode没有启动
方法:1、hadoop fs -chmod 777 -R /opt/hive/warehouse
2、hadoop fs -chmod 777 -R /opt/t_access_times.dat
3、cd /opt/hadoop-3.1.2/etc/hadoop
4、vi hdfs-site.xml #增加如下信息
5、hdfs --daemon start datanode
6、vi hdfs-site.xml #查看dfs.datanode.data.dir和dfs.namenode.name.dir下version位置,若此处两位置相同,一定要更改成不同位置,要不启动不了datanode(这是我启动不了datanode原因!!)
7、将datanode/current下的VERSION中的clusterID复制到namenode/current下的VERSION中,覆盖掉原来的clusterID。
8、start-all.sh
9、若上法都无效,如下方法请慎重使用,我是通过如下方法解决了问题,但有关于数据安全,慎用。
10、stop-all.sh
11、删除dfs.namenode.name.dir/current的data和tmp文件夹
12、hdfs namenode -format
13、start-all.sh
14、可能碰到问题4,处理方法如下。
4、Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /opt/hive/tmp/root/1be8676a-56ac-47aa-ab1c-aa63b21ce1fc. Name node is in safe mode
方法:hdfs dfsadmin -safemode leave
5、could not be cleaned up
参考:
1、第一次在create table 时没有加 STORED AS TEXTFILE 结果 INSERT OVERWRITE table 命令就只能执行一次,后面就报错。
2、DROP TABLE xxx,重新建立新表。
6、MySQL无法重启报错Warning: World-writable config file ‘/opt/mysql/my.cnf ’ is ignored的解决方法
方法:chmod 644 /opt/mysql/my.cnf #mysql/my.cnf位置
7、WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.错误。
解决方案,在 vim sbin/stop-dfs.sh 将
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
改为
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
8、其他问题
参考:https://blog.csdn.net/sunnyyoona/article/details/51648871
六、文章参考
https://www.jianshu.com/p/44516adea1bc
https://blog.csdn.net/xiaoqiu_cr/article/details/80906955