Я использую кластер Hadoop & YARN с одним узлом. Все демоны hadoop и yarn запускаются в этом узле. Я также начинаю шаг выборки с распределенного сканирования Apache Nutch 1.15, с успешно завершенными шагами inject и generate.
Я пытаюсь запустить браузер Firefox внутри задачи карты, которая выполняется в контейнере YarnChild, используя Selenium 3.149.54 FirefoxDriver. Процесс Firefox запускается, но появляется окно, сообщающее, что профиль Firefox отсутствует или недоступен , и задача карты блокируется, пока я не закрою окно.
Selenium 3.141.54 FirefoxDriver использует geckodriver для запуска Firefox, и из вывода geckodriver, который находится в журнале stderr из пользовательского журнала контейнера, я вижу, что он попытался запустить Firefox с помощью команды:
1557726792743 mozrunner::runner INFO Running command: "/usr/bin/firefox" "-marionette" "-profile" "/tmp/rust_mozprofile.0dQXae46ZwUd" "-foreground" "-no-remote"
Что я замечаю и исправляю меня, если я ошибаюсь, это то, что внутри задачи карты у меня есть доступ к двоичным файлам из локальной файловой системы хоста, например / usr / bin / firefox, но каким-то образом, когда внутри запускается firefox Задача Map от FirefoxDriver, использующая geckodriver, который находится в локальной файловой системе хоста, с помощью команды выше, процесс Firefox не может видеть каталог /tmp/rust_mozprofile.0dQXae46ZwUd, который находится внутри локального хоста fs / tmp.
Я пытался настроить FirefoxDriver на использование профиля, который находится в формате hdf, который содержит ту же информацию из временного профиля из / tmp, но все равно появляется окно, в котором говорится, что профиль отсутствует или недоступен.
Я пытался прочитать файл с локального хоста fs / tmp, используя API-интерфейс hadoop LocalFileSystem, из задачи карты, и я смог прочитать его, поэтому у меня есть доступ к локальному файлу fs из задачи карты.
Зная все это, я не могу понять, почему geckodriver не может запустить Firefox, используя профиль из /tmp.
Следующий код - это основной код, который выполняется где-то при вызовах вложенных функций из 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?
Заранее спасибо!