Tranquility writes data to Druid

demand

  • Start a stand-alone version of Druid
  • Write some data directly through a client, not through other kafka or batch import

Researched plan

Druid stand-alone configuration

Tranquility

  • Ctrl+C kill Druid

  • Download Tranquility and do it in the root directory of 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
  • Modify the quickstart/tutorial/conf/tutorial-cluster.conf file and remove the # before the tranquility-server line
# Uncomment to use Tranquility Server
!p95 tranquility-server tranquility/bin/tranquility server -configFile quickstart/tutorial/conf/tranquility/wikipedia-server.json -Ddruid.extensions.loadList=[]
  • Start Druid + Tranquility
bin/supervise -c quickstart/tutorial/conf/tutorial-cluster.conf

Sample maven project

  • Project code: https://github.com/qiaojialin/TranquilityExample

  • Create a new resources folder

  • Create a new file in it 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"
      }
    }
    
    
  • Sample code

    	
    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();
        }
      }
    }
    
    
  • Add dependency (this step is the worst)

    • Ensure that the scala of jackson and tranquility are both 2.11
    • jackson-2.9.2 is ok, 2.9.8 is not, other versions have not been tried
    <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>
    
  • The above was tested in a clean project. In another project of mine, I don't know which conflict with it. I can't find a way again, so I added three more dependencies.

    <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>
    

Other pits

Dependence is not the worst. I was able to write data yesterday, but I can’t write it today. Various MessageDroppedExceptions are said to be a time window problem on the Internet, and it is useless to adjust the date.

The biggest pitfall is that Tranquility only supports data writing for a period of time, which is very uncomfortable, so I gave up and prepared to switch to Kafka Indexing service.

Guess you like

Origin blog.csdn.net/qiaojialin/article/details/88663054