Статьи

Couchbase: создайте большой набор данных, используя Twitter и Java

Простой способ создать большой набор данных при воспроизведении / демонстрации Couchbase — или любого другого движка NoSQL — это вставить канал Twitter в вашу базу данных.

Для этого небольшого приложения я использую:

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

Источники этого проекта доступны в моем репозитории Github Twitter Injector для Couchbase, вы также можете скачать двоичную версию здесь и запустить приложение из командной строки, см. Раздел «Запуск приложения» . Не забудьте создать свои oAuth-ключи в Twitter (см. Следующий абзац)

Создать ключи oAuth

Первое, что нужно сделать, чтобы использовать API Twitter, — это создать набор ключей. Если вы хотите узнать больше обо всех этих ключах / токенах, взгляните на протокол oAuth: http://oauth.net/

1. Войдите в портал развития Twitter: https://dev.twitter.com/.

2. Создайте новое приложение

Нажмите на ссылку «Создать приложение» или перейдите в «Меню пользователя> Мои приложения> Создать новое приложение».

3. Введите информацию о приложении

4. Нажмите кнопку «Создать приложение для Twitter».

Настройки OAuth вашего приложения теперь доступны:

5- Перейдите на страницу настроек приложения и нажмите кнопку «Создать мой маркер доступа».

Теперь у вас есть вся необходимая информация для создания вашего приложения:

  • Ключ потребителя
  • Потребительский секрет
  • Токен доступа
  • Секрет токена доступа

Эти ключи будут использоваться в файле twitter4j.properties при запуске приложения Java из командной строки, см.

Создать приложение Java

Следующий код является основным кодом приложения:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.couchbase.demo;
 
import com.couchbase.client.CouchbaseClient;
import org.json.JSONException;
import org.json.JSONObject;
import twitter4j.*;
import twitter4j.json.DataObjectFactory;
 
import java.io.InputStream;
import java.net.URI;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
 
public class TwitterInjector {
 
    public final static String COUCHBASE_URIS = "couchbase.uri.list";
    public final static String COUCHBASE_BUCKET = "couchbase.bucket";
    public final static String COUCHBASE_PASSWORD = "couchbase.password";
 
    private List<URI> couchbaseServerUris = new ArrayList<URI>();
    private String couchbaseBucket = "default";
    private String couchbasePassword = "";
 
    public static void main(String[] args) {
        TwitterInjector twitterInjector = new TwitterInjector();
        twitterInjector.setUp();
        twitterInjector.injectTweets();
    }
 
    private void setUp() {
        try {
            Properties prop = new Properties();
            InputStream in = TwitterInjector.class.getClassLoader().getResourceAsStream("twitter4j.properties");
            if (in == null) {
                throw new Exception("File twitter4j.properties not found");
            }
            prop.load(in);
            in.close();
 
            if (prop.containsKey(COUCHBASE_URIS)) {
                String[] uriStrings =  prop.getProperty(COUCHBASE_URIS).split(",");
                for (int i=0; i<uriStrings.length; i++) {
                    couchbaseServerUris.add( new URI( uriStrings[i] ) );
                }
 
            } else {
                couchbaseServerUris.add( new URI("http://127.0.0.1:8091/pools") );
            }
 
            if (prop.containsKey(COUCHBASE_BUCKET)) {
                couchbaseBucket = prop.getProperty(COUCHBASE_BUCKET);
            }
 
            if (prop.containsKey(COUCHBASE_PASSWORD)) {
                couchbasePassword = prop.getProperty(COUCHBASE_PASSWORD);
 
            }
 
        } catch (Exception e) {
            System.out.println( e.getMessage() );
            System.exit(0);
        }
 
    }
 
    private void injectTweets() {
        TwitterStream twitterStream = new TwitterStreamFactory().getInstance();
        try {
            final CouchbaseClient cbClient = new CouchbaseClient( couchbaseServerUris , couchbaseBucket , couchbasePassword );
            System.out.println("Send data to : "+  couchbaseServerUris +"/"+ couchbaseBucket );
            StatusListener listener = new StatusListener() {
 
                @Override
                public void onStatus(Status status) {
                    String twitterMessage = DataObjectFactory.getRawJSON(status);
 
                    // extract the id_str from the JSON document
                    // see : https://dev.twitter.com/docs/twitter-ids-json-and-snowflake
                    try {
                        JSONObject statusAsJson = new JSONObject(twitterMessage);
                        String idStr = statusAsJson.getString("id_str");
                        cbClient.add( idStr ,0, twitterMessage  );
                        System.out.print(".");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
 
                @Override
                public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
                }
 
                @Override
                public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
                }
 
                @Override
                public void onScrubGeo(long userId, long upToStatusId) {
                }
 
                @Override
                public void onException(Exception ex) {
                    ex.printStackTrace();
                }
            };
 
        twitterStream.addListener(listener);
        twitterStream.sample();
 
        } catch (Exception e) {
            e.printStackTrace(); 
        }
    }
 
}

Некоторые основные объяснения:

  • Метод setUp() просто читает файл twitter4j.properties из пути к классам для построения строки соединения Couchbase.
  • InjectTweets открывает соединение Couchbase -line 76- и вызывает API-интерфейс TwitterStream.
  • Listener создан и получит все onStatus (статус статуса) из Twitter. Самый важный метод — это onStatus (), который получает сообщение и сохраняет его в Couchbase.
  • Одна интересная вещь: поскольку Couchbase является базой данных JSON Document, вы можете просто взять строку JSON и сохранить ее напрямую.
    cbClient.add(idStr,0 ,twitterMessage);

упаковка

Чтобы иметь возможность выполнить приложение непосредственно из файла Jar, я использую плагин сборки со следующей информацией из
pom.xml:

01
02
03
04
05
06
07
08
09
10
...
<archive>
  <manifest>
   <mainclass>com.couchbase.demo.TwitterInjector</mainclass>
  </manifest>
  <manifestentries>
   <class-path>.</class-path>
  </manifestentries>
</archive>
...

Немного информации:

  • Запись mainClass позволяет вам указать, какой класс выполнять при запуске команды java -jar.
  • Запись Class-Path позволяет вам установить текущий каталог как часть пути к классам, где программа будет искать файл twitter4j.properties.
  • Файл сборки также настроен на включение всех зависимостей (Twitter4J, клиентский пакет Couchbase,…)

Если вы хотите собрать его из исходников, просто запустите:

1
mvn clean package

Это создаст следующий файл Jar. /target/CouchbaseTwitterInjector.jar

Запустите приложение Java

Перед запуском приложения вы должны создать файл twitter4j.properties со следующей информацией:

01
02
03
04
05
06
07
08
09
10
twitter4j.jsonStoreEnabled=true
 
oauth.consumerKey=[YOUR CONSUMER KEY]
oauth.consumerSecret=[YOUR CONSUMER SECRET KEY]
oauth.accessToken=[YOUR ACCESS TOKEN]
oauth.accessTokenSecret=[YOUR ACCESS TOKEN SECRET]
 
couchbase.uri.list=http://127.0.0.1:8091/pools
couchbase.bucket=default
couchbase.password=

Сохраните файл свойств и запустите из того же места:

1
jar -jar [path-to-jar]/CouchbaseTwitterInjector.jar

Это добавит твиты в ваш сервер Couchbase. Наслаждайтесь !

Ссылка: Couchbase: создайте большой набор данных с использованием Twitter и Java от нашего партнера по JCG Тугдуала Граля в блоге Tug’s Blog .