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)