HDFS的OraclePropertyGraphDataLoader loadData

时间:2019-02-01 13:00:07

标签: oracle bigdata graph-theory cloudera oracle-spatial

我正在使用Spark + Hive构建图形和关系,并将平面OPV / OPE文件导出到HDFS,每个reducer一个OPV / OPE CSV。 我们所有的图形数据库都准备就绪,可以加载到OPG / PGX上进行分析了,并且运行起来很简单。

现在,我们要在Oracle属性图上加载这些顶点/边。

我以这种方式从hdfs中转储了文件名:

$ hadoop fs -find '/user/felipeferreira/dadossinapse/ops/*.opv/*.csv' | xargs -I{}  echo 'hdfs://'{} > opvs.lst
$ hadoop fs -find '/user/felipeferreira/dadossinapse/ops/*.ope/*.csv' | xargs -I{}  echo 'hdfs://'{} > opes.lst

并且我正在尝试使用Groovy Shell进行一些问题和怀疑:

opvs = new File('opvs.lst') as String[]
opes = new File('opes.lst') as String[]

opgdl.loadData(opg, opvs, opes, 72)

开箱即用,我收到类似

的错误
java.lang.IllegalArgumentException: loadData: part-00000-f97f1abf-5f69-479a-baee-ce0a7bcaa86c-c000.csv flat file does not exist

我将使用loadData接口中可用的InputStream方法来解决此问题,希望能解决此问题,但是我有一些疑问/建议:

  • loadData是否支持vfs,所以我可以直接加载“ hdfs:// ...”文件?
  • 在文件名中使用glob语法不是很好,所以我们可以这样做:

opgdl.loadData(opg, 'hdfs:///user/felipeferreira/opvs/**/*.csv' ...

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用OraclePropertyGraphDataLoader中的备用API,在其中可以为装入的opv / ope文件指定InputStream对象。这样,您可以使用FsDataInputStream对象从HDFS环境中读取文件。

以下是一个小样本:

// ====== Init HDFS File System Object
Configuration conf = new Configuration();
// Set FileSystem URI
conf.set("fs.defaultFS", hdfsuri);
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
// Set HADOOP user
System.setProperty("HADOOP_USER_NAME", "hdfs");
System.setProperty("hadoop.home.dir", "/");

//Get the filesystem - HDFS
FileSystem fs = FileSystem.get(URI.create(hdfsuri), conf);`

// Read files into InputStreams using HDFS FsDataInputStream Java APIs
**Path pathOPV = new Path("/path/to/file.opv");
FSDataInputStream inOPV = fileSystem.open(pathOPV);
Path pathOPV = new Path("/path/to/file.ope");
FSDataInputStream inOPE = fileSystem.open(pathOPE);**

cfg = GraphConfigBuilder.forPropertyGraphHbase().setName("sinapse").setZkQuorum("bda1node05,bda1node06").build()

opg = OraclePropertyGraph.getInstance(cfg)
opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, **inOPV, inOPE**, 100);

让我们知道这是否适合您。

答案 1 :(得分:0)

为了进行跟踪,这是我们采用的解决方案:

通过groovy shell下方文件夹中的NFS网关安装hdfs。

将文件名导出到OPV / OPE文件列表:

$ find ../hadoop/user/felipeferreira/dadossinapse/ -iname "*.csv" | grep ".ope" > opes.lst
$ find ../hadoop/user/felipeferreira/dadossinapse/ -iname "*.csv" | grep ".opv" > opvs.lst

然后将数据加载到opg / hbase上就这么简单:

cfg = GraphConfigBuilder.forPropertyGraphHbase().setName("sinapse").setZkQuorum("bda1node05,bda1node06").build()

opg = OraclePropertyGraph.getInstance(cfg)
opgdl = OraclePropertyGraphDataLoader.getInstance()

opvs = new File("opvs.lst") as String[]
opes = new File("opes.lst") as String[]

opgdl.loadData(opg, opvs, opes, 100)

这似乎受到nfs网关的瓶颈,但是我们将在下周对此进行评估。

到目前为止,图形数据加载运行良好。 如果有人建议采用更好的方法,请告诉我!