偏激了一点.
总体来说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功能.
未完待续
分享到:
相关推荐
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是一种基于Hadoop的数据仓库工具,主要用于处理和分析大规模数据。下面是关于HIVE的安装及详解。 HIVE基本概念 HIVE是什么?HIVE是一种数据仓库工具,主要用于处理和分析大规模数据。它将...
然而,在实际操作中,我们经常会遇到一些常见的错误,特别是当Hive运行在Tez引擎上时。这里我们将深入探讨五个在Hive on Tez中常见的报错问题及其解决方案。 1. 错误一:Failing because I am unlikely to write ...
在大数据处理领域,Apache Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询存储在Hadoop集群中的大型数据集。Hive JDBC(Java Database Connectivity)是Hive提供的一种...
如果发现严重问题,需要能够快速恢复到 Hive 3.0 状态。 升级 Hive 从 3.0 到 4.0 是一个复杂的过程,涉及到多个环节,需要谨慎操作。遵循上述步骤,结合 Ambari 的自动化管理能力,可以有效地降低升级风险,确保...
然而,在实际开发过程中,开发者们常常会遇到一些棘手的问题,本文将针对这些常见问题进行深入探讨。 #### 一、Hive中的Dual表 在Oracle数据库中,`dual`表是一种特殊的虚拟表,通常用于测试或执行简单的SQL查询。...
- `commons-lang3-*.jar`等其他依赖库:Hive运行时可能需要的一些通用库。 5. **Kerberos认证** 如果Hive服务器配置了Kerberos安全认证,还需要在DataGrip中配置Kerberos相关参数,如"principal"和"keytab"文件...
在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询和管理存储在Hadoop分布式文件系统(HDFS)中的大量结构化数据。Hive 1.1.0是Hive的一个版本,提供了...
使用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的每个版本都会引入新的特性和性能优化,同时也修复了前一版本中的问题。Hive 3.1.1可能包含如增强的查询优化、更好的SQL兼容性、元数据改进等特性。 Hive的jar包通常包括以下几个核心部分: 1. **Hive Client...
hive-jdbc
描述中提到,“用于Hive和HBase的连接,通过hive操作hbase上的表”,这表明这些JAR文件是为了解决Hive与HBase集成的问题。Hive-HBase连接器允许用户在Hive中创建外部表,将这些表映射到HBase的数据表,从而可以在...
hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+...
Hive 是一个基于 Hadoop 的数据仓库工具,它允许用户使用 SQL 类似的查询语言(称为 HiveQL)来处理和分析存储在 Hadoop 分布式文件系统(HDFS)中的大数据集。Hive 提供了一个数据层,使得非编程背景的用户也能方便...
Hive表生成工具,Hive表生成工具Hive表生成工具
在实际使用过程中,可能会遇到一些常见问题。比如,当使用Spark查询时,可能会因为Spark自带的Hive包与达梦数据库不兼容,导致异常。解决方法是替换Spark环境中的Hive相关库,使用与达梦数据库兼容的版本。 总结...
本文将围绕“Hue常见问题解决方案”这一主题,详细阐述Hue与Hive在大数据平台中可能遇到的问题以及相应的解决策略。 首先,我们来了解Hue的基本功能。Hue是Cloudera公司开发的一款开源Web应用程序,它提供了一个...
Hive是基于Hadoop平台的数据仓库解决方案,它主要解决了在大数据场景下,业务人员和数据科学家能够通过熟悉的SQL语言进行数据分析的问题。Hive并不存储数据,而是依赖于HDFS进行数据存储,并利用MapReduce、Tez或...