【问题标题】:Reasoning of Semantic web in Distributed systems分布式系统中语义网的推理
【发布时间】:2013-01-21 15:16:44
【问题描述】:

我想在 Hadoop 平台上使用 Web-scale Parallel Inference Engine (WebPIE) 推理器。我已经用两个 Ubuntu 虚拟机实现了 Hadoop 结构,并且运行良好。当我想使用 WebPie 对 RDF 文件进行推理时,由于需要序列文件格式,该过程失败。 WebPIE tutorial 没有提到将序列文件格式作为 Hadoop 推理的先决条件。 为了生成序列文件格式,我编写了以下代码:

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());
    }

}

此代码使用某些 RDF 文件生成正确的序列文件格式,但不能 100% 正确工作,并且有时会生成损坏的文件。有没有从一开始就避免此代码的解决方案,如果没有,我如何改进此代码以将任何 RDF 文件作为输入正常工作?

【问题讨论】:

  • 你能告诉更多关于你遇到的错误吗?正如你所说,WebPIE 教程没有提到序列文件。你能按照教程中的描述做所有事情吗?您是否在本教程中遇到任何问题。 Hadoop wiki 确实谈到了 sequence files,并且可能是一个有用的资源。

标签: hadoop rdf reasoning


【解决方案1】:

The tutorial基于在Amazon EC2上运行WebPIE,所以配置上可能会有一些差异。但是,请注意,根据教程,输入不是普通的 RDF 文件,而是“N-Triples 格式的三元组的 gzip 压缩文件”(重点是原始文件):

在启动推理器之前,我们需要将输入数据上传到 HDFS 文件系统并以合适的格式压缩。输入数据必须包含 N-Triples 格式的三元组的压缩压缩文件。尽量保持文件大小相似,文件数量多于 cpu 内核,因为每个文件将由一台机器处理。

该教程的第二部分,“第二步:在集群上上传输入数据”描述了如何将数据实际获取到系统中,它看起来像它应该适用于 Amazon EC2 以及您自己的 Hadoop 安装。我不想在这里简单地完整引用该部分,但他们给出的命令顺序是:

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

不过,这只会将数据导入 HDFS。在“第三步:压缩输入数据”

推理器使用压缩格式的数据。我们用命令压缩数据:

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

... 上面的命令可以理解为:启动压缩并将作业拆分为 4 个 map 任务和 2 个 reduce 任务,使用 10% 的数据对输入进行采样,并将出现超过 1000 个的所有资源标记为流行此示例中的次数。

这个工作完成后,我们在/pool目录下有压缩的输入数据,我们可以继续推理了。

剩下的部分讨论推理、取回数据等等,我希望一旦你输入数据,这应该不是问题。

【讨论】:

    【解决方案2】:

    输入数据必须包含 N-Triples 格式的三元组的 gzip 压缩文件,例如(triplePart1.gz、triplePart2.gz ....),因此我们有:input_triples.tar。包含N-triples(triplePart1.gz,triplePart2.gz ....)压缩文件的gz。

    1. 解压tar文件并将内容复制到HDFS

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

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

    2. 压缩输入数据

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

    3. 推理

      ---/hadoop$ bin/hadoop jar webpie.jar jobs.Reasoner /pool --fragment owl --rulesStrategy fixed --reducetasks 2 --samplingPercentage 10 --samplingThreshold 1000

    待续here :-)

    【讨论】:

    • 如果这不是完整的解决方案,请编辑您的答案并添加更多详细信息,直到它在没有您的链接的情况下有用:-)
    • 我已经提到了解决方案,实际上您只需将 N-Triples 文件压缩为 .gz 格式。当我们压缩输入数据时会出现序列文件的问题,剩下的你只需按照教程进行操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多