Начало работы с массивными данными - PullRequest
2 голосов
/ 30 мая 2010

Я математик и иногда занимаюсь консалтинговыми проектами по статистике / анализу машинного обучения. Данные, к которым у меня есть доступ, обычно меньше, не более пары сотен мегабайт (и почти всегда гораздо меньше), но я хочу больше узнать об обработке и анализе данных в масштабе гигабайт / терабайт. Что мне нужно знать и из каких хороших ресурсов можно извлечь уроки?

  1. Hadoop / MapReduce - одно очевидное начало.
  2. Какой конкретный язык программирования я должен выбрать? (Сейчас я работаю в основном на Python, Ruby, R и иногда на Java, но кажется, что C и Clojure часто используются для крупномасштабного анализа данных?)
  3. Я не очень знаком со всем движением NoSQL, за исключением того, что оно связано с большими данными. Что такое хорошее место, чтобы узнать об этом, и есть ли конкретная реализация (Cassandra, CouchDB и т. Д.), С которой я должен ознакомиться?
  4. Где я могу узнать о применении алгоритмов машинного обучения к огромным объемам данных? Мои знания по математике в основном связаны с теорией, определенно не с числовой или приближенной стороны, и я полагаю, что большинство стандартных алгоритмов ML не масштабируются.
  5. Любые другие предложения о том, чему учиться, были бы великолепны!

Ответы [ 3 ]

2 голосов
/ 01 июня 2010
  1. Apache Hadoop действительно хорошее начало, потому что он бесплатный, имеет большое сообщество и прост в настройке.
  2. Hadoop построен на Java, так что это может быть выбранным языком. Но можно использовать и другие языки с Hadoop («каналы» и «потоки»). Я знаю, что Python часто используется, например.
  3. Вы можете избежать размещения ваших данных в базах данных, если хотите. Первоначально Hadoop работает с данными в (распределенной) файловой системе. Но, как вы уже знаете, для Hadoop имеются распределенные базы данных.
  4. Вы когда-нибудь смотрели Махоут ? Я думаю, что это будет хитом для вас ;-) Много работы вам нужно, возможно, уже было сделано!?
  5. Прочитайте Быстрый запуск и настройте свой собственный (псевдораспределенный?) Кластер и запустите пример подсчета слов .

Дайте мне знать, если у вас есть какие-либо вопросы :-) Комментарий напомнит мне по этому вопросу.

0 голосов
/ 10 августа 2010

Hadoop великолепен, но в заднице может возникнуть боль в настройке. На данный момент это лучшая статья, которую я читал о настройке Hadoop. Я настоятельно рекомендую это: http://www.michael -noll.com / вики / Running_Hadoop_On_Ubuntu_Linux_% 28Single-Node_Cluster% 29

Clojure построен поверх Java, поэтому маловероятно, что он будет работать быстрее, чем Java. Тем не менее, это один из немногих языков, который хорошо разделяет память, что может быть полезным, а может и не быть. Я не математик, но кажется, что большинство математических вычислений очень распараллеливаемы, и при этом не нужно, чтобы потоки разделяли память. В любом случае, вы можете попробовать Incanter , который является библиотекой статистических вычислений Clojure, и clojure-hadoop , который делает написание заданий Hadoop намного менее болезненным.

Что касается языков, я считаю, что различия в производительности оказываются постоянными факторами. Гораздо лучше просто найти язык, который вам нравится, и сосредоточиться на улучшении ваших алгоритмов. Однако, согласно некоторой перестрелке , процитированной Питером Норвигом (прокрутите вниз к красочному столу, вы можете уклониться от Python и Perl из-за их дурацкого отношения к массивам.

В двух словах, NoSQL отлично подходит для неструктурированных / произвольно структурированных данных, тогда как SQL / RDBMS отлично (или, по крайней мере, допустимо) для структурированных данных. Изменение / добавление полей в СУБД обходится дорого, поэтому, если это случится много, вы можете от них уклониться.

Однако в вашем случае кажется, что вы собираетесь выполнять пакетную обработку тонны данных, а затем получать ответ, в отличие от данных, о которых вы будете периодически задавать вопросы? Возможно, вы могли бы просто обрабатывать CSV / текстовые файлы в Hadoop. Если вам не нужен эффективный способ доступа к произвольной информации о ваших данных на лету, я не уверен, что SQL или NoSQL будут полезны.

0 голосов
/ 30 мая 2010

Я провел крупномасштабное машинное обучение (наборы данных 3-5 ГБ), поэтому вот несколько идей:

Во-первых, есть проблемы с логистикой в ​​больших масштабах. Можете ли вы загрузить все свои данные в память? С помощью Java и 64-битной JVM вы можете получить доступ к столько оперативной памяти, сколько у вас есть: например, параметр командной строки -Xmx8192M даст вам доступ к 8 ГБ (если у вас их так много). Matlab, будучи Java-приложением, также может извлечь из этого выгоду и работать с довольно большими наборами данных.

Что еще более важно, алгоритмы, которые вы запускаете на ваших данных. Скорее всего, стандартные реализации будут ожидать все данные в памяти. Возможно, вам придется внедрить рабочий набор , в котором вы будете выгружать и выгружать данные на диск и работать только с частью данных за раз. Иногда их называют алгоритмами chunking , batch или даже incremental , в зависимости от контекста.

Вы правы, подозревая, что многие алгоритмы практически не масштабируются, поэтому вам, возможно, придется искать приблизительное решение. Хорошей новостью является то, что практически для любого алгоритма вы можете найти исследовательские работы, которые имеют дело с приближением и / или обсуждают крупномасштабные решения. Плохая новость заключается в том, что вам, скорее всего, придется применять эти подходы самостоятельно.

...