demanda
- Inicie una versión independiente de Druid
- Escriba algunos datos directamente a través de un cliente, no a través de otro kafka o importación por lotes
Plan investigado
- Inicio Druida + tranquilidad
- Inicio rápido de Druid + Tranquility: http://druid.io/docs/latest/tutorials/tutorial-tranquility.html
- Almacén de tranquilidad: https://github.com/druid-io/tranquility
- Escribe datos en Druid a través de la tranquilidad
- Código de muestra: https://github.com/druid-io/tranquility/blob/master/core/src/test/java/com/metamx/tranquility/example/JavaExample.java
- archivo de configuración del esquema de datos
- druida: http://druid.io/docs/0.13.0-incubating/ingestion/ingestion-spec.html
- tranquilidad: https://github.com/druid-io/tranquility/blob/master/docs/configuration.md
- La configuración de Tranquility encapsula algunos elementos de configuración para druida fuera de druida
- Resuelva parcialmente el problema de la dependencia de la tranquilidad: https://groups.google.com/forum/#!topic/druid-user/5afMWd17sbU
Configuración independiente de druida
-
Inicio rápido del sitio web oficial
-
Descarga Druid
-
Descarga Zookeeper y cámbiale el nombre a zk y colócalo en el directorio raíz de Druid
curl https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz -o zookeeper-3.4.11.tar.gz tar -xzf zookeeper-3.4.11.tar.gz mv zookeeper-3.4.11 zk
-
Iniciar druida
bin/supervise -c quickstart/tutorial/conf/tutorial-cluster.conf
Tranquilidad
-
Ctrl + C matar a Druid
-
Descarga Tranquility y hazlo en el directorio raíz de Druid
curl http://static.druid.io/tranquility/releases/tranquility-distribution-0.8.2.tgz -o tranquility-distribution-0.8.2.tgz
tar -xzf tranquility-distribution-0.8.2.tgz
mv tranquility-distribution-0.8.2 tranquility
- Modifique el archivo quickstart / tutorial / conf / tutorial-cluster.conf y elimine el # antes de la línea tranquility-server
# Uncomment to use Tranquility Server
!p95 tranquility-server tranquility/bin/tranquility server -configFile quickstart/tutorial/conf/tranquility/wikipedia-server.json -Ddruid.extensions.loadList=[]
- Inicio Druida + Tranquilidad
bin/supervise -c quickstart/tutorial/conf/tutorial-cluster.conf
Ejemplo de proyecto maven
-
Código del proyecto: https://github.com/qiaojialin/TranquilityExample
-
Crea una nueva carpeta de recursos
-
Crea un nuevo archivo en él
example.json
:{ "dataSources": [ { "spec": { "dataSchema": { "dataSource": "wikipedia", "parser": { "type": "string", "parseSpec": { "format": "json", "timestampSpec": { "column": "timestamp", "format": "auto" }, "dimensionsSpec": { "dimensions": [ "page", "language", "user", "unpatrolled", "newPage", "robot", "anonymous", "namespace", "continent", "country", "region", "city" ], "dimensionExclusions": [], "spatialDimensions": [] } } }, "metricsSpec": [ { "type": "count", "name": "count" }, { "type": "doubleSum", "name": "added", "fieldName": "added" }, { "type": "doubleSum", "name": "deleted", "fieldName": "deleted" }, { "type": "doubleSum", "name": "delta", "fieldName": "delta" } ], "granularitySpec": { "type": "uniform", "segmentGranularity": "DAY", "queryGranularity": "NONE" } }, "tuningConfig": { "type": "realtime", "maxRowsInMemory": 100000, "intermediatePersistPeriod": "PT10m", "windowPeriod": "PT10M" } } } ], "properties": { "zookeeper.connect": "localhost:2181", "druid.selectors.indexing.serviceName": "druid/overlord", "druid.discovery.curator.path": "/druid/discovery", "druidBeam.taskLocator": "overlord", "druidBeam.overlordPollPeriod": "PT5S" } }
-
Código de muestra
import com.google.common.collect.ImmutableMap; import com.metamx.common.logger.Logger; import com.metamx.tranquility.config.DataSourceConfig; import com.metamx.tranquility.config.PropertiesBasedConfig; import com.metamx.tranquility.config.TranquilityConfig; import com.metamx.tranquility.druid.DruidBeams; import com.metamx.tranquility.tranquilizer.MessageDroppedException; import com.metamx.tranquility.tranquilizer.Tranquilizer; import com.twitter.util.FutureEventListener; import org.joda.time.DateTime; import scala.runtime.BoxedUnit; import java.io.InputStream; import java.util.Map; public class JavaExample { private static final Logger log = new Logger(JavaExample.class); public static void main(String[] args) { // Read config from "example.json" on the classpath. final InputStream configStream = JavaExample.class.getClassLoader().getResourceAsStream("example.json"); final TranquilityConfig<PropertiesBasedConfig> config = TranquilityConfig.read(configStream); final DataSourceConfig<PropertiesBasedConfig> wikipediaConfig = config.getDataSource("wikipedia"); final Tranquilizer<Map<String, Object>> sender = DruidBeams.fromConfig(wikipediaConfig) .buildTranquilizer(wikipediaConfig.tranquilizerBuilder()); sender.start(); try { // Send 10000 objects for (int i = 0; i < 10000; i++) { // Build a sample event to send; make sure we use a current date final Map<String, Object> obj = ImmutableMap.<String, Object>of( "timestamp", new DateTime().toString(), "page", "foo", "added", i ); // Asynchronously send event to Druid: sender.send(obj).addEventListener( new FutureEventListener<BoxedUnit>() { @Override public void onSuccess(BoxedUnit value) { log.info("Sent message: %s", obj); } @Override public void onFailure(Throwable e) { if (e instanceof MessageDroppedException) { log.warn(e, "Dropped message: %s", obj); } else { log.error(e, "Failed to send message: %s", obj); } } } ); } } finally { sender.flush(); sender.stop(); } } }
-
Agregar dependencia (este paso es el peor)
- Asegúrese de que la scala de jackson y la tranquilidad sean 2.11
- jackson-2.9.2 está bien, 2.9.8 no, no se han probado otras versiones
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-scala_2.11</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.metamx</groupId> <artifactId>java-util</artifactId> <version>0.27.9</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>io.druid</groupId> <artifactId>tranquility-core_2.11</artifactId> <version>0.8.2</version> </dependency>
-
Lo anterior se probó en un proyecto limpio. En otro proyecto mío, no sé qué conflicto con él. No puedo encontrar una manera de nuevo, así que agregué tres dependencias más.
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-scala_2.11</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.2</version> </dependency>
Otros pozos
La dependencia no es lo peor. Pude escribir datos ayer, pero no puedo escribirlos hoy. Se dice que varias MessageDroppedExceptions son un problema de ventana de tiempo en Internet, y es inútil ajustar la fecha.
El mayor escollo es que Tranquility solo admite la escritura de datos durante un período de tiempo, lo cual es muy incómodo, así que me di por vencido y me preparé para cambiar al servicio Kafka Indexing.