Как программно получить имена хостов всех узлов в кластере Spark - PullRequest
1 голос
/ 06 мая 2020

Мне нужно проверить возможность подключения каждого узла кластера Spark к базе данных. Есть ли способ сделать это программно? Я подумал о том, чтобы получить имена хостов всех узлов в кластере Spark следующим образом:

val data = sc.parallelize(1 to 100000000)
val hosts = data.map {
  value =>
    java.net.InetAddress.getLocalHost().getHostName()
}.collect()

println(s "Hostnames: ${hosts.mkString(", ")}")

Но это всегда печатает одно имя хоста, даже если в кластере много узлов. Я запускаю программу в конфигурации кластерного режима. Если я могу получить разные имена хостов, я могу предположить, что этот код работает на разных узлах. И таким же образом я могу проверить подключение, изменив это следующим образом -

val data = sc.parallelize(1 to 100000000)
val hosts = data.map {value =>
    Class.forName(DRIVER)
    val connection = DriverManager.getConnection(URL, USER, PASSWORD)
    java.net.InetAddress.getLocalHost().getHostName()
}.collect()

println(s "Hostnames: ${hosts.mkString(", ")}")

Или есть какой-либо альтернативный способ сделать это?

1 Ответ

1 голос
/ 06 мая 2020

Данные могут присутствовать в одном узле, поэтому вы можете каждый раз получать одно и то же имя хоста. Попробуйте увеличить количество разделов ваших данных, это приведет к распределению данных. Тем не менее, нет никакой гарантии, что будут задействованы все исполнители. Хорошее количество разделов составляет go по этой формуле:

количество разделов = 3 * количество процессоров в вашем кластере

Это, скорее всего, распределит ваши data, и когда вы запустите код, вы будете выполняться на разных исполнителях.

Для увеличения разделов вы можете использовать:

data.repartition(<number of partitions>)

А также вы можете использовать функцию mapPartitions вместо map, если все, что вам нужно, это имя хоста для раздела.

...