时间很快,学校的Hive课程讲解完也有几周了,终于抽出时间来做相关内容的总结。在学习和安装hive之前,个人认为有必要简单的介绍下,什么是Hive呢?
Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据:可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容,这套SQL简称Hive SQL,使不熟悉mapreduce的用户可以很方便地利用SQL语言查询、汇总和分析数据。而mapreduce开发人员可以把自己写的mapper和reducer作为插件来支持hive做更复杂的数据分析。
对hive有了一个简单初步的认识后,我们就开始干活吧,哈哈哈。
好了,在确定了任务点之后,就开始逐一解决吧。
相信,你已经阅览了博主的其他博文,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:
dfs.http.address
0.0.0.0:50070
hadoop3.x:
dfs.http.address
0.0.0.0:9870
在 kali上默认是自带了mysql 的,所以,我们只需要启动mysql并配置MySQL允许Hive接入,就能支持Hive的正常使用了。
但更多时候,kali原带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
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
service mysql stop # 关闭MySQL服务器
service mysql restart # 重启MySQL服务器
mysql -u root -p
“-u”表示登陆的用户名,“-p”表示登陆用户密码。登陆密码是安装过程中设置的,输入后登陆MySQL Shell。
ALTER USER 'root'@'localhost' identified by 'newpasswd';
# newpasswd是你要修改的新密码。
如果修改是报错,大多情况下是没有刷新权限关系导致的,刷新后再修改密码:
flush privileges; # 刷新权限关系。
ALTER USER 'root'@'localhost' identified by 'newpasswd';
也或者可以通过如下命令来修改:
mysqladmin -u用户名 -p旧密码 password 新密码
# 此处仅介绍两种修改方法
hive是基于hadoop的数据仓库工具,将一定格式的文件映射为一张张表,因此hive版本和hadoop版本有对应关系,所以,一定要检查自己安装的hadoop和hive版本是否兼容!!
弱弱的说句题外话,由于博主在搭建的时候,没考虑版本兼容的问题,吃了不少的亏,在查询了大量资料和咨询已工作的工程师后才搞明白,原来是版本不兼容导致的。
如果你也像博主一样,因为版本不兼容导致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
vim /home/Hive/hive/conf/hive-site.xml
# hive-site.xml中的设置优先级高于hive-default.xml
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
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
hive
username to use against metastore database
javax.jdo.option.ConnectionPassword
hive
password to use against metastore database
JDBC(java DataBase Connectivity,Java 数据库连接)是一种用于执行SQL语句的java API,可为多种关系数据库提供统一访问,一组由用Java语言编写的类和接口组成。JDBC与Microsoft的ODBC一样,都用于访问关系数据库的编程接口。为了让Hive连接到MySQL数据库,需要下载JDBC驱动包。
● 解压缩安装(方法 1):
https://pan.baidu.com/s/1lyQ7b8IALlLp6p1qXA9lWQ
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
为保存Hive的原数据(包括表的名称,属性,列和分区,数据所在目录等) ,需要建立一个“hive”的MySQL数据库。这个数据库名称与/hive/hive-site.xml配置文件中如下内容相对应:
javax.jdo.option.ConnectionUserName
hive
# 当然,你也可自己命令哦
username to use against metastore database
在“mysql>”提示下建立数据库:
mysql> create database hive;
mysql > grant all on *.* to hive@localhost identified by 'hive';
mysql> flush privileges;
javax.jdo.option.ConnectionPassword
hive
# 当然,你可以写自己想要的密码,注意和上面权限验证时的密码一致就好。
password to use against metastore database
Hive是基于Hadoop的数据仓库,会把用户的查询语句自动转换MapReduce任务,并把结果返回用户。因此,启动Hive之前需启动Hadoop集群。命令如下:
start-dfs.sh # 我相信你已经搭建好hadoop平台了
cd /home/Hive/hive
./bin/hive
# 因为,我们已在环境变量中配置好了,所以可以直接使用hive命令启动!
schematool -dbType mysql -initSchema
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.(JobConf.java:448)
at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)
at org.apache.hadoop.hive.conf.HiveConf.(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)
原因:
1. 系统找不到相关jar包
2. 同一类型的 jar 包有不同版本存在,系统无法决定使用哪一个
通过上网查询,我们可知,该类是在guava.jar中的。
查询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
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头疼的不兼容问题也得以解决。