首页 > 解决方案 > Hive 查询失败,异常意外结束输入流

问题描述

尝试从 hive 中 HDFS 中存在的 .gz 日志文件构建外部 hive 表。运行查询后:

CREATE EXTERNAL TABLE table_name(att1 STRING,att3 STRING,att4 STRING,att5 STRING) row format serde "org.openx.data.jsonserde.JsonSerDe" with serdeproperties ("ignore.malformed.json"="true") STORED AS TEXTFILE LOCATION 'hdfs:////hdfs_location/';

当我跑步时

   select count(*) from table_name;

它通过给出以下堆栈跟踪失败:

TaskAttempt 2 失败,info=[错误:运行任务时出错(失败):尝试_1534417036833_0016_1_00_000054_2:java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:java.io.IOException:java.io.EOFException :在 org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run( TezProcessor.java:168) 在 org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:370) 在 org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:73) 在 org. apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:61) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject。doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1836) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:61) at org .apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:37) at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36) at java.util.concurrent.FutureTask.run(FutureTask .java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run( Thread.java:748) 引起:org.apache.hadoop.hive.ql.metadata.HiveException: java.io.IOException: java.io.EOFException: org.apache.hadoop.hive.ql 的输入流意外结束.exec.tez。MapRecordSource.pushRecord(MapRecordSource.java:74) 在 org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.run(MapRecordProcessor.java:419) 在 org.apache.hadoop.hive.ql.exec.tez。 TezProcessor.initializeAndRunProcessor(TezProcessor.java:185) ... 14 更多

我尝试通过验证 json 来查看内容。运行一个 ruby​​ 脚本来检查内容:

require "zlib"
require "json"

path = "/home/test_directory/file.gz"
infile = open(path)
gz = Zlib::GzipReader.new(infile)

gz.each_line do |line_content|      
    begin
        JSON.parse(line_content)  
    rescue JSON::ParserError => e  
        p "json parsing exception" + " -- " + line_content.strip
    rescue Exception => ex
        puts "An error of type #{ex.class} happened, message is #{ex.message}"
    end 
end

它给了我文件中某些行的异常消息:

发生 Encoding::InvalidByteSequenceError 类型的错误,消息为 US-ASCII 上的“\xC3”

尝试根据此修改我的查询:https ://community.hortonworks.com/articles/58548/processing-files-in-hive-using-native-non-utf8-cha.html 修改是在创建外部表后添加此行:

 ALTER TABLE table_name SET SERDEPROPERTIES ('serialization.encoding'='SJIS');

它起作用了。PS:这不是一些在线论坛中讨论的空文件问题,因为我在 hdfs 中没有空白文件。

我能做些什么,它似乎是一些字符编码问题,但无法获得解决方案。

标签: javahadoophivecharacter-encodingurlencode

解决方案


推荐阅读