Статьи

Ползать по Сети с Кассандрой и Натчем

Итак, вы хотите собрать огромное количество данных из Интернета? Какой механизм хранения лучше, чем Кассандра? Это легко сделать с Nutch.

Часто люди используют Hbase за Nutch. Это работает, но не может быть идеальным решением, если вы являетесь (или хотите быть) магазином Cassandra. К счастью, Nutch 2+ использует уровень абстракции Gora для доступа к своему механизму хранения данных. Гора поддерживает Кассандру. Таким образом, с несколькими изменениями в конфигурации вы можете использовать Nutch для сбора контента непосредственно в Cassandra.

Начнем с Nutch 2.1 … Мне нравится переходить непосредственно от источника:

1
2
3
$ git clone https://github.com/apache/nutch.git -b 2.1
...
$ ant

После сборки у вас будет каталог nutch / runtime / local, в котором находятся исполняемые файлы. Теперь давайте настроим Nutch для Cassandra.

Сначала нам нужно добавить агента в Nutch, добавив следующий элемент xml в nutch / conf / nutch-site.xml:

1
2
3
4
<property>
 <name>http.agent.name</name>
 <value>My Nutch Spider</value>
</property>

Далее нам нужно сказать Натчу использовать Гору Кассандру в качестве механизма его сохранения. Для этого мы добавим следующий элемент в файл nutch / conf / nutch-site.xml:

1
2
3
4
5
<property>
 <name>storage.data.store.class</name>
 <value>org.apache.gora.cassandra.store.CassandraStore</value>
 <description>Default class for storing data</description>
</property>

Далее нам нужно рассказать Горе о Кассандре. Отредактируйте файл nutch / conf / gora.properties. Закомментируйте записи SQL и раскомментируйте следующую строку:

1
gora.cassandrastore.servers=localhost:9160

Кроме того, нам нужно добавить зависимость для Гора-Кассандра. Отредактируйте файл ivy / ivy.xml и раскомментируйте следующую строку:

1
<dependency org="org.apache.gora" name="gora-cassandra" rev="0.2" conf="*->default" />

Наконец, мы хотим заново сгенерировать среду выполнения с новой конфигурацией и дополнительной зависимостью. Сделайте это с помощью следующей команды ant:

1
ant runtime

Теперь мы готовы к запуску!

Создайте каталог с именем «urls», с файлом с именем seed.txt, который содержит следующую строку:

1
http://nutch.apache.org/

Затем обновите URL-адрес регулярного выражения в файле conf / regex-urlfilter.txt:

1
+^http://([a-z0-9]*\.)*nutch.apache.org/

Теперь ползи!

1
bin/nutch crawl urls -dir crawl -depth 3 -topN 5

Это будет собирать веб-страницы для Кассандры !!

Давайте посмотрим на модель данных на секунду …

Вы заметите, что было создано новое пространство ключей: веб-страница. Это пространство клавиш содержит три таблицы: f, p и sc.

1
2
3
4
5
6
7
[cqlsh 2.3.0 | Cassandra 1.2.1 | CQL spec 3.0.0 | Thrift protocol 19.35.0]
Use HELP for help.
cqlsh> describe keyspaces;
system  webpage  druid  system_auth  system_traces
cqlsh> use webpage;
cqlsh:webpage> describe tables;
f  p  sc

Каждая из этих таблиц является хранилищем значений ключей. Чтобы понять, что находится в каждом из них, взгляните на файл nutch / conf / gora-cassandra-mapping.xml. Я включил фрагмент ниже:

1
2
3
4
5
6
<field name="baseUrl" family="f" qualifier="bas"/>
<field name="status" family="f" qualifier="st"/>
<field name="prevFetchTime" family="f" qualifier="pts"/>
<field name="fetchTime" family="f" qualifier="ts"/>
<field name="fetchInterval" family="f" qualifier="fi"/>
<field name="retriesSinceFetch" family="f" qualifier="rsf"/>

Из этого файла сопоставления вы можете увидеть, что он помещает в таблицу, но, к сожалению, схема на самом деле не способствует исследованию из приглашения CQL. (Я думаю, что здесь есть место для улучшения) Было бы неплохо, если бы существовала схема, дружественная к CQL, но этого может быть трудно достичь с помощью gora. Увы, это, вероятно, цена абстракции.

Таким образом, самое простое — использовать инструмент для извлечения данных. Вы можете извлечь данные с помощью следующей команды:

1
runtime/local/bin/nutch readdb -dump data -content

Когда это завершится, перейдите в каталог данных и вы увидите выходные данные задания Hadoop, которое использовалось для извлечения данных. Затем мы можем использовать это для анализа.

Я действительно хотел бы, чтобы Nutch использовал лучшую схему для C *. Было бы замечательно, если бы эти данные были немедленно использованы изнутри C *. Если кто-то сделает это улучшение, пожалуйста, дайте мне знать!