<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Игорь Артамонов &#187; Базы данных</title>
	<atom:link href="http://artamonov.ru/category/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://artamonov.ru</link>
	<description>Посмотрим, глубока ли кроличья нора</description>
	<lastBuildDate>Wed, 01 Feb 2012 11:35:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Spring-Data</title>
		<link>http://artamonov.ru/2010/09/29/spring-data/</link>
		<comments>http://artamonov.ru/2010/09/29/spring-data/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 18:35:38 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=434</guid>
		<description><![CDATA[Вчера беседовал с Марком Полаком из SpringSource и узнал что они сейчас занимаются, помимо прочего, проектом Spring Data. Это будет некий ORM. Так что, во-первых, все недовольные Hibernate и пр. могут иметь ввиду. А во-вторых эта штука делается и для NoSQL решений, что для моих проектов очень интересно. Стабильное решение будет не скоро, проект в [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера беседовал с <a href="http://www.springsource.com/people/mpollack">Марком Полаком</a> из <a href="http://www.springsource.com/">SpringSource</a> и узнал что они сейчас занимаются, помимо прочего, проектом <a href="http://git.springsource.org/spring-data">Spring Data</a>. Это будет некий ORM. Так что, во-первых, все недовольные Hibernate и пр. могут иметь ввиду. А во-вторых эта штука делается и для NoSQL решений, что для моих проектов очень интересно. </p>
<p>Стабильное решение будет не скоро, проект в самом начале пути, нет ни плана, ни майлстоунов, ни объявлений, но есть надежда что выкатят летом-осенью следующего года. Ну а сейчас, говорит, уже работает для Neo4J и MongoDB.</p>
<p>Там, кстати, Gitorius. Так что можете поучаствовать, если хочется использовать пораньше, ну или можно найти что-нибудь другое, интересное вам: <a href="http://git.springsource.org/">http://git.springsource.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2010/09/29/spring-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PwC о Semantic Web</title>
		<link>http://artamonov.ru/2009/06/21/pwc-about-semantic-web/</link>
		<comments>http://artamonov.ru/2009/06/21/pwc-about-semantic-web/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 19:21:49 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[owl]]></category>
		<category><![CDATA[rdf]]></category>
		<category><![CDATA[semantic web]]></category>
		<category><![CDATA[sparql]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=205</guid>
		<description><![CDATA[Встретил хороший отчет PriceWaterhouseCoopers по поводу Semantic Web, где идет речь о способах хранения и обработки корпоративных данных. Заинтересовало именно то что там идет речь не только о semantic web как таковом, но о внутреннем использовании этих технологий, для хранения и обработки данные. Все о том что для сложноструктурированных данных классический подход (со всеми нормальными [...]]]></description>
			<content:encoded><![CDATA[<p>Встретил хороший <a href="http://www.pwc.com/extweb/home.nsf/docid/1308AF8EA7929CCA852575BA00720F26">отчет PriceWaterhouseCoopers по поводу Semantic Web</a>, где идет речь о способах хранения и обработки корпоративных данных. Заинтересовало именно то что там идет речь не только о semantic web как таковом, но о внутреннем использовании этих технологий, для хранения и обработки данные.</p>
<p>Все о том что для сложноструктурированных данных классический подход (со всеми нормальными формами) не всегда работает. Т.е. иногда создать отдельную таблицу в БД под каждый тип сущности и установить связи просто не реально, ну например сколько их будет в случае большого магазина, например Озона? С десяток категорий с совершенно разными товарами, где общих полей мало, лишь поля цены, названия и пр. В общем в любом случае приходится придумывать что-то универсальное. Так вот, чтобы не изобретать свой велосипед, можно посмотреть в сторону технологий Semantic Web.</p>
Что есть полезного:
<ul>
<li><a href="http://ru.wikipedia.org/wiki/Resource_Description_Framework">RDF</a>&nbsp;&mdash; чрезвычайно простой и универсальный формат, а именно структурированеи в виде графа (и RDF это не XML)</li>
<li><a href="http://ru.wikipedia.org/wiki/Web_Ontology_Language">OWL</a>&nbsp;&mdash; язык для структуризации, описания предметной области, в том числе вывода неявной информации, зависимостей, связей и пр.</li>
<li><a href="http://ru.wikipedia.org/wiki/SPARQL">SPARQL</a>&nbsp;&mdash; язык запросов к rdf данным</li>
</ul>
<p>Хотя, если честно, эта область во-первых все еще только развивается, а во-вторых не все так просто и очень высокий порог для входа. Но чтото уже начинает <a href="http://en.wikipedia.org/wiki/Category:Semantic_Web">вырисовываться</a>.</p>
<p>PS а отчет советую прочитать</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/06/21/pwc-about-semantic-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Колоночные базы данных</title>
		<link>http://artamonov.ru/2009/02/17/column-oriented-databases/</link>
		<comments>http://artamonov.ru/2009/02/17/column-oriented-databases/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 14:19:20 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[bigtable]]></category>
		<category><![CDATA[column oriented]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[hbase]]></category>
		<category><![CDATA[Kdb]]></category>
		<category><![CDATA[key value]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[rdbms]]></category>
		<category><![CDATA[simpledb]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=185</guid>
		<description><![CDATA[Меня, если честно, всегда смущал тот факт что Oracle пихают во все задачи, куда только можно, бытует мнение что &#171;БД это Оракл&#187;. Я лично не думаю что это прям такая &#171;серебряная пуля&#187;. MySQL занимает те же позиции немного на другом фронте. Да, Oracle в частности, MySQL, и реляционные БД в общем, это отличный инструмент, но [...]]]></description>
			<content:encoded><![CDATA[<p>Меня, если честно, всегда смущал тот факт что Oracle пихают во все задачи, куда только можно, бытует мнение что &laquo;БД это Оракл&raquo;. Я лично не думаю что это прям такая &laquo;серебряная пуля&raquo;. MySQL занимает те же позиции немного на другом фронте. Да, Oracle в частности, MySQL, и реляционные БД в общем, это отличный инструмент, но для случая когда у нас реально востребована эта реляционность.</p>
<p>Но ведь Оракл используют независимо от того нужна ли нам реляционность, просто по привычке, и потому что <em>&laquo;все так делают&raquo;</em>. Я за все свое время редко встречал нормализованные структуры, и даже больше, часто встречал таблицы БД с колонками вида col_1, col_2, col_N и пр. нарушениями всех форм, когда также разрезали таблицы на отдельные, в том числе отдельные инстансы БД. Встречал также когда в Oracle складывали черт знает что, когда использовали как хранилище лога операций, десятки гигабайт логов, ну и т.д.  И никакого серьезного положительного эффекта от реляционных возможностей во всех этих случаях не было.</p>
<p>Не знаю может это мне так всегда везло и в других проекта все всегда &laquo;красиво&raquo;, не нарушается ни одной из &laquo;нормальных форм&raquo; и пр, но у меня опыт вот такой.</p>
<p>Под реляционностью в данном случае я подразумеваю не только то что данных хранятся в виде таблице (с заранее четко оговоренным списком атрибутов). Я имею ввиду все что вертится вокруг этого: нормальные формы, внешние ключи, связи и ограничения, acid, собственно реляционная алгебра и все прочее предназначенное для облегчения хранения и соблюдения целостности структурированных данных.</p>
<p>В общем я не сторонник использования реляционной БД всегда и везде, на любой чих. Это хорошая технология, спасающая в огромном множестве случаев, но RDBMS это совсем не серебряная пуля.</p>
<p>Поэтому хотел бы обратить внимание на другой тип баз, на колоночные БД.<br />
<span id="more-185"></span></p>
<h1>Основная идея колоночных БД</h1>
<p>Вообще базовая идея колоночных БД всего лишь в том что физически (на жестком диске) данные хранятся в другом порядке. Т.е. если обычная (рядная) БД будет все хранить построчно, то в данном случае по колонкам, в начале все данные первой колонки, потом второй, потом третьей и т.д. В рядном харнении все ячейки строки хранятся рядом, и обычно могут быть прочитаны с диска за одну операцию чтения. В колоночной наоборот, значения ячеек разнесены на разные блоки, и за одну операцию мы читаем несколько подряд идущих значений идной колонки.</p>
<p>Казалось бы мелочь, но все это не просто так, и действительно подобная организация хранения данных на самом деле не такое уж из ряда вон выходящее дело. И тот же Оракл, да и прочие РСУБД, используют и этот подход, как минимум для хранения блобов. Как правильно указали мне в комментариях на самом деле есть и традиционно реляционные СУБД, хранящие данные в колоночном виде, все таки одно другому не мешает, но это скорее редкость (об исключениях см. в списке примеров и в комментариях к записи) и все равно они обладают почти теми же свойствами (реляционность скорее из маркетинговых побуждений), а разделение на реляционные и неряляционные будет более глобально, поэтому я позволил себе разделить этот мир именно по критерию рядного vs колоночного хранения данных.</p>
<p>Дело в том что тут скорее задается начальный вектор архитектуры БД, а те задачи в которых востребован такой способ хранения также имеют свои специфические потребности, поэтому эта мелочь выливается в довольно интересные системы.</p>
<p>Перечислю что у нас обычно присуще колоночными базами данных (хочу подчеркнуть что обычно, но не все это обязательно каждой конкретно):</p>
<h2>Позднее связывание</h2>
<p>Данные у нас хранятся в виде группы полей (строка в таблице), так вот при обработке этой группы можно всегда использовать всю строку (все ячейки), или лишь ту колонку которая нам нужна в данный момент. В случае традиционной БД она хранит и читает всю строку целиком, они лежат подряд, никуда не денешься, колоночная же читает данные лишь из нужной колонки, и лишь только когда находит подходящую [по критерию] строку дочитывает для этой строки значения из недостающих колонок.</p>
<p>Например для запроса <code>select col_1 from table where col_2 = 10</code> традиционная БД будет читать все строки, проверяя каждую на условие во второй колонке, и для совпавших вернет значение первой ячейки этих строк. При этому если у нас в таблице десяток колонок то будет прочитано куча лишних данных (в данном примере что-то около 80% мусора). Чтобы такого перерасхода вычислительных ресурсов не было нужно добавить индекс, который сразу ограничит набор нужных строк. Этот индекс и есть та самая дополнительная колонка, через которую пройдет позднее связывание в традиционной БД. В случае колоночной БД будет читаться лишь 2я колонка, и при совпадении условия к ней будет привязано значение из первой колонки. Очень похоже на то что у нас вся таблица состоит лишь из индексов по колонкам.</p>
<p>Как результат это то что мы можем иметь огромное количество колонок. Если для реляционной БД больше пары десятков колонок уже начинаются проблемы (неэффективное использование чтения с диска и памяти), то для колоночной таблицы имеющие сотни и тысячи колонок это вполне нормально.</p>
<p>Получается что рядная БД удобна когда нам обычно нужно использовать данные всей строки (в условиях и связях при селекте, апдейте и пр.), а колоночная когда данных много, но обычно используется лишь небольшая их часть.</p>
<h2>Разная структура данных</h2>
<p>Связанные данные хранят в одной таблице (не забываем что при этом можно использовать огромное количество колонок), а связи между таблицами здесь не приживаются, по многим причинам. Но! здесь можно не боятся хранить сложные структуры в ячейках, в том числе вложенные списки, подтаблицы, структуры XML, JSON и пр.</p>
<p>Размер отдельной ячейки часто можно не обращать внимания, пусть даже каждая ячейка столбца имеет свой размер, тут это не особо сильно влияет, в итоге не обязательно изначально жестко типизировать колонки таблицы, пусть в одной строке будет int, в другой string, а в третьей бинарная картинка в несколько мегабайт, и весь этот разброд может быть вдоль одной колонки, если, конечно, такое востребовано. К тому же вполне мы спокойно храним null значения, они просто пропускаются, тогда как рядная БД никуда не денется&nbsp;&mdash; место на диске займет, но оставит его пустым, но при обработке дополнительные затраты.</p>
<p>Одним из применений этого подходя является ответвление БД имеющих всего одну колонку, помимо ключа, в которой и хранится все что нужно. Внешне все это выглядит как огромный HashTable. Такие БД еще называют key-value storage или document oriented database.</p>
<h2>Сжатие данных</h2>
<p>Очень распространенная штука это использование сжатия данных. Тут возможно не заслуга использования колоночности, а больше того как именно такие БД используют, но факт что это популярно и дает вполне неплохой эффект, при этом для того класса приложений где это нужно обычно лишь при незначительной потере в производительности.</p>
<h2>Большие объемы данных</h2>
<p>По вышеуказанным причинам получается что в такой структуре удобно хранить огромные объемы данных, а шардинг и реплиция обычно из коробки, как само собой разумеющееся. Возможно это и не следствие колоночноый архитектуры, а даже наоборот причина, но в общем будем иметь ввиду что &laquo;большие объемы&raquo; и &laquo;колоночное хранение&raquo; идут бок о бок. Конечно же тут сразу появляются различные возможности для параллельной обработки хранимых данных, например используя подход mapreduce и пр.</p>
<h2>Доступ</h2>
<p>Подобная БД обычно востребована при хранении и обработки больших объемов данных, поэтому в данном случае и язык запросов может быть весьма далек от стандартного SQL, и даже вовсе не иметь оного. И конечно никакой тебе реляционности, да и транзакции так себе поддерживаются. Доступ к данным будет через какойто специфичный API, что с другой стороны позволяет более тесную интеграцию приложения и хранимых данных.</p>
<p>Но получается что средства доступа по универсальности и скорости разработки/использования выглядят обычно хуже возможностей предоставляемых Oracle и компании.</p>
<h1>Сравнение с RDBMS</h1>
<h2>RDBMS:</h2>
<ul>
<li>соблюдается целостность данных (foreign keys, транзакционность)</li>
<li>четко структурированные данные</li>
<li>запросы по всей структуре БД, используя стандартизованный язык</li>
<li>результат запроса это небольшой (относительно БД) кусок данных</li>
<li>быстрое извлечение нужной структуры (в том числе быстрая реализация запроса)</li>
</ul>
<h2>Колоночные БД:</h2>
<ul>
<li>хранят большие объемы данных, упрощеный шардинг, репликация и пр.</li>
<li>данные гораздо менее структурированы</li>
<li>данные обрабатываются большим блоком (параллельно, massive parallel processing), или вообще сразу вся база</li>
<li>оптимальным будет индивидуальный подход к обработке, тесная интеграция с данными</li>
<li>худшая (ручная) поддержка целостности данных</li>
</ul>
<h2>Где стоит использовать</h2>
<p>Может хранить огромные объемы слабоструктурированных данных, спокойно смасштабируется на большой кластер и запросы будет обрабатывать параллельно по всему кластеру.</p>
<p>Здесь достаточно просто хранить большие блоки данных, документов (в документ-ориентированных БД) и/или сложных структур. Также довольно распространено хранилище данных вида &laquo;Ключ-Значение&raquo; (aka Properties Pattern, Хэш-таблица) с большими группами которых идет различная работа. Отлично подходит для задач, которые я привел в записи &laquo;<a href="http://artamonov.ru/2009/01/19/storage-for-data-mining/">Хранилище для обработки данных</a>&raquo;. Ну и также это хранилище логов и прочее в этом духе. Особенно хорошо если данные лишь дописываются, а не изменяются существующие.</p>
<p>Больший выигрыш будет если храним много, но в реальных операциях используется лишь часть колонок, или вовсе одна, помимо идентификатора конечно.</p>
<p>При таком хранении гораздо проще бежать вдоль столбца, выполняя нужные операции. Причем операции лучше независимые, или групповые, и когда они затрагивают большой блок хранимых данных. К примеру брать большими кусками и агрегировать результат&nbsp;&mdash; самое оно. Это такие задачи как обработать лог отдельных операций, и просуммировать результаты в течении каждого отдельного периода (что вообще запросто превратить в mapreduce обработку). В случае лога веб-серверов это может быть агрегация посещений по браузерам (т.е. используется отдельная колонка). Или иным образом разбивая данные независимо, и обрабатывая эти сгруппированные данные параллельно, например mapreduce&#39;ом.</p>
<h2>Где не стоит использовать</h2>
<p>Не стоит использовать когда нам нужна именно классическая реляционная структура, и когда у нас данные (и связи) постоянно меняются. Под &laquo;меняются&raquo; я подразумеваю изменение и удаление существующих данных, смену связей между ними. Хотя если данные лишь дополняются, то уже стоит подумать.</p>
<p>Так же не подойдет если у нас много колонок, и мы оперируем в основном всей строкой, нет особого смысла менять тип БД. Хотя в большинстве случаев, как я уже упоминал, значения в нескольких колонкам, которые нам нужно обрабатывать одновременно, даже удобней объединить в общую структуру, к примеру в список имя/значений, или превратив в xml, yaml или json, по вкусу.</p>
<p>Также не пойдет вариант когда операции проводятся лишь небольшом объеме базы, здесь мы просто не получим никакого выигрыша (или точнее наступим на грабли колоночных БД), и больше вероятность что хранение по строкам будет гораздо удобнее.</p>
<p>Ну и конечно не подойдет когда нам нужны классические SQL запросы. Что-то &laquo;в стиле SQL&raquo; они часто имеют, но это уже на самом деле другой подход и по другому выполняется.</p>
<h1>Реализации</h1>
<p><strong><a href="http://hadoop.apache.org/hbase/">HBase</a></strong>&nbsp;&mdash; представляет собой часть Apache Hadoop, можно сказать классическая реализация Гуглового Bigtable, рассчитана в первую очередь на большие объемы данных, и на хранение этих данных в большом кластере. Типы данных ничем не ограниченны. Я именно именно на hbase ориентировался когда приводил приводил основные тонкости/отличия, но не ограничивался им.</p>
<p>Из возможностей: сразу учтено что каждая колонка может иметь несколько ячеек (получается что помимо того что в строке несколько строк, в колонке тоже несколько ячеек, этакое минидерево, для хранения списочных и связанных данных), может хранить любые бинарные данные, может хранить одновременно несколько версии (версионность из коробки), поддерживает фильтры Блума, rest интерфейс доступа (помимо java api) и пр.</p>
<p>Но, как минимум в данный момент, не имеет индексов, кроме как по ключу. Если честно, как и сам Hadoop эта база еще развивается, поэтому БД в данный момент достаточно сырая.</p>
<p>Прочие</p>
<dl>
<dt><a href="http://couchdb.apache.org/">CouchDB</a></dt>
<dd>реализация на Erlang. Не совсем колоночная, это документная БД (document oriented DB), но по сути внутри одна большая колонка, и все приемы соответствующие. БД, конечно, не привязана к определенной платформе (т.е. к Эрлангу). Запросы пишутся на Javascript (!) в виде mapreduce операций, доступ через REST. Благодаря отказоустойчивости самого Erlang&#39;а&nbsp;&mdash; очень интересное решение</dd>
<dt><a href="http://hypertable.org/">Hipertable</a></dt>
<dd>реализация bigtable на С, изначально как основная альтернатива Hadoop HBase, именно так себя позиционировали. Причем хранение так же было организовано поверх Hadoop HDFS. Как там сейчас обстоит дело не знаю.</dd>
<dt><a href="http://code.google.com/p/the-cassandra-project/">The Cassandra Project</a></dt>
<dd>реализация от Facebook, тоже базируется на идеях Google BigTable и поэтому похожа на HBase.</dd>
<dt><a href="http://project-voldemort.com/">Project Voldermort</a></dt>
<dd>распределенный key-value storage, на java.</dd>
<dt><a href="http://www.kx.com/">Kdb+</a></dt>
<dd>коммерческая БД и язык обработки, заточенные под time-series data. Это всевозможные логи, биллинг, биржы и пр. Язык обработки имеет очень сильную базу для обработки массивов (БД в данном случае является отдельным огромным многомерным массивом) и особенно распределенных во времени. В результате многие узкоспециализированные задачи (всяческие кубы, временные данные) выполняются в разы быстрее. Как минус&nbsp;&mdash; БД и все вокруг нее являются излишне закрытыми от людей извне</dd>
<dt><a href="http://www.luciddb.org/">LucidDB</a></dt>
<dd>Open Source реляционная СУБД с основой на колоночной структуре. Расчитывается в первую очеред на аналитику, bi и пр.</dd>
<dt><a href="http://www.sybase.ru/products/sybase_iq">Sybase IQ</a></dt>
<dd>Еще одна реляционная колоночная СУБД, для нужд аналитики. В этот раз коммерческая</dd>
<dt>Amazon SimpleDB, Google BigTable, Yahoo Everest</dt>
<dd>закрытые внутренние реализации от монстров интернета.</dd>
</dl>
<h2>Ссылки</h2>
<ul>
<li><a href="http://cs-www.cs.yale.edu/homes/dna/papers/abadi-sigmod08.pdf">PDF&nbsp;&mdash; &laquo;Column-Stores vs. Row-Stores: How Different Are They Really?&raquo;</a></li>
<li><a href="http://www.databasecolumn.com/2008/12/debunking-yet-another-myth-col.html">Debunking Yet Another Myth: Column-Stores As A Storage-Layer Only Optimization</a> (и предыдущие в цикле статей)</li>
<li><a href="http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php">Is the Relational Database Doomed?</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/02/17/column-oriented-databases/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Хранилище для обработки данных</title>
		<link>http://artamonov.ru/2009/01/19/storage-for-data-mining/</link>
		<comments>http://artamonov.ru/2009/01/19/storage-for-data-mining/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 11:16:08 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[text mining]]></category>
		<category><![CDATA[архитектура]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=151</guid>
		<description><![CDATA[Допустим у нас стоит задача: нужно собирать неструктурированные html данные и извлекать из них структуру, или, точнее, информацию, т.е. система Text Mining/Information Extraction. Вcе элементы этого процесса, конечно, должны где то хранится. И если конечную информацию можно структурировать, завести с десяток таблиц в БД, настроить связи и складывать туда, то входная информация по определению у [...]]]></description>
			<content:encoded><![CDATA[<p>Допустим у нас стоит задача: нужно собирать неструктурированные html данные и извлекать из них структуру, или, точнее, информацию, т.е. система Text Mining/Information Extraction.</p>
<p>Вcе элементы этого процесса, конечно, должны где то хранится. И если конечную информацию можно структурировать, завести с десяток таблиц в БД, настроить связи и складывать туда, то входная информация по определению у нас не структурирована, ну или, как минимум, слабо структурированная. Если делать сложную структуру то из-за специфики нашей задачи нам будет очень сложно отследить целостность данных.  К слову о сложности работы с такой структурированностью замечу что я попытался было нарисовать это подход, но не смог сделать чтобы это было внятно, без всего лишнего.</p>
<p>Поэтому нужно придумывать какое то простое и универсальное решения для этой задачи. Одна из них это структура когда у нас для всего выделена одна таблица, в первые колонки которой заливается начальная структура. Далее они обрабатываются нашей программой для структурирования, и результат складывается рядом, в следующие колонки. Причем если результат мы получаем не за один шаг, что чаще и бывает, то в таком случае мы последовательно выполняем все шаги, складывая новые данные правее от текущих.<br />
<span id="more-151"></span><br />
В итоге получаем примерно такие шаги:</p>
<ol>
<li>(первая колонка) список URL</li>
<li>выкачиваем документ по этому адресу, складываем в колонку 2</li>
<li>убираем весь мусор (стили, js, реклама и пр.) из html и кладем в колонку 3</li>
<li>вырезаем текстовые контент (убираем навигацию, и пр.), результат в колонку 4</li>
<li>делаем PDF, результат в колонку 5 </li>
</ol>
<div style="float: right; margin-left: 10px; font-style: italic; font-size: 10px;">
<img src="http://artamonov.ru/wp-content/uploads/2009/01/1to1struct.png" alt="1to1struct" title="1to1struct" width="212" height="158" /><br />
Рис 1. Таблица с несколькими колонками<br />
<img src="http://artamonov.ru/wp-content/uploads/2009/01/mtonstruct.png" alt="mtonstruct" title="mtonstruct" width="212" height="235" /><br />
Рис 2. Таблица с вертикальной обработкой
</div>
<p>Мы складываем в колонку справа если у нас идет обработка 1 к 1 (см. рис 1), если же у нас идет какая либо вертикальная агрегация (см. рис 2), то новые данные стоит записывать под текущим блоком, в той же колонке, что есть более универсальный подход. В случае СУБД у нас получается для первого варианта таблица с колонками <code>block_id</code>, <code>data_id</code>, <code>col_1...col_N</code>, для второго варианта <code>block_id</code>, <code>data_id</code>, <code>value</code>. Где </p>
<ul>
<li><code>block_id</code> это у нас идентификатор обрабатываемого блока,</li>
<li> <code>data_id</code> идентификатор элемента данных, которым мы оперируем,</li>
<li> и <code>col_1..col_n</code> или <code>value</code> это те данные которые нужно обработать.</li>
</ul>
<p>В случае файловой системы получается только второй вариант, идентификатором тут будет путь к файлу. Следуя этим подходам в <a href="http://hadoop.apache.org/">Apache Hadoop</a> есть HDFS для варианта хранения в файлах, и <a href="http://hadoop.apache.org/hbase/">HBase</a> для хранения в виде таблицы.</p>
<p>Наверное сразу возникает претензия что у нас всегда данные если не дублируются, то остается слишком много временных данных, старые на каждом этапе остаются, а новые (выведенные из предыдущих) складываются рядом. Зачем это? Затем что иначе нам нужно следить за транзакциями, усложнять процесс распараллеливания обработки. Гораздо проще складывать рядом, и когда придет время (например когда мы дойдем до конечного шага), можно будет выкинуть все лишнее. Если мы можем позволить себе это, то так получается гораздо удобнее. Дополнительные бонусы тут в том что на любом этапе мы можем переиграть обработку заново (как замена rollback&#39;а) или сделать новую &laquo;ветку&raquo; обработки, выполнив другие функции. И, как минимум, всегда можем проследить историю операций.</p>
<p>Но еще более важно то что мы получаем независимые функции. Почти функции в том виде в котором они приняты в функциональном программировании. Т.е. у нас входные параметры и есть результат, и функция не должна больше ничего менять, не должна трогать входные данные, и не зависеть ни от каких данных кроме этих. Каждую из них может разрабатывать отдельный разработчик, не сильно заботясь об общей архитектуре приложения, и даже на совершенно разных языках можно писать, выбирая тот который больше подходит для конкретной задачи, которая к тому же имеет очень четкие границы.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2009/01/19/storage-for-data-mining/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Single Web Profile</title>
		<link>http://artamonov.ru/2008/09/05/single-web-profile/</link>
		<comments>http://artamonov.ru/2008/09/05/single-web-profile/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 09:18:14 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Новые технологии]]></category>
		<category><![CDATA[cdi]]></category>
		<category><![CDATA[web 3.0]]></category>
		<category><![CDATA[интеграция]]></category>
		<category><![CDATA[соц. сети]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=119</guid>
		<description><![CDATA[Предыдущий пост про CDI на самом деле подготавливал почву к похожей теме из другой области. В корпоративном секторе упомянутые подходы давно опробованы, и есть куча внедрений, ну правда в Россию это пришло сравнительно недавно, но западный опыт довольно обширный. Так вот, хочу поразмышлять по поводу приложения этих методик в web приложения. Как я уже описал, [...]]]></description>
			<content:encoded><![CDATA[<p>Предыдущий<a href="http://artamonov.ru/2008/09/04/customer-data-integration/"> пост про CDI</a> на самом деле подготавливал почву к похожей теме из другой области.</p>
<p>В корпоративном секторе упомянутые подходы давно опробованы, и есть куча внедрений, ну правда в Россию это пришло сравнительно недавно, но западный опыт довольно обширный. Так вот, хочу поразмышлять по поводу приложения этих методик в web приложения. Как я уже описал, это применимо для социальных сетей и вообще сайтов содержащих большой объем пользовательской информации. В последнее время это становится очень даже популярным, появляются различные инициативы по интеграции сервисов друг с другом, по передачи пользовательской информации. Упомянул я и протоколы, которыми кто то уже начал пользоваться, а кто-то присматривается.<br />
<span id="more-119"></span><br />
Первый этап, «с основой на CRM», в данном случае выражает наличие монстров типа Одноклассники и ВКонтакте. Так как помимо них есть куча мелких сетей, то и виртуальные модели тоже появляются. Из российских это нашумевший в определенных кругах bestpersons. С некоторыми косяками, но он первопроходец, ему положено первому наступать на все эти грабли, и пока даже можно простить тот самый косяк. Ну а дальше все идет к тому что мы переключимся на центр персональных данных, не привязанных к определенному сайту. Будет некие информационные хабы, может их предоставят и упомянутые социальные сети.</p>
<p>Есть даже мнение, которое я поддерживаю, что вся эта взаимная интеграция сайтов есть немаловажная часть будущего web 3.0, возможно даже самая главная часть. </p>
<p>Идея что для web&#39;а что для enterprise одинакова, но в случае бизнеса уже множество раз опробованная, а в web лишь только зарождается. В случае социальных сетей нет такого желания объединиться, по крайней мере со стороны сервисов, это удобно лишь конечному пользователю. Крупные социальные сети пока считают что тем самым они могут потерять своих пользователей, и судя по всему они слишком жадные до данных, скорее всего они будут сильно сопротивляться этим инновациям, пока окончательно не умрут. Те же одноклассники сейчас ценятся лишь огромной базой пользователей, а не теми услугами которые они предоставляют для них. Ну на самом деле, разместить фото и отписать «как дела?» можно и без них, но показывать это фото обычно некому, нужно в начале найти этого человека <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  И ведь ничего суперсовременного тут нет, нужна лишь база по которой можно найти своих одноклассников, а дальше уже мелочи.</p>
<p>Пользователю же подобный хаб дает большие возможности. Как минимум имея единый профайл, содержащий всю нужную и, что очень важно, всегда актуальную информацию о себе, о связях с другими людьми, к тому же сгруппированную по типам (друзья, деловые знакомые и пр.) а также медиаданные, такие как фото, видео и тесты, можно использовать внешние сервисы именно как индивидуальные услуги. Предоставляя каждому сервису определенный срез своих данных. На одном сервисе напишет другу как дела и покажет фотку «у машины» или «на курорте», на другом сервисе красивое «фото для души» и «я купил мыльницу с макросьемкой», а на третьем серию фоток с очередного праздника. Идея думаю понятна. Технически это конечно не обязательно будет именно физически единый центр/сайт/сервис. Опыт CDI показывает что наиболее вероятно распределенное хранение, как несколько связанных БД, т.е. распределенная работа с данными, но единая точка связи всех данных.</p>
<p>Закончим с философией и мечтами о светлом будущем, в данном случае растекаться мыслью по древу можно очень и очень долго. Основная мысль которую я хотел донести это то что идея единого центра пользовательских данных во-первых не нова, во-вторых опробована и есть свои методики, в-третьих что еще много что можно сделать, и самое главное, еще больше от этого получить, и в-четвертых: сейчас будет волна подобных разработок <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  А сейчас не паханое поле для всевозможных стартапов, мэшапов и прочих мейкапов.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/09/05/single-web-profile/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Customer Data Integration</title>
		<link>http://artamonov.ru/2008/09/04/customer-data-integration/</link>
		<comments>http://artamonov.ru/2008/09/04/customer-data-integration/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 08:00:29 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Бизнес]]></category>
		<category><![CDATA[Прочее]]></category>
		<category><![CDATA[cdi]]></category>
		<category><![CDATA[crm]]></category>
		<category><![CDATA[esb]]></category>

		<guid isPermaLink="false">http://artamonov.ru/?p=115</guid>
		<description><![CDATA[Customer Data Integration — объединение информации о клиентах, изначально разбросанной по множеству приложений/баз данных. Результат объединения, как единый профайл, будет уже Single Customer View. Предпосылки к это в том что в большинстве крупных компаниях данные о клиентах и взаимодействии с ними в данный момент разбросаны по множеству баз данных, от Outlook&#39;а отдельных менеджеров до бухгалтерии [...]]]></description>
			<content:encoded><![CDATA[<p>Customer Data Integration — объединение информации о клиентах, изначально разбросанной по множеству приложений/баз данных. Результат объединения, как единый профайл, будет уже Single Customer View. </p>
<p>Предпосылки к это в том что в большинстве крупных компаниях данные о клиентах и взаимодействии с ними в данный момент разбросаны по множеству баз данных, от Outlook&#39;а отдельных менеджеров до бухгалтерии и истории в call-центре. </p>
<p>Это для предприятий, если на другом примере, для веба, то это можно представить как информацию разбросанную по множеству соц-сетей (одноклассники, вконтакте, мойкруг, пикаса, жж и т.д.) и объединение всего это с помощью идей заложенных в Google Social Graph, Open Social API, DataPortability и пр.<br />
<span id="more-115"></span><br />
В корпоративном секторе, при объединении клиентских данных, обычно выделяют 3 этапа:</p>
<h1>Основа на CRM</h1>
<p>За основу берется готовая CRM (Siebel, SAP и пр.), в которую полностью переливаются все данные, и далее все существующие системы переключаются на данную CRM, так чтобы тянуть все данные из нее.<br />
Тут, к сожалению, полной интеграции практически никогда не получится, так или иначе часть информации все равно остается во внешних (хоть и связанных) системах. Т.е. работает это лишь в редких случаях, на практике сложно перевести все внешние приложения на единую CRM. Ну или еще работает если изначально компания организует всю эту инфраструктуру, подписывается на одного вендора и пр. Но этот случай сомнителен по причине того что потребность в Single Customer View обычно возникает уже после того как компания разрослась. </p>
<p>Поэтому появляется следующий вариант:</p>
<h1>Виртуальная модель данных</h1>
<p>CRM становится не только хранилищем данных о клиенте, но также выполняет роль внешнего интерфейса к существующим сторонним базам данных. Для этого реализуется какая-то система обмена данными, и CRM устанавливает внутренние связи, дополняя самостоятельно хранимые данные внешними. Это в общем-то менее рискованно, чем полная замена всех баз на одну CRM. К тому же позволяет значительно сгладить процесс перехода на новую инфраструктуру, т.к. позволяет старому ПО работать как оно работало, и постепенно, по мере обновления ПО, делать замену.<br />
Здесь уже начинаются проблемы с тем как учитывать возможную недоступность отдельных баз данных, как учитывать транзакции (т.е. атомарность обновления и непротиворечивость данных суммарно для нескольких баз участвующих в процессе), как объединять данные имеющие различия в разных БД (из-за «нечистоты» данных) и пр.</p>
<p>В результате приходит третий вариант, который с одной стороны объединяет эти подходы, а с другой выворачивает их наизнанку:</p>
<h1>Основа на клиентских данных</h1>
<p>В этом случае создается единый центр клиентских данных, и уже его используют сторонние БД, CRM и пр. приложения. Это собственно и является Customer Data Integration (CDI)</p>
<p>Вообще это на самом деле некоторая концепция, и может включать как подходы предыдущих пунктов, так и как упомянутый центр на который все переключаются, не храня у себя никакой дополнительной информации. Здесь отличие больше заключается в идеологическом вынесении центральной точки, отвечающей за данные клиента, называемой в данном случае Customer Data Hub. Этот хаб может и объединять данные, и ссылаться на них во внешних источниках, устанавливать связи между данными из разных источников, и передавать дальше внешним приложениям и пр. Технически потом все системы связывается через SOA/ESB, и все довольны.</p>
<p>Это все некие «шарообразные кони в вакууме», на практике чаще будет некоторая смешанная модель. Тем более что востребовано это в компаниях широко распределенных географически, да и весь процесс за один раз организовать не получится, будет долгий и постепенный путь миграции. Реализация тоже может быть какая угодно, во-первых каждый вендор видит это по своему, во-вторых каждой отрасли и компании нужны индивидуальные особенности. Но суть примерно такая.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/09/04/customer-data-integration/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Миграция БД</title>
		<link>http://artamonov.ru/2008/03/06/database-migration-tips/</link>
		<comments>http://artamonov.ru/2008/03/06/database-migration-tips/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 06:32:27 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[ror]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[миграция]]></category>

		<guid isPermaLink="false">http://artamonov.ru/2008/03/06/database-migration-tips/</guid>
		<description><![CDATA[Бывает что при обновлении версии работающего приложения тратится иногда по нескольку часов на приведение структуры БД к новому виду. Ну т.е. добавление колонок, переименовывание, смена связей и пр. При этом DBA сидит и по diff двух инициализационных sql (для текущего приложения и для нового) пытается понять что менялось и как нужно прописать все эти ALTER [...]]]></description>
			<content:encoded><![CDATA[<p>Бывает что при обновлении версии работающего приложения тратится иногда по нескольку часов на приведение структуры БД к новому виду. Ну т.е. добавление колонок, переименовывание, смена связей и пр. При этом DBA сидит и по diff двух инициализационных sql (для текущего приложения и для нового) пытается понять что менялось и как нужно прописать все эти <code>ALTER TABLE ...</code>, или того хуже UPDATE по хитрым условиям. Когда то, по неопытности, и мы так делали, при этом приложение клиента ждало (т.е. не работало) иногда по нескольку часов. Слава богу у них в это время была ночь и заказчик сладко спал, иначе бы много чего могли бы наслушаться.<br />
<span id="more-63"></span><br />
Позже, на другом проекте, был подход написания sql патчей, в котором разработчик прописывал все свои изменения структуры БД. К тому же надо было не порушить текущие данные, в результате писались апдейты на несколько страниц (ну это нормально). Правда в первый раз мы все равно косячнули, т.к. пытались писать патч в одном файле, на весь релиз. Во-первых не совсем удобно всем лезть в один файл (и постоянно мержить), во-вторых он быстро разрастался, ну и в третьих все равно не всегда работал (и фиг ведь найдешь кто виноват) <img src='http://artamonov.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Последнее правда поправимо, надо лишь договориться с тем как пополнять скрипт.</p>
<p>Далее все выросло до следующего варианта: при выполнении задачи пишется <code>###.название.sql</code>, где <code>название</code>"" лишь для визуальной идентификации, а вот эти <code>###</code> для очередности выполнения скриптов. Для небольшого проекта это простой счетчик. т.е. файлы <code>001.extend_user.sql</code>, <code>002.optimize_prod_view.sql</code> и т.д. Да, и если номера совпали у двух разработчиков, то чаще всего проблемы не возникнет, если они не меняли одну область БД. Когда же проект побольше, то можно нумеровать в виде <code>yyMMdd.title.sql</code> или даже <code>yyMMdd.HHmm.title.sql</code>. Хотя в любом случае нужно разруливать на уровень выше, при планировании задач связанных с БД.</p>
<p>А запустить полученные скрипты может как ДБА, так и shell скрипт, который написать совсем не проблема. Для упрощения можно еще завести табличку version содержащую актуальный номер (тот самый, с которого начинаются наши файлы sql) и тогда процедура обновления версии вовсе станет автоматической.</p>
<p>Все это не претендует на новизну, лишь совет при планировании начальной архитектуры, почему то часто об этом забывают. Ну а вообще в <a href="http://rubyonrails.ru">RoR</a> это сразу встроено. К <a href="http://grails.org">GRails</a> есть отдельный плагин. Да и отдельно для Java есть <a href="http://www.liquibase.org/">библиотека</a> облегчающая такой процесс. Правда она добавляет свой оверхед по написанию этих апдейтов, так что тут дело вкуса. </p>
<p>PS: <a href="http://www.pgadmin.org/">pgAdmin</a> (менеджер для PostgreSQL) в данном случае очень удобен, по нажатию на любой объект, будь то таблица, колонка, индекс, вьюха или что угодно, он сбоку покажет SQL для удаления и создания этого объекта. В результате все эти alter table писать не приходится, достаточно скопировать.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/03/06/database-migration-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обработка данных, подход &#171;MapReduce&#187;</title>
		<link>http://artamonov.ru/2008/02/21/obrabotka-dannyx-podxod-mapreduce/</link>
		<comments>http://artamonov.ru/2008/02/21/obrabotka-dannyx-podxod-mapreduce/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 11:07:03 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Новые технологии]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gridgain]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[map reduce]]></category>
		<category><![CDATA[split aggregate]]></category>
		<category><![CDATA[кластеризация]]></category>
		<category><![CDATA[обработка данных]]></category>

		<guid isPermaLink="false">http://artamonov.ru/2008/02/21/obrabotka-dannyx-podxod-mapreduce/</guid>
		<description><![CDATA[В 2004 году Google рассказал о модели обработки данных которую они использую. Основана она на том что данные обрабатывает пара простых функций Map и Reduce. Первая их которых выделяет множество пар Ключ/Значений из входящих данных (тоже являющихся парами Ключ/Значение), а вторая производит объединение/группировку этих пар, и, опять же, выдает наружу таки пары, чаще всего в [...]]]></description>
			<content:encoded><![CDATA[<p>В 2004 году Google рассказал о модели обработки данных которую <a href="http://labs.google.com/papers/mapreduce.html">они использую</a>. Основана она на том что данные обрабатывает пара простых функций <code>Map</code> и <code>Reduce</code>. Первая их которых выделяет множество пар Ключ/Значений из входящих данных (тоже являющихся парами Ключ/Значение), а вторая производит объединение/группировку этих пар, и, опять же, выдает наружу таки пары, чаще всего в меньшем количестве чем пришло на вход. Дополнительным элементом является распределенная файловая система GoogleFS, благодаря которой обрабатываемый файл, и вся промежуточная информация, становится легко доступной с любого компьютера в кластере.</p>
<p>Т.к. вся архитектура обработки состоит из небольших функций, то обработку можно легко распараллелить на кластере. К тому же облегчает разбивка на отдельные куски и восстановление после сбоя. Используя распределенную ФС мы разбиваем данные на небольшие кусочки, с каждым из которых и работает отдельный элемент кластера. </p>
<p>Так же эту идею можно встретить под названием Split/Aggregate. Т.е. суть в том что входные данные (неважно какого размера) разбиваются на отдельные элементы (этап split), к примеру построчно, каждая строка как отдельное значение для обработки. Эти блоки строк раcпределяются по кластеру для обработки, где для каждой строки вызывается функция обработки (map). Результат выполнения опять объединяется (reduce/aggregate) в выходной файл. Если нужно, то данные сохраняются отсортироваными в определенном порядке, к примеру по внешнему ключу.<br />
<span id="more-60"></span></p>
<h1>Область применения</h1>
<p>Сам подход очень хорошо подходит для длительной обработки больших объемов данных, причем когда нам не требуется определенная последовательность процесса или получение результата по мере поступления новых данных. Т.е. если у нас в наличии пару гигабайт данных для обработки и нам нужен конечный результат обработки, то это отличный вариант, но если у нас тот же гигабайт постоянно поступает небольшими кусочками, и мы должны их тут же отправлять на обработку, ожидая результат как можно скорее, то удобней иной подход, нежели чем MapReduce и Hadoop в частности.</p>
<p>Например это очень подходит когда нам нужно обработать стопку csv файлов. Ну или один, но большой. В каждой строке несколько колонок с данными, на основе этого получаем результат, тоже в csv. Так вот обработку такого файла легко распаралелить на нескольких машинах, построчно, или блоками, скажем по 100 строк, равномерно раскидать по серверам, обработать, а потом результирующие строки склеить в выходной файл. Если надо можно еще отсортировать чтобы было в том же порядке что и во входящих данных. Все это требует гораздо меньше ресурсов чем сама обработка данных. </p>
<p>Есть мнение что при обработке данные не стоит перегонять в текстовые файлы, пусть все хранится в БД, и читать оттуда поблочно, тут же складывая полученные результаты. В этом тоже есть свои плюсы и минусы, тут каждый решает сам, в зависимости от задач. Распределенная ФС, кстати, очень хорошо заменяет БД как центральное хранилище данных, а привести в структурный вид, удобный для БД можно уже и отдельным этапом (например отдельной задачей mapreduce). Хотя загрузку и средствами БД можно легко и быстро сделать.</p>
<h1>Пример алгоритма</h1>
<p>Приведу один простой пример, может понятней будет.</p>
<dl>
<dt>mapNumbers (&laquo;1, 4 and 3&raquo;)</dt>
<dd>Пусть он выделит все цифры в тексте, например регэкспом \d+, не суть важно. В нашем случае выдаст пары {num:1, num:4, num:3}, где num&nbsp;&mdash; имя ключа, а 1,4 и 3&nbsp;&mdash; его значения</dd>
<dt>reduceSum (num[])</dt>
<dd>На вход придет список пар с одинаковым ключем, в нашем случае ключ num. Пусть метод выполняет суммирование всех цифр для переданного списка пар. Т.е. в нашем случае ему на вход придут те три пары num:#, и он произведет суммирование 1 + 4 + 3, выдав 8</dd>
</dl>
<p>На самом деле функции иногда в сотни раз сложнее, но суть та же.</p>
<h1>Реализации MapReduce кластера под java</h1>
<h2>Apache Hadoop</h2>
<p><a href="http://hadoop.apache.org/">Apache Hadoop</a>&nbsp;&mdash; одна из основных реализаций системы для такой обработки. Поддерживает как MapReduce так и распределенную файловую систему (HDFS). Подпроектом еще идет как минимум реализация BigTable. map/reduce могут быть написаны не обязательно на Java, вполне подойдет все что может запускаться под этой ОС. Кстати, базовой ОС является Unix, хотя как я понимаю под Windows тоже работает, через cygwin.</p>
<p>Недавно Yahoo! <a href="http://developer.yahoo.com/blogs/hadoop/2008/02/yahoo-worlds-largest-production-hadoop.html">сообщил</a> что они успешно используют Hadoop для обработки объемов порядка 300 терабайт на кластере из 10 000 серверов. Из чего можно сделать вывод что для повседневных задач по обработки текущих данных Hadoop хватит с лихвой.</p>
<h2>GridGain</h2>
<p><a href="http://www.gridgain.com">GridGain</a> скорее рассчитан(но не ограничивается этим) не на обработку терабайтов данных, а разбиение на кучу задач, не важно каких. Больше подходит название SplitAggregate. Т.е. мы задаем объем задач, GridGain раскидывает это по кластеру, и далее передает нам результат. И здесь уже хоть сразу все через БД делай, хоть используй поверх распределенной ФС (от того же Hadoop даже), не суть важно. Авторы к примеру предлагают так юнит тесты запускать, т.е. разбиваем по методам на кластер, и все они параллельно тестируются. Надо это попробовать, если окажется десяток лишних компов под рукой <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>А еще эти товарищи очень не любят писать лишний код сами, а предпочитают интегрировать готовые, зарекомендовавшие себя решения. Что я считаю очень правильно, зачем лишний раз изобретать велосипед? Так вот, я к тому что система получается очень гибкая, красиво написанная, настраиваемая в спринге и интегрируется с кучей прочих около grid решений. </p>
<h1>Cloud Computing</h1>
<p>В свете последнего расцвета cloud computing, сервисов типа Amazon S3 и EC2 все это становится довольно интересным. Сейчас можно не ждать несколько часов для обработки, когда можно запустить все это на кластере из сотен серверов, получить результат через несколько минут заплатив за аренду этого кластера совсем небольшую сумму.</p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2008/02/21/obrabotka-dannyx-podxod-mapreduce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL, Spring и пр</title>
		<link>http://artamonov.ru/2006/02/16/mysql-spring-i-pr/</link>
		<comments>http://artamonov.ru/2006/02/16/mysql-spring-i-pr/#comments</comments>
		<pubDate>Thu, 16 Feb 2006 13:23:39 +0000</pubDate>
		<dc:creator>splix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Базы данных]]></category>

		<guid isPermaLink="false">http://www.artamonov.ru/2006/02/16/mysql-spring-i-pr/</guid>
		<description><![CDATA[Вот тут у меня небольшая дискуссия возникла по поводу кодировок в mysql и пр. Так как это немного перерастает размер коментариев обобщу все одним постом. Вот так например можно делать датасурс с пулом к MySQL: &#60;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&#62; &#60;property name="driverClassName" value="com.mysql.jdbc.Driver"/&#62; &#60;property name="url" value="jdbc:mysql://localhost/wallpapers?autoReconnect=true&#38;autoPoolReconnect=true&#38;useUnicode=true"/&#62; &#60;property name="username" value="user"/&#62; &#60;property name="password" value="pass"/&#62; &#60;property name="maxActive" value="500"/&#62; &#60;property name="initialSize" [...]]]></description>
			<content:encoded><![CDATA[<p>Вот <a href="/2006/02/02/messageresourcebundle-v-spring/">тут у меня</a> небольшая дискуссия возникла по поводу кодировок в mysql и пр.<br />
Так как это немного перерастает размер коментариев обобщу все одним постом.<br />
<span id="more-21"></span><br />
Вот так например можно делать датасурс с пулом к MySQL:</p>
<pre><code>&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;
 &lt;property name="driverClassName" value="com.mysql.jdbc.Driver"/&gt;
 &lt;property name="url" value="jdbc:mysql://localhost/wallpapers?autoReconnect=true&amp;autoPoolReconnect=true&amp;useUnicode=true"/&gt;
 &lt;property name="username" value="user"/&gt;
 &lt;property name="password" value="pass"/&gt;
 &lt;property name="maxActive" value="500"/&gt;
 &lt;property name="initialSize" value="50"/&gt;
&lt;/bean&gt;</code></pre>
<p>В строке соединения:<br />
<code>autoReconnect</code> и <code>autoPoolReconnect</code> заставляют переконнекчиватся к базе при потере соединения. MySQL сам сбрасывается неиспользуемую коннекцию, помоему через 12 часов (поправте меня если что), и если в пуле будет коннекция которая столько времени не использовалась, то она оборвется и когда пулу она потребуется то приложение свалится. А <code>useUnicode</code> дружит нас русским языком, точнее с Unicode, т.е. в базе не будут лежать символы вопроса вместо русских букв.</p>
<p>Параметры <code>maxActive</code> и <code>initialSize</code> указывают на размер пула (пояснения что где думаю излишни)</p>
<p>Далее, если не используется data access layer, то используем коннекцию как обычно. Ну а удобней всеже передать этот датасурс Hibernat&#39;у или чему подобному.</p>
<p>Через BasicDataSource можно достучатся до самого драйвера, если надо. Например чтобы не вызывать </p>
<pre><code>SELECT LAST_INSERT_ID()</code></pre>
<p>после вставки в табличку с auto_increment, можно сделать так:</p>
<pre><code>((com.mysql.jdbc.PreparedStatement)(((DelegatingPreparedStatement)ps).getInnermostDelegate())).getLastInsertID();</code></pre>
<p>где ps это PreparedStatement через который запихивали данные.</p>
<p>А вообще: пользуйте <a href="http://www.postgresql.org/">PostgreSQL</a>, а лучше Oracle <img src='http://artamonov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://artamonov.ru/2006/02/16/mysql-spring-i-pr/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

