OraclePropertyGraphDataLoader loadData из HDFS - PullRequest
0 голосов
/ 01 февраля 2019

Я использую Spark + Hive для построения графиков и взаимосвязей, а также для экспорта простых файлов OPV / OPE в HDFS, по одному OPV / OPE CSV на редуктор.Вся наша база данных графиков готова к загрузке в OPG / PGX для аналитики, которая работает как чудо.

Теперь мы хотим загрузить эти вершины / ребра в Oracle Property Graph.

Я выбросил имена файлов из 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

И я экспериментирую с отличной оболочкой с некоторыми проблемами и сомнениями:

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

Я справлюсь с этим с помощью подхода InputStream, доступного в интерфейсе loadData, надеюсь, что это решит эту проблему, но у меня есть некоторые вопросы / предложения:

  • Поддерживает ли loadData vfs, чтобы я мог загружать файлы 'hdfs: // ...' напрямую?
  • Было бы неплохо иметь синтаксис glob в именах файлов, поэтому мыможет сделать что-то вроде:

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Вы можете использовать альтернативный API из OraclePropertyGraphDataLoader, где вы можете указать InputStream объекты для файлов opv / ope, используемых для загрузки.Таким образом, вы можете использовать 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);

Дайте нам знать, если этот работает для вас.

0 голосов
/ 02 февраля 2019

Для отслеживания, вот решение, которое мы приняли:

Смонтировал hdfs через NFS-шлюз в папке ниже groovy shell.

Экспортировал имена файлов вOPV / OPE list-of-files:

$ 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, но мы оценим это на следующей неделе.

Загрузка данных графика пока что работает очень хорошо.Если кто-то предложит лучший подход, пожалуйста, дайте мне знать!

...