繁体   English   中英

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

[英]Getting java.io.IOException errors running an R scraper script

我有以下示例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)

我正在阅读有关在关闭流之前将其关闭的答案 当脚本在我的本地计算机上/在RStudio中运行正常时,我不知道为什么这会引发封闭的异常错误。

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

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

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

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

  • Clojure
  • ECMAScript
  • Groovy
  • a
  • 蟒蛇
  • 红宝石

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


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM