1

経由–Dmapred.cache.archives=hdfs://host:port/path/archive.zip#foldername –D.mapred.create.symlink=yesで分散キャッシュにアーカイブを送信しています。作業ディレクトリに新しいフォルダーが作成され、そこにあるファイルがアーカイブ解除されます。問題は、作業ディレクトリにこれらのファイルが必要であり、空のフォルダー名を送信するだけでなく、フォルダー名として使用しようとし.たことです。./私のJavaコードでファイルを明示的に移動する以外に、これを解決する方法についてのアイデアはありますか?

4

1 に答える 1

0

ファイルが作業ディレクトリにある特定の必要性は何ですか (そのため、いくつかの代替案を理解し、提案することができます)。

とにかく、分散キャッシュ内のアーカイブは常にディレクトリに解凍されるように見えるので、アーカイブを使用してこれを解決できるとは思わない-ただし、作業ディレクトリに配置するファイルの数によっては、使用できますDistributedCache 内のファイル。

たとえば、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 + "  ");
            }
        }
    }
}

たとえばhadoop jar myjar.jar -files pom.xml,.project,.classpath,src dummy.txt、stderr で次のように表示されます (src フォルダーが取得されていることがわかります)。

-   .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

したがって、要するに、作業ディレクトリに必要なすべてのファイルを Dist Cache ファイルにリストする必要があり、サブディレクトリはアーカイブとして、またはファイルを使用してリストすることもできます。

于 2012-08-11T02:38:28.217 に答える