2013-01-21 17 views
5

Desidero utilizzare il ragionatore Web-scale Parallel Inference Engine (WebPIE) sulla piattaforma Hadoop. Ho già implementato la struttura Hadoop con due macchine virtuali Ubuntu e funziona bene. Quando voglio utilizzare WebPie per eseguire il ragionamento su file RDF, il processo non riesce a causa della necessità del formato file di sequenza. Il WebPIE tutorial non ha menzionato nulla sul formato del file di sequenza come prerequisito per il ragionamento in Hadoop. Per produrre il formato file di sequenza ho scritto il seguente codice:Ragionamento del Web semantico in sistemi distribuiti

public static void main(String[] args) { 

    FileInputStream fis = null; 
    SequenceFile.Writer swriter = null; 
    try { 

     Configuration conf = new Configuration(); 

     File outputDirectory = new File("output"); 
     File inputDirectory = new File("input"); 
     File[] files = inputDirectory.listFiles(); 

     for (File inputFile : files) { 

      //Input 
      fis = new FileInputStream(inputFile); 

      byte[] content = new byte[(int) inputFile.length()]; 
      fis.read(content); 

      Text key = new Text(inputFile.getName()); 
      BytesWritable value = new BytesWritable(content); 

      //Output 
      Path outputPath = new Path(outputDirectory.getAbsolutePath()+"/"+inputFile.getName()); 

      FileSystem hdfs = outputPath.getFileSystem(conf); 

      FSDataOutputStream dos = hdfs.create(outputPath); 

      swriter = SequenceFile.createWriter(conf, dos, Text.class, 
        BytesWritable.class, SequenceFile.CompressionType.BLOCK, new DefaultCodec()); 

      swriter.append(key, value); 

     } 

     fis.close(); 
     swriter.close(); 

    } catch (IOException e) { 

     System.out.println(e.getMessage()); 
    } 

} 

Questo codice produce corretto formato di file di sequenza con alcuni file RDF, ma non funziona in modo corretto al 100%, e talvolta produce file danneggiati. C'è qualche soluzione dall'inizio per evitare questo codice, e se non c'è, come posso migliorare questo codice per funzionare correttamente con qualsiasi file RDF come input?

+0

Puoi dire di più sull'errore che stai incontrando. Come dici tu, l'esercitazione WebPIE non menziona Sequence Files. Puoi fare tutto quanto descritto nel tutorial come è scritto? Hai problemi con il tutorial. Il wiki Hadoop parla di [file di sequenza] (http://wiki.apache.org/hadoop/SequenceFile) e potrebbe essere una risorsa utile. –

risposta

0

The tutorial si basa sull'esecuzione di WebPIE su Amazon EC2, quindi potrebbe esserci qualche differenza nella configurazione. Si noti tuttavia che, secondo l'esercitazione, gli ingressi non sono semplici file RDF, ma “gzip file compressi di triple nel formato N-triple” (enfasi in originale):

Prima lanciamo il ragionatore, abbiamo bisogno di caricare i dati di input sul filesystem HDFS e comprimerli in un formato adatto. I dati di input devono essere costituiti da file compressi compressi con gzip di tripli in formato N-Tripli. Cerca di mantenere i file di dimensioni simili e di avere più file dei core della CPU poiché ciascun file verrà elaborato da una macchina.

La seconda sezione, “2 ° passo: caricare i dati di input sul cluster” di quel tutorial descrive come ottenere effettivamente i dati nel sistema, ed è sembra come dovrebbe applicarsi a Amazon EC2 come così come la tua installazione Hadoop. Non voglio citare semplicemente che la sezione per intero qui, ma la sequenza di comandi che danno è:

$ ./cmd-hadoop-cluster login webpie 
$ hadoop fs -ls/
$ hadoop fs -mkdir /input 
$ ./cmd-hadoop-cluster push webpie input_triples.tar.gz 

che ottiene solo i dati in HDFS, però. In “3 ° fase: comprimere i dati di ingresso”,

La reasoner funziona con i dati in un formato compresso. Abbiamo comprimere i dati con il comando:

hadoop jar webpie.jar jobs.FilesImportTriples /input /tmp /pool --maptasks 4 --reducetasks 2 --samplingPercentage 10 --samplingThreshold 1000 

... Il comando di cui sopra può essere letto come: lanciare la compressione e dividere il lavoro tra i 4 compiti mappa e 2 a ridurre le attività, il campione di ingresso utilizzando un 10% dei dati e segna come popolari tutte le risorse che appaiono più di 1000 volte in questo campione.

Al termine di questo lavoro, nella directory/pool sono presenti i dati di input compressi e possiamo procedere al ragionamento.

Le restanti sezioni discutono ragionamento, ottenere i dati di nuovo fuori, e così via, che non dovrebbe essere un problema, una volta che hai i dati in, mi aspetto.

0

I dati di ingresso devono essere costituite da file compressi con gzip compressi di triple in formato N-triple per exemple (triplePart1.gz, triplePart2.gz ....), quindi abbiamo: input_triples.tar.gz che contiene file compressi di N-tripli (triplePart1.gz, triplePart2.gz ....).

  1. decomprimere il file tar e copiare il contenuto della HDFS

    ---/Hadoop $ tar zxvf /tmp/input_triples.tar.gz/tmp/input_triples.

    ---/hadoop $ bin/hadoop fs -copyFromLocal/tmp/input-files/input.

  2. Comprimere i dati di input

    ---/Hadoop $ bin/Hadoop vaso webpie.jar jobs.FilesImportTriples/input/tmp/piscina --maptasks 4 --reducetasks 2 --samplingPercentage 10 --samplingThreshold 1000

  3. ragionamento

    ---/Hadoop $ bin/Hadoop jar webpie.jar jobs.Reasoner/piscina --fragment gufo --rulesStrategy --reducetasks fisse 2 --samplingPercentage 10 --samplingThreshold 1000

da continuare here :-)

+0

se questa non è la soluzione completa, si prega di modificare la risposta e aggiungere ulteriori dettagli fino a quando non è utile senza il tuo collegamento :-) – kleopatra

+0

Ho menzionato la soluzione, in effetti devi solo comprimere i file N-Triples in **. formato gz **. Il problema del file di sequenza appare quando comprimiamo i dati di input, quindi per il resto basta seguire il tutorial –