我想在Hadoop平台上使用Web-scale Parallel Inference Engine (WebPIE)推理器。我已经使用两个Ubuntu虚拟机实现了Hadoop结构,并且运行良好。当我想使用WebPie对RDF文件进行推理时,由于需要序列文件格式,该过程失败。 WebPIE tutorial没有提到序列文件格式作为在Hadoop中推理的先决条件。 为了生成Sequence文件格式,我编写了以下代码:
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文件作为输入?
答案 0 :(得分:0)
The tutorial基于在Amazon EC2上运行WebPIE,因此配置可能会有所不同。但请注意,根据教程,输入不是普通的RDF文件,而是“以N-Triples格式压缩三元组的压缩文件”(重点是原文):
在我们启动推理器之前,我们需要将输入数据上传到HDFS文件系统并以合适的格式压缩它。输入数据必须包含N-Triples格式的 gzip压缩文件三元组。尝试将文件保持为相似的大小,并且拥有比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中。在“第3步:压缩输入数据”,
推理器以压缩格式处理数据。我们使用以下命令压缩数据:
hadoop jar webpie.jar jobs.FilesImportTriples /input /tmp /pool --maptasks 4 --reducetasks 2 --samplingPercentage 10 --samplingThreshold 1000
...上面的命令可以理解为:启动压缩并在4个地图任务和2个减少任务之间拆分作业,使用10%的数据对输入进行采样并标记为流行的所有显示超过1000的资源这个样本中的时间。
这个工作完成后,我们在目录/池中有压缩的输入数据,我们可以继续推理。
其他部分讨论推理,获取数据等等,一旦你有了数据,这应该不是问题,我希望。
答案 1 :(得分:0)
输入数据必须包含N-Triples格式的三元组压缩文件例如(triplePart1.gz,triplePart2.gz ....),所以我们有:input_triples.tar。 gz包含N-triples的压缩文件(triplePart1.gz,triplePart2.gz ....)。
解压缩tar文件并将内容复制到HDFS
--- / hadoop $ tar zxvf /tmp/input_triples.tar.gz / tmp / input_triples。
--- / hadoop $ bin / hadoop fs -copyFromLocal / tmp / input-files / input。
压缩输入数据
--- / hadoop $ bin / hadoop jar webpie.jar jobs.FilesImportTriples / input / tmp / pool --maptasks 4 --reducetasks 2 --samplingPercentage 10 --samplingThreshold 1000
推理
--- / hadoop $ bin / hadoop jar webpie.jar jobs.Reasoner / pool --fragment owl --rulesStrategy fixed --reducetasks 2 --samplingPercentage 10 --samplingThreshold 1000
继续here: - )