Hive 查询因堆问题而失败
Posted
技术标签:
【中文标题】Hive 查询因堆问题而失败【英文标题】:Hive Query failing with Heap Issue 【发布时间】:2015-03-17 16:16:30 【问题描述】:下面是正在运行的 hive 查询,
插入表 temp.table_output
SELECT /*+ STREAMTABLE(tableB) */ c.column1 as client, a.column2 as testData,
CASE WHEN ca.updated_date IS NULL OR ca.updated_date = 'null' THEN null ELSE CONCAT(ca.updated_date, '+0000') END as update
FROM temp.tableA as a
INNER JOIN default.tableB as ca ON a.column5=ca.column2
INNER JOIN default.tableC as c ON ca.column3=c.column1 WHERE a.name='test';
TableB 有 24 亿行(140 GB),TableA 和 TableC 有大约 2 亿条记录。
集群由 3 个 Cassandra 数据节点和 3 个 Analytics 节点(位于 cassandra 之上的 Hive)组成,每个节点有 130GB 内存。
TableA、TableB、TableC 是 Hive 内部表。
Hive 集群堆大小为 12GB。
有人可以告诉我,当我运行 hive 查询时,遇到堆问题并且无法完成任务吗?它是唯一在 Hive 服务器上运行的作业。
任务失败并出现以下错误,
Caused by: java.io.IOException: Read failed from file: cfs://172.31.x.x/tmp/hive-root/hive_2015-03-17_00-27-25_132_17376615815827139-1/-mr-10002/000049_0
at com.datastax.bdp.hadoop.cfs.CassandraInputStream.read(CassandraInputStream.java:178)
at java.io.DataInputStream.readFully(DataInputStream.java:195)
at java.io.DataInputStream.readFully(DataInputStream.java:169)
at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1508)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1486)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1475)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1470)
at org.apache.hadoop.mapred.SequenceFileRecordReader.<init>(SequenceFileRecordReader.java:43)
at org.apache.hadoop.mapred.SequenceFileInputFormat.getRecordReader(SequenceFileInputFormat.java:59)
at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.<init>(CombineHiveRecordReader.java:65)
... 16 more
Caused by: java.io.IOException: org.apache.thrift.TApplicationException: Internal error processing get_remote_cfs_sblock
at com.datastax.bdp.hadoop.cfs.CassandraFileSystemThriftStore.retrieveSubBlock(CassandraFileSystemThriftStore.java:537)
at com.datastax.bdp.hadoop.cfs.CassandraSubBlockInputStream.subBlockSeekTo(CassandraSubBlockInputStream.java:145)
at com.datastax.bdp.hadoop.cfs.CassandraSubBlockInputStream.read(CassandraSubBlockInputStream.java:95)
at com.datastax.bdp.hadoop.cfs.CassandraInputStream.read(CassandraInputStream.java:159)
... 25 more
Caused by: org.apache.thrift.TApplicationException: Internal error processing get_remote_cfs_sblock
at org.apache.thrift.TApplicationException.read(TApplicationException.java:111)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71)
at org.apache.cassandra.thrift.Dse$Client.recv_get_remote_cfs_sblock(Dse.java:271)
at org.apache.cassandra.thrift.Dse$Client.get_remote_cfs_sblock(Dse.java:254)
at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.datastax.bdp.util.CassandraProxyClient.invokeDseClient(CassandraProxyClient.java:655)
at com.datastax.bdp.util.CassandraProxyClient.invoke(CassandraProxyClient.java:631)
at com.sun.proxy.$Proxy5.get_remote_cfs_sblock(Unknown Source)
at com.datastax.bdp.hadoop.cfs.CassandraFileSystemThriftStore.retrieveSubBlock(CassandraFileSystemThriftStore.java:515)
... 28 more
Hive.log
2015-03-17 23:10:39,576 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_r_000023 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,579 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_r_000052 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,582 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_m_000207 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,585 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_r_000087 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,588 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_m_000223 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,591 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_m_000045 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,594 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_m_000235 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,597 ERROR exec.Task (SessionState.java:printError(419)) - Examining task ID: task_201503171816_0036_m_002140 (and more) from job job_201503171816_0036
2015-03-17 23:10:39,761 ERROR exec.Task (SessionState.java:printError(419)) -
Task with the most failures(4):
-----
Task ID:
task_201503171816_0036_m_000036
URL:
http://sjvtncasl064.mcafee.int:50030/taskdetails.jsp?jobid=job_201503171816_0036&tipid=task_201503171816_0036_m_000036
-----
Diagnostic Messages for this Task:
Error: Java heap space
2015-03-17 23:10:39,777 ERROR ql.Driver (SessionState.java:printError(419)) - FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
【问题讨论】:
我在堆栈跟踪中没有看到任何表明堆问题的内容。您能否发布/检查 hive 和 hadoop 日志? 我认为这是一个堆问题,因为所有 3 个节点上的内存都已用尽。您能从经验中想到其他任何事情,还有什么可能导致它?这不是 hive 的生产就绪配置,所以我愿意接受配置建议,如果/哪个可以解决这个问题。百万*百万连接的查询工作正常。问题从十亿 * 百万加入开始 RAM 可能因为不相关的原因而被最大化,它被最大化并没有错。请尝试获取并检查相关节点上的 HIVE 和 HADOOP 日志,尤其是在故障节点上。 从 hive.log 添加了日志。看来确实是Heap问题。我很好奇此类服务器上通常的集群堆大小(当前为 12gb),或者分叉作业从其他地方获取堆大小? 我在回答中提供了一些链接,因为这样更容易。您需要根据您提供给它们的 JVM 堆内存量来限制 map 和 reduce 任务的数量。您可以增加堆大小,但您还需要调整新一代内存大小的大小,以避免令人讨厌的 GC 暂停。所有 hadoop 设置说明也在这些链接中。 【参考方案1】:大多数时候,跟踪器端的 hadoop 错误不是很具有描述性 - 例如“从其中一个节点检索数据时出现问题”。为了弄清楚到底发生了什么,你需要从每个节点获取 system.log,包括 hive 和 hadoop 任务日志,尤其是那些没有按时返回数据的日志,并查看问题出在哪里错误发生的时间。在 Ops Center 中,您实际上可以单击正在进行的 hive 作业并查看每个节点上发生的情况,然后查看导致作业中断的错误是什么。
这里有一些我觉得非常有用的链接。其中一些链接适用于旧版本的 DSE,但它们仍然为如何优化 Hadoop 操作和内存管理提供了一个良好的开端。
http://www.datastax.com/dev/blog/tuning-dse-hadoop-map-reduce
http://www.datastax.com/documentation/datastax_enterprise/4.0/datastax_enterprise/ana/anaHivTune.html
https://support.datastax.com/entries/23459322-Tuning-memory-for-Hadoop-tasks
https://support.datastax.com/entries/23472546-Specifying-the-number-of-concurrent-tasks-per-node
您可能还想阅读this article。有时,超时可能是由于主要的垃圾收集。
HTH
【讨论】:
以上是关于Hive 查询因堆问题而失败的主要内容,如果未能解决你的问题,请参考以下文章