Hive 的伪分布部署(搭建平台为Kali Linux)
时间很快,学校的Hive课程讲解完也有几周了,终于抽出时间来做相关内容的总结。在学习和安装hive之前,个人认为有必要简单的介绍下,什么是Hive呢?
简介:
Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据:可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容,这套SQL简称Hive SQL,使不熟悉mapreduce的用户可以很方便地利用SQL语言查询、汇总和分析数据。而mapreduce开发人员可以把自己写的mapper和reducer作为插件来支持hive做更复杂的数据分析。
对hive有了一个简单初步的认识后,我们就开始干活吧,哈哈哈。
① 已正确无误的搭建好Haoop平台
② 安装好Hive可储存原数据的数据库,如MysqL,derby等数据库系统。
③ Hive的伪分布部署
好了,在确定了任务点之后,就开始逐一解决吧。
先看看我的搭建和运行环境:
一、Kali Linux中Hadoop的伪分布搭建
相信,你已经阅览了博主的其他博文,kali中如何搭建hadoop,博主在另一篇博文中写了详细的教程,可爱漂亮小姐姐和聪明帅气小哥哥们,你们可以移步这里学习哦: Kali Linux 如何搭建 Hadoop平台,Hadoop 伪分布安装与使用 博主就不在此篇做累赘了,哈哈哈,见谅。如果,你已经搭建好了,那么博主恭喜你!!
C:\root> start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [kali]
C:\root> start-all.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [kali]
Starting resourcemanager
Starting nodemanagers
在hadoop 2.x的版本是在kali自带的火狐中输入:localhost:50070来打开;
而在hadoop 3.x中则是:localhost:9870
也或许,有朋友在浏览器中是打不开web管理界面的,这可能是缺少了对yarn的端口配置,修改hadoop中hdfs-site.xml配置文件,添加端口的配置,否则有些电脑上会打不开web页面管理。如果你的 hadoop是2.x版本写50070 ,如果 hadoop是3.x的版本则写成9870的端口。
hadoop2.x:
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
hadoop3.x:
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:9870</value>
</property>
二、安装和配置MySQL服务
在 kali上默认是自带了mysql 的,所以,我们只需要启动mysql并配置MySQL允许Hive接入,就能支持Hive的正常使用了。
但更多时候,kali原带mysql数据库并不友善,会遇到挺多的问题,不管遇到哪些问题,博主都建议您重装mysql,这样一般是比查找资料解决问题所花费时间少且效率高的。
以上是博主曾遇到的问题,询问过诸多朋友和百度查询了大量资料后仍旧无效,最后,博主果断的选择了重装。
需要特别强调的是,一定要完全彻底的卸载MySQL,否则会影响到MySQL正常安装或使用!
好在乐于助人的博主,已帮你整理好了彻底卸载并重装mysql的方法:
① 卸载mysql和其相关应用:
apt-get remove mysql*
② 查看卸载残留并清理:
dpkg --list|grep mysql
(执行该命令查看mysql卸载残留,还剩什么就卸载什么,一定要都卸载掉。)
③ 最后清理残留数据:
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P
选择“是”。
为保险起见再执行如下命令:
apt-get remove mariadb-client
apt-get autoremove mariadb-client
apt-get remove mariadb-server
apt-get autoremove mariadb-server
Kali重装MySQL:
因为在kali中是没有mysql的包的,所以,我们选择安装Mariadb来使用mysql:
apt-get install mariadb-client
apt-get install mariadb-server
安装好mysql后配置mysql
vim /etc/mysql/my.cnf
增添如下内容:
[client-server]
port=3306
socket=/tmp/mysql.sock
[mysql]
#default-character-set=utf8
[mysqld]
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data/mysql
character-set-server=utf8
tmpdir=/tmp
允许开机自启动:
systemctl enable mysql
启动mysql服务:
service mysql start
检验MySQL服务是否已开启: 博主在这里简单的介绍两种检验方式:
systemctl status mysql
或者
netstat -tap | grep mysql
此外,可通过如下命令关闭或重启MySQL服务器:
service mysql stop # 关闭MySQL服务器
service mysql restart # 重启MySQL服务器
进入 MySQL Shell :
mysql -u root -p
“-u”表示登陆的用户名,“-p”表示登陆用户密码。登陆密码是安装过程中设置的,输入后登陆MySQL Shell。
如果觉得安全性不够高,可以通过如下方法,修改MySQL的密码:
ALTER USER 'root'@'localhost' identified by 'newpasswd';
# newpasswd是你要修改的新密码。
如果修改是报错,大多情况下是没有刷新权限关系导致的,刷新后再修改密码:
flush privileges; # 刷新权限关系。
ALTER USER 'root'@'localhost' identified by 'newpasswd';
也或者可以通过如下命令来修改:
mysqladmin -u用户名 -p旧密码 password 新密码
# 此处仅介绍两种修改方法
三、Hive的伪分布式部署
hive是基于hadoop的数据仓库工具,将一定格式的文件映射为一张张表,因此hive版本和hadoop版本有对应关系,所以,一定要检查自己安装的hadoop和hive版本是否兼容!! 弱弱的说句题外话,由于博主在搭建的时候,没考虑版本兼容的问题,吃了不少的亏,在查询了大量资料和咨询已工作的工程师后才搞明白,原来是版本不兼容导致的。 如果你也像博主一样,因为版本不兼容导致Hive无法启动或正常使用,别担心,博主也会在随后为你提供解答方案。
1. Hadoop与Hive的版本兼容性查询:
Hadoop与Hive的版本兼容查询
2. Hive下载:
① Hive官网下载:http://archive.apache.org/dist/hive/
② 当然,乐于助人的博主也提供了自己下载好的两版本:Hive1.2和Hive3.1版本
(我知道聪明的你一定知道,可以通过kali自带的火狐浏览器直接下载在虚拟机中,或者是使用vmtools通过共享文件夹)
3. Hive的安装和配置:
mkdir /home/Hive # 创建hive的文件夹
sudo tar zxvf apache-hive-3.1.2-bin.tar.gz -C /home/Hive
# 可以安装到你所指定的路径下,博主习惯把软件安装在home下。
sudo mv /home/Hive/apache-hive-3.1.2-bin /home/Hive/hive
# 更改文件名,仅为方便。
sudo chomd -R root /home/Hive/hive # 对hive授权
为使用方便,我们把hive命令加入环境变量:
vim ~/.bashrc
添加以下内容:
# Hive
export HIVE_HOME=/home/Hive/hive
export PATH=$PATH:$HIVE_HOME/bin
执行生效命令:
source ~/.bashrc
修改hive-site.xml文件:
vim /home/Hive/hive/conf/hive-site.xml
# hive-site.xml中的设置优先级高于hive-default.xml
hive-site.xml文件的添加配置信息如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
</configuration>
看描述内容,设置了mysql地址,driver,数据库user,数据库passwd,可以根据情况自行修改,必须与后面mysql中创建的一致,否则连接不上
4.下载并安装MySQL JDBC驱动:
JDBC(java DataBase Connectivity,Java 数据库连接)是一种用于执行SQL语句的java API,可为多种关系数据库提供统一访问,一组由用Java语言编写的类和接口组成。JDBC与Microsoft的ODBC一样,都用于访问关系数据库的编程接口。为了让Hive连接到MySQL数据库,需要下载JDBC驱动包。 ● 解压缩安装(方法 1):
(1) MySQL JDBC官网下载
(1)当然,帅气热心的博主也提供了自己网盘:
https://pan.baidu.com/s/1lyQ7b8IALlLp6p1qXA9lWQ
提取码:99ja
解压并将jar包复制到Hive安装路径的lib目录下:
tar zxvf mysql-connector-java-5.1.49.tar.gz
cp mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar /home/Hive/hive/lib
如果,使用 低于mysql-connector-java-5.1.46-bin.jar,会影响Hive表的删除操作。 也可直接上网下载mysql-connector-java-bin.jar,同样是移动到/hive/lib下。 ● 下载MySQL JDBC的deb包安装(方法 2):
官网MySQL JDBC下载 由于Kali是属于Debian系列的,所以,我们选择下载该版本,如图:
注意下载的是deb格式的,也可以使用cpkg命令安装。
cd ~/下载 # 切换到你的文件所在目录下
对于deb包,我们可以使用apt/apt-get包安装,也可以采用deb包的专业管理命令哈。 安装方法 1:
sudo apt install ./mysql-connector-java_8.0.22-1debian10_all.deb
安装方法 2:
sudo dpkg -i mysql-connector-java_8.0.22-1debian10_all.deb
同样是将mysql-connector-java.jar包拷贝到/hive/lib目录下
cp /usr/share/java/mysql-connector-java-8.0.22.jar /home/Hive/hive/lib
(验证路径的方法:打开deb文件,提取文件,看到.tar.xz文件,用xz -d 解压,tar -xvf 解包,出来的文件目录路径就是在系统中的路径)
5.在MySQL中为Hive新建数据库:
为保存Hive的原数据(包括表的名称,属性,列和分区,数据所在目录等) ,需要建立一个“hive”的MySQL数据库。这个数据库名称与/hive/hive-site.xml配置文件中如下内容相对应:
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
# 当然,你也可自己命令哦
<description>username to use against metastore database</description>
</property>
在“mysql>”提示下建立数据库:
mysql> create database hive;
由于博主已经建过hive数据库了,所以,就不在此处上图了,见谅,哈哈哈。
6. 配置MySQL 允许Hive接入:
mysql > grant all on *.* to hive@localhost identified by 'hive';
mysql> flush privileges;
grant语句的作用是将所有数据库的所有表的所有权限赋值给本地机的Hive用户(Hive@localhost),“*.*”代表所有数据库所有表;“by”之后的“hive”是配置文件hive-site.xml时的元数据连接密码。这个密码来自/hive/conf/hive-site.xml配置文件中以下配置内容:
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
# 当然,你可以写自己想要的密码,注意和上面权限验证时的密码一致就好。
<description>password to use against metastore database</description>
</property>
7. 启动Hive !
Hive是基于Hadoop的数据仓库,会把用户的查询语句自动转换MapReduce任务,并把结果返回用户。因此,启动Hive之前需启动Hadoop集群。命令如下:
start-dfs.sh # 我相信你已经搭建好hadoop平台了
cd /home/Hive/hive
./bin/hive
# 因为,我们已在环境变量中配置好了,所以可以直接使用hive命令启动!
schematool -dbType mysql -initSchema
如果能执行到这里,幸运的话,祝贺你已经完成了Hive的伪分布部署!!
主要报错信息:
java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
C:\root> hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/Hive/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/Hadoop/hadoop-3.3.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]
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1380)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1361)
at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)
at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)
at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448)
at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)
at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5099)
at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:97)
at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:81)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
一,java.lang.NoSuchMethodError:
原因:
1. 系统找不到相关jar包
2. 同一类型的 jar 包有不同版本存在,系统无法决定使用哪一个
二,com.google.common.base.Preconditions.checkArgument:
通过上网查询,我们可知,该类是在guava.jar中的。
所以,此时我们就清楚的知道,是hive中guava.jar包和hadoop中的guava.jar包版本相差过大,导致文件在加载和使用的时候产生冲突,一般情况下是优先的把hive中低版本的一个的guava.jar包给优先加载了,而低版本明显是支持不了较新的hadoop的。
查询guava.jar包的位置:
C:\root> find / -type f -name guava*.jar
/home/pycharm/pycharm-community-2019.3.3/lib/guava-27.1-jre.jar
/home/IntelliJ-IDEA/idea-IC-193.6494.35/plugins/maven/lib/maven3/lib/guava-25.1-android.jar
/home/IntelliJ-IDEA/idea-IC-193.6494.35/lib/guava-27.1-jre.jar
/home/Eclipse/plugins/org.eclipse.m2e.maven.runtime_1.9.0.20180606-2035/jars/guava-20.0.jar
/home/Hadoop/hadoop-3.3.0/share/hadoop/hdfs/lib/guava-27.0-jre.jar
/home/Hadoop/hadoop-3.3.0/share/hadoop/yarn/csi/lib/guava-20.0.jar
/home/Hadoop/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar
/home/Hive/hive/lib/guava-19.0.jar
/home/HBase/hbase-2.3.2/lib/guava-11.0.2.jar
/mnt/hgfs/kali vmware tool sharing/guava-27.1-jre.jar
/usr/share/maltego/maltego-core-platform/modules/ext/guava-27.1-jre.jar
/usr/share/jadx/lib/guava-27.1-jre.jar
/usr/share/java/guava.jar
/root/.cache/vmware/drag_and_drop/TNc3uG/guava-27.1-jre.jar
经过测试,我们最终确定了是位于hive/lib中的中guava-19.0.jar版本低于hadoop中share/hadoop/common/lib/路径下的guava-27.0-jre.jar版本,所以,我们只需修改该包即可:
rm /home/Hive/hive/lib/guava-19.0.jar
# 删除低版的jar包
cp /home/Hadoop/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar /home/Hive/hive/lib
# 将hadoop的jar包复制替换到hive中,此处的hadoop是3.3.0的版本,hive是3.1.2版本。其他不兼容版本如果报这个错,修改方法也是一样的。
# reboot
待重启之后,和之前一样开启hadoop再运行hive就完成了hive的伪分布部署了,hive头疼的不兼容问题也得以解决。
附录:
到此,Hive在Kali Linux上的伪分布部署就告一段落了,希望对你有帮助哈!!