3

Есть ли способ установить переменную среды на всех узлах кластера EMR?Как установить PYTHONHASHSEED на AWS EMR

Я получаю сообщение об ошибке при попытке использования reduceByKey() в Python3 PySpark и получения ошибки относительно семени хэша. Я вижу, что это известная ошибка и что переменная окружения PYTHONHASHSEED должна быть одинаковой для всех узлов кластера, но мне не повезло.

Я пытался добавить переменную искровым окр через конфигурацию кластера:

[ 
    { 
    "Classification": "spark-env", 

     "Configurations": [ 
     { 
     "Classification": "export", 
     "Properties": { 
      "PYSPARK_PYTHON": "/usr/bin/python3", 
      "PYTHONHASHSEED": "123" 
     } 
    } 
    ] 
}, 
{ 
    "Classification": "spark", 
    "Properties": { 
    "maximizeResourceAllocation": "true" 
    } 
    } 
] 

, но это не работает. Я также попытался добавить скрипт начальной загрузки:

#!/bin/bash 
export PYTHONHASHSEED=123 

, но это также не похоже на трюк.

ответ

6

Я считаю, что /usr/bin/python3 не подбирая переменные окружения PYTHONHASHSEED, которую вы определяете в кластерной конфигурации под spark-env области.

Ты бы с помощью python34 вместо /usr/bin/python3 и установить конфигурацию как следует:

[ 
    { 
     "classification":"spark-defaults", 
     "properties":{ 
     // [...] 
     } 
    }, 
    { 
     "configurations":[ 
     { 
      "classification":"export", 
      "properties":{ 
       "PYSPARK_PYTHON":"python34", 
       "PYTHONHASHSEED":"123" 
      } 
     } 
     ], 
     "classification":"spark-env", 
     "properties":{ 
     // [...] 
     } 
    } 
] 

Теперь, давайте проверим это.Я определяю Баш скрипт называют как python S:

#!/bin/bash 

echo "using python34" 
for i in `seq 1 10`; 
    do 
    python -c "print(hash('foo'))"; 
    done 
echo "----------------------" 
echo "using /usr/bin/python3" 
for i in `seq 1 10`; 
    do 
    /usr/bin/python3 -c "print(hash('foo'))"; 
    done 

Приговор:

[[email protected] ~]$ bash test.sh 
using python34 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
-4177197833195190597 
---------------------- 
using /usr/bin/python3 
8867846273747294950 
-7610044127871105351 
6756286456855631480 
-4541503224938367706 
7326699722121877093 
3336202789104553110 
3462714165845110404 
-5390125375246848302 
-7753272571662122146 
8018968546238984314 

PS1: Я использую AMI релиз emr-4.8.2.

PS2: Фрагмент, вдохновленный от this answer.

EDIT: Я проверил следующее, используя pyspark.

16/11/22 07:16:56 INFO EventLoggingListener: Logging events to hdfs:///var/log/spark/apps/application_1479798580078_0001 
16/11/22 07:16:56 INFO YarnClientSchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.8 
Welcome to 
     ____    __ 
    /__/__ ___ _____/ /__ 
    _\ \/ _ \/ _ `/ __/ '_/ 
    /__/.__/\_,_/_/ /_/\_\ version 1.6.2 
     /_/ 

Using Python version 3.4.3 (default, Sep 1 2016 23:33:38) 
SparkContext available as sc, HiveContext available as sqlContext. 
>>> print(hash('foo')) 
-2457967226571033580 
>>> print(hash('foo')) 
-2457967226571033580 
>>> print(hash('foo')) 
-2457967226571033580 
>>> print(hash('foo')) 
-2457967226571033580 
>>> print(hash('foo')) 
-2457967226571033580 

также создал простое приложение (simple_app.py):

from pyspark import SparkContext 

sc = SparkContext(appName = "simple-app") 

numbers = [hash('foo') for i in range(10)] 

print(numbers) 

Который также, кажется, работает отлично:

[[email protected]*** ~]$ spark-submit --master yarn simple_app.py 

Output (укороченный):

[...] 
16/11/22 07:28:42 INFO YarnClientSchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.8 
[-5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594] // THE RELEVANT LINE IS HERE. 
16/11/22 07:28:42 INFO SparkContext: Invoking stop() from shutdown hook 
[...] 

As ты можешь см. также работает каждый раз, возвращая один и тот же хеш.

EDIT 2: Из комментариев, кажется, что вы пытаетесь вычислить хэш на исполнителях, а не водитель, таким образом, вам нужно настроить spark.executorEnv.PYTHONHASHSEED, в конфигурации вашего приложения искровой так что он может быть размножен на исполнителей (это один из способов сделать это).

Примечание: Настройка переменной среды для исполнителей это то же самое с ПРЯЖЕЙ клиентом, используйте spark.executorEnv.[EnvironmentVariableName].

Таким образом, следующий минималистский пример с simple_app.py:

from pyspark import SparkContext, SparkConf 

conf = SparkConf().set("spark.executorEnv.PYTHONHASHSEED","123") 
sc = SparkContext(appName="simple-app", conf=conf) 

numbers = sc.parallelize(['foo']*10).map(lambda x: hash(x)).collect() 

print(numbers) 

А теперь давайте проверим его еще раз. Вот усеченный выход:

16/11/22 14:14:34 INFO DAGScheduler: Job 0 finished: collect at /home/hadoop/simple_app.py:6, took 14.251514 s 
[-5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594, -5869373620241885594] 
16/11/22 14:14:34 INFO SparkContext: Invoking stop() from shutdown hook 

Я думаю, что это охватывает все.

+0

Спасибо за ваш ответ, но, к сожалению, он не работает.Существует проблема с вашим скриптом, конфигурация только устанавливает версию искрового python как python34, оболочка «python» по умолчанию все еще указывает на Python2.x. Если вы замените python на/usr/bin/python34, вы будете видеть разные значения хэша каждый раз. –

+0

Ваш пример по-прежнему выполняется только на узле драйвера в одном экземпляре Python. Если вы создаете параллельную коллекцию и запускаете ее через spark-submit, вы увидите разные значения хэша (или, по крайней мере, я делаю это для кластера из 3 узлов). Если вы замените строку «numbers = ...» на: numbers = sc.parallelize (['foo'] * 10) .map (lambda x: hash (x)). Collect() –

+1

Спасибо, это замечательно решение и делает именно то, что мне нужно. –

1

Вы, вероятно, могли бы сделать это с помощью загрузочного скрипта, но вам нужно сделать что-то вроде этого:

echo "PYTHONHASHSEED=XXXX" >> /home/hadoop/.bashrc 

(или, возможно, .profile)

Так что это подхвачена искровых процессов при они запускаются.

Ваша конфигурация выглядит разумной, хотя, возможно, стоит установить ее в разделе hadoop-env вместо этого?

+0

Я не думаю, что это установит PYTHONHASHSEED на рабочих узлах, что является проблемой? –

2

От искры docs

Примечание: При работе искры на ПРЯЖАХ в кластерном режиме, переменные окружения должны быть установлено с помощью spark.yarn.appMasterEnv [EnvironmentVariableName] свойство в вашем Conf/искре дефолте. .conf. Переменные окружения, заданные в spark-env.sh, не будут отображаться в процессе мастер-процесса YARN в режиме кластера. См. Связанные с YARN свойства искры для получения дополнительной информации.

Свойства перечислены here, так что я думаю, что вы хотите:

Добавить переменную окружения, указанный EnvironmentVariableName в процессе мастер-приложение, запущенное на пряжу.

spark.yarn.appMasterEnv.PYTHONHASHSEED="XXXX" 

ЭХ документы для конфигурирования искрового-defaults.conf являются here.

[ 
    { 
     "Classification": "spark-defaults", 
     "Properties": { 
     "spark.yarn.appMasterEnv.PYTHONHASHSEED: "XXX" 
     } 
    } 
] 
+0

Похоже, это может быть то, что мне нужно, но я не вижу, где добавить эту конфигурацию в EMR? –

+0

Добавлен фрагмент конфигурации EMR. –

1

Просто столкнулся с той же проблемой, добавив следующую конфигурацию ее решили:

# Some settings... 
Configurations=[ 
     { 
      "Classification": "spark-env", 
      "Properties": {}, 
      "Configurations": [ 
       { 
        "Classification": "export", 
        "Properties": { 
         "PYSPARK_PYTHON": "python34" 
        }, 
        "Configurations": [] 
       } 
      ] 
     }, 
     { 
      "Classification": "hadoop-env", 
      "Properties": {}, 
      "Configurations": [ 
       { 
        "Classification": "export", 
        "Properties": { 
         "PYTHONHASHSEED": "0" 
        }, 
        "Configurations": [] 
       } 
      ] 
     } 
     ], 
# Some more settings... 

Будьте осторожны: мы не используем пряжу как менеджер кластера, на данный момент кластер работает только Hadoop и Спарк.

EDIT: Следующее сообщение Тима Б, похоже, работает также с пряжей, установленной в качестве менеджера кластера.

+1

Спасибо, это сработало для меня. Даже на изображении по умолчанию EMR работает пряжа. –

+0

Полезно знать @TimB! Благодаря ! –

Смежные вопросы