2010-03-10 11 views
5

Я хотел бы начать думать о том, как я могу расширить свои алгоритмы, которые я пишу для анализа данных, чтобы их можно было применять к произвольно большим наборам данных. Интересно, каковы соответствующие концепции (потоки, параллелизм, неизменные структуры данных, рекурсия) и инструменты (Hadoop/MapReduce, Terracota и Eucalyptus), чтобы это произошло, и как конкретно эти концепции и инструменты связаны друг с другом. У меня есть рудиментарный фон в сценариях R, Python и bash, а также программирование на C и Fortran, хотя я знаком с некоторыми базовыми концепциями функционального программирования. Мне нужно изменить способ программирования, использовать другой язык (Clojure, Haskell и т. Д.) Или просто (или не просто так!) Адаптировать что-то вроде R/Hadoop (HRIPE) ... или написать обертки для Python для включения многопоточного или Hadoop доступа? Я понимаю, что это может включать требования к дополнительным аппаратным средствам, и я хотел бы получить общее представление о возможностях/вариантах. Приношу свои извинения за этот довольно большой и все же неопределенный вопрос, но просто пытаюсь начать - спасибо заранее!Понятия и инструменты, необходимые для масштабирования алгоритмов

ответ

9

Хотя языки и связанные с ними технологии/каркасы важны для масштабирования, они имеют тенденцию бледны по сравнению с важностью алгоритмов, структуры данных и архитектур. Забудьте о потоках: количество ядер, которые вы можете использовать таким образом, слишком ограничено - вы хотите, чтобы отдельные процессы обменивались сообщениями, поэтому вы можете масштабировать, по крайней мере, небольшой кластер серверов в быстрой локальной сети (и, в идеале, большой кластер также!-).

Реляционные базы данных могут быть исключением из «технологий бледных» - они могут действительно зажать вас, когда вы пытаетесь увеличить масштаб на несколько порядков. Это ваша ситуация - вы беспокоитесь о нескольких десятках или не более сотни серверов, или вы начинаете думать о тысячах или мириадах? В первом случае вы можете растянуть реляционную технологию (например, по горизонтали и по вертикали), чтобы поддержать вас - в последнем вы находитесь в точке разлома или хорошо прошли, и должен начать думать с точки зрения хранилища ключей/значений.

Назад к алгоритмам - «анализ данных» охватывает широкий диапазон ... большая часть моей работы для Google за последние несколько лет приходится на этот диапазон, например. в программном обеспечении для управления кластерами и в настоящее время в сфере бизнес-аналитики. Нужен ли вам детерминированный анализ (например, для целей бухгалтерского учета, где вы не можете игнорировать одну копейку из 8-значных цифр), или вы можете стоить , но не-детерминизм? Большинство приложений «интеллектуального анализа данных» относятся ко второй категории: вам не нужна полная точность и детерминизм, просто хорошая оценка диапазона, в котором ваши результаты могут быть доказаны, например, с вероятностью 95%.

Это особенно важно, если вам когда-либо понадобится анализ данных «в реальном времени» - почти в режиме реального времени и 100% ограничений точности при одном и том же вычислении не счастливый выбор кемпера. Но даже при массовом/пакетном автономном анализе данных, если вы можете предоставить результаты, которые на 95% гарантированы на порядок быстрее, чем это займет 99,99% (я не знаю, может ли когда-либо добыча данных быть 100.00%! -), что может быть прекрасным компромиссом.

Работа, которую я делал в течение последних нескольких лет, предъявила несколько требований к «почти реальному времени» и многим другим требованиям для автономного «пакетного» анализа - и только в очень немногих случаях где абсолютная точность является абсолютной необходимостью. Постепенно уточненная выборка (когда полная гарантированная точность не требуется), особенно в сочетании со стратифицированной выборкой (разработанной с экспертом домена !!!), снова и снова доказывает, что это отличный подход; если вы не понимаете эту терминологию и все еще хотите увеличить масштаб, превышающий терабайты, до обработки exabytes и обработки петабайтов, вам отчаянно нужен хороший курс повышения квалификации в Stats 201 или какой-либо курс охватывает эти понятия в вашей части леса (или в Университете iTunes, или предложения YouTube в университетских каналах, или blip.tv, или что-то еще).

Python, R, C++, что угодно, только вступает в игру после вы освоили эти алгоритмические вопросы, архитектурные вопросы, которые идут с ними (вы можете создать архитектуру вычислений для «статистически выжить» смерть пару серверов из вашего несметного числа, оправившись от статистически достоверной точности без большой переделки ...?), а также с поддержкой дизайна и технологий хранения.

+0

Вау, я для меня большая честь! У меня есть ваша книга на Python ... Спасибо за подробный ответ. Мои желания все еще но абстрактны, но имеют дело с измерениями земной системы ... в настоящее время нет требований к реальным потребностям, а точность 100% не требуется (после модели обработки человека: быстрая и приблизительная. И да, я довольно хорошо знаком со стратифицированными методами выборки!). Похоже, что алгоритм сильно определяется аппаратным обеспечением (естественно), и первым шагом может быть рассмотрение сокращения данных посредством репрезентативной выборки. Больше необходимости. – hatmatrix

+0

@ Стефен, да, начинаем с грубой сетки и утончаем ее и постепенно можем хорошо работать для вас (если геофизики согласны): мне лично удобнее с некоторой случайностью в выборке, но это не требование, если не возможно артефакты, исходящие из аспектов неслучайности («смещение выборки»), которые, как я подозреваю, в геофизике, могут не возникнуть. После того, как вы начнете масштабирование путем передачи сообщений, сокращение потребностей в синхронизации и обмене данными между узлами (например, непрерывные «обратные вызовы» и ожидания) становится первостепенным, и выборка пространственной сетки хорошо работает для этого! –

3

Главное для увеличения объема данных - избегать ситуаций, когда вы читаете огромные массивы данных сразу. В pythonic это обычно означает использование итераторов для использования набора данных в управляемых частях.

+0

Я люблю итераторы! Не могу остановить usin'em. – hatmatrix

Смежные вопросы