Hadoop分布式缓存归档在工作目录中未归档

Hadoop分布式缓存归档在工作目录中未归档,hadoop,apache-pig,Hadoop,Apache Pig,我正在通过–Dmapred.cache.archives向分布式缓存发送归档文件=hdfs://host:port/path/archive.zip#foldername –D.mapred.create.symlink=yes并在工作目录中创建一个新文件夹,并取消归档其中的文件。问题是我需要工作目录中的这些文件,我已经尝试使用和/作为文件夹名,并发送了一个空文件。除了在我的Java代码中显式移动文件之外,还有其他解决方法吗?文件在工作目录中的具体需求是什么(这样我可以理解,并提出一些替代方案)

我正在通过
–Dmapred.cache.archives向分布式缓存发送归档文件=hdfs://host:port/path/archive.zip#foldername –D.mapred.create.symlink=yes
并在工作目录中创建一个新文件夹,并取消归档其中的文件。问题是我需要工作目录中的这些文件,我已经尝试使用
/
作为文件夹名,并发送了一个空文件。除了在我的Java代码中显式移动文件之外,还有其他解决方法吗?

文件在工作目录中的具体需求是什么(这样我可以理解,并提出一些替代方案)

无论如何,看起来分布式缓存中的归档文件总是会被解包到一个目录中,所以我不认为您可以使用归档文件来解决这个问题-但是,根据您希望放置在工作目录中的文件数量,您可以使用分布式缓存中的文件

例如,使用GenericOptionsParser参数,您可以指定要包含的文件和文件夹,这些文件和文件夹随后在工作目录中可用:

public static class DistCacheMapper extends
        Mapper<LongWritable, Text, NullWritable, NullWritable> {
    @Override
    public void run(Context context) throws IOException,
            InterruptedException {
        Configuration conf = context.getConfiguration();

        System.err.println("Local Files:");
        listFiles(new File("."), "");
    }

    private void listFiles(File dir, String ident) {
        for (File f : dir.listFiles()) {
            System.out.println(ident + (f.isDirectory() ? "d" : "-") + "\t"
                    + f.getName());
            if (f.isDirectory()) {
                listFiles(f, ident + "  ");
            }
        }
    }
}

总之,您必须在Dist Cache files的工作目录中列出所有需要的文件,子目录可以作为归档文件列出,也可以作为使用文件列出。

谢谢您的详细回答。我知道我可以使用的大多数替代方案,但我发现使用归档在大小方面效率最高,而且最容易维护(例如,我可以在不更改任何其他内容的情况下向其中添加更多文件)
-   .classpath
-   .project
d   tmp
-   pom.xml
d   src
  d test
    d   resources
    d   java
  d main
    d   resources
    d   java
      d csw
        d   sandbox
          - DistCacheJob.java
          - .DistCacheJob.java.crc
-   job.jar
-   .job.jar.crc