`
coderplay
  • 浏览: 577030 次
  • 性别: Icon_minigender_1
  • 来自: 广州杭州
社区版块
存档分类
最新评论

Hive的一些问题

阅读更多

偏激了一点.

总体来说Hive的思想是不错的, 思路是清晰的, 但代码也是啰嗦的, 简单的功能非得涉及到3,4个类,有时候十多个类。

 

1. 实现代码过量使用自己造的术语以及由它们引申的术语,导致代码理解起来非常困难, 例如SerDe(DynamicSerDe, LazySimpleSerDe), 如果说SerDe从字面Deserializer+Serializer还比较好理解的话. 那么RowResolver, ObjectInspector就无从知道了,  更严重的是这些关键类几乎没有文档说明, 而且这些类都有密切的关系. 

还有一例:  *Desc,  *Work, *Task. 静下心来, 还是能理解的, 为了序列化成必须有像*Desc这样的东西, 但这些东西一多, 就会看到代码充斥着这些类的实例, 而且非常多代码去维护它们之间的关系. 

 

2. thrift, thrift这东西本来就不是开源界所广泛接受的东西,当然facebook使用自己的东西也无可厚非. 但如果要把HiveServer做成多用户的Server, thrift行不行那还得考量. 我尝试过, 这种RPC做各进程交换数据, 相互调用还是非常方便的, 但是做Server不是很方便.

 

3. SessionState. 使用ThreadLocal将各会话的数据进行线程封闭, 造成了太多地方使用SessionState.get(). 像全局变量一样, 引入隐晦的类间耦合.

 

4.  细节. reduceSinkDesc里有两个tableDesc成员变量,乍一看让人不解.  map输出操作的时候, 要table描述干嘛? 仔细一看, 其实只要用到它的序列化及反序列化功能.  在PlanUtils. getBinarySortableTableDesc()方法内大张旗鼓地向tableDesc灌入DynamicSerDe, SequenceFileInputFormat, SequenceFileOutputFormat...实际上ReduceSinkOperator只需要那个SerDe去解析key/value.

这个tableDesc很滑稽. groupby_key+ distinct_key形成了ExecMapper要输出的key, reducekey由SemanticAnalyzer. genGroupByPlanReduceSinkOperator()组合, 然后调用PlanUtils.getReduceSinkDesc()方法按照keyCols建立一个tableDesc, 它的ddl样子如下

struct binary_sortable_table

{

  类型名  reducekey0,

  类型名  reducekey1,

  ...

}

这个tableDesc开始是放在reduceSinkDesc中的, 用来给mapper序列化key, 但是reducer得到key要反序列化它啊, 否则怎么知道这个key的内容?  所以reducer也要得到这个tableDesc. 怎么得到呢? 在mapredWork里面有个tableDesc keyDesc, 在hdfs上建立plan.[0-9]+文件,reducer可以从这里得到。 但这个tableDesc是怎么传给mapredWork的呢? 本来它是在reduceSinkDesc里面啊.  仔细一找, SemanticAnalyzer.analyzeInteral的最后一步genMapRedTasks(qb) ->setKeyDescTaskTree(rootTask) ->GenMapRedUtils.setKeyAndValueDesc(work, op) -> ReduceSinkOperator rs = (ReduceSinkOperator)topOp; plan.setKeyDesc(rs.getConf().getKeySerializeInfo());

 

曲曲折折, 终于把这个tableDesc从reduceSinkDesc赋给了mapredWork, 终于reducer可以得到它了, 上帝都感动得哭了!

 

 

5. 细节.   GenericUDF不错, 但initialize必须得返回非null实例, 否则hive会抛出NullPointerException而crash.  造成一下假设: 扩展人员知道这个情况, 但很多时候大家是不知道的. 

GenericUDFUtils.ReturnObjectInspectorResolver. update(oi), 如果传进去的oi一直为null, 那它由get()返回的ObjectInspector必定为null, 从而initialize()返回null, 作者本人都不知道会有这种情况.

看GenericUDFHash的代码, initialize返回一个PrimitiveObjectInspectorFactory.writableIntObjectInspector作为trick,  骗骗其它的代码.  其实在evaluate的时候根本没用. 好的代码不应该给别人造成side impression(not effect here).

 

6. 看过代码,你会发现解析thrift文法(如DynamicSerDe类)用的是JavaCC做的lexer&parser, 而Hive的sql解析则用的是antlr生成的lexer&parser.也就是说,要掌握hive这个项目,你至少要会两种CC.

 

7. 细节. reduceSinkDesc有两个成员keyCols和partitionCols, 分别用来做为map输出的key和partition, 其实在group by的时候.  partitionCols是reduceSinkDesc的一部分. 没有必要copy成两份, 这个partitionCols没有带来更灵活的partition功能.

 

 

 

未完待续

 

 

分享到:
评论
2 楼 coderplay 2011-05-27  
fuyanqing03 写道
你好,我想问一下,hive必须和hadoop的master装在一台机器上吗? 如果可以分开应该怎么配置。


不用. hive只是hadoop的一个client,只需要配置在集群外, 能提交hadoop作业就可以.
1 楼 fuyanqing03 2011-05-26  
你好,我想问一下,hive必须和hadoop的master装在一台机器上吗? 如果可以分开应该怎么配置。

相关推荐

    Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践

    Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践 ...但是,Hive也存在一些常见问题,例如慢查询问题、数据倾斜问题、资源不足问题等。因此,在使用Hive时,需要注意这些问题,并采取相应的解决方法。

    hive客户端安装_hive客户端安装_hive_

    创建一个测试数据库和表,然后插入一些数据,验证Hive是否正常工作。例如: ``` CREATE DATABASE testdb; USE testdb; CREATE TABLE test_table (id INT, name STRING); LOAD DATA LOCAL INPATH '/path/to/data.txt'...

    hive的一些报错及解决方法

    ### Hive的一些报错及解决方法 #### 一、Hive连接报错 在更换网络接口卡后重新启动服务时,可能会遇到Hive连接失败的问题。此类问题通常与元数据存储中的异常有关,例如存在多个版本的元数据或者端口被其他服务...

    HIVE安装及详解

    "HIVE安装及详解" HIVE是一种基于Hadoop的数据仓库工具,主要用于处理和分析大规模数据。下面是关于HIVE的安装及详解。 HIVE基本概念 HIVE是什么?HIVE是一种数据仓库工具,主要用于处理和分析大规模数据。它将...

    hive on tez 常见报错问题收集

    然而,在实际操作中,我们经常会遇到一些常见的错误,特别是当Hive运行在Tez引擎上时。这里我们将深入探讨五个在Hive on Tez中常见的报错问题及其解决方案。 1. 错误一:Failing because I am unlikely to write ...

    hive开发中常遇到的坑

    然而,在实际开发过程中,开发者们常常会遇到一些棘手的问题,本文将针对这些常见问题进行深入探讨。 #### 一、Hive中的Dual表 在Oracle数据库中,`dual`表是一种特殊的虚拟表,通常用于测试或执行简单的SQL查询。...

    Ambari下Hive3.0升级到Hive4.0

    如果发现严重问题,需要能够快速恢复到 Hive 3.0 状态。 升级 Hive 从 3.0 到 4.0 是一个复杂的过程,涉及到多个环节,需要谨慎操作。遵循上述步骤,结合 Ambari 的自动化管理能力,可以有效地降低升级风险,确保...

    连接hive依赖的jar包_hive连接方式

    - `commons-lang3-*.jar`等其他依赖库:Hive运行时可能需要的一些通用库。 5. **Kerberos认证** 如果Hive服务器配置了Kerberos安全认证,还需要在DataGrip中配置Kerberos相关参数,如"principal"和"keytab"文件...

    Hive_JDBC.zip_hive java_hive jdbc_hive jdbc pom_java hive_maven连

    在大数据处理领域,Apache Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询存储在Hadoop集群中的大型数据集。Hive JDBC(Java Database Connectivity)是Hive提供的一种...

    Hive驱动1.1.0.zip

    在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询和管理存储在Hadoop分布式文件系统(HDFS)中的大量结构化数据。Hive 1.1.0是Hive的一个版本,提供了...

    Hive3.1.2编译源码

    使用hive3.1.2和spark3.0.0配置hive on spark的时候,发现官方下载的hive3.1.2和spark3.0.0不兼容,hive3.1.2对应的版本是spark2.3.0,而spark3.0.0对应的hadoop版本是hadoop2.6或hadoop2.7。 所以,如果想要使用高...

    hive相关jar包

    Hive的每个版本都会引入新的特性和性能优化,同时也修复了前一版本中的问题。Hive 3.1.1可能包含如增强的查询优化、更好的SQL兼容性、元数据改进等特性。 Hive的jar包通常包括以下几个核心部分: 1. **Hive Client...

    hive-jdbc hive jdbc驱动

    hive-jdbc

    hive所有jar文件

    描述中提到,“用于Hive和HBase的连接,通过hive操作hbase上的表”,这表明这些JAR文件是为了解决Hive与HBase集成的问题。Hive-HBase连接器允许用户在Hive中创建外部表,将这些表映射到HBase的数据表,从而可以在...

    hive-site.xml

    hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+...

    hive

    Hive 是一个基于 Hadoop 的数据仓库工具,它允许用户使用 SQL 类似的查询语言(称为 HiveQL)来处理和分析存储在 Hadoop 分布式文件系统(HDFS)中的大数据集。Hive 提供了一个数据层,使得非编程背景的用户也能方便...

    Hive表生成工具,Hive表生成工具Hive表生成工具

    Hive表生成工具,Hive表生成工具Hive表生成工具

    Hue 常见问题解决方案,大数据平台的hue/hive常见问题总结 免费下载

    本文将围绕“Hue常见问题解决方案”这一主题,详细阐述Hue与Hive在大数据平台中可能遇到的问题以及相应的解决策略。 首先,我们来了解Hue的基本功能。Hue是Cloudera公司开发的一款开源Web应用程序,它提供了一个...

    Hive metastore 使用达梦数据库存储元数据

    在实际使用过程中,可能会遇到一些常见问题。比如,当使用Spark查询时,可能会因为Spark自带的Hive包与达梦数据库不兼容,导致异常。解决方法是替换Spark环境中的Hive相关库,使用与达梦数据库兼容的版本。 总结...

    Hive总结.docx

    Hive是基于Hadoop平台的数据仓库解决方案,它主要解决了在大数据场景下,业务人员和数据科学家能够通过熟悉的SQL语言进行数据分析的问题。Hive并不存储数据,而是依赖于HDFS进行数据存储,并利用MapReduce、Tez或...

Global site tag (gtag.js) - Google Analytics