it-swarm.com.de

Hadoop DistributedCache ist veraltet - was ist die bevorzugte API?

Meine Map-Aufgaben benötigen Konfigurationsdaten, die ich über den verteilten Cache verteilen möchte.

Das Hadoop MapReduce-Tutorial zeigt die usage der DistributedCache-Klasse in etwa wie folgt:

// In the driver
JobConf conf = new JobConf(getConf(), WordCount.class);
...
DistributedCache.addCacheFile(new Path(filename).toUri(), conf); 

// In the mapper
Path[] myCacheFiles = DistributedCache.getLocalCacheFiles(job);
...

In Hadoop 2.2.0 ist jedoch DistributedCacheals veraltet markiert .

Was ist der neue bevorzugte Weg, um dies zu erreichen? Gibt es ein aktuelles Beispiel oder Lernprogramm, das diese API behandelt?

34
DNA

Die APIs für den verteilten Cache befinden sich in der Jobklasse selbst. Überprüfen Sie die Dokumentation hier: http://hadoop.Apache.org/docs/stable2/api/org/Apache/hadoop/mapreduce/Job.html Der Code sollte ungefähr so ​​aussehen 

Job job = new Job();
...
job.addCacheFile(new Path(filename).toUri());

In Ihrem Mapper-Code: 

Path[] localPaths = context.getLocalCacheFiles();
...
49
user2371156

Um auf @jtravaglini zu erweitern, verwenden Sie DistributedCache für YARN/MapReduce 2 vorzugsweise wie folgt:

Verwenden Sie in Ihrem Treiber die Job.addCacheFile()

public int run(String[] args) throws Exception {
    Configuration conf = getConf();

    Job job = Job.getInstance(conf, "MyJob");

    job.setMapperClass(MyMapper.class);

    // ...

    // Mind the # sign after the absolute file location.
    // You will be using the name after the # sign as your
    // file name in your Mapper/Reducer
    job.addCacheFile(new URI("/user/yourname/cache/some_file.json#some"));
    job.addCacheFile(new URI("/user/yourname/cache/other_file.json#other"));

    return job.waitForCompletion(true) ? 0 : 1;
}

Und überschreiben Sie in Ihrem Mapper/Reducer die setup(Context context)-Methode:

@Override
protected void setup(
        Mapper<LongWritable, Text, Text, Text>.Context context)
        throws IOException, InterruptedException {
    if (context.getCacheFiles() != null
            && context.getCacheFiles().length > 0) {

        File some_file = new File("./some");
        File other_file = new File("./other");

        // Do things to these two files, like read them
        // or parse as JSON or whatever.
    }
    super.setup(context);
}
20
tolgap

Die neue DistributedCache-API für YARN/MR2 befindet sich in der Klasse org.Apache.hadoop.mapreduce.Job.

   Job.addCacheFile()

Leider gibt es dafür nicht viele umfassende Tutorials.

http://hadoop.Apache.org/docs/stable/api/org/Apache/hadoop/mapreduce/Job.html#addCacheFile%28Java.net.URI%29

5
jtravaglini

Ich habe job.addCacheFile () nicht verwendet. Stattdessen habe ich die Option -files wie "-files /path/to/myfile.txt#myfile" wie zuvor verwendet. Dann verwende ich im Mapper- oder Reducer-Code die folgende Methode:

/**
 * This method can be used with local execution or HDFS execution. 
 * 
 * @param context
 * @param symLink
 * @param throwExceptionIfNotFound
 * @return
 * @throws IOException
 */
public static File findDistributedFileBySymlink(JobContext context, String symLink, boolean throwExceptionIfNotFound) throws IOException
{
    URI[] uris = context.getCacheFiles();
    if(uris==null||uris.length==0)
    {
        if(throwExceptionIfNotFound)
            throw new RuntimeException("Unable to find file with symlink '"+symLink+"' in distributed cache");
        return null;
    }
    URI symlinkUri = null;
    for(URI uri: uris)
    {
        if(symLink.equals(uri.getFragment()))
        {
            symlinkUri = uri;
            break;
        }
    }   
    if(symlinkUri==null)
    {
        if(throwExceptionIfNotFound)
            throw new RuntimeException("Unable to find file with symlink '"+symLink+"' in distributed cache");
        return null;
    }
    //if we run this locally the file system URI scheme will be "file" otherwise it should be a symlink
    return "file".equalsIgnoreCase(FileSystem.get(context.getConfiguration()).getScheme())?(new File(symlinkUri.getPath())):new File(symLink);

}

Dann in Mapper/Reducer:

@Override
protected void setup(Context context) throws IOException, InterruptedException
{
    super.setup(context);

    File file = HadoopUtils.findDistributedFileBySymlink(context,"myfile",true);
    ... do work ...
}

Wenn ich "-files /path/to/myfile.txt" direkt verwendet habe, muss ich "myfile.txt" verwenden, um auf die Datei zuzugreifen, da dies der Standardname des Symlinks ist.

2
Jackie Jiang

Keine der genannten Lösungen funktionierte für mich vollständig. Es könnte sein, dass sich die Hadoop-Version ständig ändert. Ich verwende hadoop 2.6.4. Im Wesentlichen ist DistributedCache veraltet, daher wollte ich das nicht verwenden. Da einige der Beiträge darauf hinweisen, dass wir addCacheFile () verwenden, hat sich dies etwas geändert. So funktioniert es für mich

job.addCacheFile(new URI("hdfs://X.X.X.X:9000/EnglishStop.txt#EnglishStop.txt"));

Hier kann X.X.X.X eine Master-IP-Adresse oder ein localhost sein. Die Datei EnglishStop.txt wurde in/HDFS in HDFS gespeichert. 

hadoop fs -ls /

Die Ausgabe ist 

-rw-r--r--   3 centos supergroup       1833 2016-03-12 20:24 /EnglishStop.txt
drwxr-xr-x   - centos supergroup          0 2016-03-12 19:46 /test

Lustig, aber praktisch: # EnglishStop.txt bedeutet, dass wir jetzt als "EnglishStop.txt" im Mapper darauf zugreifen können. Hier ist der Code für das gleiche

public void setup(Context context) throws IOException, InterruptedException     
{
    File stopwordFile = new File("EnglishStop.txt");
    FileInputStream fis = new FileInputStream(stopwordFile);
    BufferedReader reader = new BufferedReader(new InputStreamReader(fis));

    while ((stopWord = reader.readLine()) != null) {
        // stopWord is a Word read from Cache
    }
}

Das hat einfach für mich funktioniert. Sie können die Zeile aus der in HDFS gespeicherten Datei lesen

1
Somum

Ich hatte das gleiche Problem. DistributedCach ist nicht nur veraltet, sondern auch getLocalCacheFiles und "new Job". Was für mich funktioniert hat, ist folgendes:

Treiber:

Configuration conf = getConf();
Job job = Job.getInstance(conf);
...
job.addCacheFile(new Path(filename).toUri());

Im Mapper/Reducer-Setup:

@Override
protected void setup(Context context) throws IOException, InterruptedException
{
    super.setup(context);

    URI[] files = context.getCacheFiles(); // getCacheFiles returns null

    Path file1path = new Path(files[0])
    ...
}
0
patapouf_ai