访问Hive获取下载安装地址
安装
- 创建
downloads
文件夹并下载Hive
1 | hadoop@M5303398:~$ mkdir downloads |
- 解压
apache-hive-3.1.2-bin.tar.gz
到hive
目录
1 | hadoop@M5303398:~/downloads$ tar xzf apache-hive-3.1.2-bin.tar.gz -C ~/hive |
- 配置Hive的环境变量(bashrc)
1 | hadoop@M5303398:~$ sudo nano .bashrc |
- 修改环境变量
1 | export HIVE_HOME=~/hive/apache-hive-3.1.2-bin |
- 刷新
.hashrc
1 | hadoop@M5303398:~$ source ~/.bashrc |
- 修改
hive-config.sh
1 | sudo nano $HIVE_HOME/bin/hive-config.sh |
- 添加
HADOOP_HOME
1 | export HADOOP_HOME=/home/hdoop/hadoop-3.2.1 |
在HDFS中创建配置单元目录
- 创建两个单独的目录以将数据存储在HDFS层中:
- 临时的
tmp
目录将存储Hive进程的中间结果 warehouse
仓库目录将存储与Hive相关的表。
- 临时的
- 创建tmp目录,该目录将存储Hive发送到HDFS的中间数据
1 | hdfs dfs -mkdir /tmp |
- 为tmp组成员添加写和执行权限
1 | hdfs dfs -chmod g+w /tmp |
- 检查权限是否正确添加
1 | hdfs dfs -ls / |
- 创建仓库目录
warehouse
- 在
/user/hive/
父目录中创建仓库目录
1 | hdfs dfs -mkdir -p /hadoop/hive/warehouse |
- 为仓库组成员添加写入和执行权限
1 | hdfs dfs -chmod g+w /hadoop/hive/warehouse |
- 检查权限是否添加正确
1 | hdfs dfs -ls /hadoop/hive |
配置 hive-site.xml
文件
- 默认情况下,Apache Hive发行版包含模板配置文件。模板文件位于Hive conf目录中,并概述了默认的Hive设置。 使用以下命令找到正确的文件
1 | cd $HIVE_HOME/conf |
- 使用hive-default.xml.template创建hive-site.xml文件
1 | cp hive-default.xml.template hive-site.xml |
- 使用nano文本编辑器访问hive-site.xml文件
1 | sudo nano hive-site.xml |
FAQ
HiveSchemaTool:Parsing failed. Reason: Missing required option
- 将命令替换为(修改-dbType 和 -initSchema的顺序)
1
$HIVE_HOME/bin/schematool -dbType derby -initSchema
Exception in thread “main” java.lang.NoSuchMethodError:
- 该错误表明Hadoop和Hive版本之间很可能存在不兼容性问题
- 在Hive lib目录中找到guava jar文件
1
ls $HIVE_HOME/lib
- 在Hadoop lib目录中也找到guava jar文件
1
ls $HADOOP_HOME/share/hadoop/hdfs/lib
- 列出的两个版本不兼容,并导致该错误。从Hive lib目录中删除现有的guava文件
1
rm $HIVE_HOME/lib/guava-19.0.jar
- 将guava文件从Hadoop lib目录复制到Hive lib目录
1
cp $HADOOP_HOME/share/hadoop/hdfs/lib/guava-27.0-jre.jar $HIVE_HOME/lib/
- 再次使用 schematool 命令启动 Derby 数据库
1
$HIVE_HOME/bin/schematool -dbType derby -initSchema
Hive throws: WstxParsingException: Illegal character entity: expansion character (code 0x8)
- 之所以引发该错误,是因为单词
for
和transactional
之间有一个特殊字符()
。删除该字符或复制并粘贴(替换)介于<description>
和</description>
之间的字符。 - 修改类型
fortransactional
为for transactional
- 之所以引发该错误,是因为单词
Exception in thread “main” java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader
- 确保
.bashrc
中修改的内容是正确的
1
2
3#Hive Related Options
export HIVE_HOME=~/hive/apache-hive-3.1.2-bin
export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/binHive目前不支持Java 9+,如果Java版本高于9+,需要安装并配置JAVA8
- 根据本地包
1
sudo apt-get update
- 安装
JAVA 8
1
sudo apt-get install openjdk-8-jdk
- 查看
JAVA 8
的版本
1
hadoop@M5303398:~$ cd /usr/lib/jvm
- 修改
hadoop-env.sh
1
hadoop@M5303398:~$ vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
- 配置
JAVA_HOME
1
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
输入
hive
查看
- 确保
Exception in thread “main” java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
- 这是因为
hive-site.xml
缺少system:java.io.tmpdir
和system:user.name
- 将下面的内容添加到
hive-site.xml
开头
1
2
3
4
5
6
7
8<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>${user.name}</value>
</property>- 这是因为