运行R scraper脚本时遇到java.io.IOException错误

时间:2019-02-21 16:28:12

标签: java r docker apache-nifi

我有这个示例R刮板脚本(我不能使用实际的网站):

#!/usr/bin/Rscript

library(RCurl)
library(httr)
library(rvest)
library(lubridate)
library(stringi)

new_files <- Map(function(ln, y, bn) {

  fun1 <- html_session(URLencode(
    paste0("https://example.com", ln)),
    config(ssl_verifypeer = FALSE))

  if(y == Sys.Date()) {writeBin(fun1$response$content, bn)}
    else ("He's dead, Jim")

  return(fun1$response$content)

}, links, dates, names)

我正在通过Apache NiFi(ExecuteProcessor处理器)在docker容器中运行此脚本。但是,当我将其设置为运行时,我会不断收到此错误:

Process execution failed due to java.io.IOException: Stream closed: java.io.IOException: Stream closed
     java.io.IOException: Stream closed 
  at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
  at java.io.BufferedInputStream.read(BufferedInputStream.java:336)
  at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
  at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
  at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
  at java.io.FilterInputStream.read(FilterInputStream.java:107)
  at org.apache.nifi.processors.standard.ExecuteProcess$4.call(ExecuteProcess.java:367)
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  at java.lang.Thread.run(Thread.java:748)

在关闭this answer on closing streams之前,我正在阅读。当脚本在我的本地计算机上/在RStudio中运行正常时,我不知道为什么这会引发封闭的异常错误。

在docker容器中执行后立即混乱。与Map函数中的if / else语句有关?我不知道-或与加载lubridate包有关。

1 个答案:

答案 0 :(得分:1)

正如已经提到的几个人一样,您正在尝试做一些复杂的事情,需要在多个领域进行故障排除。我将分享一些解决此问题的步骤,但是请考虑以下几点:

您正在使用相当复杂的解决方案来解决可能是一个简单的问题。您可以通过“我要抓取网站”或“我要运行脚本”这些方式之一来考虑问题吗?

在这种情况下,有个好消息,NiFi可以使用ExecuteScript处理器轻松处理脚本,它目前支持以下语言:

  • 服装
  • ECMAScript
  • 时髦
  • lua
  • python
  • 红宝石

根据我的个人喜好,我会选择python,您将轻松找到许多有关如何抓取网站的示例。


如果以上操作还不够,请检查以下步骤:

  1. 您的脚本有效吗? (似乎您已经检查过了)
  2. 您可以从NiFi运行简单的R脚本吗? (例如,无需库即可执行1 + 1的操作)
  3. 您可以在没有NiFi的情况下从docker容器中运行任何R脚本吗?
  4. 您是否可以在没有NiFi的情况下从docker容器中运行此特定的R脚本?
  5. 您是否可以使用ExecuteProcessor进行任何操作?例如一个简单的ls
  6. 您可以使用该Docker容器中的ExecuteProcessor进行任何操作吗?例如一个简单的ls

要深入研究所有可能性会有点太多,但是请进行检查并希望答案是明确的,或者至少可以将重点放在故障排除上。