Recommendations for distributed processing/distributed storage systems
At my organization we have a processing and storage system spread across two dozen linux machines that handles over a petabyte of data. The system right now is very ad-hoc; processing automation and data management is handled by a collection of large perl programs on independent machines. I am looking at distributed processing and storage systems to make it easier to maintain, evenly distribute load and data with replication, and grow in disk space and compute power.
The system needs to be able to handle millions of files, varying in size between 50 megabytes to 50 gigabytes. Once created, the files will not be appended to, only replaced completely if need be. The files need to be accessible via HTTP for customer download.
Right now, processing is automated by perl scripts (that I have complete control over) which call a series of other programs (that I don't have control over because they are closed source) that essentially transforms one data set into another. No data mining happening here.
Here is a quick list of things I am looking for:
Reliability: These data must be accessible over HTTP about 99% of the time so I need something that does data replication across the cluster.
Scalability: I want to be able to add more processing power and storage easily and rebalance the data on across the cluster.
Distributed processing: Easy and automatic job scheduling and load balancing that fits with processing workflow I briefly described above.
Осведомленность о местонахождении данных: строго не требуется, но желательно Поскольку данные и обработка будут происходить на одном и том же наборе узлов, я бы хотел, чтобы планировщик заданий планировал задания на узле или рядом с ним, на котором фактически находятся данные, для сокращения сетевого трафика.
Вот что я посмотрел до сих пор:
Управление хранением:
GlusterFS: выглядит действительно красиво и легко в использовании, но, похоже, нет способа выяснить, на каком узле (ах) файл фактически находится для предоставления в качестве подсказки для планировщика заданий.
GPFS: похоже на золотой стандарт кластерных файловых систем. Удовлетворяет большинству моих требований, за исключением, например, glusterfs, осведомленности о местонахождении данных.
Ceph: Прямо сейчас кажется незрелым.
Распределенная обработка:
- Sun Grid Engine: у меня большой опыт в этом, и он относительно прост в использовании (если он правильно настроен). Но Oracle обрела ледяную хватку, и это больше не кажется желанным.
И то и другое:
Hadoop / HDFS: На первый взгляд казалось, что hadoop идеально подходит для моей ситуации. Распределенное хранилище и планирование заданий, и это было единственное, что я нашел, что дало бы мне понимание местоположения данных, которое я хотел. Но мне не нравится, что имя является единственной точкой отказа. Кроме того, я не совсем уверен, соответствует ли парадигма MapReduce типу рабочего процесса обработки, который у меня есть. Кажется, вам нужно написать все свое программное обеспечение специально для MapReduce, а не просто использовать Hadoop в качестве общего планировщика заданий.
OpenStack: я немного читал об этом, но у меня возникли проблемы с решением, хорошо ли он подходит к моей проблеме или нет.
У кого-нибудь есть мнения или рекомендации по технологиям, которые бы хорошо подходили моей проблеме? Любые предложения или советы будут с благодарностью.
Спасибо!
1 ответ
Звучит так, будто ты в большей степени на пути к тому, что тебе нужно. Существующие технологии (GlusterFS, GPFS) имеют функции, которые вы ищете, но не обеспечивают локальность данных. В зависимости от того, что вы делаете с данными, это может быть встроено в ваш диспетчер работы.
Для меня это звучит так, как будто вам нужно встроить этап индексации в конвейер обработки, который определяет локальность данных. Это можно распараллелить, а затем повторно сериализовать в базе данных, хотя этот шаг, вероятно, представляет собой пользовательский код (вы знаете свои данные лучше, чем я). Если у вас есть локальность данных, рабочие единицы обработки пакетов для рабочих узлов должны быть достаточно простыми; сначала создайте рабочие блоки для данных локального узла, а затем к смежному с узлом (если эта концепция применима в вашем случае), и, наконец, глобальный контекст, используемый, когда большая часть обработки выполнена, но несколько рабочих блоков, кажется, требуют возраста и их локальный процессор занят, жуя их.
Это представление высокого уровня. Фокусировка ближе к болтам проблемы. Судя по тому, что вы сказали до сих пор, похоже, что вы работаете с большими кусками данных и хотите, чтобы обработка выполнялась в локальном хранилище по соображениям пропускной способности. Я вижу несколько вариантов:
Первая идея: когда данные поступают из вашего источника, они копируются в Gluster/GPFS/ любую распределенную файловую систему. Затем запустите процесс индексации, который я описал выше. Затем, когда рабочие обрабатывают данные, обработанные наборы данных передаются обратно в другую группу серверов, роль которых заключается в обработке обработанных данных через HTTP. Метод отчета может быть реализован даже через HTTP PUT, которые затем сбрасывают данные в другую реплицированную файловую систему. Недостаток этого метода заключается в том, что он хранит ваши данные дважды (оригинальные и измененные), но я не знаю, что вы уже делаете. Это позволяет вам значительно расширить масштаб обрабатывающей инфраструктуры, сохраняя при этом небольшую размерность инфраструктуры обслуживания клиентов.
Вторая идея, как указано выше, но когда работники заканчивают обработку рабочего модуля, сохраненные данные сохраняются в файловой системе Gluster/GPFS/ любой другой. HTTP-серверы затем подают данные непосредственно из этих репозиториев, но они не так озабочены локальными узлами, как узлы обработки. Для этого, вероятно, было бы неплохо иметь отдельные сети обслуживания клиентов и обработки, чтобы ограничить проблему двойного транзита с этими большими наборами данных.
Третья идея: если выяснить локальность данных GPFS/Gluster на самом деле неосуществимо (я ими не пользовался, поэтому я не уверен), возможно, вы захотите заняться созданием собственного типа хранилища. Это много работы, но если вам действительно нужна местность, это может стоить этого для вас. Когда вы принимаете данные, каждый набор данных индексируется в базе данных, а HTTP помещается в несколько узлов по мере необходимости. Когда происходит обработка, создаются задания для отдельных узлов для данных, которые сначала являются локальными для самих узлов. Когда работник получает задание, он получает данные HTTP от узла, указанного в базе данных (который должен быть самим собой, но не обязательно). Когда работа завершена, она уведомляет базу данных и получает инструкции о том, куда ставить результаты.
Для обслуживания обработанных наборов данных клиентам, вам, вероятно, придется ввести некоторый код приложения для преобразования файлов для извлечения в проксированные HTTP GET с ваших узлов.
Это действительно представляет часть процесса с высокой пропускной способностью в форме этой базы данных. Он может иметь несколько веб-серверов с балансировкой нагрузки перед ним для логики обработки, но сама база данных в конечном итоге оказывается единственной точкой отказа (хотя люди, более разбирающиеся в способах работы с базами данных, могут знать об этом), База данных, по сути, действует как таблица размещения файлов для большой файловой системы на основе HTTP. Поскольку для вашей обработки, похоже, требуется очень простая семантика файловой системы (выборка / ввод, возможно блокировка / разблокировка для узла, который обрабатывает набор данных), который может быть опосредован такой базой данных. Очевидно, что эта БД будет очень большой, поэтому некоторые из технологий NoSQL могут лучше подходить по соображениям производительности.
Я знаю, что это не конкретные технологии, которые вы ищете, это больше о методах работы с недостатками на рынке. Кажется, что локальность данных и репликация являются чем-то вроде крайнего случая. Так получилось, что мы делаем что-то похожее на вас только с меньшими наборами данных, так что это тема, которая мне тоже в голову.