HIVE 1.2.1 的安装和配置

HIVE的那些事

HIVE是一个数据仓库,可以类比成数据库。但是它与传统数据库不同的是,HIVE是基于HDFS的,而传统的数据库是基于文件系统的。但是由于HIVE还是具有传统数据库的增、删、改、查功能,而HDFS中得文件是多读少写的,这显然不能符合数据库的需求,所以HIVE不能将元数据存在HDFS中。目前HIVE还是将元数据存在数据库中,如内嵌的Derby或者外联的Mysql中。

HIVE 1.2.1 的安装和配置

首先要安装hadoop,我这里的hadoop的版本是2.6.2,然后去Hive官网下载1.2.1版本的Hive。

首先将hive解压到对应的路径下:

tar -zxvf apache-hive-1.2.1-bin.tar.gz

接着修改环境变量:

export HADOOP_HOME=/Users/stardj/hadoop/hadoop-2.6.2
export HIVE_HOME=/Users/stardj/hive/apache-hive-1.2.1-bin
export PATH=$PATH:$HIVE_HOME/bin
export CLASS_PATH=$CALSSPATH:$HIVE_HOME/lib

然后修改hive的配置文件,路径为${HIVE_HOME}/conf。先修改hive_env.sh文件

# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/Users/stardj/hadoop/hadoop-2.6.2
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/Users/stardj/hive/apache-hive-1.2.1-bin/conf

修改完hive_env.sh文件后,再将hive-default.xml.template复制并改名为hive-site.xml,清除里面得全部内容(因为hive会先加载default那个文件,再去加载site文件,如果两个文件里有相同得配置,那么以site为准,所以不必拷贝那么多,容易混淆)。

  <configuration>
          <property>
                  <name>javax.jdo.option.ConnectionURL</name>
                  <value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true</value>
          </property>

          <property>
                  <name>javax.jdo.option.ConnectionDriverName</name>
                  <value>com.mysql.jdbc.Driver</value>
                  <description>driver</description>
          </property>
          <property>
                  <name>javax.jdo.option.ConnectionUserName</name>
                  <value>hive</value>
                  <description>username</description>
          </property>

          <property>
                  <name>javax.jdo.option.ConnectionPassword</name>
                  <value>hive</value>
                  <description>password</description>
          </property>
  </configuration>

至此,hive的基本配置已经完成,接下来就要配置hive来连接mysql数据库了。

HIVE HWI配置

Hive Web Interface(HWI)简介:Hive自带了一个Web-GUI,功能不多,可用于效果展示,如果没有安装Hue的话,是个不错的选择。

由于hive-bin包中没有包含HWI的页面,只有Java代码编译好的jar包:hive-hwi-1.2.0.jar

因此需要下载源码从中提取jsp文件并打包成war文件到hive-lib目录中:

cd apache-hive-1.2.1-src/hwi
jar cfM hive-hwi-1.2.1.war -C web .

然后将war包放到hive-lib目录下即可启动hwi服务:

hiveLogPath='/var/log/hadoop/hive'
HIVE_HOME='/usr/local/hive'
mkdir -p $hiveLogPath
nohup $HIVE_HOME/hive --service hiveserver2 > $hiveLogPath/hiveserver2.log 2>&1 &
nohup $HIVE_HOME/hive --service metastore > $hiveLogPath/metastore.log 2>&1 &
nohup $HIVE_HOME/hive --service hwi > $hiveLogPath/hwi.log 2>&1 &

修改hive-site.xml配置文件:

<property>
    <name>hive.hwi.war.file</name>
    <value>lib/hive-hwi-1.2.1.war</value>
    <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description>
</property>
<property>
    <name>hive.hwi.listen.host</name>
    <value>0.0.0.0</value>
    <description>This is the host address the Hive Web Interface will listen on</description>
</property>
<property>
    <name>hive.hwi.listen.port</name>
    <value>9999</value>
    <description>This is the port the Hive Web Interface will listen on</description>
</property>

接着访问URL:http://master:9999/hwi/

然而继续报错:

ERROR compiler.Compiler: Javac exception 

Unable to find a javac compiler; com.sun.tools.javac.Main is not on the classpath.

Perhaps JAVA_HOME does not point to the JDK. It is currently set to "/usr/local/java/jre"

原因:jetty编译jsp类时,ant没有识别到正确的jdk路径。

解决:ln -s $JAVA_HOME/lib/tools.jar $HIVE_HOME/lib/

或者直接将jdk里地tools.jar考到hive/lib文件夹下。

至此hive的hwi配置完成。

IDEA HIVE编程常见问题

  • 启动指令报错

运行如下指令时:

hive --service hiveserver &

报出如下的错误:

Starting Hive Thrift Server
Exception in thread "main" java.lang.ClassNotFoundException: org.apache.hadoop.hive.service.HiveServer
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:274)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:214)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

查看下jar包,的确没这个类了,被hiveserver2取代了,所以如果遇到这样的问题,可以使用如下指令:

hive --service hiveserver2 &
  • java编程中报错

在用java写hive jdbc连接HDFS时,报出一下错误:

java.lang.ClassNotFoundException: org.apache.hadoop.hive.jdbc.HiveDriver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at HiveJdbcClient.main(HiveJdbcClient.java:14)

blogroll

social