Как установить переменную среды в задании YARN Spark?

Я пытаюсь получить доступ к Accumulo 1.6 из Apache Spark (написано на Java), используя AccumuloInputFormat с newAPIHadoopRDD. Чтобы сделать это, я должен сообщить AccumuloInputFormat, где найти ZooKeeper, вызвав метод setZooKeeperInstance. Этот метод принимает объект ClientConfiguration, который определяет различные соответствующие свойства.

Я создаю свой объект ClientConfiguration, вызывая статический метод loadDefault. Предполагается, что этот метод ищет в разных местах файл client.conf для загрузки значений по умолчанию. Одно из мест, где он должен искать, это $ACCUMULO_CONF_DIR/client.conf.

Поэтому я пытаюсь установить переменную среды ACCUMULO_CONF_DIR таким образом, чтобы она была видна, когда Spark запускает задание (для справки, я пытаюсь запустить в режиме развертывания yarn-cluster). Я еще не нашел способ сделать это успешно.

До сих пор я пробовал:

  • Звонок setExecutorEnv("ACCUMULO_CONF_DIR", "/etc/accumulo/conf") по телефону SparkConf
  • Экспорт ACCUMULO_CONF_DIR в spark-env.sh
  • Настройка spark.executorEnv.ACCUMULO_CONF_DIR в spark-defaults.conf

Ни один из них не работал. Когда я печатаю среду перед вызовом setZooKeeperInstance, ACCUMULO_CONF_DIR не появляется.

Если это уместно, я использую CDH5 версии всего.

Вот пример того, что я пытаюсь сделать (импорт и обработка исключений опущены для краткости):

public class MySparkJob
{
    public static void main(String[] args)
    {
        SparkConf sparkConf = new SparkConf();
        sparkConf.setAppName("MySparkJob");
        sparkConf.setExecutorEnv("ACcUMULO_CONF_DIR", "/etc/accumulo/conf");
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
        Job accumuloJob = Job.getInstance(sc.hadoopConfiguration());
        // Foreach loop to print environment, shows no ACCUMULO_CONF_DIR
        ClientConfiguration accumuloConfiguration = ClientConfiguration.loadDefault();
        AccumuloInputFormat.setZooKeeperInstance(accumuloJob, accumuloConfiguration);
        // Other calls to AccumuloInputFormat static functions to configure it properly.
        JavaPairRDD<Key, Value> accumuloRDD =
            sc.newAPIHadoopRDD(accumuloJob.getConfiguration(),
                               AccumuloInputFormat.class,
                               Key.class,
                               Value.class);
    }
}

person Trebor Rude    schedule 10.10.2014    source источник


Ответы (1)


Итак, я обнаружил ответ на этот вопрос, когда писал вопрос (извините, искатели репутации). Проблема в том, что CDH5 использует Spark 1.0.0, а я выполнял задание через YARN. По-видимому, режим YARN не обращает никакого внимания на среду исполнителя и вместо этого использует переменную среды SPARK_YARN_USER_ENV для управления своей средой. Таким образом, обеспечение того, чтобы SPARK_YARN_USER_ENV содержало ACCUMULO_CONF_DIR=/etc/accumulo/conf, работает и делает ACCUMULO_CONF_DIR видимым в среде в указанной точке в исходном примере вопроса.

Эта разница в работе автономного режима и режима YARN привела к SPARK-1680, который сообщается об исправленном в Spark 1.1.0.

person Trebor Rude    schedule 10.10.2014