读书人

hive并发调用的运行方式-个人心得篇

发布时间: 2013-04-26 16:27:53 作者: rapoo

hive并发调用的运行方式-个人经验篇
前言

使用hive,我们很多情况下会并发调用hive程序,将sql任务转换成mapreuce提交到hadoop集群中,而在本人使用hive的过程中,发现并发调用hive有几个问题,在这个和大家分享下.

正文

默认安装hive,hive是使用derby内存数据库保存hive的元数据,这样是不可以并发调用hive的,需要配置为使用mysql保存hive的元数据。

?

运行hive,可以有以下访问方式:

1.hiveserver:hive以thrift服务的服务器形式运行,允许不同的语言编写客户端进行访问, 通过thrift,jdbc,odbc连接器和hive服务器与hive通信,这种方式很适合java编程人员通过jdbc接口去访问hive,但是在实 践中,发现并发调用时,很容易出现hiveserver无故宕机,没有jvm的dump文件,hiveserver的程序也毫无输出。

?

2.metastore:

?

2.1.内嵌metastore:默认情况下,metastore和hive是运行在同一个进程里,这种方式经过测试,在并发中是最稳定的,使用这种方式,暂时没有出现问题。

?

2.2.远程metastore:通过配置hive.metastore.local为false,让 metastore作为一个单独的进程运行,hive客户端都要连接远程metastore才能执行任务,但是在实践中,一样很容易出现远程 metastore无故宕机,同样没有jvm的dump文件,远程metastore程序也毫无输出。

?

如果你是多个机器安装了hive,多个机器共享同一个mysql元数据,那么默认情况下,在并发调用时,会偶尔发生hive—ELETEME找不到的错误,异常可以参考http://mail-archives.apache.org/mod_mbox/hive-user/201107.mbox/%3C4F6B25AFFFCAFE44B6259A412D5F9B1033183876@ExchMBX104.netflix.com%3E

这个错误是hive使用的datanucleus框架的bug,在hive中会去取schme name和catalog,是第三方的库datanucleus在操作,可以看到它创—ELETEME123213一些随机数字的表,然后删掉。。目的 就为了去获取schme name和catalog。而多个机器在并发过程中,datanucleus发现有DELETEME表,会删除,这个会导致创建了DELETEME的 hive进程在访问mysql过程中报错。

要解决这个问题,需要做以下配置:

$HIVE_HOME/bin/hive -S -e "<hive sql>"

?再从管道获取hive的输出,是本人觉得最稳定安全的方式。

备注:执行sql做分析计算,以local的shell方式调用是没啥问题,但是在load data的时候,并发调用依然有问题,hive stats设置为mysql依然无果,只能将load data的代码以synchroize的方式调用,规避并发的问题。

参考?http://hi.baidu.com/youziguo/item/daa1550eb7efa865d45a1175

? ? ? ?http://fatkun.com/2012/04/hive-deleteme-table.html

? ? ? ?http://blog.csdn.net/jiedushi/article/details/6579956

读书人网 >开源软件

热点推荐