<?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>Insight IT &#187; MapReduce</title>
	<atom:link href="http://www.insight-it.ru/tag/mapreduce/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.insight-it.ru</link>
	<description>Информационные технологии</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:34:08 +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>Hadoop возвращается</title>
		<link>http://www.insight-it.ru/masshtabiruemost/hadoop-vozvrashhaetsya/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/hadoop-vozvrashhaetsya/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 20:15:48 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[HBase]]></category>
		<category><![CDATA[HDFS]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=87</guid>
		<description><![CDATA[Если Вы являетесь постоянным читателем моего блога, то вполне вероятно, что Вы помните мой старый пост об этом замечательном проекте от Apache Foundation. С тех пор он развивался невероятными темпами и очень многое успело измениться, об этом я и хотел бы сегодня поделиться своими впечатлениями. В дополнение к этому планируется небольшая инструкция по развертыванию Hadoop [...]]]></description>
			<content:encoded><![CDATA[<p>Если Вы являетесь постоянным читателем моего блога, то вполне вероятно, что Вы помните мой <a href="/net/scalability/hadoop/" target="_blank">старый пост</a> об этом замечательном проекте от <a href="http://apache.org" target="_blank" rel="nofollow">Apache Foundation</a>. С тех пор он развивался невероятными темпами и очень многое успело измениться, об этом я и хотел бы сегодня поделиться своими впечатлениями. В дополнение к этому планируется небольшая инструкция по развертыванию Hadoop на кластере из большого количества машин, который послужит неплохим развитием темы, начатой в посте <a href="/net/scalability/hadoop-dlya-razrabotchika/">&#171;Hadoop для разработчика&#187;</a>.<br />
<span id="more-87"></span></p>
<h3>Что нового?</h3>
<p>Для начала  вкратце напомню что их себя представляет данный продукт, всего в нем три компонента:</p>
<dl>
<dt>HDFS</dt>
<dd>кластерная файловая система.</dd>
<dt>MapReduce framework</dt>
<dd>программная основа для построения приложений, работающих по одноименной модели.</dd>
<dt>HBase</dt>
<dd>нереляционная база данных.</dd>
</dl>
<p>Повторно повторяться смысла не вижу, все уже давно <a href="/net/scalability/hadoop/" target="_blank">разложено по полочкам</a>. Так что сразу перейдем к глобальным изменениям в проекте, произошедшим с написания вышеупомянутого поста, то есть с февраля. Сразу хочу сказать, что подробно пересказывать <a href="http://svn.apache.org/repos/asf/hadoop/core/trunk/CHANGES.txt" rel="nofollow" target="_blank">release notes</a> у меня нет никакого желания, если Вам интересны все подробности о каждом bugfix&#8217;е или изменении в API, то имеет смысл почитать их в оригинале.</p>
<p>Наиболее значительным событием в развитии Apache Hadoop было, пожалуй, отделение <a href="/tag/hbase" target="_blank">HBase</a> в отдельный проект. Какие же это повлекло последствия? С точки зрения простого смертного наиболее заметен тот факт, что HBase пропал из основного архива или репозитория Hadoop и его теперь нужно качать отдельно <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  На самом же деле такое обособление лишь ускорило ее развитие, совсем недавно HBase отпраздновала свой релиз версии 0.2.0, включающий в себя массу нововведений и исправленных проблем, например язык запросов HQL был полностью заменен на jirb/jython shell, а также было добавлено кэширование данных в памяти. Помимо этого сильно изменилось API, очень рекомендую заглянуть в <a href="http://hadoop.apache.org/hbase/docs/current/api/index.html" rel="nofollow" target="_blank">javadoc</a> проекта, если Вас это интересует.</p>
<p>На уровне файловой системы наиболее значительным изменением стало добавление еще одного типа узлов &#8212; <strong>Secondary NameNode</strong>. Это нововведение является первым шагом на пути к устранению узких мест в системе (так называемых single points of failure). Название этого типа узлов говорит само за себя: они подстраховывают основной <em>NameNode</em> на случай непредвиденных сбоев. Они создают резервную копию образа метаданных файловой системы и лога транзакций (то есть всех операций с файлами и директориями в HDFS) и периодически ее обновляют. Полноценного автоматического восстановления системы они в случае сбоя на сервере с <em>NameNode</em> они на данный момент не обеспечивают, но сохранность данных на случай, скажем, разрушившегося RAID обеспечить могут.</p>
<p>MapReduce framework тоже несомненно развивается и дорабатывается, но каких-либо особо выдающихся изменений в нем не произошло: появляются дополнительные возможности, исправляются ошибки, снимаются те или иные ограничения. В общем все идет своим чередом.</p>
<h3>Поднимаем кластер</h3>
<div style="border: solid 1px #aaaaaa; background: white; padding: 6px;margin:4px;">
<strong align="center">ВНИМАНИЕ!</strong><br /> Перед продолжением чтения этого раздела, настоятельно рекомендуется прочитать <a href="http://www.insight-it.ru/net/scalability/hadoop-dlya-razrabotchika/" target="_blank">статью о запуске псевдо-кластера из одного компьютера</a>.
</div>
<p>Для начала нам понадобится некоторое количество компьютеров (хотя если у Вас серьезные намерения, то лучше все же гордо называть их серверами, а для &#171;побаловаться&#187; сойдут и обычные рабочие станции с <a href="/tag/linux" target="_blank">Linux</a>). Конкретное количество на самом деле роли не играет, продолжать можно как с 2 серверами, так и с 20 тысячами (по крайней мере теоретически). Хотя пару рекомендаций все же могу дать: при использовании в &#171;боевых&#187; условиях стоит стараться избегать физического совмещения мастер-узлов компонентов системы (<em>NameNode, JobTracker, HMaster</em>) с &#171;рядовыми&#187; серверами, таким образом желательно начинать с, как минимум, 5-7 серверов.</p>
<p>Удостоверившись, что на всем оборудовании установлен какой-нибудь дистрибутив <a href="/tag/linux" target="_blank">Linux</a> или <a href="/tag/unix" target="_blank">Unix</a> (любители особо поизвращаться могут попытать счастья с &#171;окнами&#187; в совокупности с Cygwin) и 5 или 6 версия JRE/JDK (желательно от Sun), можно приступать к настройке каждого узла по тому же принципу, что и для псевдо-кластера (да-да, предупреждение в начале раздела было написано не для мебели). Кстати не забудьте, что <a href="/tag/hbase" target="_blank">HBasе</a> теперь нужно скачивать отдельно. О небольших присутствующих особенностях я расскажу чуть позже, а пока дам маленький совет, который позволит несколько облегчить это непростое дело.</p>
<p>Вручную выполнять одни и те же операции на паре десятков/сотен/тысяч серверов мало того что долго, но и чрезвычайно утомительно. Уже на втором-третьем сервере начнет появляться желание каким-либо образом автоматизировать процесс установки. Конечно же можно воспользоваться специализированным программным обеспечением, скажем <a href="http://www.theether.org/gexec/" target="_blank" rel="nofollow">gexec</a>, но есть и более простой способ: существенно упростить жизнь может простой скрипт на bash в 5 строчек:</p>
<pre lang="bash">
#!/bin/bash
for x in `cat ~/nodes`
do
ssh hadoop@$x $1
done
</pre>
<p>В файле <strong>~/nodes</strong> должен располагаться список IP-адресов всех серверов, тогда получив первым параметром произвольную консольную команду скрипт выполнит ее на каждом сервере. С его помощью можно существенно сократить время, требуемое на выполнение всех необходимых действий для запуска кластера.</p>
<p>После небольшого лирического отступления вернемся собственно к <a href="/tag/hadoop" target="_blank">Hadoop</a>. Как Вы уже, надеюсь, знаете, система использует <strong>ssh</strong> для управления всеми компонентами системы, причем очень желателен беспарольный доступ между всеми узлами. Для этого необходимо собрать в один файл все публичные ключи <strong>~/.ssh/id_rsa.pub</strong> на каждом из узлов (по одному на строчку) и разместить его под именем <strong>~/.ssh/authorized_keys</strong> тоже на каждом из узлов. Кстати для упоминавшегося выше скрипта беспарольный доступ тоже очень желателен.</p>
<p>Следующим этапом нужно подготовить конфигурационные файлы, они должны быть идентичными на всех узлах, так что заполнив их все на одном из узлов нужно скопировать их по всем остальным серверам (очень удобно делать это с помощью <strong>rsync</strong>). Теперь пройдемся по необходимым изменениям в каждом из них:</p>
<dl>
<dt><strong>hadoop-site.xml</strong></dt>
<dd>
<pre lang="XML">
<property>
  <name>fs.default.name</name>
  <value>hdfs://namenode:54310</value>
  <description>The name of the default file system.  A URI whose
  scheme and authority determine the FileSystem implementation.  The
  uri's scheme determines the config property (fs.SCHEME.impl) naming
  the FileSystem implementation class.  The uri's authority is used to
  determine the host, port, etc. for a filesystem.</description>
</property>
<property>
  <name>mapred.job.tracker</name>
  <value>jobtracker:54311</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>
</pre>
<p>Каждый сервер должен знать где расположен <em>NameNode</em>, по-этому он явно указывается в полном пути к файловой системе, практически аналогичная ситуация и с <em>JobTracker</em>. Вместо namenode и jobtracker необходимо указать их IP-адреса или доменные имена (или в крайнем случае &#8212; имя в <strong>/etc/hosts</strong>)
</dd>
<dt><strong>masters</strong></dt>
<dd>
Вопреки логике, здесь указывается список всех <em>SecondaryNameNode</em>. Одного-двух серверов здесь будет вполне достаточно, самое главное не указывать здесь адрес основного <em>NameNode</em>, лучше всего подойдет какой-нибудь другой мастер-сервер, может быть дополненный одним из обычных узлов кластера. Выделять под это отдельный сервер смысла не много, так как нагрузка на них минимальна.
</dd>
<dt><strong>slaves</strong></dt>
<dd>
Список всех рядовых серверов, по одному на строку (опять же: IP или доменное имя). На них будут запущенны <em>DataNode</em> и <em>TaskTracker</em>.
</dd>
<dt><strong>hbase-site.xml</strong></dt>
<dd>
<pre lang="XML">
<property>
     <name>hbase.master</name>
     <value>hmaster:60000</value>
     <description>The host and port that the HBase master runs at</description>
   </property>
<property>
     <name>hbase.rootdir</name>
     <value>hdfs://namenode/hbase</value>
     <description>location of HBase instance in dfs</description>
   </property>
</pre>
<p>Первое изменение достаточно очевидно: <em>HRegionServer</em> должны знать где находится <em>HMaster</em>, о чем им и сообщает первое свойство (заменяем hmaster на соответствующий адрес). А вот второе свойство является следствием &#171;обособления&#187; HBase от Hadoop, о котором шла речь ранее. Теперь имеется возможность использовать их отдельно (с локальной файловой системой вместо HDFS), а так как появился выбор файловой системы &#8212; ее адрес необходимо указывать полностью. В данном случае указан адрес HDFS (такой же как в <strong>hadoop-site.xml</strong>).
</dd>
<dt><strong>regionservers</strong></dt>
<dd>
Вполне очевидный конфигурационный файл, по аналогии со <strong>slaves</strong>, заполняется списком адресов для запуска <em>HRegionServer</em>. Часто совпадает с упомянутым <strong>slaves</strong>, обычно достаточно просто скопировать.
</dd>
</dl>
<p>Удостоверившись, что с конфигурационными файлами все нормально и что они на всех серверах совпадают, можно приступать собственно к запуску. Этот процесс практически полностью совпадает с запуском на одном узле, хотя обычно проще желать это тоже простеньким скриптом примерно такого вида:</p>
<pre lang="bash">
#!/bin/bash
ssh hadoop@namenode ~/hadoop/bin/start-dfs.sh
ssh hadoop@jobtracker ~/hadoop/bin/start-mapred.sh
ssh hadoop@hmaster ~/hbase/bin/start-hbase.sh
</pre>
<p>Если мы нигде не ошиблись и все сделано правильно, то кластер благополучно запустится, что легко проследить выполнив на каждом узле команду <strong>jps</strong> и проверив соответствие запущенных компонентов запланированному (читай: указанному в конфигурационных файлах).</p>
<p>В целом процесс достаточно прост и не занимает много времени, если Вы все же столкнулись с какими-либо проблемами в процессе &#8212; обращайтесь, вполне возможно, что я смогу помочь. Удостовериться, что все нормально можно абсолютно так же, как и для псевдо-кластера &#8212; с помощью MapReduce задач, идущих в комплекте с Hadoop. Выглядеть это может, например, вот так:</p>
<pre lang="bash">
~/hadoop/bin/hadoop jar hadoop-*-examples.jar pi 4 10000
</pre>
<p>По-хорошему надо было бы написать подобную инструкцию сразу после первой, но почему-то как-то не сложилось&#8230;</p>
<h3>Заключение</h3>
<p>На данный момент <a href="/tag/hadoop" target="_blank">Hadoop</a> стал еще более работоспособным, по сравнению с его февральским состоянием. Сообщество использующих его разработчиков растет с каждым днем, а все ошибки и проблемы исправляются очень и очень оперативно, многие коммерческие проекты могут позавидовать таким темпам развития. Хоть до по-настоящему стабильного релиза еще далеко, данный продукт уже сейчас очень активно используется в достаточно большом количестве крупных интернет-проектов.</p>
<p>На закуску небольшой бонус в виде моей небольшой вводной презентации об Apache Hadoop, правда слегка устаревшей (была подготовлена 1 июня 2008г.):</p>
<div style="width:425px;text-align:left;margin:20px 0;" id="__ss_558641"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/m11/apache-hadoop-presentation?src=embed" title="Apache Hadoop">Apache Hadoop</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=hadoop-1219003116800762-9&#038;stripped_title=apache-hadoop-presentation" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=hadoop-1219003116800762-9&#038;stripped_title=apache-hadoop-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object</div>
<p>Если Вы еще не успели подписаться на <a href="/feed" target="_blank">RSS</a> &#8212; сейчас самое время!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/hadoop-vozvrashhaetsya/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Hadoop для разработчика</title>
		<link>http://www.insight-it.ru/masshtabiruemost/hadoop-dlya-razrabotchika/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/hadoop-dlya-razrabotchika/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 21:15:51 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[gentoo linux]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[HBase]]></category>
		<category><![CDATA[HDFS]]></category>
		<category><![CDATA[MapReduce]]></category>
		<category><![CDATA[ПО]]></category>
		<category><![CDATA[развертывание]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[установка]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/hadoop-dlya-razrabotchika/</guid>
		<description><![CDATA[Для разработки приложений, работающих с использованием Hadoop, или же алгоритмов для MapReduce framework&#8217;а совсем не нужен полномасштабный кластер. На самом же деле для запуска всей системы, описанной мной в одном из предыдущих постов, вполне достаточно одного компьютера и буквально минут 15 свободного времени, как потратить их для решения этой задачи я Вам и поведаю. Рассказывать [...]]]></description>
			<content:encoded><![CDATA[<p>Для разработки приложений, работающих с использованием Hadoop, или же алгоритмов для MapReduce framework&#8217;а совсем не нужен полномасштабный кластер. На самом же деле для запуска всей системы, описанной мной в <a href="/net/scalability/hadoop/" target="_blank">одном из предыдущих постов</a>, вполне достаточно одного компьютера и буквально минут 15 свободного времени, как потратить их для решения этой задачи я Вам и поведаю.<br />
<span id="more-49"></span><br />
Рассказывать я буду на примере своего <a href="/tag/gentoo-linux" target="_blank">Gentoo Linux</a>, но большая часть этого повествования будет справедлива и для других unix-like операционных систем.</p>
<h3>Подготовка</h3>
<p>Перед тем, как приступить собственно говоря к установке <a href="http://hadoop.apache.org/core/" target="_blank" rel="nofollow">Hadoop</a>, необходимо выполнить два элементарных действия, необходимых для правильного функционирования системы:</p>
<ul>
<li>открыть доступ одному из пользователей по <strong>ssh</strong> к этому же компьютеру без пароля, можно например создать отдельного пользователя для этого [hadoop]:
<pre lang="bash">
useradd -m -n hadoop
</pre>
<p>Далее действия выполняем от его имени:</p>
<pre lang="bash">
su hadoop
</pre>
<p>Генерируем RSA-ключ для обеспечения аутентификации в условиях отсутствия возможности использовать пароль:</p>
<pre>
hadoop@localhost ~ $ ssh-keygen -t rsa -P ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
7b:5c:cf:79:6b:93:d6:d6:8d:41:e3:a6:9d:04:f9:85 hadoop@localhost
</pre>
<p>И добавляем его в список авторизованных ключей:</p>
<pre lang="bash">
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
</pre>
<p>Этого должно быть более чем достаточно, проверить работоспособность соединения можно просто написав:</p>
<pre lang="bash">
ssh localhost
</pre>
<p>Не забываем предварительно инициализировать <strong>sshd</strong>:</p>
<pre lang="bash">
/etc/init.d/sshd start
</pre>
</li>
<li>Помимо этого необходимо убедиться в наличии установленной JVM версии 1.5.0 или выше, а также узнать директорию, где она располагается, вариантов сделать это множество, я нашел ее просто заглянув в самое логичное место &#8212; <strong>/usr/lib</strong>, но при желании никто не может Вам помешать воспользоваться услугами, например, <strong>slocate</strong>. Найденную директорию с JVM лучше запомнить или записать куда-нибудь, для меня она оказалась:
<pre lang="bash">
/usr/lib/jvm/sun-jdk-1.6
</pre>
</li>
</ul>
<h3>Установка</h3>
<p>Установка начинается с получения копии исходного кода системы, способов для этого существует несколько. Я перепробовал практически все, самую адекватную версию мне удалось получить из SVN. Для ее получения необходимо выполнить следующую команду:</p>
<pre lang="bash">
svn checkout http://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.16 ~
</pre>
<p><strong>branch-0.16</strong> &#8212; последняя доступная версия на данный момент, для определения ее номера достаточно заглянуть <a href="http://svn.apache.org/repos/asf/hadoop/core/branches/" target="_blank" rel="nofollow">по тому же адресу</a> браузером. Предполагается, что Hadoop будет располагаться прямо в <strong>/home/hadoop</strong>, но запросто можно использовать и другую директорию.</p>
<p>Сразу же стоит скомпилировать различные дополнительные компоненты системы, особенно это актуально из-за <a href="/tag/hbase" target="_blank">HBase</a>, но и помимо него соберется много чего интересного, например plug-in для отличной IDE под названием <strong><a href="http://www.eclipse.org" target="_blank" rel="nofollow">Eclipse</a></strong> или <a href="http://hadoop.apache.org/core/docs/r0.16.0/hod.html" target="_blank" rel="nofollow">Hadoop On Demand</a>. Задача также элементарна:</p>
<pre lang="bash">
cd ~
ant clean jar compile-contrib
</pre>
<h3>Настройка</h3>
<p>Конфигурационные файлы можно редактировать в произвольном порядке, самое главное ничего не забыть <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li><strong>conf/hadoop-env.sh</strong>
<pre>
# The java implementation to use.  Required.
export JAVA_HOME=/usr/lib/jvm/sun-jdk-1.6
</pre>
<p>Единственная обязательная переменная окружения &#8212; <strong>JAVA_HOME</strong>, здесь как раз пригодится заранее найденный путь до JVM, все остальное &#8212; по желанию.
</li>
<li><strong>conf/hadoop-site.xml</strong>
<pre lang="xml"><?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hadoop/data/${user.name}</value>
  <description>A base for other temporary directories.</description>
</property>
<property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:54310</value>
  <description>The name of the default file system.  A URI whose
  scheme and authority determine the FileSystem implementation.  The
  uri's scheme determines the config property (fs.SCHEME.impl) naming
  the FileSystem implementation class.  The uri's authority is used to
  determine the host, port, etc. for a filesystem.</description>
</property>
<property>
  <name>mapred.job.tracker</name>
  <value>localhost:54311</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>
<property>
  <name>dfs.replication</name>
  <value>1</value>
  <description>Default block replication.
  The actual number of replications can be specified when the file is created.
  The default is used if replication is not specified in create time.
  </description>
</property>

</configuration>
</pre>
<p>Этот конфигурации файл является одним из ключевых, таким образом он выглядит для конфигурации, состоящей из одного компьютера (позаимствован из <a href="http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Single-Node_Cluster%29" target="_blank" rel="nofollow">англоязычного мануала</a> на ту же тему).
</li>
<li><strong>src/contrib/hbase/conf/hbase-site.xml</strong>
<pre lang="xml">
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
     <name>hbase.master</name>
     <value>localhost:60000</value>
     <description>The host and port that the HBase master runs at</description>
   </property>
<property>
     <name>hbase.rootdir</name>
     <value>/hbase</value>
     <description>location of HBase instance in dfs</description>
   </property>
</configuration>
</pre>
<p>Как не сложно заметить, этот файл необходим для функционирования <strong>HBase</strong>, по-моему все просто и очевидно, &lt;description&gt; говорят сами за себя.
</li>
</ul>
<h3>Запуск</h3>
<p>Начать стоит с ознакомления с кратким описанием доступных команд Hadoop, сделать это можно просто набрав <strong>~/bin/hadoop</strong>:</p>
<pre>
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
  namenode -format     format the DFS filesystem
  secondarynamenode    run the DFS secondary namenode
  namenode             run the DFS namenode
  datanode             run a DFS datanode
  dfsadmin             run a DFS admin client
  fsck                 run a DFS filesystem checking utility
  fs                   run a generic filesystem user client
  balancer             run a cluster balancing utility
  jobtracker           run the MapReduce job Tracker node
  pipes                run a Pipes job
  tasktracker          run a MapReduce task Tracker node
  job                  manipulate MapReduce jobs
  version              print the version
  jar <jar>            run a jar file
  distcp <srcurl> <desturl> copy file or directories recursively
  daemonlog            get/set the log level for each daemon
 or
  CLASSNAME            run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
</pre>
<p>Первым делом необходимо отформатировать <em>Namenode</em>:</p>
<pre lang="bash">
~/bin/hadoop namenode -format
</pre>
<p>И дело останется лишь за малым, запустить на выполнение пару bash-скриптов, которые без вашего дальнейшего участия <em>инициализируют</em> всю систему, включая HBase:</p>
<pre>
~/bin/hadoop/start-all.sh &#038;&#038; ~/src/contrib/hbase/bin/start-hbase.sh
</pre>
<p>Как только они закончат все необходимые действия, у Вас появится возможность удостовериться, что все в порядке. Самым простым способом является запуск клиента <em>Hbase Shell</em>:</p>
<pre lang="bash">
~/bin/src/contrib/hbase/bin/hbase shell
</pre>
<p>Если в ответ Вы получили соответствующее приглашение клиента, значит все было сделано верно!</p>
<p>Вот собственно говоря и все, псевдо-кластер функционирует, доступ к HBase имеется, можно приступать к разработке <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>P.S.:</strong> Остановка системы производится по тому же принципу скриптами <strong>stop-all.sh</strong> и <strong>stop-hbase.sh</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/hadoop-dlya-razrabotchika/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Hadoop</title>
		<link>http://www.insight-it.ru/masshtabiruemost/hadoop/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/hadoop/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 19:41:32 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[HBase]]></category>
		<category><![CDATA[HDFS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MapReduce]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[информационные технологии]]></category>
		<category><![CDATA[кластер]]></category>
		<category><![CDATA[распределенные вычисления]]></category>
		<category><![CDATA[технология]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/hadoop/</guid>
		<description><![CDATA[Hadoop представляет собой платформу для построения приложений, способных обрабатывать огромные объемы данных. Система основывается на распределенном подходе к вычислениям и хранению информации, основными ее особенностями являются: Масштабируемость: с помощью Hadoop возможно надежное хранение и обработка огромных объемов данных, которые могут измеряться петабайтами; Экономичность: информация и вычисления распределяются по кластеру, построенному на самом обыкновенном оборудовании. Такой [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/hadoop-logo.jpg" title="Hadoop" alt="Hadoop Logo" style="float:right; margin: 7px 0 0 10px;"/><br />
<a href="http://hadoop.apache.org/core/" rel="nofollow" target="_blank">Hadoop</a> представляет собой платформу для построения приложений, способных обрабатывать огромные объемы данных. Система основывается на распределенном подходе к вычислениям и хранению информации, основными ее особенностями являются:</p>
<ul>
<li><strong>Масштабируемость:</strong> с помощью <a href="/tag/hadoop" target="_blank">Hadoop</a> возможно надежное хранение и обработка огромных объемов данных, которые могут измеряться петабайтами;</li>
<li><strong>Экономичность:</strong> информация и вычисления распределяются по <a href="/tag/klaster" target="_blank">кластеру</a>, построенному на самом обыкновенном оборудовании. Такой кластер может состоять из тысяч узлов;</li>
<li><strong>Эффективность:</strong> распределение данных позволяет выполнять их обработку параллельно на множестве компьютеров, что существенно ускоряет этот процесс;</li>
<li><strong>Надежность:</strong> при хранении данных возможно предоставление избыточности, благодаря хранению нескольких копий. Такой подход позволяет гарантировать отсутствие потерь информации в случае сбоев в работе системы;</li>
<li><strong>Кроссплатформенность:</strong> так как основным языком программирования, используемым в этой системе является <a href="/tag/java">Java</a>, развернуть ее можно на базе любой операционной системы, имеющей <acronym title="Java Virtual Machine">JVM</acronym>.</li>
</ul>
<p><span id="more-47"></span></p>
<h3>HDFS</h3>
<p>В основе всей системы лежит распределенная файловая система под незамысловатым названием <strong>Hadoop Distributed File System</strong>. Представляет она собой вполне стандартную распределенную файловую систему, но все же она обладает рядом особенностей:</p>
<ul>
<li>Устойчивость к сбоям, разработчики рассматривали сбои в оборудовании скорее как норму, чем как исключение;</li>
<li>Приспособленность к развертке на самом обыкновенном ненадежном оборудовании;</li>
<li>Предоставление высокоскоростного потокового доступа ко всем данным;</li>
<li>Настроена для работы с большими файлами и наборами файлов;</li>
<li>Простая модель работы с данными: <em>один раз записали &#8212; много раз прочли</em>;</li>
<li>Следование принципу: <em>переместить вычисления проще, чем переместить данные</em>;</li>
</ul>
<h4>Архитектура HDFS</h4>
<p>Проще всего ее демонстрирует схема, <a  href="http://hadoop.apache.org/core/docs/current/images/hdfsarchitecture.gif" target="_blank" rel="nofollow">позаимствованная</a> с официального сайта проекта и переведенная мной на руский:<br />
<img src="/wp-content/uploads/hdfsarchitecture.jpg" title="Архитектура HDFS" alt="Архитектура HDFS" /></p>
<p>Действующие лица:</p>
<dl>
<dt><strong>Namenode</strong></dt>
<dd>Этот компонент системы осуществляет всю работу с метаданными. Он должен быть запущен только на одном компьютере в кластере. Именно он управляет размещением информации и доступом ко всем данным, расположенным на ресурсах кластера. Сами данные проходят с остальных машин кластера к клиенту мимо него.</dd>
<dt><strong>Datanode</strong></dt>
<dd>На всех остальных компьютерах системы работает именно этот компонент. Он располагает сами блоки данных в локальной файловой системе для последующей передачи или обработки их по запросу клиента. Группы узлов данных принято называть Rack, они используются, например, в схемах репликации данных.</dd>
<dt><strong>Клиент</strong></dt>
<dd>Просто приложение или пользователь, работающий с файловой системой. В его роли может выступать практически что угодно.</dd>
</dl>
<p>Пространство имен <a href="/tag/hdfs" target="_blank">HDFS</a> имеет классическую иерархическую структуру: пользователи и приложения имеют возможность создавать директории и файлы. Файлы хранятся в виде блоков данных произвольной (но одинаковой, за исключением последнего; по-умолчанию 64  mb) длины, размещенных на <strong>Datanode</strong>&#8216;ах. Для обеспечения отказоустойчивости блоки хранятся в нескольких экземплярах на разных узлах, имеется возможность настройки количества копий и алгоритма их распределения по системе. Удаление файлов происходит не сразу, а через какое-то время после соответствующего запроса, так как после получения запроса файл перемещается в директорию <b>/trash</b> и хранится там определенный период времени на случай если пользователь или приложение передумают о своем решении. В этом случае информацию можно будет восстановить, в противном случае &#8212; физически удалить.</p>
<p>Для обнаружения возникновения каких-либо неисправностей, <strong>Datanode</strong> периодически отправляют <strong>Namenode</strong>&#8216;у сигналы о своей работоспособности. При прекращении получения таких сигналов от одного из узлов <strong>Namenode</strong> помечает его как <em>&#171;мертвый&#187;</em>, и прекращает какой-либо с ним взаимодействие до возвращения его работоспособности. Данные, хранившиеся на <em>&#171;умершем&#187;</em> узле реплицируются дополнительный раз из оставшихся <em>&#171;в живых&#187;</em> копий и система продолжает свое функционирование как ни в чем не бывало.</p>
<p>Все коммуникации между компонентами файловой системы проходят по специальным протоколам, основывающимся на стандартном <strong>TCP/IP</strong>. Клиенты работают с <strong>Namenode</strong> с помощью так называемого <strong>ClientProtocol</strong>, а передача данных происходит по <strong>DatanodeProtocol</strong>, оба они <em>обернуты</em> в <strong>Remote Procedure Call (RPC)</strong>.</p>
<p>Система предоставляет несколько интерфейсов, среди которых командная оболочка <strong>DFSShell</strong>, набор ПО для администрирования <strong>DFSAdmin</strong>, а также простой, но эффективный веб-интерфейс. Помимо этого существуют несколько API для языков программирования: Java API, C pipeline, WebDAV и так далее.</p>
<h3>MapReduce</h3>
<p>Помимо файловой системы, <a href="/tag/hadoop" target="_blank">Hadoop</a> включает в себя framework для проведения масштабных вычислений, обрабатывающих огромные объемы данных. Каждое такое вычисление называется Job (задание) и состоит оно, как видно из названия, из двух этапов:</p>
<dl>
<dt><strong>Map</strong></dt>
<dd>Целью этого этапа является представление произвольных данных (на практике чаще всего просто пары ключ-значение) в виде промежуточных пар ключ-значение. Результаты сортируются и групируются по ключу и передаются на следующий этап.</dd>
<dt><strong>Reduce</strong></dt>
<dd>Полученные после <strong>map</strong> значения используются для финального вычисления требуемых данных. Практические любые данные могут быть получены таким образом, все зависит от требований и функционала приложения.</dd>
</dl>
<p>Задания выполняются, подобно файловой системе, на всех машинах в кластере (чаще всего одних и тех же). Одна из них выполняет роль управления работой остальных &#8212; <strong>JobTracker</strong>, остальные же ее бесприкословно слушаются &#8212; <strong>TaskTracker</strong>. В задачи <strong>JobTracker</strong>&#8216;а входит составление расписания выполняемых работ, наблюдение за ходом выполнения, и перераспределение в случае возникновения сбоев.</p>
<p>В общем случае каждое приложение, работающее с этим framework&#8217;ом, предоставляет методы для осуществления этапов <strong>map</strong> и <strong>reduce</strong>, а также указывает расположения входных и выходных данных. После получения этих данных <strong>JobTracker</strong> распределяет задание между остальными машинами и предоставляет клиенту полную информацию о ходе работ.</p>
<p>Помимо основных вычислений могут выполняться вспомогательные процессы, такие как составление отчетов о ходе работы, кэширование, сортировка и так далее.</p>
<h3>HBase</h3>
<p><img src="/wp-content/uploads/hbase-logo.gif" alt="HBase Logo" title="HBase" style="float:right; margin: 24px 4px 4px 4px;" /><br />
В рамках <a href="/tag/hadoop" target="_blank">Hadoop</a> доступна еще и система хранения данных, которую правда сложно назвать <a href="/tag/subd" target="_blank">СУБД</a> в традиционном смысле этого слова. Чаще проводят аналогии с проприетарной системой этого же плана от <a href="/tag/google">Google</a> &#8212; <a href="/tag/bigtable" target="_blank">BigTable</a>.</p>
<p><a href="http://hadoop.apache.org/hbase" target="_blank" rel="nofollow">HBase</a> представляет собой распределенную систему хранения больших объемов данных.  Подобно реляционным СУБД данные хранятся в виде таблиц, состоящих из строк и столбцов. И даже для доступа к ним предоставляется язык запросов <strong>HQL</strong> (как ни странно &#8212; <strong>Hadoop Query Language</strong>), отдаленно напоминающий более распространенный <a href="/tag/sql" target="_blank">SQL</a>. Помимо этого предоставляется итерирующмй интерфейс для сканирования наборов строк.</p>
<p>Одной из основных особенностей хранения данных в <strong>HBase</strong> является возможность наличия нескольких значений, соответствующих одной комбинации таблица-строка-столбец, для их различения используется информация о времени добавления записи. На концептуальном уровне таблицы обычно представляют как набор строк, но физически же они хранятся по столбцам, достаточно важный факт, который стоит учитывать при разработки схемы хранения данных. Пустые ячейки не отображаются каким-либо образом физически в хранимых данных, они просто отсутствуют. Существуют конечно и другие нюансы, но я постарался упомянуть лишь основные.</p>
<p><strong>HQL</strong> очень прост по своей сути, если Вы уже знаете <a href="/tag/sql" target="_blank">SQL</a>, то для изучения его Вам понадобится лишь просмотреть по диагонали коротенький вывод команды <b>help;</b>, занимающий всего пару экранов в консоли. Все те же <strong>SELECT</strong>, <strong>INSERT</strong>, <strong>UPDATE</strong>, <strong>DROP</strong> и так далее, лишь со слегка измененным синтаксисом.</p>
<p>Помимо обычно командной оболочки <strong>HBase Shell</strong>, для работы с <strong>HBase</strong> также предоставлено несколько API для различных языков программирования: <a href="http://hadoop.apache.org/hbase/docs/current/api/index.html" target="_blank" rel="nofollow">Java</a>, <a href="http://wiki.apache.org/hadoop/Hbase/Jython" target="_blank" rel="nofollow">Jython</a>, <a href="http://wiki.apache.org/hadoop/Hbase/HbaseRest" target="_blank" rel="nofollow">REST</a> и <a href="http://wiki.apache.org/hadoop/Hbase/ThriftApi" target="_blank" rel="nofollow">Thrift</a>.</p>
<h3>Заключение</h3>
<p><a href="/tag/hadoop" target="_blank">Hadoop</a> является отличным решением для построения высоконагруженных приложений, которое уже активно используется <a href="http://wiki.apache.org/hadoop/PoweredBy" target="_blank" rel="nofollow">множеством интернет-проектов</a>. В последующих постах на эту тему я постараюсь описать процесс развертывания этой системы и написания приложений, работающих по принципу <a href="/tag/mapreduce">MapReduce</a>. Не пропустить момент их публикации Вам может помочь подписка на <a href="/feed" target="_blank">RSS-ленту</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/hadoop/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Архитектура Google</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-google/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-google/#comments</comments>
		<pubDate>Thu, 31 Jan 2008 15:05:56 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[BigTable]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[GFS]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[MapReduce]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Sawzall]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Google]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[кластер]]></category>
		<category><![CDATA[поиск]]></category>
		<category><![CDATA[сервер]]></category>
		<category><![CDATA[хранение данных]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-google/</guid>
		<description><![CDATA[Эта статья датируется 2008 годом, новая версия: Архитектура Google 2011 Google &#8212; Король масштабируемости. Каждый хоть раз слышал о Google благодаря их всеобъемлющему, &#171;умному&#187; и быстрому поисковому сервису, но ни для кого не секрет, что они не ограничиваются только им. Их платформа для построения масштабируемых приложений позволяет выпускать множество удивительно конкурентноспособных интернет-приложений, работающих на уровне [...]]]></description>
			<content:encoded><![CDATA[<div class="frame"><em>Эта статья датируется 2008 годом, новая версия: <a href="/masshtabiruemost/arkhitektura-google-2011/">Архитектура Google 2011</a></em></div>
<blockquote style="margin-left: 200px"><p><strong><a href="/tag/google" target="_blank">Google</a></strong> &#8212; Король масштабируемости.</p></blockquote>
<p>Каждый хоть раз слышал о <a href="/tag/google" target="_blank">Google</a> благодаря их всеобъемлющему, &#171;умному&#187; и быстрому поисковому сервису, но ни для кого не секрет, что они  не ограничиваются только им. Их платформа для построения масштабируемых приложений позволяет выпускать множество удивительно конкурентноспособных интернет-приложений, работающих на уровне всего Интернета вцелом. Они ставят перед собой цель постоянно строить все более и более производительную и масштабируемую архитектуру для поддержки своих продуктов. Как же им это удается?</p>
<p><span id="more-35"></span></p>
<h3>Источники информации</h3>
<p><em>Сразу хочу сказать, что эта запись является переводом с английского, автор <a href="http://highscalability.com/google-architecture" target="_blank" rel="nofollow">оригинальной версии</a> &#8212; <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd Hoff</a>. Оригинал написан приблизительно в середине 2007 года, но по-моему до сих пор очень даже актуально.</em></p>
<p>Далее следует перечисление источников информации из оригинала:</p>
<ul>
<li><a href="http://video.google.com/videoplay?docid=-5699448884004201579" target="_blank" rel="_nofollow">Video: Построение больших систем в Google</a></li>
<li><a href="http://labs.google.com/papers/gfs.html" target="_blank" rel="_nofollow">Google Lab: Файловая система Google (GFS)</a></li>
<li><a href="http://labs.google.com/papers/mapreduce.html" target="_blank" rel="_nofollow">Google Lab: MapReduce: упрощенная обработка данных на больших кластерах</a></li>
<li><a href="http://labs.google.com/papers/bigtable.html" target="_blank" rel="_nofollow">Google Lab: BigTable.</a></li>
<li><a href="http://video.google.com/videoplay?docid=7278544055668715642" target="_blank" rel="_nofollow">Video: BigTable: система распределенного хранения данных.</a></li>
<li><a href="http://www.baselinemag.com/article2/0,1540,1985514,00.asp" target="_blank" rel="_nofollow">Как работает Google</a> от David Carr в Baseline Magazine.</li>
<li><a href="http://labs.google.com/papers/sawzall.html" target="_blank" rel="_nofollow">Google Lab: интерпретирование данных. Параллельный анализ с помощью Sawzall.</a></li>
<li><a href="http://www.25hoursaday.com/weblog/2007/06/25/GoogleScalabilityConferenceTripReportMapReduceBigTableAndOtherDistributedSystemAbstractionsForHandlingLargeDatasets.aspx" target="_blank" rel="_nofollow">Записи с конференции по масштабированию от Dare Obasonjo.</a></li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/linux" target="_blank">Linux</a></li>
<li>Большое разнообразие языков программирования: Python, <a href="/tag/java" target="_blank">Java</a>, C++</li>
</ul>
<h3>Что внутри?</h3>
<h4>Статистика</h4>
<ul>
<li>На 2006 год система включала в себя 450000 недорогих серверов</li>
<li>За 2005 год было проиндексировано 8 миллиардов страниц. На данный момент… кто знает?</li>
<li>На момент написания оригинала Google включает в себя более 200 <a href="/tag/gfs" target="_blank">GFS</a> кластеров. Один кластер может состоять из 1000 или даже 5000 компьютеров</li>
<li>Десятки и сотни тысяч компьютеров получают данные из <a href="/tag/gfs" target="_blank">GFS</a> кластеров, которые насчитывают более 5 петабайт дискового пространства. Суммарные пропускная способность операций записи и чтения между дата центрами может достигать 40 гигабайт в секунду</li>
<li><a href="/tag/bigtable" target="_blank">BigTable</a> позволяет хранить миллиарды ссылок (URL), сотни терабайт снимков со спутников, а также настройки миллионов пользователей</li>
</ul>
<p><em>// Цифры не первой свежести конечно, но тоже неплохо.</em></p>
<h4>Стек</h4>
<p><a href="/tag/google" target="_blank">Google</a> визуализирует свою инфраструктуру в виде трехслойного стека:</p>
<ul>
<li><em>Продукты:</em> поиск, реклама, электронная почта, карты, видео, чат, блоги</li>
<li><em>Распределенная инфраструктура системы:</em> <a href="/tag/gfs" target="_blank">GFS</a>, <a href="/tag/mapreduce" target="_blank">MapReduce</a> и <a href="/tag/bigtable" target="_blank">BigTable</a></li>
<li><em>Вычислительные платформы:</em> множество компьютеров во множестве датацентров</li>
<li>Легкое развертывание для компании при низком уровне издержек</li>
<li>Больше денег вкладывается в оборудование для исключения возможности потерь данных</li>
</ul>
<h4>Надежное хранение данных с помощью <a href="/tag/gfs" target="_blank">GFS</a></h4>
<ul>
<li>Надежное масштабируемое хранение данных крайне необходимо для любого приложения. <strong>GFS</strong> является основой их платформы хранения информации</li>
<li><strong><a href="/tag/gfs" target="_blank">GFS</a></strong> &#8212; большая распределенная файловая система, способная хранить и обрабатывать огромные объемы информации</li>
<li><em>Зачем строить что-либо самим вместо того, чтобы просто взять это с полки?</em> Они контролируют абсолютно всю систему и именно эта платформа отличает их от всех остальных. Она предоставляет:
<dl>
<dd>– высокую надежность дата центров</dd>
<dt>
</dt>
<dd>– масштабируемость до тысяч сетевых узлов</dd>
<dt>
</dt>
<dd>– высокую пропускную способность операций чтения и записи</dd>
<dt>
</dt>
<dd>– поддержку больших блоков данных, размер которых может измеряться в гигабайтах</dd>
<dt>
</dt>
<dd>– эффективное распределение операций между датацентрами для избежания возникновения &#171;узких мест&#187; в системе</dd>
</dl>
</li>
<li>В системе существуют мастер-сервера и сервера, собственно хранящие информацию:
<dl>
<dt>
</dt>
<dd>– Мастер-сервера хранят метаданные для всех файлов. Сами данные хранятся блоками по 64 мегабайта на остальных серверах. Клиенты могут выполнять операции с метаданными на мастер-серверах, чтобы узнать на каком именно сервере расположены необходимые данные.</dd>
<dt>
</dt>
<dd>– Для обеспечения надежности один и тот же блок данных хранится в трех экземплярах на разных серверах, что обеспечивает избыточность на случай сбоев в работе какого-либо сервера.</dd>
<dt>
</dt>
<dd>– Новые приложения могут пользоваться как существующими кластерами, так и новыми, созданными специально для них.</dd>
<dt>
</dt>
<dd>– Ключ успеха заключается в том, чтобы быть уверенными в том, что у людей есть достаточно вариантов выбора для реализации их приложений. <strong><a href="/tag/gfs" target="_blank">GFS</a></strong> может быть настроена для удовлетворения нужд любого конкретного приложения.</dd>
</dl>
</li>
</ul>
<h4>Работаем с данными при помощи MapReduce</h4>
<ul>
<li>Теперь, когда у нас есть отличная система хранения, что же делать с такими объемами данных? Допустим, у нас есть много терабайт данных, равномерно распределенных между 1000 компьютерами. Коммерческие базы данных не могут эффективно масштабироваться до такого уровня, именно в такой ситуации в дело вступает технология <strong><a href="/tag/mapreduce" target="_blank">MapReduce</a></strong>.</li>
<li><strong><a href="/tag/mapreduce" target="_blank">MapReduce</a></strong> является программной моделью и соответствующей реализацией обработки и генерации больших наборов данных. Пользователи могут задавать функцию, обрабатывающую пары ключ/значение для генерации промежуточных аналогичных пар, и сокращающую функцию, которая объединяет все промежуточные значения, соответствующие одному и тому же ключу. Многие реальные задачи могут быть выражены с помощью этой модели. Программы, написанные в таком функциональном стиле автоматически распараллеливаются и адаптируются для выполнения на обширных кластерах. Система берет на себя детали разбиения входных данных на части, составления расписания выполнения программ на различных компьютерах, управления ошибками, и организации необходимой коммуникации между компьютерами. Это позволяет программистам, не обладающим опытом работы с параллельными и распределенными системами, легко использовать все ресурсы больших распределенных систем.</li>
<li>Зачем использовать <strong><a href="/tag/mapreduce" target="_blank">MapReduce</a></strong>?
<dl>
<dd>– Отличный способ распределения задач между множеством компьютеров</dd>
<dd>– Обработка сбоев в работе</dd>
<dd>– Работа с различными типами смежных приложений, таких как поиск или реклама. Возможно предварительное вычисление и обработка данных, подсчет количества слов, сортировка терабайт данных и так далее</dd>
<dd>– Вычисления автоматически приближаются к источнику ввода-вывода</dd>
</dl>
</li>
<li><strong><a href="/tag/mapreduce" target="_blank">MapReduce</a></strong> использует три типа серверов:
<dl>
<dd>– <em>Master:</em> назначают задания остальным типам серверов, а также следят за процессом их выполнения</dd>
<dd>– <em>Map:</em> принимают входные данные от пользователей и обрабатывают их, результаты записываются в промежуточные файлы</dd>
<dd>– <em>Reduce:</em> принимают промежуточные файлы от Map-серверов и сокращают их указанным выше способом</dd>
</dl>
</li>
<li>Например, мы хотим посчитать количество слов на всех страницах. Для этого нам необходимо передать все страницы, хранимые в <strong>GFS</strong>, на обработку в <strong>MapReduce</strong>. Этот процесс будет происходить на тысячах машин одновременно с полной координацией действий, в соответствии  с автоматически составленным расписанием выполняемых работ, обработкой потенциальных ошибок, и передачей данных выполняемыми автоматически.
<dl>
<dd>– Последовательность выполняемых действий выглядела бы следующим образом: <em>GFS → Map → перемешивание → Reduce → запись результатов обратно в GFS</em></dd>
<dd>– Технология <strong>MapReduce</strong> состоит из двух компонентов: соответственно <em>map</em> и <em>reduce</em>. Map отображает один набор данных в другой, создавая тем самым пары ключ/значение, которпыми в нашем случае являются слова и их количества.</dd>
<dd>– В процессе перемешивания происходит аггрегирование типов ключей.</dd>
<dd>– Reduction в нашем случае просто суммирует все результаты и возвращает финальный результат.</dd>
</dl>
</li>
<li>В процессе индексирования <a href="/tag/google" target="_blank">Google</a> подвергает поток данных обработке около 20 разных механизмов сокращения. Сначала идет работа над всеми записями и аггрегированными ключами, после чего результат передается следующему механизму и второй механизм уже работает с результатами работы первого, и так далее.</li>
<li>Программы могут быть очень маленькими, всего лишь от 20 до 50 строк кода.</li>
<li>Единственной проблемой могут быть &#171;отстающие компьютеры&#187;. Если один компьютер работает существенно медленнее, чем все остальные, это будет задерживать работу всей системы в целом.</li>
<li>Транспортировка данных между серверами происходит в сжатом виде. Идея заключается в том, что ограничивающим фактором является пропускная способность канала и ввода-вывода, что делает резонным потратить часть процессорного времени  на компрессию и декомпрессию данных.</li>
</ul>
<h4>Хранение структурированных данных в BigTable</h4>
<ul>
<li><strong>BigTable</strong> является крупномасштабной, устойчивой к потенциальным ошибкам, самоуправляемой системой, которая может включать в себя терабайты памяти и петабайты данных, а также управлять миллионами операций чтения и записи в секунду.</li>
<li><strong>BigTable</strong> представляет собой распределенный механизм хэширования, построенный поверх <strong><a href="/tag/gfs" target="_blank">GFS</a></strong>, а вовсе не реляционную базу данных и, как следствие, не поддерживает <a href="/tag/sql" target="_blank">SQL</a>-запросы и операции типа Join.</li>
<li>Она предоставляет механизм просмотра данных для получения доступа к структурированным данным по имеющемуся ключу. <strong><a href="/tag/gfs" target="_blank">GFS</a></strong> хранит данные не поддающиеся пониманию, хотя многим приложениям необходимы структурированные данные.</li>
<li>Коммерческие базы данных попросту не могут масштабироваться до такого уровня и, соответственно, не могут работать с тысячами машин одновременно.</li>
<li>С помощью контролирования своих низкоуровневых систем хранения данных, <a href="/tag/google" target="_blank">Google</a> получает больше возможностей по управлению и модификации их системой. Например, если им понадобится функция, упрощающая координацию работы между датацентрами, они просто могут написать ее и внедрить в систему.</li>
<li>Подключение и отключение компьютеров к функционирующей системе никак не мешает ей просто работать.</li>
<li>Каждый блок данных хранится в ячейке, доступ к которой может быть предоставлен как по ключу строки или столбца, так и по временной метке.</li>
<li>Каждая строка может храниться в одной или нескольких таблицах. Таблицы реализуются в виде последовательности блоков по 64 килобайта, организованных в формате данных под названием <strong>SSTable</strong>.</li>
<li>В <strong><a href="/tag/bigtable" target="_blank">BigTable</a></strong> тоже используется три типа серверов:
<dl>
<dd>– <em>Master:</em> распределяют таблицы по Tablet-серверам, а также следят за расположением таблиц и перераспределяют задания в случае необходимости.</dd>
<dd>– <em>Tablet:</em> обрабатывают запросы чтения/записи для таблиц. Они раделяют таблицы, когда те превышают лимит размера (обычно 100-200 мегабайт). Когда такой сервер прекращает функционирование по каким-либо причинам, 100 других серверов берут на себя по одной таблице и система продолжает работать как-будто ничего не произошло.</dd>
<dd>– <em>Lock:</em> формируют распределенный сервис ограничения одновременного доступа. Операции открытия таблицы для записи, анализа Master-сервером или проверки доступа должны быть взаимноисключающими.</dd>
</dl>
</li>
<li>Локальная группировка может быть использована для физического хранения связанных данных вместе, чтобы обеспечить лучшую локализацию ссылок на данные.</li>
<li>Таблицы по возможности кэшируются в оперативной памяти серверов.</li>
</ul>
<h3>Оборудование</h3>
<ul>
<li>Как эффективно организовать большую группу компьютеров с точки зрения издержек и производительности?</li>
<li>Используется самое обыкновенное ультра-дешевое оборудование и поверх него строится программное обеспечение, способное спокойно пережить смерть любой части оборудования.</li>
<li>Тысячекратный рост вычислительной мощности может быть достигнут с издержками в 33 раза меньшими, если воспользоваться толерантной к сбоям инфраструктурой, по сравнению с инфраструктурой, построенной на высоконадежных компонентах. Надежность строится поверх ненадежных компонентов.</li>
<li><a href="/tag/linux" target="_blank">Linux</a>, домашнее размещение серверов, материнске платы предназначенные для персональных компьютеров, дешевые средства хранения данных.</li>
<li>Цена за каждый ватт энергии в расчете на производительность не становится меньше, что ведет к большим проблемам связанным с энергообеспечением и охлаждением.</li>
<li>Использование совместного размещения в своих и арендуемых датацентрах.</li>
</ul>
<h3>Разное</h3>
<ul>
<li>Быстрый выпуск изменений более предпочтителен, чем ожидание.</li>
<li>Библиотеки &#8212; превалирующий метод построения программ.</li>
<li>Некоторые приложения предоставляются в виде сервисов.</li>
<li>Инфраструктура управляет определением версий приложений таким образом, что они могут выпускать новые продукты, не боясь сломать работу какого-либо компонента системы.</li>
</ul>
<h3>Пути развития</h3>
<ul>
<li>Поддержка географически распределенных кластеров.</li>
<li>Создание единого глобального пространства имен для всех данных. На данный момент данные распределены по кластерам.</li>
<li>Более автоматизированные передача и обработка данных</li>
<li>Решение вопросов, связанных с поддержанием работоспособности сервисов даже в тех случаях, когда целый кластер отключается от системы в связи с техническими работами или каким-либо сбоем в работе.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li><strong>Инфраструктура может быть конкурентным преимуществом.</strong> Это определенно так для Google. Они могут выпускать новые интернет сервисы быстрее, с меньшими издержками, на таком уровне, что мало кто сможет составить им конкуренцию. Подход многих компаний сильно отличается от подхода <a href="/tag/google" target="_blank">Google</a>, эти компании рассматривают инфраструктуру как статью расходов, они обычно используют совсем другие технологии и совсем не задумываются о планировании и организации своей системы. Google позиционирует себя как компанию по построению систем, что является очень современным подходом к разработке программного обеспечения.</li>
<li><strong>Охватывание нескольких дата центров до сих пор является нерешенной проблемой.</strong> Большинство сайтов базируется в одном или двух дата центрах. Полное распределение сайта между несколькими датацентрами является хитрой задачей.</li>
<li>Взгляните на <em><a href="http://hadoop.apache.org/core/" target="_blank" rel="nofollow">Hadoop</a></em>, если у Вас нет времени на собственноручное построение всей архитектуры с нуля. <em>Hadoop</em> явялется opensource воплощением в жизнь многих идей здесь представленных.</li>
<li>Часто недооцениваемым преимуществом платформенного подхода является тот факт, что даже неопытные разработчики могут быстро и качественно реализовывать трудоемкие приложения на базе платформы. Но если бы каждый проект требовал одинаково распределенной архитектуры, то это создало бы много проблем, так как люди, которые понимают как это делается, являются достаточно большой редкостью.</li>
<li><strong>Совместная деятельность не всегда является таким уж плохим занятием.</strong> Если все части системы работают взаимосвязанно, то улучшение в одной из них сразу и абсолютно прозрачно отразится положительным образом и на остальных компонентах системы. В противном случае такой эффект наблюдаться не будет.</li>
<li>Построение самоуправляемых систем позволяет более легко перераспределять ресурсы между серверами, расширять систему, отключать некоторые компьютеры и элегантно проводить обновления.</li>
<li>Производить длительные операции стоит параллельно.</li>
<li>Всему, что было сделано Google, предшествовало искусство, а не только крупномасштабное развертывание системы.</li>
<li>Учитывайте возможность <strong>компрессии данных</strong>, она является очень неплохим решением, если остается лишнее процессорное время, но присутствует нехватка пропускной способности.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-google/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
	</channel>
</rss>

