本文默认所有文件下载到/home/YourUserName/downloads
1. Hive简介
hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。
2. Hive安装及其配置
- 下载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
- 开始安装
解压
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&characterEncoding=utf8&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中要使用&呢?因为&是XML中预定义的实体引用
实体引用 所代表的字符 字符名称 < < 小于 > > 大于 & & 和 ' ’ 单引号 " " 双引号 将下载好的驱动文件放到
/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;
应该如下
- 启动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的问题
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 - 等待,一直到安全模式结束。