能否在 Hadoop 集群中的 Map Task 中启动特定进程?
Can a specific procesess be started inside a Map Task in a Hadoop Cluster?
我使用一个节点的 Hadoop 和 YARN 集群。所有 hadoop 和 yarn 守护进程都在这个节点中启动。我还使用 Apache Nutch 1.15 分布式爬网启动了一个获取步骤,成功完成了注入和生成步骤。
我正在尝试 运行 Firefox 浏览器在地图任务中 运行s 在 YarnChild 容器上,使用 Selenium 3.149.54 FirefoxDriver。 Firefox 进程启动,但弹出 window 提示 Firefox 配置文件丢失或无法访问,地图任务被阻止,直到我关闭 window .
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/rust_mozprofile.0dQXae46ZwUd”目录tmp.
我已经尝试将 FirefoxDriver 设置为使用位于 hdfs 中的配置文件,该配置文件具有来自 /tmp 的临时配置文件的相同信息,但是 window 表示该配置文件丢失或仍然出现无法访问。
我尝试使用 hadoop LocalFileSystem API 从主机本地 fs /tmp 读取一个文件,在 map 任务中,我可以读取它,所以我可以从地图任务。
了解所有这些后,我无法理解为什么 geckodriver 无法使用 /tmp 中的配置文件启动 Firefox。
以下代码是运行某处嵌套函数调用getProtocolOutput的主要代码,来自FetcherThread,在FetcherRun mapper中启动。简单的说,下面的代码运行s在一个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 env变量路径目录的环境,这意味着主目录应该对应于当前启动浏览器的用户,用于创建firefox profile相关文件。
来自 Hadoop 的映射任务的问题,在我的例子中,HOME 环境变量只是 "HOME=/home/"。我对执行地图任务的用户没有这个目录的写权限,隐式地对 firefox 浏览器没有写权限。所以每次出现的pop-up都是因为firefox浏览器无法在HOME目录下创建profile相关文件
我使用一个节点的 Hadoop 和 YARN 集群。所有 hadoop 和 yarn 守护进程都在这个节点中启动。我还使用 Apache Nutch 1.15 分布式爬网启动了一个获取步骤,成功完成了注入和生成步骤。
我正在尝试 运行 Firefox 浏览器在地图任务中 运行s 在 YarnChild 容器上,使用 Selenium 3.149.54 FirefoxDriver。 Firefox 进程启动,但弹出 window 提示 Firefox 配置文件丢失或无法访问,地图任务被阻止,直到我关闭 window .
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/rust_mozprofile.0dQXae46ZwUd”目录tmp.
我已经尝试将 FirefoxDriver 设置为使用位于 hdfs 中的配置文件,该配置文件具有来自 /tmp 的临时配置文件的相同信息,但是 window 表示该配置文件丢失或仍然出现无法访问。
我尝试使用 hadoop LocalFileSystem API 从主机本地 fs /tmp 读取一个文件,在 map 任务中,我可以读取它,所以我可以从地图任务。
了解所有这些后,我无法理解为什么 geckodriver 无法使用 /tmp 中的配置文件启动 Firefox。
以下代码是运行某处嵌套函数调用getProtocolOutput的主要代码,来自FetcherThread,在FetcherRun mapper中启动。简单的说,下面的代码运行s在一个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 env变量路径目录的环境,这意味着主目录应该对应于当前启动浏览器的用户,用于创建firefox profile相关文件。
来自 Hadoop 的映射任务的问题,在我的例子中,HOME 环境变量只是 "HOME=/home/"。我对执行地图任务的用户没有这个目录的写权限,隐式地对 firefox 浏览器没有写权限。所以每次出现的pop-up都是因为firefox浏览器无法在HOME目录下创建profile相关文件