gpt4 book ai didi

hadoop - 能否在 Hadoop 集群中的 Map Task 中启动特定进程?

转载 作者:可可西里 更新时间:2023-11-01 15:43:09 24 4
gpt4 key购买 nike

我使用具有一个节点的 Hadoop 和 YARN 集群。所有 hadoop 和 yarn 守护进程都在这个节点中启动。我还使用 Apache Nutch 1.15 分布式爬网启动了一个获取步骤,成功完成了注入(inject)和生成步骤。

我正在尝试使用 Selenium 3.149.54 FirefoxDriver 在 YarnChild 容器上运行的 map task 中运行 Firefox 浏览器。 Firefox 进程启动,但弹出一个窗口,提示 Firefox 配置文件丢失或无法访问, map task 被阻止,直到我关闭该窗口。

Selenium 3.141.54 FirefoxDriver 使用 geckodriver 启动 Firefox,从容器用户日志的标准错误日志中的 geckodriver 输出,我看到它尝试使用以下命令运行 Firefox:

1557726792743   mozrunner::runner   INFO    Running command: "/usr/bin/firefox" "-marionette" "-profile" "/tmp/rust_mozprofile.0dQXae46ZwUd" "-foreground" "-no-remote" 

我注意到的是,如果我错了请纠正我,在映射任务中我可以从主机本地文件系统访问二进制文件,比如/usr/bin/firefox,但是不知何故,当 firefox 在内部启动时一个映射任务,由 FirefoxDriver 使用位于主机本地文件系统中的 geckodriver,使用上面的命令,Firefox 进程看不到位于主机本地 fs/tmp 中的“/tmp/rust_mozprofile.0dQXae46ZwUd”目录。

我已尝试将 FirefoxDriver 设置为使用位于 hdfs 中的配置文件,该配置文件与/tmp 中的临时配置文件具有相同的信息,但仍然出现表示配置文件丢失或无法访问的窗口。

我尝试使用 hadoop LocalFileSystem API 从映射任务中读取主机本地文件系统/tmp 中的文件,我可以读取它,因此我可以从映射任务访问本地文件系统。

了解所有这些后,我无法理解为什么 geckodriver 无法使用/tmp 中的配置文件启动 Firefox。

下面的代码是从getProtocolOutput调用嵌套函数某处运行的主要代码,从FetcherThread开始,在FetcherRun mapper中启动。简单的说,下面的代码运行在一个Mapper中启动的特定线程中:

    profile = new FirefoxProfile();
boolean enableFlashPlayer = conf.getBoolean("selenium.firefox.enable.flash", false);
int loadImage = conf.getInt("selenium.firefox.load.image", 1);
int loadStylesheet = conf.getInt("selenium.firefox.load.stylesheet", 1);
System.setProperty("webdriver.gecko.driver", conf.get("webdriver.gecko.driver"));

profile.setPreference("dom.ipc.plugins.enabled.libflashplayer.so", enableFlashPlayer);
profile.setPreference("permissions.default.stylesheet", loadImage);
profile.setPreference("permissions.default.image", loadStylesheet);
profile.setPreference("marionette", false);
profile.setAcceptUntrustedCertificates(true);

long firefoxBinaryTimeout = conf.getLong("selenium.firefox.binary.timeout", 45);
binary = new FirefoxBinary();
binary.setTimeout(TimeUnit.SECONDS.toMillis(firefoxBinaryTimeout));

binary.addCommandLineOptions("-profile", "/home/iulian/firefox.profile");

options = new FirefoxOptions();
options.setBinary(binary).setProfile(profile);

driver = new FirefoxDriver(options); // the execution stop here and the window appears, which says that firefox profile is missing or is inaccessible
System.out.println("Finished starting driver.");
long pageLoadWait = conf.getLong("libselenium.page.load.delay", 10);
driver.manage().timeouts().pageLoadTimeout(pageLoadWait, TimeUnit.SECONDS);

您认为问题出在哪里?如何以简单的方式调试对/tmp 的访问?

提前致谢!

最佳答案

我已经找到问题了。

当启动 Firefox 浏览器时,此浏览器需要有一个具有有效 HOME 环境变量路径目录的环境,这意味着主目录应对应于启动浏览器的当前用户,用于创建 firefox 配置文件相关文件。

在我的例子中,来自 Hadoop 的映射任务的问题在于 HOME 环境变量只是“HOME=/home/”。我对执行 map task 的用户没有这个目录的写权限,隐式地对 firefox 浏览器没有写权限。所以每次出现的弹窗都是因为firefox浏览器无法在HOME目录下创建profile相关文件。

关于hadoop - 能否在 Hadoop 集群中的 Map Task 中启动特定进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56118804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com