Можно ли запустить определенную процедуру внутри задачи Map в кластере Hadoop? - PullRequest
1 голос
/ 13 мая 2019

Я использую кластер 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?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 июня 2019

Мне удалось найти проблему.

При запуске браузера Firefox этот браузер должен иметь среду с допустимым каталогом пути переменной env HOME, что означает, что домашний каталог должен соответствовать текущемупользователь, который запускает браузер, для создания файлов, связанных с профилем firefox.

Проблема с задачей Map из Hadoop, в моем случае, состояла в том, что переменная HOME env была просто "HOME = / home /".У меня нет разрешения на запись в этот каталог с пользователем, который выполнил задачу карты, и неявно браузер Firefox.Следовательно, всплывающее окно, которое появлялось каждый раз по той причине, что браузер Firefox не смог создать связанные с профилем файлы в каталоге HOME.

...