获取异常:IOException输入缓冲区在提取tar文件时被关闭异常

时间:2016-08-23 10:15:48

标签: java hadoop apache-spark hdfs

我在HDFS上有一些tar文件。我的目标是提取这些文件&在HDFS上存储提取的文件。

例如:

这是我的输入目录结构(HDFS)。

final ArrayList<Item> data = new ArrayList<>();
MyAdapter myAdapter = new MyAdapter(data,new MyAdapter.MyOnItemClickListener()
{
     @Override
     public void myOnItemClick(int button, int position) {
           Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));         
           startActivity(intent);
     }
}, getContext());
recView.setAdapter(myAdapter);

预期输出将为:

Path : /data/160823 -->
 --------
| 160823 |
 --------
  |
  | --- 00
        |----- xyz.tar
        |----- xyz2.tar

  | --- 01
        |----- xyz3.tar
        |----- abc2.tar

  | --- 02
        |----- abc3.tar
        |----- abc4.tar

   .
   .
   .
   --- 23
        |----- pqr.tar
        |----- pqr2.tar

我的代码提取这些tar文件并将这些文件存储到HDFS上的路径中。

所以我能够提取第一个.tar文件&amp;能够在HDFS上存储输出,但在读完下一个.tar文件之后,我得到了这个例外。

 --------
| Output |
 --------
  |
  |----- xyz.gz
  |----- xyz2.gz

这是我的代码段,

java.io.IOException: input buffer is closed
    at org.apache.commons.compress.archivers.tar.TarBuffer.readRecord(TarBuffer.java:190)
    at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getRecord(TarArchiveInputStream.java:302)
    at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:230)
    at com.lsr.TarMapper.call(TarMapper.java:53)
    at com.lsr.TarMapper.call(TarMapper.java:1)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$1$1.apply(JavaRDDLike.scala:129)
    at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$1$1.apply(JavaRDDLike.scala:129)
    at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371)
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327)
    at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:126)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
    at org.apache.spark.scheduler.Task.run(Task.scala:89)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

请就此问题提出建议。

1 个答案:

答案 0 :(得分:1)

您正在调用的copyBytes()的重载会在副本末尾关闭输入流。

使用另一个。