python извлекает текстовые блоки для нескольких переменных [duplicate]

Путь классов Apache Spark построен динамически (для размещения кода пользователя для каждого приложения), что делает его уязвимым для таких проблем. @ user7337271 ответ правильный, но есть еще несколько проблем, в зависимости от используемого вами менеджера кластера («мастер»).

Во-первых, приложение Spark состоит из из этих компонентов (каждый из них является отдельным JVM, поэтому потенциально содержит разные классы в его пути к классам):

  1. Драйвер: это ваше приложение, создающее SparkSession (или SparkContext) и подключение к диспетчеру кластера для выполнения фактической работы
  2. Диспетчер кластеров: служит в качестве «точки входа» в кластер, которому поручено выделить исполнителей для каждого заявление. В Spark есть несколько разных типов: автономный, YARN и Mesos, которые мы опишем ниже.
  3. Исполнители: это процессы на узлах кластера, выполняющие фактическую работу (запуск Spark Задачи )

Соотношение между ними описано на этой диаграмме из обзора режима кластера Apache Spark :

Теперь - какие классы должны находиться в каждом из этих компонентов?

На это может ответить следующая диаграмма:

Давайте разберем это медленно:

  1. Spark Code - это библиотеки Spark. Они должны существовать в ALL трех компонентах, так как они включают клей, который позволяет Spark выполнять связь между ними. Кстати, авторы Spark внесли дизайнерское решение включить код для ВСЕХ компонентов во ВСЕХ компонентах (например, включить код, который должен запускаться только в Executor в драйвере), чтобы упростить это - так что «толстая банка Spark» (в версиях до 1.6 ) или «архив» (в версии 2.0, ниже) содержат необходимый код для всех компонентов и должны быть доступны во всех них.
  2. Код только для драйверов - это код пользователя, который не содержит ничего, что должно используется для исполнителей, то есть кода, который не используется при каких-либо преобразованиях в RDD / DataFrame / Dataset. Это необязательно должно быть отделено от распределенного кода пользователя, но это может быть.
  3. Распределенный код - это код пользователя, который скомпилирован с кодом драйвера, но также должен выполняться на исполнителях - все используемые фактические преобразования должны быть включены в эту банку.

Теперь, когда мы получили это прямо, как мы получаем, чтобы классы правильно загружались в каждом компоненте, и какими правилами они должны следовать?

  1. Spark Code : как утверждают предыдущие ответы, вы должны использовать те же версии Scala и Spark для всех компонентов. 1.1 В автономном режиме существует «ранее существовавшая» установка Spark, к которой могут подключаться приложения (драйверы). Это означает, что все драйверы должны использовать ту же версию Spark, что и на главном и исполнительном устройствах. 1.2 В YARN / Mesos каждое приложение может использовать другую версию Spark, но все компоненты одного и того же приложения должны использовать один и тот же. Это означает, что если вы использовали версию X для компиляции и упаковки вашего приложения-драйвера, вы должны предоставить такую ​​же версию при запуске SparkSession (например, через spark.yarn.archive или spark.yarn.jars параметры при использовании YARN). Банки / архив, которые вы предоставляете, должны включать все зависимости Spark (включая транзитивные зависимости), и они будут отправляться диспетчером кластера каждому исполнителю при запуске приложения.
  2. Код драйвера: это полностью до - драйвер код может быть отправлен в виде кучи банок или «толстой банки», если он включает все зависимости Spark + весь код пользователя
  3. Распределенный код: помимо присутствия в драйвере этот код должен быть отправлены исполнителям (опять же, вместе со всеми его транзитивными зависимостями). Это делается с использованием параметра spark.jars.

Подводя итог, рассмотрим предлагаемый подход к созданию и развертыванию Spark Application (в данном случае - с использованием YARN):

  • Создайте библиотеку с вашим распределенным кодом, упакуйте ее как «регулярную» банку (с файлом .pom, описывающим ее зависимости), так и как «живую банку» (со всеми включенными транзитными зависимостями).
  • Создайте приложение драйвера с зависимостями компиляции в вашей распределенной библиотеке кодов и Apache Spark (с определенной версией).
  • Пакет приложения драйвера в жирную банку, которая будет развернута в driver
  • Передайте правильную версию вашего распределенного кода в качестве значения параметра spark.jars при запуске SparkSession
  • Передайте местоположение файла архива (например, gzip), содержащего все банки в папке lib/ загруженных двоичных файлов Spark в качестве значения spark.yarn.archive

47
задан Curious2learn 25 October 2010 в 11:18
поделиться

6 ответов

Если вы действительно хотите создать их на лету, вы можете назначить dict, который возвращается либо globals (), либо locals () в зависимости от того, какое пространство имен вы хотите создать в них:

globals()['somevar'] = 'someval'
print somevar  # prints 'someval'

Но я бы не рекомендовал это делать. В общем, избегайте глобальных переменных. Использование locals () часто просто скрывает то, что вы на самом деле делаете. Вместо этого создайте свой собственный dict и назначьте его.

mydict = {}
mydict['somevar'] = 'someval'
print mydict['somevar']

Изучите python zen; запустите это и запомните его:

>>> import this
30
ответ дан kanaka 21 August 2018 в 03:30
поделиться

У меня возникла ваша проблема, и вот мой ответ:

prices = [5, 12, 45]
list=['1','2','3']

for i in range(1,3):
  vars()["prices"+list[0]]=prices[0]
print ("prices[i]=" +prices[i])

, поэтому при печати:

price1 = 5 
price2 = 12
price3 = 45
8
ответ дан Raviteja 21 August 2018 в 03:30
поделиться
  • 1
    Это не работает. – Billal BEGUERADJ 27 April 2017 в 12:16
  • 2
    Здесь много ошибок, но подход как таковой не является полностью ошибочным; вы можете назначить vars()["prices"+str(i)] и иметь переменную с ожидаемым именем. – tripleee 30 January 2018 в 07:04

На объекте вы можете достичь этого с помощью setattr

>>> class A(object): pass
>>> a=A()
>>> setattr(a, "hello1", 5)
>>> a.hello1
5
15
ответ дан Stefano Borini 21 August 2018 в 03:30
поделиться

Хотя я не вижу большого смысла, вот он:

for i in xrange(0, len(prices)):
    exec("price%d = %s" % (i + 1, repr(prices[i])));
27
ответ дан Tim Čas 21 August 2018 в 03:30
поделиться
  • 1
    Что такое отступ от сгенерированного кода? И когда это сгенерировано? Невозможно заставить это работать в проекте Django – Philip007 21 May 2013 в 11:41
  • 2
    О, вы имеете в виду генерировать фактический код, а не выполнять каждую отдельную вещь? Просто замените это exec() на print(). – Tim Čas 10 June 2013 в 17:06
  • 3
    Какова цель использования функции repr ()? – Bodhidarma 11 May 2015 в 13:17
  • 4
    @Bodhidarma: см. Описание в документах Python --- repr() пытается вернуть значение, которое при передаче в eval() (или exec() в этом случае) дает объект с одинаковое значение. В случае строк это ускользает от них должным образом. THAT SAID , вы никогда не должны использовать вышеприведенный код (у Python есть отличная концепция для представления кучи переменных --- списков!). – Tim Čas 11 May 2015 в 13:53
  • 5
    Обратите внимание, что это не будет работать в функции - по крайней мере, сегодня, не могу вспомнить, было ли это в Темные века. Поскольку большинство Python-кода, вероятно, не должно быть на уровне модуля, оно не работает там, где будет жить большинство кода. – DSM 3 April 2017 в 13:41

бит длинный, он работает, я думаю ...

prices = [5, 12, 45]
names = []
for i, _ in enumerate(prices):
    names.append("price"+str(i+1))
dict = {}
for name, price in zip(names, prices):
    dict[name] = price
for item in dict:
    print(item, "=", dict[item])
2
ответ дан Leo Zhang 21 August 2018 в 03:30
поделиться

Еще один пример, который действительно является вариантом другого ответа , поскольку он также использует словарь:

>>> vr={} 
... for num in range(1,4): 
...     vr[str(num)] = 5 + num
...     
>>> print vr["3"]
8
>>> 
6
ответ дан PolyGeo 21 August 2018 в 03:30
поделиться
  • 1
    как вы изменяете vr, хотя? ваше решение побеждает всю цель. я очищаю данные из Интернета, с которыми мне нужно создавать экземпляры класса для каждого элемента контейнера, а количество элементов контейнера неизвестно ... как в вопросе 2 в этот поток, который я создал – Anthony 29 June 2018 в 00:48
  • 2
    @ Энтони вопрос, который я отвечаю здесь, гораздо более сосредоточен, чем то, с чем вы связались. У меня нет совета по этому вопросу. – PolyGeo 29 June 2018 в 00:55
  • 3
    это в основном тот же контекст. я имел в виду «Вопрос № 2», в этой нити на самом дне ... – Anthony 29 June 2018 в 01:32
Другие вопросы по тегам:

Похожие вопросы: