2016-04-12 3 views
1

ich einen MR-Algorithmus auf einige Daten geschrieben haben, eine Datenstruktur zu erstellen. Nach der Erstellung muss ich einige Fragen beantworten. Um diese Abfragen schneller beantworten zu können, habe ich aus dem Ergebnis Metadaten (etwa mehrere MB) erstellt. dieseeine Datenstruktur im Knoten Master pflegen

Jetzt ist meine Frage:

Ist es möglich, diese Metadaten im Speicher des Master-Knoten zu erstellen Datei zu vermeiden I/O als Folge Antwort schneller fragt?

+0

Was meinen Sie durch eine Datenstruktur erstellen? Wenn Sie Abfragen sagen, meinen Sie, dass Sie einen MR-Job für die Abfrage ausführen werden? Bitte erläutern Sie das Szenario. –

+0

wie diese Stellen Sie sich vor, Sie haben B-Baum im Speicher zu Datendateien auf HDFS zu zeigen. Bei Abfragen verweisen Sie auf B-Tree, um auf einige Datendateien zuzugreifen und dann einen MR-Job auszuführen. – AKJ88

Antwort

1

Unter der Annahme, auf der Grundlage der OP Reaktion auf die andere Antwort, werden die Metadaten für einen anderen MR Job erforderlich. Distributed Cache in diesem Fall zu verwenden ist ziemlich einfach:

In der Treiberklasse:

public class DriverClass extends Configured{ 

    public static void main(String[] args) throws Exception { 

    /* ...some init code... */ 


    /* 
    * Instantiate a Job object for your job's configuration. 
    */ 
    Configuration job_conf = new Configuration(); 
    DistributedCache.addCacheFile(new Path("path/to/your/data.txt").toUri(),job_conf); 
    Job job = new Job(job_conf); 

    /* ... configure and start the job... */ 

    } 
} 

In der Mapper-Klasse können Sie die Daten auf der Setup-Phase gelesen und es für die Karte Klasse zur Verfügung stellen:

public class YourMapper extends Mapper<LongWritable, Text, Text, Text>{ 

    private List<String> lines = new ArrayList<String>(); 

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

    /* Get the cached archives/files */ 
    Path[] cached_file = new Path[0]; 
    try { 
     cached_file = DistributedCache.getLocalCacheFiles(context.getConfiguration()); 
    } catch (IOException e1) { 
     // TODO add error code 
     e1.printStackTrace(); 
    } 
    File f = new File (cached_file[0].toString()); 
    try { 
     /* Read the data some thing like: */ 
     lines = Files.readLines(f,charset); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 
    } 


    @Override 
    public void map(LongWritable key, Text value, Context context) 
     throws IOException, InterruptedException { 

     /* 
     * In the mapper - use the data as needed 
     */ 

    } 
}  

Beachten Sie, dass Cache Distributed kann mehr die reine Textdatei halten. Sie können Archive (zip, tar ..) und sogar eine vollständige Java-Klasse (JAR-Dateien) verwenden.

Beachten Sie auch, dass in neueren Hadoop-Implementierungen die Distributed Cache API in der Job-Klasse selbst gefunden wird. Siehe this API und this answer.