Я использую Spark 2.4.3 на пяти узлах в режиме клиента и автономном режиме для целей тестирования, и мне назначен ограниченный диапазон портов. Поэтому я настроил все порты, которые возможны в соответствии с документами, чтобы избежать того, что Spark берет произвольные порты за пределы моего освобожденного диапазона кода:
в spark-env.sh:
SPARK_MASTER_PORT=master-port<br>
SPARK_WORKER_PORT=worker-port
в командной строке для spark-submit:
-master master-ip:master-port
--conf spark.blockManager.port=block-manager-port
--conf spark.driver.blockManager.port=block-manager-port
--conf spark.driver.port=driver-port
Но теперь я нахожу в журнале для драйвера:
... INFO CoarseGrainedSchedulerBackend$DriverEndpoint:
Registered executor NettyRpcEndpointRef(spark-client://Executor) (worker-ip:arbitrary-port)
with ID 4
Это означает, что искраиспользует произвольный порт для исполнителя - с номером порта, который находится за пределами назначенного мне диапазона - хотя у меня настроены все возможные порты.
Это приводит к следующей записи журнала для драйвера:
... INFO MapOutputTrackerMasterEndpoint: Asked to send map output locations
for shuffle 2 to worker-ip:arbitrary-port
В противном случае в каком-то рабочем журнале можно найти:
... INFO MapOutputTrackerWorker: Doing the fetch; tracker endpoint =
NettyRpcEndpointRef(spark://MapOutputTracker@driver-ip:driver-port)
...
... INFO MapOutputTrackerWorker: Don't have map outputs for shuffle 13, fetching them
... INFO MapOutputTrackerWorker: Got the output locations
Таким образом, все работает, и в журналах нет других предупреждений или ошибок, касающихся этой проблемы. Но я новичок в искре, и я боюсь потери данных. Не могли бы вы дать какой-либо совет, если бы я мог игнорировать эту проблему или что я мог сделать, чтобы заставить Spark использовать порты в моем диапазоне освобожденного кода для исполнителей?
Я искал документы и Интернет, но информации неткак это исправить. Я проанализировал код Spark для классов, которые цитируются в приведенных выше записях журнала (CourseGrainedSchedulerBackend: DriverEndpoint.receiveAndReply, MapOutputTrackerMasterEndpoint.receiveAndReply), но не смог выяснить, откуда Spark получает произвольный номер порта.