hive-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Oleksiy Sayankin (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HIVE-12779) Buffer underflow when inserting data to table
Date Tue, 31 May 2016 11:11:12 GMT

    [ https://issues.apache.org/jira/browse/HIVE-12779?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15307573#comment-15307573
] 

Oleksiy Sayankin commented on HIVE-12779:
-----------------------------------------

Alina has found a workaround for this issue.

*ROOT-CAUSE:*

Consider method 

{code}
  protected int require (int required) throws KryoException 
{code}

from class com.esotericsoftware.kryo.io.Input where exception happens. 

{code}
  int remaining = limit - position;
  if (remaining >= required) return remaining;
  if (required > capacity) throw new KryoException("Buffer too small: capacity:
" + capacity + ", required: " + required);

  int count;
  // Try to fill the buffer.
  if (remaining > 0) {
  count = fill(buffer, limit, capacity - limit);
  if (count == -1) throw new KryoException("Buffer underflow.");
{code}

We can see that exception ("Buffer underflow.") occurs when count == -1. So let us see method
fill(byte[] buffer, int offset, int count) in details:
{code}
  if (inputStream == null) return -1;
  try {
  return inputStream.read(buffer, offset, count);
  } catch (IOException ex) {
  throw new KryoException(ex);
  }
{code}

It returns -1 either when inputStream == null or from inputStream.read(buffer, offset, count).
We definitely know that inputStream can not be equal null here because of constructor:

{code}
  public Input (InputStream inputStream) {
    this(4096);
    if (inputStream == null) throw new IllegalArgumentException("inputStream
cannot be null.");
    this.inputStream = inputStream;
    }
{code}

>From Java docs we know that if no byte is available because the stream is at end of file,
the value -1 is returned by the method  inputStream.read(buffer, offset, count). Hence we
suspect here some errors in HDFS  here that causes -1 to be a return value. Skipping usage
of file system as query plan storage and sending it via RPC directly will fix the issue.


*SOLUTION:*

Use 

{code}
  <property>
    <name>hive.rpc.query.plan</name>
    <value>true</value>
  </property>
{code}

in hive-site.xml as workaround. This property defines whether to send the query plan via local
resource or RPC.

> Buffer underflow when inserting data to table
> ---------------------------------------------
>
>                 Key: HIVE-12779
>                 URL: https://issues.apache.org/jira/browse/HIVE-12779
>             Project: Hive
>          Issue Type: Bug
>          Components: Database/Schema, SQL
>         Environment: CDH 5.4.9
>            Reporter: Ming Hsuan Tu
>            Assignee: Alan Gates
>
> I face a buffer underflow problem when inserting data to table from hive 1.1.0.
> the block size is 128 MB and the data size is only 10MB, but it gives me 891 mappers.
> Task with the most failures(4):
> -----
> Task ID:
>   task_1451989578563_0001_m_000008
> URL:
>   http://0.0.0.0:8088/taskdetails.jsp?jobid=job_1451989578563_0001&tipid=task_1451989578563_0001_m_000008
> -----
> Diagnostic Messages for this Task:
> Error: java.lang.RuntimeException: Failed to load plan: hdfs://tpe-nn-3-1:8020/tmp/hive/alec.tu/af798488-dbf5-45da-8adb-e4f2ddde1242/hive_2016-01-05_18-34-26_864_3947114301988950007-1/-mr-10004/bb86c923-0dca-43cd-aa5d-ef575d764e06/map.xml:
org.apache.hive.com.esotericsoftware.kryo.KryoException: Buffer underflow.
>         at org.apache.hadoop.hive.ql.exec.Utilities.getBaseWork(Utilities.java:450)
>         at org.apache.hadoop.hive.ql.exec.Utilities.getMapWork(Utilities.java:296)
>         at org.apache.hadoop.hive.ql.io.HiveInputFormat.init(HiveInputFormat.java:268)
>         at org.apache.hadoop.hive.ql.io.HiveInputFormat.getRecordReader(HiveInputFormat.java:234)
>         at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getRecordReader(CombineHiveInputFormat.java:701)
>         at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.<init>(MapTask.java:169)
>         at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:432)
>         at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
>         at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at javax.security.auth.Subject.doAs(Subject.java:415)
>         at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
>         at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
> Caused by: org.apache.hive.com.esotericsoftware.kryo.KryoException: Buffer underflow.
>         at org.apache.hive.com.esotericsoftware.kryo.io.Input.require(Input.java:181)
>         at org.apache.hive.com.esotericsoftware.kryo.io.Input.readBoolean(Input.java:783)
>         at org.apache.hive.com.esotericsoftware.kryo.serializers.UnsafeCacheFields$UnsafeBooleanField.read(UnsafeCacheFields.java:120)
>         at org.apache.hive.com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:507)
>         at org.apache.hive.com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:672)
>         at org.apache.hadoop.hive.ql.exec.Utilities.deserializeObjectByKryo(Utilities.java:1069)
>         at org.apache.hadoop.hive.ql.exec.Utilities.deserializePlan(Utilities.java:960)
>         at org.apache.hadoop.hive.ql.exec.Utilities.deserializePlan(Utilities.java:974)
>         at org.apache.hadoop.hive.ql.exec.Utilities.getBaseWork(Utilities.java:416)
>         ... 12 more
> Container killed by the ApplicationMaster.
> Container killed on request. Exit code is 143
> Container exited with a non-zero exit code 143
> Thank you.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message