Как открыть файлы из папки ресурсов в проекте sbt / apache flink - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над проектом на основе scala, используя apache flink , и до сих пор я только запускал свой проект из IntelliJ, который работал без проблем.Теперь, когда я впервые создаю файл JAR, который затем будет выполняться во время выполнения apache flink , я столкнулся с проблемами с открытием файлов ресурсов.

При запуске файл с именемsetup.xml изнутри src/main/resources будет открыто.Это работает в IntelliJ, но не во время выполнения flink.

В IntelliJ структура папок выглядит следующим образом:

root
\
 src
   \
    main
     \
      resources
       \
        setup.xml

При просмотре созданного файла JAR с помощью какого-либо проводника архива структура будет выглядеть следующим образом:

root
\
 [...]
\
 setup.xml

Варианты кода для этого я пробовал:

// by path
val filePath = getClass.getResource("/setup.xml").getPath
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)

// by URI
val filePath = getClass.getResource("/setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)

// with classloader
val filePath = getClass.getClassLoader.getResource("setup.xml").toURI
val currentPath = Paths.get(filePath)
val parsed = XML.loadFile(currentPath.toString)

Все 3 варианта работают в IntelliJ, но не во время выполнения flink.Это даст java.nio.file.FileSystemNotFoundException или java.io.FileNotFoundException.

Обратите внимание, что следующие будут работать в обоих IntelliJ И во время выполнения flink:

val source = Source.fromURL(getClass.getResource("/setup.xml"))
val parsed = XML.loadString(source.getLines().mkString)

Однако , я должен иметь доступ к компонентам пути и работать с объединением / разрешением путей.Это связано с тем, что файл XML будет содержать ссылки на другие файлы, которые хранятся относительно самого файла setup.xml.Таким образом, мне нужно получить путь к файлу setup.xml и разрешить some-referenced.xml с этим путем к файлу, чтобы открыть его.

Так как бы я правильно использовал один из 3 вариантов в начале, используякласс Path, поэтому я могу динамически разрешать другие пути к файлам как в IntelliJ, так и во время выполнения flink?

1 Ответ

0 голосов
/ 12 декабря 2018

Вот пример для чтения файла CSV, который я использовал в предыдущих проектах:

private val irisDS = env.readCsvFile[Iris](getClass.getResource("/iris.dat").getPath) map { tuple ⇒
    val list = tuple.productIterator.toList
    val numList = list map (_.asInstanceOf[Double])
    LabeledVector(numList(4), DenseVector(numList.take(4).toArray))
}

Возможно, вы неправильно объявили в своем SBT зависимости Flink, у меня они такие:

val flinkDependencies = Seq(
  "org.apache.flink" %% "flink-scala" % flinkVersion % "compile",
  "org.apache.flink" %% "flink-ml" % flinkVersion % "compile",
  "org.apache.flink" %% "flink-streaming-scala"  % flinkVersion  % "compile"
)

Хотя, я думаю, что когда я выполнял проект во время выполнения Apache Flink, мне приходилось читать файлы извне, а не из папки ресурсов, может быть, мой файл Setup.scala поможет вам.

...