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的伪分布部署

   好了,在确定了任务点之后,就开始逐一解决吧。

  先看看我的搭建和运行环境:

hive linux 插数据_大数据

  一、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

hive linux 插数据_hive_02

  在hadoop 2.x的版本是在kali自带的火狐中输入:localhost:50070来打开;

而在hadoop 3.x中则是:localhost:9870

hive linux 插数据_hive_03

  也或许,有朋友在浏览器中是打不开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,这样一般是比查找资料解决问题所花费时间少且效率高的。

hive linux 插数据_hive linux 插数据_04

hive linux 插数据_hadoop_05

  以上是博主曾遇到的问题,询问过诸多朋友和百度查询了大量资料后仍旧无效,最后,博主果断的选择了重装。

  需要特别强调的是,一定要完全彻底的卸载MySQL,否则会影响到MySQL正常安装或使用!

  好在乐于助人的博主,已帮你整理好了彻底卸载并重装mysql的方法:

① 卸载mysql和其相关应用:

apt-get remove mysql*

hive linux 插数据_linux_06

② 查看卸载残留并清理:

dpkg --list|grep mysql 
(执行该命令查看mysql卸载残留,还剩什么就卸载什么,一定要都卸载掉。)

hive linux 插数据_hive_07

③ 最后清理残留数据:

dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P

  选择“是”。

hive linux 插数据_hadoop_08

hive linux 插数据_hive linux 插数据_09

为保险起见再执行如下命令:
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

hive linux 插数据_hive_10

允许开机自启动:

systemctl enable mysql

启动mysql服务:

service mysql start

  检验MySQL服务是否已开启:   博主在这里简单的介绍两种检验方式:

systemctl status mysql
 或者
 netstat -tap | grep mysql

hive linux 插数据_大数据_11

  此外,可通过如下命令关闭或重启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 linux 插数据_hadoop_12

hive linux 插数据_大数据_13

  三、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

hive linux 插数据_hive linux 插数据_14

  执行生效命令:

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系列的,所以,我们选择下载该版本,如图:

hive linux 插数据_大数据_15

    注意下载的是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>

hive linux 插数据_hive_16

  7. 启动Hive !

   Hive是基于Hadoop的数据仓库,会把用户的查询语句自动转换MapReduce任务,并把结果返回用户。因此,启动Hive之前需启动Hadoop集群。命令如下:

start-dfs.sh		# 我相信你已经搭建好hadoop平台了
 cd /home/Hive/hive
 ./bin/hive
 # 因为,我们已在环境变量中配置好了,所以可以直接使用hive命令启动!

hive linux 插数据_hive linux 插数据_17

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)

hive linux 插数据_hadoop_18

   一,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 linux 插数据_linux_19

hive linux 插数据_大数据_20

hive linux 插数据_hive_21

   到此,Hive在Kali Linux上的伪分布部署就告一段落了,希望对你有帮助哈!!