hive安装/启动以及源码调试

hive安装

1、安装hadoop并启动

2、安装hive

3、配置metastore(默认是derby,多用户操作时要改成mysql库)

metastore_db无权限,或在EmbeddedMetastore模式下启用多个客户端都会报

Errorinmetadata:java.lang.RuntimeException:Unabletoinstantiateorg.apache.hadoop.hive.metastore.HiveMetaStoreClient

 

cphive-default.xml.template hive-default.xml以及hive-site.xml (hive-site.xml是个性化配置,优先级高于hive-default.xml)

配置hive-site.xml中的metastore配置:

 
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
  <description>JDBC connect string fora JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driverclassname fora JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
  <description>username to use against metastore database</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>XXX</value>
  <description>password to use against metastore database</description>
</property>

记的添加Mysql的jar包到hive的lib中,否则Errorinmetadata:java.lang.RuntimeException:Unabletoinstantiateorg.apache.hadoop.hive.metastore.HiveMetaStoreClient

4、./hive就可以启动hive

5、hive thrift server

hive --service hiveserver -p10001来启动hive thrift服务(默认为10000端口)

nohup hive --service hiverserver -p10001可以在后台跑

6、排查问题时可以打开Hive的Debug日志,便于定位问题

./hive-hiveconfhive.root.logger=DEBUG,console

问题:

1、在cli中执行任何操作报异常(使用内置的derby)

FAILED: Error in metadata: MetaException(message:Got exception: org.apache.hadoop.hive.metastore.api.MetaException javax.jdo.JDODataStoreException: Error(s) were found while auto-creating/validating the datastore for classes. The errors are printed in the log, and are attached to this exception.
NestedThrowables:
java.sql.SQLSyntaxErrorException: In an ALTER TABLE statement, the column 'IS_STOREDASSUBDIRECTORIES' has been specified as NOT NULL and either the DEFAULT clause was not specified or was specified as DEFAULT NULL.)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

 原来是要到hive目录下(即有metastore_db文件夹所在的位置),然后再执行hive命令,就能正常查了

hive源码编译

1、启用debug监听(我采用的是0.11.0版本)

hive --debug (默认是port=8000)

自定义端口使用:hive --debug:port=4000

debug模式只有在0.10.0以上版本才可以用。debug启动后会等待客户端连接,客户端连接上后就进入cli命令行

2、hive源码编译及eclipse调试

下载hive源码(可通过svn或下载src包),通过ant clean package eclipse-files后,导入到eclipse中。

监听hive debug时的远程端口,就可以进入debug模式。

hive脚本运行流程

hive启动脚本:hive脚本中加载ext中各*.sh中的方法

hive servername server参数

如hive --debug --help:

流程中会判断$1=‘--debug’则$DEBUG=‘--debug’, 里面有

if($DEBUG 存在){

if $2 如--help,就会执行debug_help方法。

else 设置HIVE_MAIN_CLIENT_DEBUG_OPTS的参数中加入debug相应参数

 

hive脚本最后的$TORUN "$@" ,TORUN其实就是cli,即执行/ext/cli.sh脚本,该脚本中主要是调用/ext/util/execHiveCmd.sh 来执行最后的CliDriver。

即exec $HADOOP jar ${HIVE_LIB}/hive-cli-*.jar $CLASS $HIVE_OPTS "$@"

其中:

$HADOOP=/var/root/soft/hadoop-0.20.2/bin/hadoop (hadoop脚本路径)

$CLASS=org.apache.hadoop.hive.cli.CliDriver

 

hadoop脚本中最终会执行:

exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"

 

hive的debug参数就是在hive脚本时放到HADOOP_OPTS中的

 

 

遇到的问题:

为了便于调试,在本机安装了hadoop和hive,然后启动hive --debug,一直不能进入debug模式,看hive进程,jdwp的设置没在参数中。弄了半天发现HADOOP_OPTS在hadoop的hadoop-env.sh里被赋值了,即把hive的HADOOP_OPTS的覆盖了(当时在hadoop-env.sh里设置了参数,而没有保留之前的$HADOOP_OPTS)

相关推荐