推荐系统从无到有(3)—— Hive

本文默认所有文件下载到/home/YourUserName/downloads

1. Hive简介

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。

2. Hive安装及其配置

  1. 下载Hive

进入Apache Hive的下载源页面

注:3.x.x版本是与Hadoop的3.y.y版本一起工作的,而2.x.x则是与Hadoop的2.y.y版本一起工作。

选择版本

我Hadoop是3.1.3版本的所以下载3.1.2的Hive**(记得下载编译好的包)**

在这里插入图片描述

wget http://mirror.bit.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz

此外,我为Hive配的数据库时MySQL,所以需要下载MySQL的驱动jar包

wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar

上面的下载速度太慢,可以试试下面这个

wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.47.tar.gz
# 从这里下载的文件要解压哦
tar -zxf mysql-connector-java-5.1.47.tar.gz
  1. 开始安装

解压

tar -zxf apache-hive
mv apache hive
cp hive /usr/local/hive

配置环境变量

vi /etc/source

加入

export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin

在hdfs目录并赋予权限

hdfs dfs -mkdir -p /usr/local/hive/warehouse
hdfs dfs -mkdir -p /usr/local/hive/tmp
hdfs dfs -mkdir -p /usr/local/hive/log
hdfs dfs -chmod g+w /usr/local/hive/warehouse
hdfs dfs -chmod g+w /usr/local/hive/tmp
hdfs dfs -chmod g+w /usr/local/hive/log

配置hive-env.sh

cd /usr/local/hive/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh

在里面添加如下内容(template复制过来后有对应的行)

export JAVA_HOME=/usr/lib/jvm/java-1.8.0_241
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=$HIVE_HOME/conf
export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib/*

配置hive-site.xml

cp -r hive-default.xml.template hive-site.xml
vim hive-site.xml

<configuration>标签中加入如下内容

 <property>
   <name>system:java.io.tmpdir</name>
   <value>/tmp/hive/java</value>
 <property>
 <property>
   <name>system:user.name</name>
   <value>${user.name}</value>
 <property>

并修改如下内容

<property>
   <name>javax.jdo.option.ConnectionURL</name>
 <value>jdbc:mysql://Master:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=utf8&amp;useSSL=false</value>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.jdbc.Driver</value>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionUserName</name>
   <value>root</value>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>toor</value>
 </property>

注:为什么在这里ConnectionURL的value中要使用&amp;呢?因为&是XML中预定义的实体引用

实体引用 所代表的字符 字符名称
&lt; < 小于
&gt; > 大于
&amp; &
&apos; 单引号
&quot; " 双引号

将下载好的驱动文件放到/usr/local/hive/lib

cp /home/yourusername/downloads/mysql-connector-java-5.1.47.jar /usr/local/hive/lib
# 如果是用第二个命令下载的则
# cp /home/yourusername/downloads/mysql-connector-java-5.1.47/mysql-connector-java-5.1.47.jar /usr/local/hive/lib

使用schemaTool初始化mysql数据库

schematool -dbType mysql -initSchema

完成后的输出

然后我们登陆MySQL查看一下

mysql -u root -p yourpassword

看看有没有hive这一个数据库

show databases;

应该如下

初始化后的结果

  1. 启动Hive (要先把Hadoop启动起来)
hive

输出如下

在这里插入图片描述

3. 过程中遇到的问题

  • 提示log4j的binding相关导致,无法初始化

删除classpath里的相关包,只留一个

报错提示

比如这里我们删除$HIVE_HOME/lib下的log4j包

rm -rf /usr/local/hive/lib/log4j-slf4j-impl-2.6.2.jar

注:这里包的名字可能不一样,请根据终端里输出的日志来输入命令

  • 提示Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument

这个是hive使用的一个guava版本过低的问题,可以直接复制Hadoop下的guava过来,记得删掉hive自带的guava

cp /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive/lib
cd /usr/local/hive/lib
rm -rf guava-19.0.jar
  • hive-site.xml的问题

3224

cd /usr/local/hive/conf
vim hive-site.xml

使用vim的命令

:3224

按下回车就能看到出错的地方

出错行

然后还有一个<configuration>标签闭合的问题

标签闭合

  • hive启动失败:Cannot create directory /tmp/hive. Name node is in safe mode.

退出安全模式的命令

hdfs dfsadmin -safemode leave

可能原因:

hdfs的安全模式是受配置文件hdfs-site.xml的以下属性影响:

<property>
	<name>dfs.namenode.safemode.threshold-pct</name>
	<value>0.99</value>
</property>

这是一个百分比,表示当NameNode获取到了整个文件系统数据块的99%,则自动退出安全模式。这个百分比是可以自己设定的,如果这个值小于或等于0,则不会进入安全模式,但如果这个值大于1,则会无限处于安全模式。

无限处于安全模式,有以下可能:

1)dfs.namenode.safemode.threshold-pct的值大于1

2)是不是节点很少,而且副本要求不是1,比如说,只有一个节点,但最小副本(dfs.replication.min)是2,那么,这种情况,肯定会无限安全模式,因为,需要2个副本,但只有一个节点,无法拷贝第二个副本。


安全模式解释:

NameNode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例 (dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态
dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。
有两个方法离开这种安全模式
(1)修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。(注:在hdfs-site.xml中将其设置为0,关闭安全模式)
(2)hadoop dfsadmin -safemode leave命令强制离开

注:用户可以通过dfsadmin -safemode来操作安全模式,参数value的说明如下:

  • enter - 进入安全模式
  • leave - 强制NameNode离开安全模式
  • get - 返回安全模式是否开启的信息
  • wait - 等待,一直到安全模式结束。

猜你喜欢

转载自blog.csdn.net/JikeStardy/article/details/105210672
今日推荐