我正在尝试在 Hive 0.9 中的表上创建索引。一个表有 10 亿行,另一个有 3000 万行。我使用的命令是(除了创建表等)
CREATE INDEX DEAL_IDX_1 ON TABLE DEAL (ID) AS
'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD;
alter index DEAL_IDX_1 ON DEAL rebuild;
set hive.optimize.autoindex=true;
set hive.optimize.index.filter=true;
对于 30 磨坊。行表,重建过程看起来还不错(映射器和减速器都完成了),直到最后它打印
Invalid alter operation: Unable to alter index.
FAILED: Execution Error, return code 1
from org.apache.hadoop.hive.ql.exec.DDLTask
检查日志,它有错误
java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver"
不知道为什么会遇到这个错误,但无论如何,我添加了 derby-version.jar:
add jar /path/derby-version.jar
报告的错误已解决,但仍然出现另一个错误:
org.apache.hadoop.hive.ql.exec.FileSinkOperator:
StatsPublishing error: cannot connect to database
不知道如何解决问题。不过,我确实在 hive/warehouse 下看到了创建的索引表。
对于 10 亿行的表格,情况就另当别论了。映射器刚刚卡在 2% 左右。并显示错误
FATAL org.apache.hadoop.mapred.Child: Error running child :
java.lang.OutOfMemoryError: Java heap space
我试图强制执行最大堆大小以及最大映射内存(请参阅某处提到的设置,但未在配置单元的配置设置中):
set mapred.child.java.opts = -Xmx6024m
set mapred.job.map.memory.mb=6000;
set mapred.job.reduce.memory.mb=4000;
但是,这无济于事。映射器仍会因相同的错误而卡在 2%。