我在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)
请就此问题提出建议。
答案 0 :(得分:1)
您正在调用的copyBytes()
的重载会在副本末尾关闭输入流。
使用另一个。