Начало работы с массивными данными
Я математик и иногда занимаюсь консалтинговыми проектами по статистике / анализу машинного обучения. Данные, к которым у меня есть доступ, обычно меньше, не более пары сотен мегабайт (и почти всегда гораздо меньше), но я хочу больше узнать об обработке и анализе данных в масштабе гигабайт / терабайт. Что мне нужно знать, и какие уроки можно извлечь из этого?
- Hadoop / MapReduce - одно очевидное начало.
- Есть ли какой-то конкретный язык программирования, который я должен выбрать? (Сейчас я работаю в основном на Python, Ruby, R и иногда на Java, но кажется, что C и Clojure часто используются для крупномасштабного анализа данных?)
- Я не очень знаком со всем движением NoSQL, за исключением того, что оно связано с большими данными. Что такое хорошее место, чтобы узнать об этом, и есть ли конкретная реализация (Cassandra, CouchDB и т. Д.), С которой мне следует ознакомиться?
- Где я могу узнать о применении алгоритмов машинного обучения к огромным объемам данных? Мои математические знания в основном связаны с теорией, определенно не с числовой или приближенной стороны, и я предполагаю, что большинство стандартных алгоритмов ML на самом деле не масштабируются.
- Любые другие предложения о том, что нужно изучать, было бы здорово!
3 ответа
- Apache Hadoop действительно хорошее начало, потому что он бесплатный, имеет большое сообщество и прост в настройке.
- Hadoop построен на Java, поэтому он может быть выбранным языком. Но можно использовать и другие языки с Hadoop ("каналы" и "потоки"). Я знаю, что Python часто используется, например.
- Вы можете избежать размещения ваших данных в базах данных, если хотите. Первоначально Hadoop работает с данными в (распределенной) файловой системе. Но, как вы уже знаете, для Hadoop имеются распределенные базы данных.
- Вы когда-нибудь смотрели Mahout? Я думаю, что это будет хитом для вас;-) Много работы вам нужно, возможно, уже было сделано!?
- Прочтите Quick Start и настройте свой собственный (псевдораспределенный?) Кластер и запустите пример подсчета слов.
Дайте мне знать, если у вас есть какие-либо вопросы:-) Комментарий напомнит мне по этому вопросу.
Я провел крупномасштабное машинное обучение (наборы данных 3-5 ГБ), так что вот несколько идей:
Во-первых, есть проблемы с логистикой в больших масштабах. Можете ли вы загрузить все свои данные в память? С помощью Java и 64-битной JVM вы можете получить доступ к такому объему оперативной памяти, как у вас есть: например, параметр командной строки -Xmx8192M
даст вам доступ к 8 ГБ (если у вас есть так много). Matlab, будучи Java-приложением, также может извлечь из этого выгоду и работать с довольно большими наборами данных.
Более того, алгоритмы, которые вы запускаете на ваших данных. Скорее всего, стандартные реализации будут ожидать все данные в памяти. Возможно, вам придется внедрить подход с рабочим набором самостоятельно, когда вы будете выгружать и выгружать данные на диск и работать только с частью данных за раз. Иногда их называют алгоритмами разбиения на фрагменты, пакетными или даже инкрементными, в зависимости от контекста.
Вы вправе подозревать, что многие алгоритмы практически не масштабируются, поэтому вам, возможно, придется искать приблизительное решение. Хорошей новостью является то, что практически для любого алгоритма вы можете найти исследовательские работы, которые имеют дело с приближением и / или обсуждают крупномасштабные решения. Плохая новость в том, что вам, скорее всего, придется применять эти подходы самостоятельно.
Hadoop великолепен, но в заднице может возникнуть боль в настройке. На данный момент это лучшая статья, которую я читал о настройке Hadoop. Я настоятельно рекомендую это: http://www.michael-noll.com/wiki/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 будут полезны.