AWS Lambda + Tinkerpop/Gremlin + TitanDB для EC2 + AWS DynamoDB в облаке

Я пытаюсь выполнить следующий поток:

  1. пользователь нажимает на AWS Gateway (REST),

  2. запускает AWS Lambda,

  3. который использует Tinkerpop/Gremlin подключается к

  4. TitanDB на EC2, который использует

  5. AWS DynamoDB в облаке (не на EC2) в качестве бэкэнда.

Прямо сейчас мне удалось создать полностью рабочий экземпляр TitanDB на EC2, который хранит данные в DynamoDB в облаке. Я также могу подключиться из AWS Lambda к EC2 через Tinkerpop/Gremlin, НО только так:

Cluster.build()
       .addContactPoint("10.x.x.x") // ip of EC2
       .create()
       .connect()
       .submit("here I type my query as string and it will work");

И это работает, однако я настоятельно предпочитаю использовать "Criteria API" (GremlinPipeline) вместо простого языка Gremlin. Другими словами, мне нужен ORM или что-то в этом роде. Я знаю, что Tinkerpop включает это. Я понял, что мне нужен объект класса Graph. Вот что я попробовал:

Graph graph = TitanFactory
            .build()
            .set("storage.hostname", "10.x.x.x")
            .set("storage.backend", "com.amazon.titan.diskstorage.dynamodb.DynamoDBStoreManager")
            .set("storage.dynamodb.client.credentials.class-name", "com.amazonaws.auth.DefaultAWSCredentialsProviderChain")
            .set("storage.dynamodb.client.credentials.constructor-args", "")
            .set("storage.dynamodb.client.endpoint", "https://dynamodb.ap-southeast-2.amazonaws.com")
            .open();

Тем не менее он выдает "Не удалось найти класс реализации: com.amazon.titan.diskstorage.dynamodb.DynamoDBStoreManager". Конечно, компьютер работает правильно, так как IntelliJ IDEA также не может его найти.

Мои зависимости:

//
// aws
compile 'com.amazonaws:aws-lambda-java-core:+'
compile 'com.amazonaws:aws-lambda-java-events:+'
compile 'com.amazonaws:aws-lambda-java-log4j:+'
compile 'com.amazonaws:aws-java-sdk-dynamodb:1.10.5.1'
compile 'com.amazonaws:aws-java-sdk-ec2:+'
//
// database
// titan 1.0.0 is compatible with gremlin 3.0.2-incubating, but not yet with 3.2.0
compile 'com.thinkaurelius.titan:titan-core:1.0.0'
compile 'org.apache.tinkerpop:gremlin-core:3.0.2-incubating'
compile 'org.apache.tinkerpop:gremlin-driver:3.0.2-incubating'

Какова моя цель: иметь полностью работающий объект Graph

В чем моя проблема: у меня нет класса DynamoDBStoreManager, и я не знаю, какую зависимость я должен добавить.

Мой дополнительный вопрос: почему подключение через класс Cluster требует только IP и работает, а TitanFactory требует свойств, подобных тем, которые я использовал на gremlin-server в EC2? Я не хочу создавать второй сервер, я просто хочу подключиться к нему как клиент и получить объект Graph.

РЕДАКТИРОВАТЬ: После добавления распознавателя, он строит, в выводе я получаю несколько:

13689 [TitanID (0) (4) [0]] WARN com.thinkaurelius.titan.diskstorage.idmanagement.ConsistentKeyIDAuthority - исключение временного хранилища при получении блока идентификатора - повторная попытка в PT2.4S: com.thinkaurelius.titan.diskstorage.TeoraryBackendception Написал заявку для блока идентификаторов [1, 51) в PT0.342S => слишком медленно, порог: PT0.3S

и выполнение зависает в методе open(), поэтому не позволяет мне выполнять какие-либо запросы.

1 ответ

Решение

Для DynamoDBStoreManager класс, вам понадобится эта зависимость:

compile 'com.amazonaws:dynamodb-titan100-storage-backend:1.0.0'

Затем для проблемы DynamoDBLocal, попробуйте добавить этот решатель:

resolvers += "AWS DynamoDB Local Release Repository" at "http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release"

Мне не совсем понятно, что это значит - "Criteria API" вместо простого языка Гремлин. Я предполагаю, что вы имеете в виду, что вы хотите взаимодействовать с графиком, используя Java, а не передавать Gremlin в виде строки на работающий сервер Titan/Gremlin. Если это так, то вам вообще не нужно запускать сервер Titan/Gremlin (шаг 4 выше). Напишите программу AWS Lambda (шаг 2-3 выше), которая создает прямое соединение с клиентом Titan через TitanFactoryгде все свойства конфигурации Titan предназначены для вашего экземпляра DynamoDB (шаг 5 выше).

Другие вопросы по тегам