2015-10-30 3 views
2

Я ищу, чтобы поделиться пулом http-соединения с сторонним сервисом у моих исполнителей искры.Как создать пул соединений на уровне исполнителя в Spark?

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

from urllib3 import HTTPConnectionPool 

rdd = sc.parallelize(["peter", "john", "harris"]) 


def get_service(name): 
    pool = HTTPConnectionPool('ajax.googleapis.com', maxsize=10) 

    r = pool.request('GET', '/ajax/services/search/web', fields={'q': 'urllib3', 'v': '1.0'}) 
    return name 

rdd.map(lambda x: get_service(x)).count() 
  • я получаю сообщение об ошибке, если я создаю его как глобальную функцию
  • я мог бы сделать раздел карты и создать его внутри. Затем я получаю один пул соединений по разделам (лучше, чем ничего, но не идеально)

Где я должен определить пул подключений, который должен иметь только один исполнитель?

+2

См. Https://spark.apache.org/docs/latest/streaming-programming-guide.html#design-patterns-for-using-foreachrdd – Reactormonk

+0

@Reactormonk Точно, что я пытаюсь сделать. Однако, в 4-м примере (последний), где я должен определить свой пул? С помощью urllib3 мне нужно создать экземпляр. В примере используется статический класс для обработки пула, и мне нужно создать экземпляр для управления пулом. – poiuytrez

ответ

2

Поскольку документация @ReactorMonk имеет poitned из определения пула соединений внутри foreachPartition (для всего действия) или mapPartitions (если Вы хотите получить информацию обратно) является хорошим способом, чтобы ограничить себя одним соединения на перегородку. (Хотя связь при условии, был на streamining документы, так что это могло бы быть немного запутанным, вы можете также посмотреть на mapPartitions в https://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD)

def processRecords(itr): 
    pool = HTTPConnectionPool('ajax.googleapis.com', maxsize=10) 
    return map(lambda name: //logic goeshere, 
     itr) 

rdd.foreachPartition(sendRecords) 

Один дополнительный потенциал улучшения, если вы можете иметь большое количество разделов по сравнению с количеством исполнителей составляет coalesce ваших данных, чтобы иметь одинаковое количество разделов как исполнителей, уменьшая количество подключений, которые вы в конечном итоге сделаете.

Если бы мы были в JVM, мы могли бы также попытаться использовать шаблон singleton для рабочего, но все будет немного затруднено с тем, как исполнители python работают в Spark.

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