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)