Я обрабатываю данные с помощью экземпляра m4.x16large, используя фреймворк Spark. Мне нужно загрузить много ТБ данных из S3, распределенных во многих файлах размером ~ 128 МБ. Согласно спецификациям экземпляра EC2, у меня должна быть пропускная способность до 20 Гбит / с, что соответствует примерно 2 ГБ / с. Однако при обработке данных из S3 я в среднем достигаю пропускной способности ~ 650 МБ / с.
И экземпляр, и сегмент S3 находятся в одном регионе, и загрузка ЦП машины не достигает 100%, поэтому я предполагаю, что узкое место не в скорости обработки. Я выполняю легкую агрегацию данных по мере их поступления и сохраняю их на диске, но я не понимаю, как это может ограничить пропускную способность сети.
Я делаю что-то неправильно? Можно ли повысить производительность при загрузке данных из S3? Как я могу лучше достичь теоретического предела пропускной способности сети в 20 Гбит / с?
Редактировать: Я использую минимум для запуска этого экземпляра. Я создал один общедоступный VPC с подсетью, имеющей конечную точку службы для S3.
Из мастера создания VPC у меня есть:
Public subnet instances use Elastic IPs or Public IPs to access the Internet.
Спасибо за продолжение, я добавил дополнительную информацию к своему вопросу. Пожалуйста, дайте мне знать, если я могу предоставить какую-либо другую полезную информацию.
Я не понимаю, где вы объяснили, сколько параллельных / одновременных загрузок вы делаете. Было бы полезно знать типичную пропускную способность, которую вы видите при каждой отдельной загрузке.
Как я могу получить эту информацию? Когда я пытаюсь прочитать данные, Spark создает ~ 10 тыс. Задач, соответствующих каждому из файлов в каталоге S3. Поскольку у меня доступно около 110 ядер, я предполагаю, что это количество одновременных загрузок? Я считываю данные в фрейм данных с помощью sparkSession.read.text(s3_path).





Сколько одновременных / параллельных загрузок вы выполняете при достижении 650 МБ (б?) / С? Как этот экземпляр получает доступ к S3 ... Elastic IP? NAT-шлюз? Экземпляр NAT? Конечная точка S3 VPC?