Я подключился к предложениям Amazon AWS и, пожалуйста, объясните это на высоком уровне - если я правильно думаю.
Итак, у меня есть несколько скриптов парсинга Python на моем локальном компьютере. Я хочу использовать AWS для сверхбыстрого подключения к Интернету по более низкой цене - выигрыш / выигрыш!
Я понимаю, что могу развернуть экземпляр CentOS / Ubuntu на EC2. Установите необходимые библиотеки Python. Запускайте и останавливайте экземпляры с помощью boto (Python) для экономии затрат. Я правильно думаю? (Это возможно?)
Я выполню CRON несколько скриптов, которые начнут извлекать (очищать) HTML-файлы для последующего анализа. Итак, эти HTML-файлы копируются на S3 для хранения (или я должен выгружать их на свой локальный компьютер, поскольку именно так я буду анализировать и хранить в MySQL?).
Пожалуйста, сообщите, могу ли я понять свои предположения и то немногое, что я знаю об AWS, за несколько часов чтения / поиска в Google об услуге.
Основная предпосылка вашей настройки кажется хорошей, однако есть несколько элементов, которые вы, возможно, захотите учесть.
Во-первых, пропускная способность сети EC2 (и ввода-вывода) зависит от типа инстанса. Если вы надеетесь использовать экземпляры t1.micro, не ожидайте «сверхбыстрого подключения к Интернету» - даже с m1.small вы можете не увидеть требуемую производительность. Также имейте в виду, что вы платите за полосу пропускания, используемую на EC2 (а не только за время экземпляра).
Что касается вашего первого пункта, не должно возникнуть особых трудностей при настройке Python на экземпляре EC2. Однако потенциальные трудности возникают из-за координации ваших экземпляров. Например, если у вас запущено 2 экземпляра, как вы разделите задачу между ними? Как каждый экземпляр «узнает», что сделал другой (при условии, что вы не собираетесь вручную разбивать список URL-адресов). Более того, если вы запускаете экземпляр, будет ли один из экземпляров EC2 отвечать за его обработку или ваш локальный компьютер будет с этим справляться (если это один из экземпляров EC2, как вы определяете, какой экземпляр будет отвечать за задачу? (то есть, чтобы предотвратить выполнение задачи «запуск» каждым экземпляром) и как вы перераспределяете задачи, чтобы включить новый экземпляр? Как вы определяете, какие экземпляры должны завершаться автоматически?
Несомненно, все вышеперечисленное возможно (коросинхронизация / сердцебиение, кардиостимулятор, автоматическое масштабирование и т. Д.), Но сначала их легко упустить из виду. В любом случае, если вы ищете «лучшую цену», вы, вероятно, захотите использовать спотовые инстансы (в отличие от инстансов по запросу), однако, чтобы это работало, вам нужна довольно надежная архитектура. (Стоит отметить, что спотовые цены значительно колеблются - иногда превышая цену по запросу; в зависимости от временного интервала, в котором вы работаете, вы захотите либо установить низкую верхнюю спотовую цену, либо определить лучший подход (на месте / по запросу) на регулярной (ежечасной) основе, чтобы минимизировать ваши затраты.) Хотя я не могу подтвердить это на данный момент, самым простым (и дешевым) вариантом может быть автоматическое масштабирование AWS. Вам необходимо настроить будильники Cloudwatch (но Cloudwatch предоставляет 10 бесплатных будильников), а само автоматическое масштабирование не связано с затратами (кроме стоимости новых экземпляров и затрат Cloudwatch).
Учитывая, что я действительно не имею представления о масштабах вашей деятельности, я могу спросить, почему бы просто не использовать EC2 для анализа и обработки. Особенно если синтаксический анализ сложен, страницы могут быть извлечены быстрее, чем они могут быть обработаны, и у вас есть большое количество страниц (предположительно, иначе вам не пришлось бы прилагать усилия по настройке AWS), это может быть эффективнее просто обрабатывать страницы на EC2, а когда все будет сделано, скачать дамп базы данных. Возможно, это может немного упростить ситуацию - если один экземпляр работает с MySQL (с данными, хранящимися на томе EBS), каждый экземпляр запрашивает у экземпляра MySQL следующий набор записей (и, возможно, отмечает их как зарезервированные), выполняет выборку и процессы, и сохраняет данные в MySQL.
Если вы не собираетесь запускать MySQL на EC2, вы можете хранить свои HTML-файлы на S3, как вы упомянули, или можете сохранить их на томе EBS. Преимущество S3 в том, что вам не нужно заранее выделять хранилище (особенно полезно, если вы не знаете размер данных, с которыми имеете дело) - вы платите за PUT / GET и хранилище; Обратной стороной является скорость - S3 не предназначен для использования в качестве файловой системы, и (даже если вы можете смонтировать его как файловую систему) было бы довольно неэффективно сохранять каждый отдельный файл в S3 (так как в этом случае вы захотите накапливать несколько страниц, и они загружают их в S3). Кроме того, если у вас большой объем файлов (десятки тысяч), процесс выборки всех имен файлов и т. Д. Может быть медленным. Тома EBS предназначены для использования в качестве хранилища, подключенного к экземпляру - преимущество заключается в скорости - как в скорости передачи, так и в том факте, что он имеет `` файловую систему '' (поэтому чтение списка файлов и т. Д. Происходит быстро) - тома EBS сохраняются за пределами завершение работы экземпляра (кроме корневых томов EBS, которые по умолчанию отсутствуют (но могут быть выполнены)). Недостатки томов EBS заключаются в том, что вам необходимо заранее выделить определенное количество хранилища (которое нельзя изменить на лету) - и вы платите за этот объем хранилища (независимо от того, все ли оно используется); вы также платите за операции ввода-вывода (кроме того, производительность томов EBS зависит от скорости сети - поэтому более крупные экземпляры получают лучшую производительность EBS). Другое преимущество EBS состоит в том, что, будучи файловой системой, вы можете очень легко выполнять такую задачу, как сжатие файлов (и я полагаю, что если вы загружаете много html-страниц, вы не захотите получать отдельные файлы S3 позже). ).
На самом деле я не собираюсь рассуждать о возможностях (имея в виду, что в очень большом масштабе для управления такого рода задачами будет использоваться что-то вроде map-reduce / hadoop), но если у вас есть подход к разделению задача (например, экземпляр MySQL) и управление масштабированием экземпляров (например, автоматическое масштабирование), идея, которая у вас есть, должна работать нормально.
Вы можете взаимодействовать с разными экземплярами через SQS. Это служба очереди. Вы можете поставить входной URL в очередь в SQS. Каждый экземпляр будет последовательно получать URL из SQS. Но SQS не будет давать один и тот же ввод для нескольких экземпляров. В этом главное преимущество ..