前言
使用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报DELETEME找不到的错误,异常可以参考http://mail-archives.apache.org/mod_mbox/hive-user/201107.mbox/%3C4F6B25AFFFCAFE44B6259A412D5F9B1033183876@ExchMBX104.netflix.com%3E
这个错误是hive使用的datanucleus框架的bug,在hive中会去取schme name和catalog,是第三方的库datanucleus在操作,可以看到它创建DELETEME123213一些随机数字的表,然后删掉。。目的 就为了去获取schme name和catalog。而多个机器在并发过程中,datanucleus发现有DELETEME表,会删除,这个会导致创建了DELETEME的 hive进程在访问mysql过程中报错。
要解决这个问题,需要做以下配置:
<property> <name>datanucleus.fixedDatastore</name> <value>true</value> </property> <property> <name>datanucleus.autoCreateSchema</name> <value>false</value> </property>
但是要注意:这个配置需要在让hive在第一次初始化好后,才能启动,因为第一次会自动创建元数据。
但是,这个配置会导致hive不会自动创建元数据,而第一次初始化时,不是全部的元数据会建好的,所以这个配置需要折中平衡,建议是没有并发调用不 启动这个配置,如果有并发调用启动,但是最好配置两种hive实例,一种不启动这个配置,作为日常的建表维护,一种作为定时任务,并发调用hive。
hive的并发调用,是很容易遇到问题的,要小心处理。
总结
个人经验,如果需要并发调用hive,首先要配置hive的元数据为mysql数据库,最好是通过内嵌metastore的方式去调用hive,通 过执行
$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
相关推荐
在Java编程环境中,与Hive进行交互通常涉及使用Hive JDBC驱动程序,这是一种允许Java应用程序通过JDBC(Java Database Connectivity)接口与Hadoop上的Hive数据仓库进行通信的方式。本实例将聚焦于如何使用Java和...
- **8.8 Join中处理null值的语义区别**:Hive处理NULL值的方式可能与传统SQL不同。 #### 九、优化与技巧 - **9.1 全排序**:对于大规模数据集进行全排序可能会导致性能问题。 - **9.2 怎样做笛卡尔积**:在特定...
Hive 优化方法整理 Hive 优化方法整理是 Hive 数据处理过程中的重要步骤,涉及到 Hive 的类 SQL 语句本身进行调优、参数调优、Hadoop 的 HDFS 参数调优和 Map/Reduce 调优等多个方面。 Hive 类 SQL 语句优化 1. ...
Hive元数据库存储了Hive内部的元数据信息,这些信息包括表结构、数据类型和表间关系等,是Hive正常运行所必需的。 Hive支持多种元数据库,包括DERBY和MySQL。DERBY是一个轻量级的数据库,仅适合单用户测试和开发...
Hive提供了一个基于SQL的接口,允许开发者以结构化的方式访问分布式存储的数据。 在Java中,JDBC是一种标准的API,它允许程序员用统一的方式来访问各种类型的数据库。为了连接到Hive,我们需要Hive JDBC驱动,这个...
这意味着如果你在进行多用户并发测试或生产环境部署时,这种方式并不适用。 2. **Local方式**(本地MySQL): - **特点**:通过配置让Hive连接本地安装的MySQL服务器来存储元数据。 - **优势**:相比Derby,...
调用流树以层次结构的方式展示了程序执行过程中的函数调用顺序,帮助开发者直观地查看控制流。 ### 使用Hive Callflow 要使用`cppflow`,用户需要在每个需要跟踪的函数开头插入预定义的宏。虽然目前这一步需要手动...
- 两者可以通过Hive-on-HBase的方式结合使用,即利用Hive的SQL接口来查询HBase中的数据,增强了HBase的查询灵活性。 #### 2. HBase数据结构 **知识点解析:** HBase的数据模型主要由行键(Row Key)、列族(Column...
这个工具使得在分布式环境中对大数据处理变得更加便捷,因为Hive通常用于存储和查询大规模数据集,而REST API则提供了轻量级、灵活的远程调用方式。以下是关于HiveAPI、REST API、Apache Hive以及相关技术的详细解释...
### Hive高级编程知识点详解 #### 一、Hive组件概览 Hive 是一个基于 Hadoop 的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能,使得 Hadoop 更加易用。Hive 的主要组成部分...
这种方式提高了查询的并发性和系统的整体可用性。 通过这些改进,BIGO成功地优化了Ad-Hoc分析流程,增强了系统的稳定性和用户友好性。未来,他们将继续关注性能优化、新特性的引入以及对更多数据源的支持,以满足日...
为了更好地管控 DataX 的任务,我们需要使用 Java 集成的方式去调用 DataX,並返回任务执行的详细信息。 在使用 Java 调用 DataX 之前,我们需要了解 DataX 的源码结构。从 GitHub 上下载 DataX 的源码,并跟踪源码...
- **使用**:可以通过命令行工具调用该脚本来执行测试,并查看结果。 - **TeraSort Benchmark Suite** - **样例代码**:实现了一套完整的排序基准测试,包括生成随机数据、排序以及验证排序正确性等功能。 - **...
- **一致性**:保证数据的一致性,即使在并发访问的情况下。 - **高效性**:系统需要高效地处理读写操作。 - **容错性**:具备自动故障检测和恢复机制。 - **易用性**:提供简单易用的API供应用程序调用。 - **...
- Hive更适合于批处理和数据分析,而HBase更适合于实时查询和高并发操作。 4. **TCP连接过程**: - TCP的三次握手确保了连接的可靠建立。 - 断开连接是通过四次挥手完成的,确保数据传输完整且释放资源。 5. **...
- **取消Job**:如果需要终止正在运行的Job,可以调用`JobClient.killJob()`方法。 #### 十、Hadoop集群的配置调优 为了获得最佳性能,需要对Hadoop集群进行细致的配置调优。 **调优技巧**: - **内存配置**:...
- 以及其他相关项目如Hive、Pig等。 - **Hadoop核心组成介绍** - HDFS负责数据存储。 - MapReduce负责数据处理。 - **Hadoop生态圈结构** - 包括数据存储、数据处理、数据访问等多个层面。 - **Hadoop安装与配置...
- **系统环境**: SoapUI基于Java开发,因此在安装前需要确保计算机上已经安装了Java运行环境,并且设置了`JAVA_HOME`环境变量指向JRE目录,同时需要将JRE bin目录添加到系统路径中。 - **安装步骤**: 下载对应的...
- **API接口**:通过调用外部API获取数据,适用于获取结构化的数据。 - **ETL工具**:如Apache Nifi,用于从多种数据源抽取、转换和加载数据。 **2. 数据清洗的过程和步骤有哪些?如何处理用户输入的脏数据?** - ...