From c59dc385197c5cbfc4be5105e2b4bf9b41f6cf14 Mon Sep 17 00:00:00 2001 From: Akshay Sarma Date: Thu, 18 Feb 2021 11:50:46 -0800 Subject: [PATCH] 1.0 (#39) --- docs/apidocs/bullet-bql/1.0.0/index.html | 1 + docs/apidocs/bullet-bql/1.1.0/index.html | 1 + docs/apidocs/bullet-core/1.0.0/index.html | 1 + docs/apidocs/bullet-core/1.1.0/index.html | 1 + docs/apidocs/bullet-core/1.2.0/index.html | 1 + docs/apidocs/bullet-dsl/1.0.0/index.html | 1 + docs/apidocs/bullet-dsl/1.0.1/index.html | 1 + docs/apidocs/bullet-dsl/1.1.0/index.html | 1 + docs/apidocs/bullet-kafka/1.0.0/index.html | 1 + docs/apidocs/bullet-kafka/1.0.1/index.html | 1 + docs/apidocs/bullet-pulsar/1.0.0/index.html | 1 + docs/apidocs/bullet-record/1.0.0/index.html | 1 + docs/apidocs/bullet-record/1.1.0/index.html | 1 + docs/apidocs/bullet-service/1.0.0/index.html | 1 + docs/apidocs/bullet-spark/1.0.0/index.html | 1 + docs/apidocs/bullet-storm/1.0.0/index.html | 1 + docs/backend/dsl.md | 82 ++++---- docs/backend/ingestion.md | 1 + docs/backend/spark-setup.md | 21 +- docs/backend/storm-architecture.md | 44 ++-- docs/backend/storm-performance.md | 128 ++++++------ docs/backend/storm-setup.md | 20 +- docs/img/overallarch-2.png | Bin 152160 -> 0 bytes docs/img/overallarch-3.svg | 1 + docs/img/topology-3.png | Bin 202086 -> 0 bytes docs/img/topology-4.svg | 1 + docs/index.md | 60 +----- docs/quick-start/spark.md | 171 ++++++++-------- docs/quick-start/storm.md | 56 ++--- docs/releases.md | 21 +- docs/ui/setup.md | 70 ++++--- docs/ws/api-bql.md | 192 ------------------ docs/ws/api-json.md | 4 +- docs/ws/api.md | 147 ++++++++++++++ docs/ws/examples.md | 6 +- docs/ws/setup.md | 82 ++++++-- examples/Makefile | 2 +- examples/install-all-spark.sh | 72 +++---- examples/install-all-storm.sh | 27 +-- examples/spark/bin/launch.sh | 2 - examples/spark/pom.xml | 14 +- .../bullet_spark_kafka_settings.yaml | 3 +- examples/storm/pom.xml | 39 ++-- .../bullet/storm/examples/RandomSpout.java | 2 +- .../src/main/resources/bullet_settings.yaml | 3 +- examples/ui/env-settings.json | 9 +- .../web-service/example_query_config.yaml | 4 + mkdocs.yml | 8 +- 48 files changed, 680 insertions(+), 628 deletions(-) create mode 100644 docs/apidocs/bullet-bql/1.0.0/index.html create mode 100644 docs/apidocs/bullet-bql/1.1.0/index.html create mode 100644 docs/apidocs/bullet-core/1.0.0/index.html create mode 100644 docs/apidocs/bullet-core/1.1.0/index.html create mode 100644 docs/apidocs/bullet-core/1.2.0/index.html create mode 100644 docs/apidocs/bullet-dsl/1.0.0/index.html create mode 100644 docs/apidocs/bullet-dsl/1.0.1/index.html create mode 100644 docs/apidocs/bullet-dsl/1.1.0/index.html create mode 100644 docs/apidocs/bullet-kafka/1.0.0/index.html create mode 100644 docs/apidocs/bullet-kafka/1.0.1/index.html create mode 100644 docs/apidocs/bullet-pulsar/1.0.0/index.html create mode 100644 docs/apidocs/bullet-record/1.0.0/index.html create mode 100644 docs/apidocs/bullet-record/1.1.0/index.html create mode 100644 docs/apidocs/bullet-service/1.0.0/index.html create mode 100644 docs/apidocs/bullet-spark/1.0.0/index.html create mode 100644 docs/apidocs/bullet-storm/1.0.0/index.html delete mode 100644 docs/img/overallarch-2.png create mode 100644 docs/img/overallarch-3.svg delete mode 100755 docs/img/topology-3.png create mode 100644 docs/img/topology-4.svg delete mode 100644 docs/ws/api-bql.md create mode 100644 docs/ws/api.md delete mode 100644 examples/spark/bin/launch.sh create mode 100644 examples/web-service/example_query_config.yaml diff --git a/docs/apidocs/bullet-bql/1.0.0/index.html b/docs/apidocs/bullet-bql/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-bql/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-bql/1.1.0/index.html b/docs/apidocs/bullet-bql/1.1.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-bql/1.1.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-core/1.0.0/index.html b/docs/apidocs/bullet-core/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-core/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-core/1.1.0/index.html b/docs/apidocs/bullet-core/1.1.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-core/1.1.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-core/1.2.0/index.html b/docs/apidocs/bullet-core/1.2.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-core/1.2.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-dsl/1.0.0/index.html b/docs/apidocs/bullet-dsl/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-dsl/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-dsl/1.0.1/index.html b/docs/apidocs/bullet-dsl/1.0.1/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-dsl/1.0.1/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-dsl/1.1.0/index.html b/docs/apidocs/bullet-dsl/1.1.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-dsl/1.1.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-kafka/1.0.0/index.html b/docs/apidocs/bullet-kafka/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-kafka/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-kafka/1.0.1/index.html b/docs/apidocs/bullet-kafka/1.0.1/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-kafka/1.0.1/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-pulsar/1.0.0/index.html b/docs/apidocs/bullet-pulsar/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-pulsar/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-record/1.0.0/index.html b/docs/apidocs/bullet-record/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-record/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-record/1.1.0/index.html b/docs/apidocs/bullet-record/1.1.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-record/1.1.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-service/1.0.0/index.html b/docs/apidocs/bullet-service/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-service/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-spark/1.0.0/index.html b/docs/apidocs/bullet-spark/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-spark/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/apidocs/bullet-storm/1.0.0/index.html b/docs/apidocs/bullet-storm/1.0.0/index.html new file mode 100644 index 00000000..210ebe8a --- /dev/null +++ b/docs/apidocs/bullet-storm/1.0.0/index.html @@ -0,0 +1 @@ +Replace me with the real documentation. diff --git a/docs/backend/dsl.md b/docs/backend/dsl.md index c5b5a488..f583bf31 100644 --- a/docs/backend/dsl.md +++ b/docs/backend/dsl.md @@ -5,17 +5,14 @@ Bullet DSL is a configuration-based DSL that allows users to plug their data int To support this, Bullet DSL provides two major components. The first is for reading data from a pluggable data source (the *connectors* for talking to various data sources), and the second is for converting data (the *converters* for understanding your data formats) into [BulletRecords](ingestion.md). By enabling Bullet DSL in the Backend and configuring Bullet DSL, your backend will use the two components to read from the configured data source and convert the data into BulletRecords, without you having to write any code. -The three interfaces that the DSL uses are: +There is also an optional minor component that acts as the glue between the connectors and the converters. These are the *deserializers*. They exist if the data coming out of connector is of a format that cannot be understood by a converter. Typically, this happens for serialized data that needs to be deserialized first before a converter can understand it. -1. The **BulletConnector** : Bullet DSL's reading component -2. The **BulletRecordConverter** : Bullet DSL's converting component -3. The **Bullet Backend** : The implementation of Bullet on a Stream Processor - -There is also an optional BulletDeserializer component that sits between the Connector and the Converter to deserialize the data. +The four interfaces that the DSL uses are: -!!!note - - For the Backend, please refer to the DSL-specific Bullet Storm setup [here](storm-setup.md#using-bullet-dsl). (Currently, only Bullet Storm supports Bullet DSL.) +1. The **BulletConnector** : Bullet DSL's reading component +2. The **BulletDeserializer** : Bullet DSL's optional deserializing component +3. The **BulletRecordConverter** : Bullet DSL's converting component +4. The **Bullet Backend** : The implementation of Bullet on a Stream Processor ## BulletConnector @@ -135,6 +132,10 @@ bullet.dsl.converter.pojo.class.name: "com.your.package.YourPOJO" The MapBulletRecordConverter is used to convert Java Maps of Objects into BulletRecords. Without a schema, it simply inserts every entry in the Map into a BulletRecord without any type-checking. If the Map contains objects that are not types supported by the BulletRecord, you might have issues when serializing the record. +### JSONBulletRecordConverter + +The JSONBulletRecordConverter is used to convert String JSON representations of records into BulletRecords. Without a schema, it simply inserts every entry in the JSON object into a BulletRecord without any type-checking and it only uses the Double type for all numeric values (since it is unable to guess whether records might need a wider type). You should use a schema and mention the appropriate types if you want more specific numeric types for the fields in your record. If the JSON contains objects that are not types supported by the BulletRecord, you might have issues when serializing the record. + ### AvroBulletRecordConverter The AvroBulletRecordConverter is used to convert Avro records into BulletRecords. Without a schema, it inserts every field into a BulletRecord without any type-checking. With a schema, you get type-checking, and you can also specify a RECORD field, and the converter will accept Avro Records in addition to Maps, flattening them into the BulletRecord. @@ -146,7 +147,6 @@ The schema consists of a list of fields each described by a name, reference, typ 1. `name` : The name of the field in the BulletRecord 2. `reference` : The field to extract from the to-be-converted object 3. `type` : The type of the field -4. `subtype` : The subtype of any nested fields in this field (if any) When using the schema: @@ -154,8 +154,7 @@ When using the schema: 1. The `name` of the field in the schema will be the name of the field in the BulletRecord. 2. The `reference` of the field in the schema is the field/value to be extracted from an object when it is converted to a BulletRecord. 3. If the `reference` is null, it is assumed that the `name` and the `reference` are the same. -4. The `type` must be specified and will be used for type-checking. -5. The `subtype` must be specified for certain `type` values (`LIST`, `LISTOFMAP`, `MAP`, or `MAPOFMAP`). Otherwise, it must be null. +4. The `type` must be specified and can be used for type-checking. If you provide a schema and set the `bullet.dsl.converter.schema.type.check.enable` setting, then the converter will validate that the types in the source data matches the given type here. Otherwise, the type provided will be assumed. This is useful when initially using the DSL and you are not sure of the types. #### Types @@ -165,24 +164,34 @@ When using the schema: 4. FLOAT 5. DOUBLE 6. STRING -7. LIST -8. LISTOFMAP -9. MAP -10. MAPOFMAP -11. RECORD - -#### Subtypes - -1. BOOLEAN -2. INTEGER -3. LONG -4. FLOAT -5. DOUBLE -6. STRING - -!!!note "RECORD" - - For RECORD type, you should normally reference a Map. For each key-value pair in the Map, a field will be inserted into the BulletRecord. Hence, the name in a RECORD field is left empty. +7. BOOLEAN_MAP +8. INTEGER_MAP +9. LONG_MAP +10. FLOAT_MAP +11. DOUBLE_MAP +12. STRING_MAP +13. BOOLEAN_MAP_MAP +14. INTEGER_MAP_MAP +15. LONG_MAP_MAP +16. FLOAT_MAP_MAP +17. DOUBLE_MAP_MAP +18. STRING_MAP_MAP +19. BOOLEAN_LIST +20. INTEGER_LIST +21. LONG_LIST +22. FLOAT_LIST +23. DOUBLE_LIST +24. STRING_LIST +25. BOOLEAN_MAP_LIST +26. INTEGER_MAP_LIST +27. LONG_MAP_LIST +28. FLOAT_MAP_LIST +29. DOUBLE_MAP_LIST +30. STRING_MAP_LIST + +!!!note "Special Type for a RECORD" + + There is a special case where if you omit the `type` and the `name` for an entry in the schema, the reference is assumed to be a map containing arbitrary fields with types in the list above. You can use this if you have a map field that contains various objects with one or more types in the list above and want to flatten that map out into the target record using the respective types of each field in the map. The names of the fields in the map will be used as the top-level names in the resulting record. #### Example Schema @@ -195,13 +204,11 @@ When using the schema: }, { "name": "myBoolMap", - "type": "MAP", - "subtype": "BOOLEAN" + "type": "BOOLEAN_MAP" }, { "name": "myLongMapMap", - "type": "MAPOFMAP", - "subtype": "LONG" + "type": "LONG_MAP_MAP" }, { "name": "myIntFromSomeMap", @@ -217,10 +224,9 @@ When using the schema: "name": "myIntFromSomeNestedMapsAndLists", "reference": "someMap.nestedMap.nestedList.0", "type": "INTEGER" - }, + }, { - "reference" : "someMap", - "type": "RECORD" + "reference" : "someMap" } ] } @@ -228,7 +234,7 @@ When using the schema: ## BulletDeserializer -BulletDeserializer is an abstract Java class that can be implemented to deserialize/transform output from BulletConnector to input for BulletRecordConverter. It is an *optional* component and whether it's necessary or not depends on the output of your data sources. For example, if your KafkaConnector outputs byte arrays that are actually Java-serialized Maps, and you're using a MapBulletRecordConverter, you would use the JavaDeserializer, which would deserialize byte arrays into Java Maps for the converter. +BulletDeserializer is an abstract Java class that can be implemented to deserialize/transform output from BulletConnector to input for BulletRecordConverter. It is an *optional* component and whether it's necessary or not depends on the output of your data sources. If one is not needed, the `IdentityDeserializer` can be used. For example, if your KafkaConnector outputs byte arrays that are actually Java-serialized Maps, and you're using a MapBulletRecordConverter, you would use the JavaDeserializer, which would deserialize byte arrays into Java Maps for the converter. Currently, we support two BulletDeserializer implementations: diff --git a/docs/backend/ingestion.md b/docs/backend/ingestion.md index 6368bd7e..80a59e77 100644 --- a/docs/backend/ingestion.md +++ b/docs/backend/ingestion.md @@ -33,6 +33,7 @@ Data placed into a Bullet Record is strongly typed. We support these types curre 1. Map of Strings to any of the [Primitives](#primitives) 2. Map of Strings to any Map in 1 +3. List of any of the [Primitives](#primitives) 3. List of any Map in 1 With these types, it is unlikely you would have data that cannot be represented as Bullet Record but if you do, please let us know and we are more than willing to accommodate. diff --git a/docs/backend/spark-setup.md b/docs/backend/spark-setup.md index 8a725b79..69e1f4e6 100644 --- a/docs/backend/spark-setup.md +++ b/docs/backend/spark-setup.md @@ -12,7 +12,7 @@ Download the Bullet Spark standalone jar from [JCenter](http://jcenter.bintray.c If you are using Bullet Kafka as pluggable PubSub, you can download the fat jar from [JCenter](http://jcenter.bintray.com/com/yahoo/bullet/bullet-kafka/). Otherwise, you need to plug in your own PubSub jar or use the RESTPubSub built-into bullet-core and turned on in the API. -To use Bullet Spark, you need to implement your own [Data Producer Trait](https://github.com/bullet-db/bullet-spark/blob/master/src/main/scala/com/yahoo/bullet/spark/DataProducer.scala) with a JVM based project. You have two ways to implement it as described in the [Spark Architecture](spark-architecture.md#data-processing) section. You include the Bullet artifact and Spark dependencies in your pom.xml or other equivalent build tools. The artifacts are available through JCenter. Here is an example if you use Scala and Maven: +To use Bullet Spark, you need to implement your own [Data Producer Trait](https://github.com/bullet-db/bullet-spark/blob/master/src/main/scala/com/yahoo/bullet/spark/DataProducer.scala) with a JVM based project or you can use Bullet DSL (see below). If you choose to implement your own, you have two ways as described in the [Spark Architecture](spark-architecture.md#data-processing) section. You include the Bullet artifact and Spark dependencies in your pom.xml or other equivalent build tools. The artifacts are available through JCenter. Here is an example if you use Scala and Maven: ```xml @@ -65,9 +65,26 @@ To use Bullet Spark, you need to implement your own [Data Producer Trait](https: You can also add ```sources``` or ```javadoc``` if you want the sources or javadoc. +### Using Bullet DSL + +Instead of implementing your own Data Producer, you can also use the provided DSL receiver with [Bullet DSL](dsl.md). To do so, add the following settings to your YAML configuration: + +```yaml +# If true, enables the Bullet DSL data producer which can be configured to read from a custom data source. If enabled, +# the DSL data producer is used instead of the producer. +bullet.spark.dsl.data.producer.enable: true + +# If true, enables the deserializer between the Bullet DSL connector and converter components. Otherwise, this step is skipped. +bullet.spark.dsl.deserializer.enable: false +``` + +You may then use the appropriate DSL settings to point to the class names of the Connector and Converter you wish to use to read from your data source and convert it to BulletRecord instances. + +There is also a setting to enable [BulletDeserializer](dsl.md#bulletdeserializer), which is an optional component of Bullet DSL for deserializing data between reading and converting. + ## Launch -After you have implemented your own data producer and built a jar, you could launch your Bullet Spark application. Here is an example command for a [YARN cluster](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html). +After you have implemented your own data producer or used Bullet DSL and built a jar, you could launch your Bullet Spark application. Here is an example command for a [YARN cluster](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html). ```bash ./bin/spark-submit \ diff --git a/docs/backend/storm-architecture.md b/docs/backend/storm-architecture.md index 821ed258..1886687f 100644 --- a/docs/backend/storm-architecture.md +++ b/docs/backend/storm-architecture.md @@ -6,15 +6,21 @@ This section describes how the [Backend architecture](../index.md#backend) is im For Bullet on Storm, the Storm topology implements the backend piece from the full [Architecture](../index.md#architecture). The topology is implemented with the standard Storm spout and bolt components: -![Bullet Storm Topology](../img/topology-3.png) +![Bullet Storm Topology](../img/topology-4.svg) -The components in [Architecture](../index.md#architecture) have direct counterparts here. The Query spouts reading from the PubSub layer using plugged-in PubSub consumers make up the Request Processor. The Filter bolts and your plugin for your source of data (generally a spout but could be a topology) make up the Data Processor. The Join bolt, the Loop bolt and the Result bolt make up the Combiner. +The components in [Architecture](../index.md#architecture) have direct counterparts here. The Query spouts reading from the PubSub layer using plugged-in PubSub consumers make up the Request Processor. The Filter bolts and your plugin for your source of data (shown here using plugged with both the DSL spouts and DSL bolts from [Bullet DSL](#dsl.md)) make up the Data Processor. The Join bolt, the Loop bolt and the Result bolt make up the Combiner. There are peripheral components such as the Loop bolts, Tick spouts or the Replay bolts to handle metadata management in the topology. -The red colored lines are the path for the queries that come in through the PubSub, the blue is for the data from your data source and the orange is for metadata and loop-back signals used internally by the backend. The pattern on the lines denote how the data (Storm tuples) is moved to the next component. Dashed indicates a broadcast (sent to all instances of the component), dotted indicates a key grouping (sent to a particular instance based on hashing on a particular field), and solid indicates a shuffle (randomly sent to an instance). +The red colored lines are the path for the queries that come in through the PubSub, the blue is for the data from your data source and the orange is for metadata and loop-back signals used internally by the backend. The purple lines highlight the most important components where queries and data intermix (the Filter and Join bolts). -!!! note "What's a Tick Spout?" +The pattern on the lines denote how the data (Storm tuples) is moved to the next component. Dashed indicates a broadcast (sent to all instances of the component), dotted indicates a key grouping (sent to a particular instance based on hashing on a particular field), solid indicates a shuffle (randomly sent to an instance) and dashed-dotted indicates a custom grouping. - The Tick Spout component produces Storm tuples at predefined intervals to the Filter and Join Bolts. These tuples, called tick tuples, behave like CPU clock cycles for Bullet. Bullet performs all its system related activities on a tick. This includes purging stale queries, emitting left over data for queries, etc. We could have gone the route of having asynchronous threads that do the same thing but this was a far more simpler solution. The downside is that Bullet is as fast or as slow as its tick period, which can be configured on launch (defaults to ```100 ms```). In practice, this means that your time-based windows need to be at least twice as long as your tick period. +!!! note "What's a Replay?" + + The Replay and the [pluggable storage](storm-setup.md#storage) are *optional components* in Bullet on Storm. They exist to replay existing queries if you plugged in a storage layer into the [API](#../ws/setup.md#storage). You would use this if you have long running queries and are not tolerant to losing queries for your use-case. Currently, we do not support storage intermediate results in the storage though. For instance, if you restart the topology but have storage and replay configured, you will recreate all the queries on startup but you will lose all intermediate results that were held in memory so far. We plan to add intermediate result storage as well soon! + +!!! note "What's a Tick spout?" + + The Tick spout component produces Storm tuples at predefined intervals to the Filter and Join bolts. These tuples, called tick tuples, behave like CPU clock cycles for Bullet. Bullet performs all its system related activities on a tick. This includes purging stale queries, emitting left over data for queries, etc. We could have gone the route of having asynchronous threads that do the same thing but this was a far simpler solution. The downside is that Bullet is as fast or as slow as its tick period, which can be configured on launch (defaults to ```100 ms```). In practice, this means that your time-based windows need to be at least twice as long as your tick period. As a practical example of how Bullet uses ticks: when the final data is emitted from the Filter bolts when the query has expired, the Join bolt receiving it waits for 3 (this is configurable) ticks after *its query* expires to collect all the last intermediate results from the Filter bolts. If the tick period is set as high as 5 s, this means that a query will take 3 * 15 or 15 s to get back after its expiry! Setting it to 1 s, makes it 1 * 3 s. Similarly, intermediate windows are buffered (for certain kinds of windowed queries) to collect all results for that window before sending it back to the user. @@ -22,16 +28,21 @@ The red colored lines are the path for the queries that come in through the PubS Bullet can accept arbitrary sources of data as long as they can be read from Storm. You can either: -1. Write a Storm spout that reads your data from where ever it is (Kafka etc) and [converts it to Bullet Records](ingestion.md). See [Quick Start](../quick-start/storm.md#storm-topology) for an example. +1. Write a Storm spout (or optionally topology) that reads your data from where ever it is (Kafka etc) and [converts it to Bullet Records](ingestion.md). See [Quick Start](../quick-start/storm.md#storm-topology) for an example. 2. Hook up an existing topology that is doing something else directly to Bullet. You will still write and hook up a component that converts your data into Bullet Records in your existing topology. +3. Use [Bullet DSL](dsl.md) to configure a DSL spout (and optionally a DSL bolt) to use the DSL interfaces to automatically understand your data source with its data format and convert it to the interface Bullet uses without code. + +| | Option 1 | Option 2 | Option 3 | +| ------------------------------------------------------------------------------------------- | -------- | -------- | -------- | +| Write code to read from your data source and convert to Bullet records | Y | Y | N | +| Write Storm spouts and/or bolts | Y | Y | N | +| Saves a persistence/pubsub layer | N | Y | N | +| Separate reading data from converting and allowing fan-out | N | Y | Y | +| Full control over how data is read, processed and converted to Bullet records | Y | Y | N | -| | Pros | Cons | -| -------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | -| Option 1 | Very simple to get started. Just implement a spout | Need a storage layer that your spout pulls or some system has to push to your spouts | -| Option 2 | Saves a persistence layer | Ties your topology to Bullet directly, making it affected by Storm Backpressure etc | -| Option 2 | You can add bolts to do more processing on your data before sending it to Bullet | Increases the complexity of the topology | +Option 3 is generally flexible and is recommended. Having a code-less way to plug into Bullet is the fastest way to get started. We are adding new data sources and formats to the DSL so that we can support more ways to get your data into Bullet. If a connector or converter is not supported in DSL for your specific data source, you can also implement your own. It will save you from having to write Storm spouts or bolts and lets you reuse the Bullet DSL spout and/or bolt. -Your data is then emitted to the Filter bolt. If you have no queries in your system, the Filter bolt will promptly drop all Bullet Records and do absolutely nothing. If there are queries in the Filter bolt, the record is checked against the [filters](../index.md#filters) in each query and if it matches, it is processed by the query. Each query type can choose when to emit based on what window is configured for it. Depending on this, the matched record could be immediately emitted (if it is a RAW query or the intermediate aggregate if anything else) or it could be buffered till a specific time is reached (or the query has expired). +Regardless of how your data is read, it is then emitted to the Filter bolt. If you have no queries in your system, the Filter bolt will promptly drop all Bullet Records and do nothing. If there are queries in the Filter bolt, the record is checked against each query and if it matches, it is processed by the query. Each query type can choose when to emit its intermediate result based on what window is configured for it. Depending on this, the matched record could be immediately emitted (if it is a RAW query or the intermediate aggregate if anything else) or it could be buffered till a specific time is reached (or the query has expired). ### Request processing @@ -39,6 +50,11 @@ The Query spouts fetch Bullet queries through the PubSub layer using the Subscri The Query spout also key groups the query and additional query metadata to the Join bolts. This means that the query and the metadata will be end up at exactly one Join bolt. + +!!! note "Key grouping" + + Technically, Bullet uses a Custom grouping in Storm instead of Key grouping. The Custom grouping does the same thing as what the Key grouping would do in Storm. The reason why we use the Custom grouping is for Replay so that we can deterministically control the Join bolt component that will receive a query and reuse that information for certain aspects of replaying. This is just defensive programming in case Storm changes their key group algorithm to function differently. + ### Combining Since the data from the Query spout (query and metadata) and the data from all Filter bolts (intermediate results) is key grouped by the unique query id, only one particular Join bolt receives both the query and the intermediate results for a particular query. The Join bolt can then combine the intermediate results and produce a final result. This result is joined (hence the name) along with the metadata for the query and is shuffled to the Result bolts. This bolt then uses the particular Publisher from the plugged in PubSub layer and uses the metadata if it needs to and sends the results back through the PubSub layer to the requestor. @@ -49,14 +65,14 @@ Since the data from the Query spout (query and metadata) and the data from all F !!! note "Loop back" - We have not mentioned the loop components. These are mainly used to perform house-keeping within the topology. For instance, there is a Rate Limit concept in the Bullet core libraries that if violated in any instance of the query being executed, should cause the query to be killed. Wherever this error originates, it will trickle to the Loop bolt and be looped back through the PubSub, through the Query Spout and sent to all components that know about the query. These components will then kill the query as well. We call this a loop because strictly speaking, the topology is a Directed Acyclic Graph and we violate it by making a loop. These are also used to deliver external signals such as killing a query etc from the API or the UI. If you disable windows entirely, the Loop bolt will not be wired up when you launch your Bullet topology. + We have not mentioned the loop components or the replay bolts. These are mainly used to perform house-keeping within the topology or if you have configured storage/replay. For instance, there is a Rate Limit concept in the Bullet core libraries that if violated in any instance of the query being executed, should cause the query to be killed. Wherever this error originates, it will trickle to the Loop bolt and be looped back through the PubSub, through the Query spout and sent to all components that know about the query. These components will then kill the query as well. We call this a loop because strictly speaking, the topology is a Directed Acyclic Graph and we violate it by making a loop. These are also used to deliver external signals such as killing a query etc from the API or the UI. If you disable windows entirely, the Loop bolt will not be wired up when you launch your Bullet topology. ## Scalability The topology set up this way scales horizontally and has some nice properties: * If you want to scale for processing more data but the same amount of queries, you only need to scale the components that read your data (the spout reading the data or your custom topology) and the Filter bolts. - * If you want to scale for more queries but the same amount of data, you generally need to scale up the Filter Bolts. If you need it, you can scale the Query spouts, Join bolts, Loop bolts and Result bolts. You should ensure that your PubSub layer (if you're using the Storm DRPC PubSub layer, then this is the number of DRPC servers in your Storm cluster) can handle the volume of queries and results being sent through it. These components generally have low parallelisms compared to your data processing components since the data volume is generally much higher than your query volume, so this is generally not needed. + * If you want to scale for more queries but the same amount of data, you generally need to scale up the Filter bolts. If you need it, you can scale the Query spouts, Join bolts, Loop bolts and Result bolts. You should ensure that your PubSub layer (if you're using the Storm DRPC PubSub layer, then this is the number of DRPC servers in your Storm cluster) can handle the volume of queries and results being sent through it. These components generally have low parallelisms compared to your data processing components since the data volume is generally much higher than your query volume, so this is generally not needed. See [Scaling for more Queries](storm-performance.md#test-7-scaling-for-more-queries) and [Scaling for more Data](storm-performance.md#test-6-scaling-for-more-data) for more details. diff --git a/docs/backend/storm-performance.md b/docs/backend/storm-performance.md index eab8d918..142352f5 100644 --- a/docs/backend/storm-performance.md +++ b/docs/backend/storm-performance.md @@ -86,7 +86,7 @@ The parallelisms, CPU and memory settings for the components are listed below. ## Testing on Kafka 0.9.0.1 -For Tests 1 through 4, we read from a Kafka 0.9 cluster with the following configuration for the various Bullet components (unless specified). We use the single Spout model to read from the Kafka topic, partitioned into ```64``` partitions. +For Tests 1 through 4, we read from a Kafka 0.9 cluster with the following configuration for the various Bullet components (unless specified). We use the single spout model to read from the Kafka topic, partitioned into ```64``` partitions. ### Resource utilization @@ -94,12 +94,12 @@ For Tests 1 through 4, we read from a Kafka 0.9 cluster with the following confi | Component | Parallelism |CPU (cores) | On Heap Memory (MiB) | Off Heap Memory (MiB) |Total Memory (MiB) | | :------------------ | ----------: | ---------: | -------------------: | --------------------: | ----------------: | -| DataSource Spout |64 |64 |768.0 |192.0 |61440 | -| Filter Bolt |128 |128 |384.0 |192.0 |73728 | -| Join Bolt |2 |1 |384.0 |192.0 |1152 | -| DRPC Spout |2 |0.4 |128.0 |192.0 |640 | -| PrepareRequest Bolt |1 |0.2 |128.0 |192.0 |320 | -| ReturnResults Bolt |1 |0.2 |128.0 |192.0 |320 | +| DataSource spout |64 |64 |768.0 |192.0 |61440 | +| Filter bolt |128 |128 |384.0 |192.0 |73728 | +| Join bolt |2 |1 |384.0 |192.0 |1152 | +| DRPC spout |2 |0.4 |128.0 |192.0 |640 | +| PrepareRequest bolt |1 |0.2 |128.0 |192.0 |320 | +| ReturnResults bolt |1 |0.2 |128.0 |192.0 |320 | | IMetricsConsumer |1 |0.1 |128.0 |0 |128 | | Ackers |256 |25.6 |128.0 |0 |32768 | | **Total** |**455** |**219.5** | | |**170496** | @@ -124,19 +124,19 @@ storm jar ``` 1. The spout parallelism is 64 because it is going to read from a Kafka topic with 64 partitions (any more is meaningless since it cannot be split further). It reads and converts the data into Bullet Records. -2. We've fanned out from the spouts to the Filter Bolts by a ratio of 2. We may or may not need this. -3. We use ```topology.max.spout.pending=20000``` to limit the number of in-flight tuples there can be from a DataSource Spout instance and throttle it if too many queries are slowing down processing downstream. This is set pretty high to account for catch-up and skew in our Kafka partitions +2. We've fanned out from the spouts to the Filter bolts by a ratio of 2. We may or may not need this. +3. We use ```topology.max.spout.pending=20000``` to limit the number of in-flight tuples there can be from a DataSource spout instance and throttle it if too many queries are slowing down processing downstream. This is set pretty high to account for catch-up and skew in our Kafka partitions 4. We have set the max heap size for a worker to ```4 GiB``` since we do not want too large of a worker. If a component dies or a worker is killed by RAS, it will not affect too many other components. It also makes heap dumps etc manageable. 5. We set ```topology.worker.gc.childopts``` to use ```ParNewGC``` and ```CMS```. These are our cluster defaults but we are listing them here since this may not be true for all Storm clusters. We have also added the ```-XX:NewRatio=1``` to the defaults since most of our objects are short-lived and having a larger Young Generation reduces our Young Generation GC (ParNew) frequency. -6. We are using 256 acker tasks. There is acking from the DataSource Spout to the Filter Bolt and from the DRPCSpout and the PrepareRequestBolt, so about ~130 components will be acking. We could get away with using much less ackers as they are very light-weight. +6. We are using 256 acker tasks. There is acking from the DataSource spout to the Filter bolt and from the DRPCSpout and the PrepareRequestBolt, so about ~130 components will be acking. We could get away with using much less ackers as they are very light-weight. ## Test 1: Measuring the minimum latency of Bullet -We are [running this query](../ws/examples.md#simplest-query) in this test. This ```RAW``` query without any filters will serve to measure the intrinsic delay added by Bullet. The data record pulled out has a timestamp for when the record was emitted into Kafka, Bullet will inject the timestamp into the record when the Filter Bolt sends it on and the metadata collection logs timestamps for when the query was received and terminated. Using these, we can measure the end-to-end latency for getting one record through Bullet. +We are [running this query](../ws/examples.md#simplest-query) in this test. This ```RAW``` query without any filters will serve to measure the intrinsic delay added by Bullet. The data record pulled out has a timestamp for when the record was emitted into Kafka, Bullet will inject the timestamp into the record when the Filter bolt sends it on and the metadata collection logs timestamps for when the query was received and terminated. Using these, we can measure the end-to-end latency for getting one record through Bullet. ### Result -The following table shows the timestamps averaged by running **100** of these queries. The delays below are shown *relative* to the Query Received timestamp (when the query was received by Bullet at the Join Bolt). +The following table shows the timestamps averaged by running **100** of these queries. The delays below are shown *relative* to the Query Received timestamp (when the query was received by Bullet at the Join bolt).
@@ -147,7 +147,7 @@ The following table shows the timestamps averaged by running **100** of these qu | Query Received | 0 | | Query Finished | 1.66 | -The Bullet Filtered timestamp above is negative because the Filter Bolt received the query and emitted an arbitrary record ```2.16 ms``` before the Join Bolt received the query. The data was submitted into Kafka about ```710.75 ms``` before the query was received by Bullet and that difference is the processing time of Kafka and the time for our spouts to read the data into Bullet. +The Bullet Filtered timestamp above is negative because the Filter bolt received the query and emitted an arbitrary record ```2.16 ms``` before the Join bolt received the query. The data was submitted into Kafka about ```710.75 ms``` before the query was received by Bullet and that difference is the processing time of Kafka and the time for our spouts to read the data into Bullet. ### Conclusion @@ -157,7 +157,7 @@ Bullet adds a delay of a few ms - **```1.66 ms```** in the test above - to just The [last test](#test-1-measuring-the-minimum-latency-of-bullet) attempted to measure how long Bullet takes to pick out a record. Here we will measure how long it takes to find a record *that we generate*. This is the average of running **100** queries across a time interval of 30 minutes trying to filter for a record with a single unique value in a field [similar to this query](../ws/examples.md#simple-filtering). -We added a timestamp into the record when the record was initially read by the DataSource Spout. Using this and the Bullet Filtered timestamp and Query Finished timestamps, we can easily track the record through Bullet. +We added a timestamp into the record when the record was initially read by the DataSource spout. Using this and the Bullet Filtered timestamp and Query Finished timestamps, we can easily track the record through Bullet. Since we are looking at values in the data, the average data volume across this test was: ```Data: 76,000 R/s and 101 MiB/s``` @@ -179,7 +179,7 @@ Bullet received the record ```996.5 ms``` after the query was received. The dela ### Conclusion -We see that Bullet took on average ```1006.8 ms - 996.5 ms``` or **```10.3 ms```** from the time it saw the record first in DataSource Spout to finishing up the query and returning it in the Join Bolt. +We see that Bullet took on average ```1006.8 ms - 996.5 ms``` or **```10.3 ms```** from the time it saw the record first in DataSource spout to finishing up the query and returning it in the Join bolt. ## Test 3: Measuring the maximum number of parallel ```RAW``` queries @@ -187,7 +187,7 @@ This test runs a query similar to the [simple filtering query](../ws/examples.md ### What is meant by maximum? -We want to see how many of these queries we can have running simultaneously till the Filter Bolt is unable to process records from the spouts in time. If a Filter Bolt is unable to keep up with the rate of data produced by the spouts, our queries will not find all 10 records. Workers may start dying (killed by RAS for exceeding capacity) as well. We will be trying to find the number of queries in parallel that we can run without these happening. +We want to see how many of these queries we can have running simultaneously till the Filter bolt is unable to process records from the spouts in time. If a Filter bolt is unable to keep up with the rate of data produced by the spouts, our queries will not find all 10 records. Workers may start dying (killed by RAS for exceeding capacity) as well. We will be trying to find the number of queries in parallel that we can run without these happening. The average data volume across this test was: ```Data: 85,000 R/s and 126 MiB/s``` @@ -213,7 +213,7 @@ We ran a number of queries in parallel (you may have to use ```ulimit``` to chan ### Result -We were able to run 200 queries successfully but 300 and higher started causing our Filter Bolts to slow down. This slow down caused our spouts to be throttled and fall behind reading data. This caused the matching data to not show up in time during the queries. Some of our attempts would not return all the expected 10 records. +We were able to run 200 queries successfully but 300 and higher started causing our Filter bolts to slow down. This slow down caused our spouts to be throttled and fall behind reading data. This caused the matching data to not show up in time during the queries. Some of our attempts would not return all the expected 10 records. Using our metrics that were captured using our in-house metrics aggregation system (that our IMetricsConsumer publishes to), let's take a look at the CPU, Heap utilizations. @@ -221,8 +221,8 @@ Before you look at the figures: 1. All the figures below are for the same time interval. The X-axis represents time in ```1 minute``` intervals 2. [Figure 1](#figure-1-queries-running) shows the number of queries running for a time interval -3. The other figures show a metric across **all** the workers (JVMs) in the Storm topology, each running a mix of a components (spouts reading from Kafka, Filter Bolts etc) -4. The majority of the components (excluding ackers) are spouts reading from Kafka or Filter Bolts, so the figures can be taken to be primarily describing those workers +3. The other figures show a metric across **all** the workers (JVMs) in the Storm topology, each running a mix of a components (spouts reading from Kafka, Filter bolts etc) +4. The majority of the components (excluding ackers) are spouts reading from Kafka or Filter bolts, so the figures can be taken to be primarily describing those workers #### Figure 1. Queries running @@ -250,7 +250,7 @@ Before you look at the figures: !!! note "Garbage collection" - As we increase the number of queries sent into Bullet, more objects are created in the Filter and Join Bolts. These quickly fill up our heap and cause GCs. The zig-zags represents heaps being cleared after GC and filling back up quickly. Also, note that the CPU usage is directly related to the GC times. In other words, performance is pretty much directly correlated with the amount of GC we do. + As we increase the number of queries sent into Bullet, more objects are created in the Filter and Join bolts. These quickly fill up our heap and cause GCs. The zig-zags represents heaps being cleared after GC and filling back up quickly. Also, note that the CPU usage is directly related to the GC times. In other words, performance is pretty much directly correlated with the amount of GC we do. The following table summarizes these figures: @@ -291,12 +291,12 @@ Our resource utilization is now: | Component | Parallelism |CPU (cores) |On Heap Memory (MiB) | Off Heap Memory (MiB) | Total Memory (MiB) | | :------------------ | ----------: | ---------: | ------------------: | --------------------: | -----------------: | -| DataSource Spout |64 |64 |**1280.0** |192.0 | 94208 | -| Filter Bolt |128 |128 |**1024.0** |192.0 | 155648 | -| Join Bolt |2 |1 |384.0 |192.0 | 1152 | -| DRPC Spout |2 |0.4 |128.0 |192.0 | 640 | -| PrepareRequest Bolt |1 |0.2 |128.0 |192.0 | 320 | -| ReturnResults Bolt |1 |0.2 |128.0 |192.0 | 320 | +| DataSource spout |64 |64 |**1280.0** |192.0 | 94208 | +| Filter bolt |128 |128 |**1024.0** |192.0 | 155648 | +| Join bolt |2 |1 |384.0 |192.0 | 1152 | +| DRPC spout |2 |0.4 |128.0 |192.0 | 640 | +| PrepareRequest bolt |1 |0.2 |128.0 |192.0 | 320 | +| ReturnResults bolt |1 |0.2 |128.0 |192.0 | 320 | | IMetricsConsumer |1 |0.1 |128.0 |0 | 128 | | Ackers |256 |25.6 |128.0 |0 | 32768 | | **Total** |**455** |**219.5** | | | **285184** | @@ -349,7 +349,7 @@ With this change in heap usage, we could get to **```735```** of these queries s ## Testing on Kafka 0.10.0.1 -For this and subsequent tests, we upgraded our Kafka cluster to 0.10. We used the new Kafka consumer APIs to read *batches* of messages instead of a message at a time. We changed our DataSource Spout to read batches of messages (raw bytes) instead and added a DataSource Bolt that converts each batch message into Bullet records. Switching to this model let us be a lot more efficient in our data reading. +For this and subsequent tests, we upgraded our Kafka cluster to 0.10. We used the new Kafka consumer APIs to read *batches* of messages instead of a message at a time. We changed our DataSource spout to read batches of messages (raw bytes) instead and added a DataSource bolt that converts each batch message into Bullet records. Switching to this model let us be a lot more efficient in our data reading. To read more data, we will be trying to read a topic that is a superset of our data set so far and produces up to **13** times the number of records (maximum of 1.3 million records/sec) and **20** times the size of the data we were reading till now. This Kafka topic has **256** partitions. @@ -361,13 +361,13 @@ Our average data volume across this test was: ```Data: 756,000 R/s and 3080 MiB/ | Component | Parallelism |CPU (cores) |On Heap Memory (MiB) |Off Heap Memory (MiB) | Total Memory (MiB) | | :------------------ | ----------: | ---------: | ------------------: | -------------------: | -----------------: | -| DataSource Spout |128 |128 |1024.0 |192.0 | 155648 | -| DataSource Bolt |256 |512 |2580.0 |192.0 | 709632 | -| Filter Bolt |512 |512 |1024.0 |192.0 | 622592 | -| Join Bolt |2 |1 |512.0 |192.0 | 1408 | -| DRPC Spout |2 |0.4 |128.0 |192.0 | 640 | -| PrepareRequest Bolt |1 |0.2 |128.0 |192.0 | 320 | -| ReturnResults Bolt |1 |0.2 |128.0 |192.0 | 320 | +| DataSource spout |128 |128 |1024.0 |192.0 | 155648 | +| DataSource bolt |256 |512 |2580.0 |192.0 | 709632 | +| Filter bolt |512 |512 |1024.0 |192.0 | 622592 | +| Join bolt |2 |1 |512.0 |192.0 | 1408 | +| DRPC spout |2 |0.4 |128.0 |192.0 | 640 | +| PrepareRequest bolt |1 |0.2 |128.0 |192.0 | 320 | +| ReturnResults bolt |1 |0.2 |128.0 |192.0 | 320 | | IMetricsConsumer |4 |0.4 |128.0 |0 | 512 | | Ackers |256 |25.6 |128.0 |0 | 32768 | | **Total** |**1162** |**1179.8** | | | **1523840** | @@ -393,7 +393,7 @@ We capped the GC threads to ```8``` and ```4```, which helps performance on our !!! note "Max Spout Pending is now 30 ?!" - We use ```topology.max.spout.pending``` as a way to throttle how fast we read from Kafka. There is no acking past the Filter Bolt. The maximum number of batch messages we read is ```500``` from Kafka. This makes our true max spout pending: ```500 * 30 = 15,000```. The tuple that is emitted from the spout is a large tuple that contains up to ```500``` records and we limit up to ```30``` of those to go unacked from any single spout before we throttle it. Since we have ```128``` spouts, we can have ```128 * 15,000``` messages unacked in the topology at any time at the most. + We use ```topology.max.spout.pending``` as a way to throttle how fast we read from Kafka. There is no acking past the Filter bolt. The maximum number of batch messages we read is ```500``` from Kafka. This makes our true max spout pending: ```500 * 30 = 15,000```. The tuple that is emitted from the spout is a large tuple that contains up to ```500``` records and we limit up to ```30``` of those to go unacked from any single spout before we throttle it. Since we have ```128``` spouts, we can have ```128 * 15,000``` messages unacked in the topology at any time at the most. ### Result @@ -432,13 +432,13 @@ hiccups in our collection mechanism (the collection granularity was not 5s as we ### Conclusion -We are trying to read a data source that could have```13``` times more records and ```20``` times more data volume. So we have roughly increased the parallelism of the components reading the data by 10x (```128 + 512 = 768``` cores to read and convert the data whereas previously we were using ```64``` cores). Once this is fixed and we can read the data comfortably using our DataSource Spouts and Bolts, we can scale the Filter Bolts and other components to accommodate for queries. We set our Filter Bolt parallelism (dominates the rest of the components) to ```512```. We need about ```25``` machines (5 times more than the previous of ```5```). +We are trying to read a data source that could have```13``` times more records and ```20``` times more data volume. So we have roughly increased the parallelism of the components reading the data by 10x (```128 + 512 = 768``` cores to read and convert the data whereas previously we were using ```64``` cores). Once this is fixed and we can read the data comfortably using our DataSource spouts and bolts, we can scale the Filter bolts and other components to accommodate for queries. We set our Filter bolt parallelism (dominates the rest of the components) to ```512```. We need about ```25``` machines (5 times more than the previous of ```5```). With this configuration, we were able to run **```680```** queries simultaneously before we hit the DRPC limit. Since DRPC is a shared resource for the cluster, this limit is slightly lower than the previously observed number possibly due to our test environment being multi-tenant and other topologies using the shared resource. !!! note "Measuring latency in Bullet" - So far, we have been using data being delayed long enough as a proxy for queries failing. [Bullet-Storm 0.4.3](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.4.3) adds an average latency metric computed in the Filter Bolts. For the next tests, we add a timestamp in the Data Source spouts when the record is read and this latency metric tells us exactly how long it takes for the record to be matched against a query and acked. By setting a limit for this latency, we can much more accurately measure acceptable performance. + So far, we have been using data being delayed long enough as a proxy for queries failing. [Bullet-Storm 0.4.3](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.4.3) adds an average latency metric computed in the Filter bolts. For the next tests, we add a timestamp in the Data Source spouts when the record is read and this latency metric tells us exactly how long it takes for the record to be matched against a query and acked. By setting a limit for this latency, we can much more accurately measure acceptable performance. ## Test 6: Scaling for More Data @@ -451,7 +451,7 @@ For this test, we'll establish how much resources we need to read various data v For reading the data, we have to first scale the DataSource spouts and bolts and then set the parallelism of the Filter bolts to support the minimum 400 queries we want at the data volume. We leave the rest of the components at their default values as seen in in [Test 5](#test-5-reading-more-data). -To get various data volumes, we read a large Kafka topic with (256 partitions) with over 1 million R/s and sample various percentages to get less data. The sampling is done in our DataSource Spouts. +To get various data volumes, we read a large Kafka topic with (256 partitions) with over 1 million R/s and sample various percentages to get less data. The sampling is done in our DataSource spouts. ### Result @@ -462,29 +462,29 @@ The following table summarizes the results: | Data (MiB/s, R/s) | Component | Parallelism | CPU cores | On Heap (MiB) | Total CPU cores | Total Memory (MiB) | | :---------------- | :------------- | ----------: | --------: | ------------: | --------------: | -----------------: | |**307, 69700** | | | | |**98.3** |**123648** | -| |DataSource Spout|16 |0.5 |1024 | | | -| |DataSource Bolt |32 |2 |2048 | | | -| |Filter Bolt |24 |1 |1024 | | | +| |DataSource spout|16 |0.5 |1024 | | | +| |DataSource bolt |32 |2 |2048 | | | +| |Filter bolt |24 |1 |1024 | | | |**920, 216825** | | | | |**242.7** |**281856** | -| |DataSource Spout|32 |1 |1024 | | | -| |DataSource Bolt |72 |2 |2048 | | | -| |Filter Bolt |64 |1 |1024 | | | +| |DataSource spout|32 |1 |1024 | | | +| |DataSource bolt |72 |2 |2048 | | | +| |Filter bolt |64 |1 |1024 | | | |**1535, 374370** | | | | |**531.5** |**616192** | -| |DataSource Spout|64 |1 |1024 | | | -| |DataSource Bolt |160 |2 |2048 | | | -| |Filter Bolt |144 |1 |1024 | | | +| |DataSource spout|64 |1 |1024 | | | +| |DataSource bolt |160 |2 |2048 | | | +| |Filter bolt |144 |1 |1024 | | | |**2149, 524266** | | | | |**812.3** |**939264** | -| |DataSource Spout|72 |1 |1024 | | | -| |DataSource Bolt |256 |2 |2048 | | | -| |Filter Bolt |224 |1 |1024 | | | +| |DataSource spout|72 |1 |1024 | | | +| |DataSource bolt |256 |2 |2048 | | | +| |Filter bolt |224 |1 |1024 | | | |**3070, 724390** | | | | |**997.1** |**1321984** | -| |DataSource Spout|96 |1 |1024 | | | -| |DataSource Bolt |320 |2 |2580 | | | -| |Filter Bolt |256 |1 |1024 | | | +| |DataSource spout|96 |1 |1024 | | | +| |DataSource bolt |320 |2 |2580 | | | +| |Filter bolt |256 |1 |1024 | | | |**4024, 1004500** | | | | |**1189.4** |**1582208** | -| |DataSource Spout|96 |1 |1024 | | | -| |DataSource Bolt |384 |2 |2580 | | | -| |Filter Bolt |320 |1 |1024 | | | +| |DataSource spout|96 |1 |1024 | | | +| |DataSource bolt |384 |2 |2580 | | | +| |Filter bolt |320 |1 |1024 | | | The following figures graphs how the data volume relates to the total CPU and Memory needed. @@ -507,11 +507,11 @@ For this test, we'll establish how much resources we need to support more querie As our 3 server DRPC cluster currently does not let us do more than ```680 RAW``` queries, in this test, we will: -* Vary the number of Filter Bolts as they are the primary bottleneck for supporting more queries. -* To simplify things, we will only vary the **parallelism** and fix the CPU and memory of each Filter Bolt to ```1 Core``` and ```1 GiB Memory``` +* Vary the number of Filter bolts as they are the primary bottleneck for supporting more queries. +* To simplify things, we will only vary the **parallelism** and fix the CPU and memory of each Filter bolt to ```1 Core``` and ```1 GiB Memory``` * We will use ```RAW``` queries as the queries to scale -* Each ```RAW``` query will run for ```30 s``` and search for ```10``` records that we generate. The query will actually look for *11* records to force it to run for the full ```30 s```. This is because we want to stress the Filter Bolt as much as possible. As long as there is a query in the system, the Filter Bolt will deserialize and check every record that it processes -* We will measure the same filtering latency: the time taken from the record read in DataSource Spout to its emission in the Filter Bolt. We want the maximum latency to be less than ```200 ms``` +* Each ```RAW``` query will run for ```30 s``` and search for ```10``` records that we generate. The query will actually look for *11* records to force it to run for the full ```30 s```. This is because we want to stress the Filter bolt as much as possible. As long as there is a query in the system, the Filter bolt will deserialize and check every record that it processes +* We will measure the same filtering latency: the time taken from the record read in DataSource spout to its emission in the Filter bolt. We want the maximum latency to be less than ```200 ms``` ### Results @@ -519,7 +519,7 @@ The following table summarizes the results:
-| Filter Bolt Parallelism | Queries | Average Latency (ms) | Status | Topology CPU (cores) | Topology Memory (MiB) | +| Filter bolt Parallelism | Queries | Average Latency (ms) | Status | Topology CPU (cores) | Topology Memory (MiB) | | :---------------------- | ------: | -------------------: | -----: | -------------------: | --------------------: | |**4** | | | |**78.3** |**112256** | | |1 |7 |OK | | | @@ -575,7 +575,7 @@ The following table summarizes the results: | |600 |26 |OK | | | | |**650** |32 |OK | | | -The following figure summarizes the minimum number of CPU cores (which are also the number of Filter Bolts) needed to support the the maximum number of ```RAW``` queries with latency < 200 ms. +The following figure summarizes the minimum number of CPU cores (which are also the number of Filter bolts) needed to support the the maximum number of ```RAW``` queries with latency < 200 ms. #### Figure 15. CPU vs Max Concurrent Queries @@ -583,7 +583,7 @@ The following figure summarizes the minimum number of CPU cores (which are also This shows that the queries supported also scale pretty linearly. -You may have noticed how when latency starts to increase, it increases pretty rapidly. This suggests that there is a *knee* or *exponential* curve for latency. The following figure shows this in the graph of the latency for queries with ```20``` Filter Bolts. +You may have noticed how when latency starts to increase, it increases pretty rapidly. This suggests that there is a *knee* or *exponential* curve for latency. The following figure shows this in the graph of the latency for queries with ```20``` Filter bolts. #### Figure 16. Max Concurrent Queries vs Latency @@ -591,4 +591,4 @@ You may have noticed how when latency starts to increase, it increases pretty ra ### Conclusion -Since Filter Bolts tend to be the most CPU intensive of the query processing components, this test measured how scaling Filter Bolts affected the number of queries that can be supported. For the fixed data volume, this relationship is linear. +Since Filter bolts tend to be the most CPU intensive of the query processing components, this test measured how scaling Filter bolts affected the number of queries that can be supported. For the fixed data volume, this relationship is linear. diff --git a/docs/backend/storm-setup.md b/docs/backend/storm-setup.md index b29f4389..568a5c4a 100644 --- a/docs/backend/storm-setup.md +++ b/docs/backend/storm-setup.md @@ -8,12 +8,12 @@ Bullet is configured at run-time using settings defined in a file. Settings not ## Installation -To use Bullet, you need to implement a way to read from your data source and convert your data into Bullet Records (bullet-record is a transitive dependency for Bullet and can be found [in JCenter](ingestion.md#installing-the-record-directly). You have two options in how to get your data into Bullet: +To use Bullet, you need to implement a way to read from your data source and convert your data into Bullet Records (bullet-record is a transitive dependency for Bullet and can be found [in JCenter](ingestion.md#installing-the-record-directly). You have a couple of options in how to get your data into Bullet: -1. You can implement a Spout that reads from your data source and emits Bullet Record. This spout must have a constructor that takes a List of Strings. -2. You can pipe your existing Storm topology directly into Bullet. In other words, you convert the data you wish to be query-able through Bullet into Bullet Records from a bolt in your topology. +1. You can implement a spout (or even a topology) that reads from your data source and emits Bullet Records. You then write a main class that submits the topology with your topology wired in [using our submit method](https://github.com/bullet-db/bullet-storm/blob/master/src/main/java/com/yahoo/bullet/storm/StormUtils.java). +2. Use Bullet DSL to configure a spout (and optionally a bolt) that you provide in the settings to our main class. This will wire up your data source and data format to Bullet without you having to write code! -Option 1 is the simplest to start with and should accommodate most scenarios. See [Pros and Cons](storm-architecture.md#data-processing). +You can refer to the [Pros and Cons](storm-architecture.md#data-processing) of the various approaches to determine what works best for you. You need a JVM based project that implements one of the two options above. You include the Bullet artifact and Storm dependencies in your pom.xml or other dependency management system. The artifacts are available through JCenter, so you will need to add the repository. @@ -51,7 +51,7 @@ You can also add ```sources``` or ```javad If you are going to use the second option (directly pipe data into Bullet from your Storm topology), then you will need a main class that directly calls the submit method with your wired up topology and the name of the component that is going to emit Bullet Records in that wired up topology. The submit method can be found in [Topology.java](https://github.com/bulletbullet-storm/blob/master/src/main/java/com/yahoo/bullet/Topology.java). The submit method submits the topology so it should be the last thing you do in your main. -If you are just implementing a Spout, see the [Launch](#launch) section below on how to use the main class in Bullet to create and submit your topology. +If you are just implementing a spout, see the [Launch](#launch) section below on how to use the main class in Bullet to create and submit your topology. Storm topologies are generally launched with "fat" jars (jar-with-dependencies), excluding storm itself: @@ -129,7 +129,7 @@ You can pass other arguments to Storm using the -c argument. The example above u ## Using Bullet DSL -Instead of implementing your own spout or Topology, you can also use the provided DSL spout (and optionally, DSL Bolt) with [Bullet DSL](dsl.md). To do so, add the following settings to your YAML configuration: +Instead of implementing your own spout or Topology, you can also use the provided DSL spout (and optionally, DSL bolt) with [Bullet DSL](dsl.md). To do so, add the following settings to your YAML configuration: ```yaml bullet.topology.dsl.spout.enable: true @@ -147,7 +147,7 @@ bullet.topology.dsl.bolt.memory.off.heap.load: bullet.topology.dsl.deserializer.enable: false ``` -If the DSL Bolt is enabled in addition to the spout (the spout is always required!), Storm will read your data in the spout and convert it in the bolt. Without the bolt, reading and converting are done entirely in the spout. If you wish to separate the two by enabling the DSL Bolt, you can lower per-worker latencies when data volume is large and scale them independently. +If the DSL bolt is enabled in addition to the spout (the spout is always required!), Storm will read your data in the spout and convert it in the bolt. Without the bolt, reading and converting are done entirely in the spout. If you wish to separate the two by enabling the DSL bolt, you can lower per-worker latencies when data volume is large and scale them independently. There is also a setting to enable [BulletDeserializer](dsl.md#bulletdeserializer), which is an optional component of Bullet DSL for deserializing data between reading and converting. @@ -178,3 +178,9 @@ storm jar bullet-storm-0.9.1.jar \ --bullet-conf ./bullet_settings.yaml \ --jars "bullet-dsl-0.1.2.jar,pulsar-client-2.2.1.jar,pulsar-client-schema-2.2.1.jar,protobuf-shaded-2.1.0-incubating.jar" ``` + +## Storage and Replay + +If you set up the [Storage layer in the Web Service](../ws/setup.md#storage-configuration), you can turn on the replaying feature in Bullet on Storm. This wires up the Replay bolts to the topology. This component keeps track of the queries in the backend and replays queries from the Storage layer upon restart or component failure. + +Currently, only queries are stored. In the future, the Storage module will also be used for storing intermediate results in addition to queries to accommodate for restarts or component failures without loss of data for executing queries. diff --git a/docs/img/overallarch-2.png b/docs/img/overallarch-2.png deleted file mode 100644 index d42fdca1c75a6aacfa09ac841260c95f4b6f409e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152160 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 W{}JWz-aS \ No newline at end of file diff --git a/docs/img/topology-3.png b/docs/img/topology-3.png deleted file mode 100755 index 1fb059498588e072b43b518c2158dd34c98f9fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202086 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 diff --git a/docs/img/topology-4.svg b/docs/img/topology-4.svg new file mode 100644 index 00000000..1145fd2f --- /dev/null +++ b/docs/img/topology-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 5f9bd59e..d8270a1b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,7 +15,7 @@ * Filter raw data or aggregate data -* Can be run on storm or spark streaming +* Can be run on Storm or Spark Streaming * A look-forward query system - operates on data that arrive after the query is submitted @@ -60,11 +60,11 @@ To set up Bullet on a real data stream, you need: # Querying in Bullet -Bullet queries allow you to filter, project and aggregate data. You can also specify a window to get incremental results. Bullet lets you fetch raw (the individual data records) as well as aggregated data. +Bullet queries allow you to filter, project and aggregate data. You can also specify a window to get incremental results. We support basically first-order SQL (no joins or nested queries). Bullet lets you fetch raw (the individual data records) as well as aggregated data. * See the [UI Usage section](ui/usage.md) for using the UI to build Bullet queries. This is the same UI you will build in the Quick Starts. -* See the API section ([BQL](ws/api-bql.md), or the more verbose, underlying query format - [JSON](ws/api-json.md)) for building Bullet API queries +* See the API section ([API](ws/api.md) for building Bullet API queries * For examples using the API, see [Examples](ws/examples.md). These are actual albeit cleansed queries sourced from the instance at Yahoo. @@ -75,55 +75,7 @@ A Bullet query terminates and returns whatever has been collected so far when: 1. A maximum duration is reached. In other words, a query runs for a defined time window (which can be infinite). 2. A maximum number of records is reached (only applicable for queries that are fetching raw data records and not aggregating). -## Filters - -Bullet supports two kinds of filters: - -| Filter Type | Meaning | -| ------------------ | ------- | -| Logical filter | Allow you to combine filter clauses (Logical or Relational) with logical operations like AND, OR and NOTs | -| Relational filters | Allow you to use comparison operations like equals, not equals, greater than, less than, regex like etc, on fields | - -## Projections - -Projections allow you to pull out only the fields needed and rename them when you are querying for raw data records. - -## Aggregations - -Aggregations allow you to perform some operation on the collected records. - -The current aggregation types that are supported are: - -| Aggregation | Meaning | -| -------------- | ------- | -| GROUP | The resulting output would be a record containing the result of an operation for each unique value combination in your specified fields | -| COUNT DISTINCT | Computes the number of distinct elements in the fields. (May be approximate) | -| LIMIT or RAW | The resulting output would be at most the number specified in size. | -| DISTRIBUTION | Computes distributions of the elements in the field. E.g. Find the median value or various percentile of a field, or get frequency or cumulative frequency distributions | -| TOP K | Returns the top K most frequently appearing values in the column | - -Currently we support ```GROUP``` aggregations with the following operations: - -| Operation | Meaning | -| -------------- | ------- | -| COUNT | Computes the number of the elements in the group | -| SUM | Computes the sum of the non-null values in the provided field for all elements in the group | -| MIN | Returns the minimum of the non-null values in the provided field for all the elements in the group | -| MAX | Returns the maximum of the non-null values in the provided field for all the elements in the group | -| AVG | Computes the average of the non-null values in the provided field for all the elements in the group | - -If you ```GROUP``` with no operation, you are performing a ```DISTINCT``` on the field(s). If you ```GROUP``` with no field(s), you are performing the operation(s) across all your data. - -## Post Aggregations - -Post Aggregations let you perform some operation before finalizing and returning the results to you. This is applied every time a result is returned to you (see below). The current operations supported are: - -| Post Aggregation | Meaning | -| ---------------- | ------- | -| ORDER BY | Orders your result by your specified fields in ascending or descending order | -| COMPUTATION | Specify an expression (can be nested expressions) [here](ws/api-json.md#expressions) to do math with or cast fields in your result | - -## Windows +## Windowing Windows in a Bullet query allow you to specify how often you'd like Bullet to return results. @@ -151,9 +103,9 @@ We also use Sketches as a way to control high cardinality grouping (group by a n ## End-to-End Architecture -![Overall Architecture](img/overallarch-2.png) +![Overall Architecture](img/overallarch-3.svg) -The image above shows how the various pieces of the Bullet interact at a high-level. All these layers are modular and pluggable. You can choose an implementation for the Backend and the PubSub (or create your own). The core of Bullet is abstracted into a [library](https://github.com/yahoo/bullet-core) that can be reused to implement the Backend, Web Service and PubSub layers in a platform agnostic manner. +The image above shows how the various pieces of the Bullet interact at a high-level. All these layers are modular and pluggable. Some, like the persistence layer for queries, are optional. You can choose an implementation for the Backend and the PubSub (or create your own). The core of Bullet is abstracted into a [library](https://github.com/yahoo/bullet-core) that can be reused to implement the Backend, Web Service and PubSub layers in a platform agnostic manner. --- diff --git a/docs/quick-start/spark.md b/docs/quick-start/spark.md index ae43bedb..350fbd76 100644 --- a/docs/quick-start/spark.md +++ b/docs/quick-start/spark.md @@ -37,7 +37,7 @@ mkdir -p $BULLET_HOME/pubsub mkdir -p $BULLET_HOME/service mkdir -p $BULLET_HOME/ui cd $BULLET_HOME -curl -LO https://github.com/bullet-db/bullet-db.github.io/releases/download/v0.6.1/examples_artifacts.tar.gz +curl -LO https://github.com/bullet-db/bullet-db.github.io/releases/download/v1.0.0/examples_artifacts.tar.gz tar -xzf examples_artifacts.tar.gz export BULLET_EXAMPLES=$BULLET_HOME/bullet-examples ``` @@ -50,10 +50,10 @@ For this instance of Bullet we will use the Kafka PubSub implementation found in ```bash cd $BULLET_HOME/pubsub -curl -Lo bullet-kafka.jar http://jcenter.bintray.com/com/yahoo/bullet/bullet-kafka/0.3.2/bullet-kafka-0.3.2-fat.jar -curl -LO https://archive.apache.org/dist/kafka/0.11.0.1/kafka_2.12-0.11.0.1.tgz -tar -xzf kafka_2.12-0.11.0.1.tgz -export KAFKA_DIR=$BULLET_HOME/pubsub/kafka_2.12-0.11.0.1 +curl -Lo bullet-kafka.jar http://jcenter.bintray.com/com/yahoo/bullet/bullet-kafka/1.0.1/bullet-kafka-1.0.1-fat.jar +curl -LO https://archive.apache.org/dist/kafka/2.3.1/kafka_2.12-2.3.1.tgz +tar -xzf kafka_2.12-2.3.1.tgz +export KAFKA_DIR=$BULLET_HOME/pubsub/kafka_2.12-2.3.1 ``` #### Step 3: Start Zookeeper @@ -81,22 +81,22 @@ $KAFKA_DIR/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication ### Setup Bullet Backend on Spark -We will run the bullet-spark backend using [Spark 2.2.1](https://spark.apache.org/releases/spark-release-2-2-1.html). +We will run the bullet-spark backend using [Spark 3.0.1](https://spark.apache.org/releases/spark-release-3-0-1.html). -#### Step 6: Install Spark 2.2.1 +#### Step 6: Install Spark 3.0.1 ```bash export BULLET_SPARK=$BULLET_HOME/backend/spark cd $BULLET_SPARK -curl -O https://archive.apache.org/dist/spark/spark-2.2.1/spark-2.2.1-bin-hadoop2.7.tgz -tar -xzf spark-2.2.1-bin-hadoop2.7.tgz +curl -O https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz +tar -xzf spark-3.0.1-bin-hadoop2.7.tgz ``` #### Step 7: Setup Bullet-Spark and Example Data Producer ```bash cp $BULLET_HOME/bullet-examples/backend/spark/* $BULLET_SPARK -curl -Lo bullet-spark.jar http://jcenter.bintray.com/com/yahoo/bullet/bullet-spark/0.2.2/bullet-spark-0.2.2-standalone.jar +curl -Lo bullet-spark.jar http://jcenter.bintray.com/com/yahoo/bullet/bullet-spark/1.0.0/bullet-spark-1.0.0-standalone.jar ``` #### Step 8: Launch the Bullet Spark Backend @@ -104,7 +104,7 @@ curl -Lo bullet-spark.jar http://jcenter.bintray.com/com/yahoo/bullet/bullet-spa Run this multi-line command (new lines are escaped): ```bash -$BULLET_SPARK/spark-2.2.1-bin-hadoop2.7/bin/spark-submit \ +$BULLET_SPARK/spark-3.0.1-bin-hadoop2.7/bin/spark-submit \ --master local[10] \ --class com.yahoo.bullet.spark.BulletSparkStreamingMain \ --jars $BULLET_HOME/pubsub/bullet-kafka.jar,$BULLET_SPARK/bullet-spark-example.jar \ @@ -121,8 +121,9 @@ The Backend will usually be up and running usually within 5-10 seconds. Once it ```bash cd $BULLET_HOME/service -curl -Lo bullet-service.jar http://jcenter.bintray.com/com/yahoo/bullet/bullet-service/0.4.3/bullet-service-0.4.3-embedded.jar +curl -Lo bullet-service.jar http://jcenter.bintray.com/com/yahoo/bullet/bullet-service/1.0.0/bullet-service-1.0.0-embedded.jar cp $BULLET_EXAMPLES/web-service/example_kafka_pubsub_config.yaml $BULLET_HOME/service/ +cp $BULLET_EXAMPLES/web-service/example_query_config.yaml $BULLET_HOME/service/ cp $BULLET_EXAMPLES/web-service/example_columns.json $BULLET_HOME/service/ ``` @@ -133,6 +134,7 @@ Run this multi-line command (new lines are escaped): ```bash java -Dloader.path=$BULLET_HOME/pubsub/bullet-kafka.jar -jar bullet-service.jar \ --bullet.pubsub.config=$BULLET_HOME/service/example_kafka_pubsub_config.yaml \ + --bullet.query.config=${BULLET_HOME}/service/example_query_config.yaml \ --bullet.schema.file=$BULLET_HOME/service/example_columns.json \ --server.port=9999 \ --logging.path=. \ @@ -148,7 +150,7 @@ curl -s http://localhost:9999/api/bullet/columns ``` ```bash -curl -s -H 'Content-Type: text/plain' -X POST -d '{"aggregation": {"size": 1}}' http://localhost:9999/api/bullet/sse-query +curl -s -H 'Content-Type: text/plain' -X POST -d 'SELECT * FROM STREAM(2000, TIME) LIMIT 1;' http://localhost:9999/api/bullet/queries/sse-query ``` This query will return a result JSON containing a "records" field containing a single record, and a "meta" field with some meta information. @@ -165,17 +167,17 @@ You can also check the status of the Web Service by looking at the Web Service l ```bash cd $BULLET_HOME/ui -curl -s https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash +curl -s https://raw.githubusercontent.com/creationix/nvm/v0.37.2/install.sh | bash source ~/.bashrc -nvm install v6.9.4 -nvm use v6.9.4 +nvm install v10.20.1 +nvm use v10.20.1 ``` #### Step 13: Install the Bullet UI ```bash -curl -LO https://github.com/bullet-db/bullet-ui/releases/download/v0.6.2/bullet-ui-v0.6.2.tar.gz -tar -xzf bullet-ui-v0.6.2.tar.gz +curl -LO https://github.com/bullet-db/bullet-ui/releases/download/v1.0.0/bullet-ui-v1.0.0.tar.gz +tar -xzf bullet-ui-v1.0.0.tar.gz cp $BULLET_EXAMPLES/ui/env-settings.json config/ ``` @@ -227,7 +229,7 @@ This section will go over the various custom pieces this example plugged into Bu The Spark Streaming application we ran was Bullet plugged in with a custom Receiver in our implementation of the Bullet Spark DataProducer trait. This Receiver and DataProducer are implemented in this [example project](https://github.com/bullet-db/bullet-db.github.io/blob/src/examples/spark/) and was already built for you when you [downloaded the examples](#step-1-setup-directories-and-examples). It does not read from any data source and just produces random, structured data. It also produces only up to a maximum number of records in a given period. Both this maximum and the length of a period are configured in the Receiver (at most 100 every 1 second). ```bash -$BULLET_SPARK/spark-2.2.1-bin-hadoop2.7/bin/spark-submit \ +$BULLET_SPARK/spark-3.0.1-bin-hadoop2.7/bin/spark-submit \ --master local[10] \ --class com.yahoo.bullet.spark.BulletSparkStreamingMain \ --jars $BULLET_HOME/pubsub/bullet-kafka.jar,$BULLET_SPARK/bullet-spark-example.jar \ @@ -248,74 +250,74 @@ The settings defined by ```--bullet-spark-conf=$BULLET_SPARK/bullet_spark_kafka_ Let's look at the [custom Receiver code](https://github.com/bullet-db/bullet-db.github.io/blob/src/examples/spark/src/main/scala/com/yahoo/bullet/spark/examples/receiver/RandomReceiver.scala) that generates the data. ```scala - private def receive(): Unit = { - nextIntervalStart = System.currentTimeMillis() - while (!isStopped) { - val timeNow = System.currentTimeMillis() - // Only emit if we are still in the interval and haven't gone over our per period max - if (timeNow <= nextIntervalStart && generatedThisPeriod < maxPerPeriod) { - store(generateRecord()) - generatedThisPeriod += 1 - } - if (timeNow > nextIntervalStart) { - logger.info("Generated {} tuples out of {}", generatedThisPeriod, maxPerPeriod) - nextIntervalStart = timeNow + period - generatedThisPeriod = 0 - periodCount += 1 - } - // It is courteous to sleep for a short time. - try { - Thread.sleep(1) - } catch { - case e: InterruptedException => logger.error("Error: ", e) + private def receive(): Unit = { + nextIntervalStart = System.currentTimeMillis() + while (!isStopped) { + val timeNow = System.currentTimeMillis() + // Only emit if we are still in the interval and haven't gone over our per period max + if (timeNow <= nextIntervalStart && generatedThisPeriod < maxPerPeriod) { + store(generateRecord()) + generatedThisPeriod += 1 + } + if (timeNow > nextIntervalStart) { + logger.info("Generated {} tuples out of {}", generatedThisPeriod, maxPerPeriod) + nextIntervalStart = timeNow + period + generatedThisPeriod = 0 + periodCount += 1 + } + // It is courteous to sleep for a short time. + try { + Thread.sleep(1) + } catch { + case e: InterruptedException => logger.error("Error: ", e) + } } } - } ``` This method above emits the data. This method is wrapped in a thread that is called by the Spark framework. This function only emits at most the given maximum tuples per period. ```scala - private def makeRandomMap: Map[java.lang.String, java.lang.String] = { - val randomMap = new HashMap[java.lang.String, java.lang.String](2) - randomMap.put(RandomReceiver.RANDOM_MAP_KEY_A, RandomReceiver.STRING_POOL(Random.nextInt(RandomReceiver.STRING_POOL.length))) - randomMap.put(RandomReceiver.RANDOM_MAP_KEY_B, RandomReceiver.STRING_POOL(Random.nextInt(RandomReceiver.STRING_POOL.length))) - randomMap - } + private def makeRandomMap: Map[java.lang.String, java.lang.String] = { + val randomMap = new HashMap[java.lang.String, java.lang.String](2) + randomMap.put(RandomReceiver.RANDOM_MAP_KEY_A, RandomReceiver.STRING_POOL(Random.nextInt(RandomReceiver.STRING_POOL.length))) + randomMap.put(RandomReceiver.RANDOM_MAP_KEY_B, RandomReceiver.STRING_POOL(Random.nextInt(RandomReceiver.STRING_POOL.length))) + randomMap + } - private def generateRecord(): BulletRecord = { - val record = new SimpleBulletRecord() - val uuid = UUID.randomUUID().toString - record.setString(RandomReceiver.STRING, uuid) - record.setLong(RandomReceiver.LONG, generatedThisPeriod) - record.setDouble(RandomReceiver.DOUBLE, Random.nextDouble()) - record.setDouble(RandomReceiver.GAUSSIAN, Random.nextGaussian()) - record.setString(RandomReceiver.TYPE, RandomReceiver.STRING_POOL(Random.nextInt(RandomReceiver.STRING_POOL.length))) - record.setLong(RandomReceiver.DURATION, System.nanoTime() % RandomReceiver.INTEGER_POOL(Random.nextInt(RandomReceiver.INTEGER_POOL.length))) - - // Don't use Scala Map and convert it by asJava when calling setxxxMap method in BulletRecord. - // It converts Scala Map to scala.collection.convert.Wrappers$MapWrapper which is not serializable in scala 2.11.x (https://issues.scala-lang.org/browse/SI-8911). - - record.setStringMap(RandomReceiver.SUBTYPES_MAP, makeRandomMap); - - val booleanMap = new HashMap[java.lang.String, java.lang.Boolean](4) - booleanMap.put(uuid.substring(0, 8), Random.nextBoolean()) - booleanMap.put(uuid.substring(9, 13), Random.nextBoolean()) - booleanMap.put(uuid.substring(14, 18), Random.nextBoolean()) - booleanMap.put(uuid.substring(19, 23), Random.nextBoolean()) - record.setBooleanMap(RandomReceiver.BOOLEAN_MAP, booleanMap) - - - val statsMap = new HashMap[java.lang.String, java.lang.Long](4) - statsMap.put(RandomReceiver.PERIOD_COUNT, periodCount) - statsMap.put(RandomReceiver.RECORD_NUMBER, periodCount * maxPerPeriod + generatedThisPeriod) - statsMap.put(RandomReceiver.NANO_TIME, System.nanoTime()) - statsMap.put(RandomReceiver.TIMESTAMP, System.nanoTime()) - record.setLongMap(RandomReceiver.STATS_MAP, statsMap) - - record.setListOfStringMap(RandomReceiver.LIST, asList(makeRandomMap, makeRandomMap)) - record - } + private def generateRecord(): BulletRecord[_ <: java.io.Serializable] = { + val record = new TypedSimpleBulletRecord() + val uuid = UUID.randomUUID().toString + record.setString(RandomReceiver.STRING, uuid) + record.setLong(RandomReceiver.LONG, generatedThisPeriod) + record.setDouble(RandomReceiver.DOUBLE, Random.nextDouble()) + record.setDouble(RandomReceiver.GAUSSIAN, Random.nextGaussian()) + record.setString(RandomReceiver.TYPE, RandomReceiver.STRING_POOL(Random.nextInt(RandomReceiver.STRING_POOL.length))) + record.setLong(RandomReceiver.DURATION, System.nanoTime() % RandomReceiver.INTEGER_POOL(Random.nextInt(RandomReceiver.INTEGER_POOL.length))) + + // Don't use Scala Map and convert it by asJava when calling setxxxMap method in BulletRecord. + // It converts Scala Map to scala.collection.convert.Wrappers$MapWrapper which is not serializable in scala 2.11.x (https://issues.scala-lang.org/browse/SI-8911). + + record.setStringMap(RandomReceiver.SUBTYPES_MAP, makeRandomMap); + + val booleanMap = new HashMap[java.lang.String, java.lang.Boolean](4) + booleanMap.put(uuid.substring(0, 8), Random.nextBoolean()) + booleanMap.put(uuid.substring(9, 13), Random.nextBoolean()) + booleanMap.put(uuid.substring(14, 18), Random.nextBoolean()) + booleanMap.put(uuid.substring(19, 23), Random.nextBoolean()) + record.setBooleanMap(RandomReceiver.BOOLEAN_MAP, booleanMap) + + + val statsMap = new HashMap[java.lang.String, java.lang.Long](4) + statsMap.put(RandomReceiver.PERIOD_COUNT, periodCount) + statsMap.put(RandomReceiver.RECORD_NUMBER, periodCount * maxPerPeriod + generatedThisPeriod) + statsMap.put(RandomReceiver.NANO_TIME, System.nanoTime()) + statsMap.put(RandomReceiver.TIMESTAMP, System.nanoTime()) + record.setLongMap(RandomReceiver.STATS_MAP, statsMap) + + record.setListOfStringMap(RandomReceiver.LIST, asList(makeRandomMap, makeRandomMap)) + record + } ``` This ```generateRecord``` method generates some fields randomly and inserts them into a BulletRecord (simple). Note that the BulletRecord is typed and all data must be inserted with the proper types. @@ -342,7 +344,7 @@ class RandomProducer extends DataProducer { } ``` -If you put Bullet on your data, you will need to write a DataProducer (or a full on Spark DAG if your reading is complex), that reads from your data source and emits a DStream of BulletRecords with the fields you wish to be query-able similar to this example. +If you put Bullet on your data, you will need to write a DataProducer (or a full on Spark DAG if your reading is complex), that reads from your data source and emits a DStream of BulletRecords with the fields you wish to be query-able similar to this example, or you can use [Bullet DSL to configure and plug in](../backend/spark-setup.md#using-bullet-dsl) a DSL based receiver that uses the Bullet DSL's Connector -> Serializer -> Converter system to read and convert your dataset without having to write code! ### PubSub @@ -410,8 +412,9 @@ Finally, we configured the UI with the custom environment specific settings file { "default": { "queryHost": "http://localhost:9999", - "queryNamespace": "api/bullet", + "queryNamespace": "api/bullet/queries", "queryPath": "ws-query", + "validationPath": "validate-query", "queryStompRequestChannel": "/server/request", "queryStompResponseChannel": "/client/response", "schemaHost": "http://localhost:9999", @@ -423,14 +426,14 @@ Finally, we configured the UI with the custom environment specific settings file } ], "bugLink": "https://github.com/bullet-db/bullet-ui/issues", - "modelVersion": 3, + "modelVersion": 4, "migrations": { "deletions": "query" }, "defaultValues": { "aggregationMaxSize": 1024, "rawMaxSize": 500, - "durationMaxSecs": 86400, + "durationMaxSecs": 9007199254740, "distributionNumberOfPoints": 11, "distributionQuantilePoints": "0, 0.25, 0.5, 0.75, 0.9, 1", "distributionQuantileStart": 0, @@ -438,7 +441,7 @@ Finally, we configured the UI with the custom environment specific settings file "distributionQuantileIncrement": 0.1, "windowEmitFrequencyMinSecs": 1, "everyForRecordBasedWindow": 1, - "everyForTimeBasedWindow": 2, + "everyForTimeBasedWindow": 2000, "sketches": { "countDistinctMaxEntries": 16384, "groupByMaxEntries": 512, diff --git a/docs/quick-start/storm.md b/docs/quick-start/storm.md index 69e8897e..45da0dde 100644 --- a/docs/quick-start/storm.md +++ b/docs/quick-start/storm.md @@ -4,15 +4,15 @@ This section gets you running a mock instance of Bullet to play around with. The At the end of this section, you will have: - * Setup the Bullet topology using a custom spout on [bullet-storm-0.8.5](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.5) - * Setup the [Web Service](../ws/setup.md) talking to the topology and serving a schema for your UI using [bullet-service-0.4.3](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-0.4.3) - * Setup the [REST PubSub](../pubsub/rest.md) talking to the topology and Web Service using [bullet-core-0.6.4](https://github.com/bullet-db/bullet-core/releases/tag/bullet-core-0.6.4). - * Setup the [UI](../ui/setup.md) talking to the Web Service using [bullet-ui-0.6.2](https://github.com/bullet-db/bullet-ui/releases/tag/v0.6.2) + * Setup the Bullet topology using a custom spout on [bullet-storm-1.0.0](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-1.0.0) + * Setup the [Web Service](../ws/setup.md) talking to the topology and serving a schema for your UI using [bullet-service-1.0.0](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-1.0.0) + * Setup the [REST PubSub](../pubsub/rest.md) talking to the topology and Web Service using [bullet-core-1.2.0](https://github.com/bullet-db/bullet-core/releases/tag/bullet-core-1.2.0). + * Setup the [UI](../ui/setup.md) talking to the Web Service using [bullet-ui-1.0.0](https://github.com/bullet-db/bullet-ui/releases/tag/v1.0.0) **Prerequisites** * You will need to be on an Unix-based system (Mac OS X, Ubuntu ...) with ```curl``` installed - * You will need [JDK 8](http://www.oracle.com/technetwork/java/javase/downloads/index.html) installed + * You will need [JDK 8+](http://www.oracle.com/technetwork/java/javase/downloads/index.html) installed * You will need enough CPU and RAM on your machine to run about 8-10 JVMs in ```server``` mode. You should have at least 2 GB free space on your disk. We will be setting up a Storm cluster with multiple components, an embedded Tomcat server and a Node server. ## Install Script @@ -43,18 +43,18 @@ mkdir -p $BULLET_HOME/backend/storm mkdir -p $BULLET_HOME/service mkdir -p $BULLET_HOME/ui cd $BULLET_HOME -curl -LO https://github.com/bullet-db/bullet-db.github.io/releases/download/v0.6.1/examples_artifacts.tar.gz +curl -LO https://github.com/bullet-db/bullet-db.github.io/releases/download/v1.0.0/examples_artifacts.tar.gz tar -xzf examples_artifacts.tar.gz export BULLET_EXAMPLES=$BULLET_HOME/bullet-examples ``` -#### Step 2: Install Storm 1.2 +#### Step 2: Install Storm 2.2 ```bash cd $BULLET_HOME/backend -curl -O http://apache.org/dist/storm/apache-storm-1.2.2/apache-storm-1.2.2.zip -unzip apache-storm-1.2.2.zip -export PATH=$(pwd)/apache-storm-1.2.2/bin/:$PATH +curl -O http://apache.org/dist/storm/apache-storm-2.2.0/apache-storm-2.2.0.zip +unzip apache-storm-2.2.0.zip +export PATH=$(pwd)/apache-storm-2.2.0/bin/:$PATH ``` #### Step 3: Launch Storm components @@ -78,7 +78,7 @@ Once everything is up without errors, visit [http://localhost:8080](http://local ### Setting up the example Bullet topology -Now that Storm is up and running, we can put Bullet on it. We will use an example Spout that runs on Bullet 0.8.3 on our Storm cluster. The source is available [here](https://github.com/bullet-db/bullet-db.github.io/blob/src/examples/storm). This was part of the artifact that you installed in Step 1. +Now that Storm is up and running, we can put Bullet on it. We will use an example spout that runs on Bullet 1.2.0 on our Storm cluster. The source is available [here](https://github.com/bullet-db/bullet-db.github.io/blob/src/examples/storm). This was part of the artifact that you installed in Step 1. #### Step 4: Setup the Storm example @@ -92,8 +92,6 @@ cp $BULLET_EXAMPLES/backend/storm/* $BULLET_HOME/backend/storm ```bullet.query.aggregation.raw.max.size: 500``` The max ```RAW``` records you can fetch is 500. - ```bullet.query.aggregation.max.size: 1024``` The max records you can fetch for any query is 1024. - ```bullet.query.aggregation.count.distinct.sketch.entries: 16384``` We can count 16384 unique values exactly. Approximates after. ```bullet.query.aggregation.group.sketch.entries: 1024``` The max unique groups can be 1024. Uniform sample after. @@ -153,23 +151,30 @@ curl -s -H 'Content-Type: text/plain' -X POST -d '{"aggregation": {"size": 1}}' curl -s http://localhost:9999/api/bullet/columns ``` +!!! note "Settings" + + Take a look at example_query_settings.yaml for the settings that are being overridden for this example. You can add or change the query settings (used by BQL when creating the query) by referring to [core Bullet settings in bullet_defaults.yaml](https://github.com/bullet-db/bullet-core/blob/master/src/main/resources/bullet_defaults.yaml). We have [customized these settings](https://github.com/bullet-db/bullet-db.github.io/blob/src/examples/web-service/example_query_settings.yaml): + + ```bullet.query.aggregation.max.size: 1024``` The max records you can fetch for any query is 1024. + + ### Setting up the Bullet UI #### Step 8: Install Node ```bash -curl -s https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash +curl -s https://raw.githubusercontent.com/creationix/nvm/v0.37.2/install.sh | bash source ~/.bashrc -nvm install v6.9.4 -nvm use v6.9.4 +nvm install v10.20.1 +nvm use v10.20.1 ``` #### Step 9: Install the Bullet UI ```bash cd $BULLET_HOME/ui -curl -LO https://github.com/bullet-db/bullet-ui/releases/download/v0.6.2/bullet-ui-v0.6.2.tar.gz -tar -xzf bullet-ui-v0.6.2.tar.gz +curl -LO https://github.com/bullet-db/bullet-ui/releases/download/v1.0.0/bullet-ui-v1.0.0.tar.gz +tar -xzf bullet-ui-v1.0.0.tar.gz cp $BULLET_EXAMPLES/ui/env-settings.json config/ ``` @@ -203,7 +208,7 @@ If you were performing the steps yourself, you can also manually cleanup **all t | -------------- | ---------------------------------------------------------------- | | UI | ```pkill -f [e]xpress-server.js``` | | Web Service | ```pkill -f [e]xample_rest_pubsub_config.yaml``` | -| Storm | ```pkill -f [a]pache-storm-1.2.2``` | +| Storm | ```pkill -f [a]pache-storm-2.2.0``` | | File System | ```rm -rf $BULLET_HOME /tmp/dev-storm-zookeeper``` | This does *not* delete ```$HOME/.nvm``` and some extra lines nvm may have added to your ```$HOME/{.profile, .bash_profile, .zshrc, .bashrc}```. @@ -228,7 +233,7 @@ storm jar bullet-storm-example-1.0-SNAPSHOT-jar-with-dependencies.jar \ ... ``` -This command launches the jar (an uber or "fat" jar) containing the custom spout code and all dependencies you copied in Step 5. We pass the name of your spout class with ```--bullet-spout com.yahoo.bullet.storm.examples.RandomSpout``` to the Bullet main class ```com.yahoo.bullet.Topology``` with two arguments ```--bullet-spout-arg 20``` and ```--bullet-spout-arg 101```. The first argument tells the Spout to generate at most 20 tuples (records) in a period and the second argument says a period is 101 ms long. +This command launches the jar (an uber or "fat" jar) containing the custom spout code and all dependencies you copied in Step 5. We pass the name of your spout class with ```--bullet-spout com.yahoo.bullet.storm.examples.RandomSpout``` to the Bullet main class ```com.yahoo.bullet.Topology``` with two arguments ```--bullet-spout-arg 20``` and ```--bullet-spout-arg 101```. The first argument tells the spout to generate at most 20 tuples (records) in a period and the second argument says a period is 101 ms long. The settings defined by ```--bullet-conf ./bullet_settings.yaml``` and the arguments here run all components in the topology with a parallelism of 1. So there will be one spout that is producing ~200 rps. @@ -313,7 +318,7 @@ private BulletRecord generateRecord() { This ```generateRecord``` method generates some fields randomly and inserts them into a BulletRecord. Note that the BulletRecord is typed and all data must be inserted with the proper types. -If you put Bullet on your data, you will need to write a Spout (or a topology if your reading is complex), that reads from your data source and emits BulletRecords with the fields you wish to be query-able placed into a BulletRecord similar to this example. +If you put Bullet on your data, you will need to write a spout (or a topology if your reading is complex), that reads from your data source and emits BulletRecords with the fields you wish to be query-able placed into a BulletRecord similar to this example. ### PubSub @@ -386,8 +391,9 @@ Finally, we configured the UI with the custom environment specific settings file { "default": { "queryHost": "http://localhost:9999", - "queryNamespace": "api/bullet", + "queryNamespace": "api/bullet/queries", "queryPath": "ws-query", + "validationPath": "validate-query", "queryStompRequestChannel": "/server/request", "queryStompResponseChannel": "/client/response", "schemaHost": "http://localhost:9999", @@ -399,14 +405,14 @@ Finally, we configured the UI with the custom environment specific settings file } ], "bugLink": "https://github.com/bullet-db/bullet-ui/issues", - "modelVersion": 3, + "modelVersion": 4, "migrations": { "deletions": "query" }, "defaultValues": { "aggregationMaxSize": 1024, "rawMaxSize": 500, - "durationMaxSecs": 86400, + "durationMaxSecs": 9007199254740, "distributionNumberOfPoints": 11, "distributionQuantilePoints": "0, 0.25, 0.5, 0.75, 0.9, 1", "distributionQuantileStart": 0, @@ -414,7 +420,7 @@ Finally, we configured the UI with the custom environment specific settings file "distributionQuantileIncrement": 0.1, "windowEmitFrequencyMinSecs": 1, "everyForRecordBasedWindow": 1, - "everyForTimeBasedWindow": 2, + "everyForTimeBasedWindow": 2000, "sketches": { "countDistinctMaxEntries": 16384, "groupByMaxEntries": 512, diff --git a/docs/releases.md b/docs/releases.md index c05a238e..58a5d729 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -10,7 +10,7 @@ API (Java and Scala) docs can also be found for the releases below. ## Download -For downloading any artifact listed below manually, you should preferably use the [**JCenter mirror here**](https://jcenter.bintray.com/com/yahoo/bullet/). For resolving artifacts in your build tool, follow the directions in each of the components' Package Manager Setup sections. +For downloading any artifact listed below manually, you should preferably use the [**JCenter mirror here**](https://jcenter.bintray.com/com/yahoo/bullet/). For resolving artifacts in your build tool, follow the direcions in each of the components' Package Manager Setup sections. ----- @@ -30,6 +30,7 @@ The core Bullet logic (a library) that can be used to implement Bullet on differ | Date | Release | Highlights | APIDocs | | ------------ | ------------------------------------------------------------------------------------- | ---------- | ------- | +| 2021-01-04 | [**1.2.0**](https://github.com/bullet-db/bullet-core/releases/tag/bullet-core-1.2.0) | Storage layer updates and extensions | [JavaDocs](apidocs/bullet-core/1.2.0/index.html) | | 2020-10-30 | [**1.1.0**](https://github.com/bullet-db/bullet-core/releases/tag/bullet-core-1.1.0) | Ternary Logic, Bullet Record 1.1 | [JavaDocs](apidocs/bullet-core/1.1.0/index.html) | | 2020-10-02 | [**1.0.0**](https://github.com/bullet-db/bullet-core/releases/tag/bullet-core-1.0.0) | Major release - Expressions, Storage, Async queries, No JSON queries | [JavaDocs](apidocs/bullet-core/1.0.0/index.html) | | 2019-02-01 | [**0.6.6**](https://github.com/bullet-db/bullet-core/releases/tag/bullet-core-0.6.6) | QueryManager partition leak cleanup | [JavaDocs](apidocs/bullet-core/0.6.6/index.html) | @@ -85,14 +86,14 @@ The implementation of Bullet on Storm. Due to major API changes between Storm <= | Date | Storm 1.0+ | Storm 0.10 | Highlights | APIDocs | | ------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ---------- | ------- | -| 2021-01-01 | [**1.0.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-1.0.0) | - | Bullet Core 1.1, Replay, Storage | [JavaDocs](apidocs/bullet-storm/1.0.0/index.html) | +| 2021-01-12 | [**1.0.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-1.0.0) | - | Bullet Core 1.1, Replay, Storage | [JavaDocs](apidocs/bullet-storm/1.0.0/index.html) | | 2019-02-07 | [**0.9.1**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.9.1) | [**0.9.1**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.9.1) | Bullet DSL 0.1.2 and packaging fixes | [JavaDocs](apidocs/bullet-storm/0.9.1/index.html) | | 2019-02-07 | [**0.9.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.9.0) | [**0.9.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.9.0) | Bullet DSL support! | [JavaDocs](apidocs/bullet-storm/0.9.0/index.html) | | 2018-11-26 | [**0.8.5**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.5) | [**0.8.5**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.5) | Extended field notation and updates bullet-core to 0.6.4| [JavaDocs](apidocs/bullet-storm/0.8.5/index.html) | | 2018-11-20 | [**0.8.4**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.4) | [**0.8.4**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.4) | Partitioning and updates bullet-core to 0.6.2 | [JavaDocs](apidocs/bullet-storm/0.8.4/index.html) | | 2018-06-18 | [**0.8.3**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.3) | [**0.8.3**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.3) | Using new bullet-record and bullet-core supporting Integer and Float data types | [JavaDocs](apidocs/bullet-storm/0.8.3/index.html) | -| 2018-04-12 | [**0.8.2**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.2) | [**0.8.2**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.2) | Delaying query start in Join Bolt | | -| 2018-04-04 | [**0.8.1**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.1) | [**0.8.1**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.1) | Fixed bug in JoinBolt | | +| 2018-04-12 | [**0.8.2**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.2) | [**0.8.2**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.2) | Delaying query start in Join bolt | | +| 2018-04-04 | [**0.8.1**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.1) | [**0.8.1**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.1) | Fixed bug in Joinbolt | | | 2018-03-30 | [**0.8.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.8.0) | [**0.8.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.8.0) | Supports windowing / incremental updates | | | 2017-11-07 | [**0.7.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.7.0) | [**0.7.0**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.7.0) | Merge Query and Metadata Streams | | | 2017-10-24 | [**0.6.2**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.6.2) | [**0.6.2**](https://github.com/bullet-db/bullet-storm/releases/tag/bullet-storm-0.10-0.6.2) | Adds a fat jar for using the DRPC PubSub in the Web Service | | @@ -125,7 +126,7 @@ The implementation of Bullet on Spark Streaming. | Date | Release | Highlights | APIDocs | | ------------ | --------------------------------------------------------------------------------- | ---------- | ------- | -| 2021-01-01 | [**1.0.0**](https://github.com/bullet-db/bullet-spark/releases/tag/bullet-spark-1.0.0) | Bullet Core 1.1, Storage | [SparkDocs](apidocs/bullet-spark/1.0.0/index.html) | +| 2021-02-12 | [**1.0.0**](https://github.com/bullet-db/bullet-spark/releases/tag/bullet-spark-1.0.0) | Bullet Core 1.2, DSL | [SparkDocs](apidocs/bullet-spark/1.0.0/index.html) | | 2019-02-07 | [**0.2.2**](https://github.com/bullet-db/bullet-spark/releases/tag/bullet-spark-0.2.2) | Fixes a NPE in JoinStreaming for very short queries | [SparkDocs](apidocs/bullet-spark/0.2.2/index.html) | | 2018-11-26 | [**0.2.1**](https://github.com/bullet-db/bullet-spark/releases/tag/bullet-spark-0.2.1) | Uses bullet-core 0.6.4 and supports extended field notation in queries | [SparkDocs](apidocs/bullet-spark/0.2.1/index.html) | | 2018-11-16 | [**0.2.0**](https://github.com/bullet-db/bullet-spark/releases/tag/bullet-spark-0.2.0) | Uses bullet-core 0.6.1 and adds partitioning support | [SparkDocs](apidocs/bullet-spark/0.2.0/index.html) | @@ -153,7 +154,7 @@ The Web Service implementation that can serve a static schema from a file and ta | Date | Release | Highlights | APIDocs | | ------------ | -------------------------------------------------------------------------------------- | ---------- | ------- | -| 2021-01-01 | [**1.0.0**](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-0.5.0) | Async queries, Storage, Metrics, BQL only 1.0, Bullet Core 1.0 | [JavaDocs](apidocs/bullet-service/1.0.0/index.html) | +| 2021-01-12 | [**1.0.0**](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-1.0.0) | Async queries, Storage, Metrics, BQL only 1.0, Bullet Core 1.0 | [JavaDocs](apidocs/bullet-service/1.0.0/index.html) | | 2019-03-07 | [**0.5.0**](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-0.5.0) | QueryManager API updates | [JavaDocs](apidocs/bullet-service/0.5.0/index.html) | | 2018-11-28 | [**0.4.3**](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-0.4.3) | Updates bullet-bql to 0.2.1 | [JavaDocs](apidocs/bullet-service/0.4.3/index.html) | | 2018-11-26 | [**0.4.2**](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-0.4.2) | BQL to JSON endpoint, dead backend reaper, new types in Schema, bullet-core 0.6.4 | [JavaDocs](apidocs/bullet-service/0.4.2/index.html) | @@ -185,7 +186,7 @@ The Bullet UI that lets you build, run, save and visualize results from Bullet. | Date | Release | Highlights | | ------------ | -------------------------------------------------------------------------------------- | ---------- | -| 2021-01-01 | [**1.0.0**](https://github.com/bullet-db/bullet-ui/releases/tag/v1.0.0) | Ember 3 Octane, BQL support, new filter operators | +| 2021-01-12 | [**1.0.0**](https://github.com/bullet-db/bullet-ui/releases/tag/v1.0.0) | Ember 3 Octane, BQL support, new filter operators | | 2019-03-18 | [**0.6.2**](https://github.com/bullet-db/bullet-ui/releases/tag/v0.6.2) | Logo update | | 2018-10-05 | [**0.6.1**](https://github.com/bullet-db/bullet-ui/releases/tag/v0.6.1) | Timeseries Graphing, Bar, Pie Charts and FontAwesome | | 2018-07-20 | [**0.6.0**](https://github.com/bullet-db/bullet-ui/releases/tag/v0.6.0) | Supports adding a full default starting query | @@ -241,6 +242,8 @@ A DSL to plug data sources into the Bullet Backend and Web Service. | Date | Release | Highlights | APIDocs | | ------------ | ---------------------------------------------------------------------------------------- | ---------- | ------- | +| 2021-02-17 | [**1.1.0**](https://github.com/bullet-db/bullet-dsl/releases/tag/bullet-dsl-1.1.0) | JSONBulletRecordConverter | [JavaDocs](apidocs/bullet-dsl/1.1.0/index.html) | +| 2021-02-11 | [**1.0.1**](https://github.com/bullet-db/bullet-dsl/releases/tag/bullet-dsl-1.0.1) | Bullet Core 1.2, Unsets default connector/converter | [JavaDocs](apidocs/bullet-dsl/1.0.1/index.html) | | 2020-10-30 | [**1.0.0**](https://github.com/bullet-db/bullet-dsl/releases/tag/bullet-dsl-1.0.0) | Bullet Core 1.1, Types to match Bullet Record 1.1 | [JavaDocs](apidocs/bullet-dsl/1.0.0/index.html) | | 2019-02-07 | [**0.1.1**](https://github.com/bullet-db/bullet-dsl/releases/tag/bullet-dsl-0.1.1) | Interface consolidation, IdentityDeserializer | [JavaDocs](apidocs/bullet-dsl/0.1.1/index.html) | | 2019-02-05 | [**0.1.0**](https://github.com/bullet-db/bullet-dsl/releases/tag/bullet-dsl-0.1.0) | Bullet DSL, Fat jar, Interface refactors | [JavaDocs](apidocs/bullet-dsl/0.1.0/index.html) | @@ -262,6 +265,7 @@ A PubSub implementation using Kafka as the backing PubSub. Can be used with any | Date | Release | Highlights | APIDocs | | ------------ | ------------------------------------------------------------------------------------ | ---------- | ------- | +| 2021-02-17 | [**1.0.1**](https://github.com/bullet-db/bullet-kafka/releases/tag/bullet-kafka-1.0.1) | Bullet Core 1.2 | [JavaDocs](apidocs/bullet-kafka/1.0.1/index.html) | | 2020-10-30 | [**1.0.0**](https://github.com/bullet-db/bullet-kafka/releases/tag/bullet-kafka-1.0.0) | Bullet Core 1.1 | [JavaDocs](apidocs/bullet-kafka/1.0.0/index.html) | | 2018-12-17 | [**0.3.3**](https://github.com/bullet-db/bullet-kafka/releases/tag/bullet-kafka-0.3.3) | Removes adding unnecessary properties to Producers/Consumers | [JavaDocs](apidocs/bullet-kafka/0.3.3/index.html) | | 2018-11-26 | [**0.3.2**](https://github.com/bullet-db/bullet-kafka/releases/tag/bullet-kafka-0.3.2) | Uses bullet-core-0.6.4 | [JavaDocs](apidocs/bullet-kafka/0.3.2/index.html) | @@ -306,7 +310,8 @@ A library facilitating the conversion from Bullet BQL queries to Bullet queries. | Date | Release | Highlights | APIDocs | | ------------ | ------------------------------------------------------------------------------------ | ---------- | ------- | -| 2020-01-01 | [**1.0.0**](https://github.com/bullet-db/bullet-bql/releases/tag/bullet-bql-1.0.0) | Expressions, Schema integration, native queries instead of JSON | [JavaDocs](apidocs/bullet-bql/1.0.0/index.html) | +| 2021-01-04 | [**1.1.0**](https://github.com/bullet-db/bullet-bql/releases/tag/bullet-bql-1.1.0) | Updates Bullet Core to 1.2.0 | [JavaDocs](apidocs/bullet-bql/1.1.0/index.html) | +| 2021-01-04 | [**1.0.0**](https://github.com/bullet-db/bullet-bql/releases/tag/bullet-bql-1.0.0) | Expressions, Schema integration, native queries instead of JSON | [JavaDocs](apidocs/bullet-bql/1.0.0/index.html) | | 2018-11-28 | [**0.2.1**](https://github.com/bullet-db/bullet-bql/releases/tag/bullet-bql-0.2.1) | Extended field access notation | [JavaDocs](apidocs/bullet-bql/0.2.1/index.html) | | 2018-09-28 | [**0.2.0**](https://github.com/bullet-db/bullet-bql/releases/tag/bullet-bql-0.2.0) | Adds Post Aggregations and uses bullet-core-0.5.1 | [JavaDocs](apidocs/bullet-bql/0.2.0/index.html) | | 2018-09-06 | [**0.1.2**](https://github.com/bullet-db/bullet-bql/releases/tag/bullet-bql-0.1.2) | Supports CONTAINSKEY, CONTAINSVALUE, SIZEOF, comparing to other fields. Fixes some bugs | [JavaDocs](apidocs/bullet-bql/0.1.2/index.html) | diff --git a/docs/ui/setup.md b/docs/ui/setup.md index 91c9d5b9..5b39f1ec 100644 --- a/docs/ui/setup.md +++ b/docs/ui/setup.md @@ -76,14 +76,15 @@ The configuration for the UI lets you have different instances of Bullet for dif | queryHost | The end point (port included) of your Web Service machine that is talking to the Bullet backend | | queryNamespace | Any qualifiers you have after your host and port on your Web Service running on your ```queryHost``` | | queryPath | The path fragment after the ```queryNamespace``` on your Web Service running on your ```queryHost``` for the WebSocket endpoint | +| validationPath | The path fragment after the ```queryNamespace``` on your Web Service running on your ```queryHost``` for the Query Validation endpoint | | queryStompRequestChannel | The fragment after this is the Stomp Request channel as configured in your Web Service for the WebSocket endpoint | | queryStompResponseChannel | The fragment after this is the Stomp Response channel as configured in your Web Service for the WebSocket endpoint | | schemaHost | The end point (port included) of your Web Service machine that is serving your schema in the JSON API format (see [Web Service setup](../ws/setup.md) for details.)| | schemaNamespace | The path fragment on your schema Web Service running on the ```schemaHost```. There is no ```schemaPath``` because it **must** be ```columns``` in order for the UI to be able fetch the column resource (the fields in your schema).| -| modelVersion | This is used an indicator to apply changes to the stored queries, results etc. It is monotonically increasing. On startup, changes specified in ```migrations``` will be applied if the old modelVersion is not present or is < than this number | +| modelVersion | This is used an indicator to apply changes to the stored queries, results etc. It is monotonically increasing. On startup, changes specified in ```migrations``` will be applied if the old modelVersion is not present or is < than this number. This is generally incremented by the UI once backwards-incompatible changes are made. | | migrations | is an object that currently supports one key: ```deletions``` of type string. The value can be set to either ```result``` or ```query```. The former wipes all existing results. The latter wipes everything. See ```modelVersion``` above. | | helpLinks | Is a list of objects, where each object is a help link. These links populate the "Help" drop-down on the UI's top navbar. You can add links to explain your data for example | -| defaultQuery | Can either be a [API Query](../ws/api-json.md) or a URL from which one could be fetched dynamically. The UI makes this the query created on every newly created Query. You could use this as a way to have user specific (for example, cookie based) filters created for your users or customize an aggregation when they create a new query in the UI. Note that if you have are accessing a map subfield and your field value in the filter is set as ```foo.bar``` and you want ```bar``` to be the subfield in the UI query builder, you will need to add a key called ```subfield``` in the filter (not supported by the API) and set its value to ```true``` | +| defaultQuery | Can either be a [API Query](../ws/api.md) or a URL from which one could be fetched dynamically. The UI makes this the query created on every newly created Query. You could use this as a way to have user specific (for example, cookie based) filters created for your users or customize an aggregation when they create a new query in the UI. Note that Builder Query do not support all API queries yet but whatever query you specify here (as long as it's a valid query) will be supported in the BQL query page in the UI. If it is not possible to convert your query into a Builder query, a default one will be used instead. | | bugLink | Is a URL that by default points to the issues page for the UI GitHub repository. You can change it to point to your own custom JIRA queue or something else | | defaultValues | Is an object that lets you configures defaults for various query parameters and lets you tie your custom backend settings to the UI | @@ -93,15 +94,15 @@ These are the properties in the ```defaultValues``` object. The Validated column | --------------------------------------- | --------- | ------- | ---------------- | | aggregationMaxSize | Yes | Yes | The size used when doing a Count Distinct, Distinct, Group By, or Distribution query. Set this to your max aggregations size in your backend configuration | | rawMaxSize | Yes | Yes | The maximum size for a Raw query. Set this to your max raw aggregation size in your backend configuration | -| durationMaxSecs | Yes | Yes | The maximum duration for a query. Set this to the seconds version of milliseconds max duration in your backend configuration | +| durationMaxSecs | Yes | Yes | The maximum duration for a query. Set this to the seconds version of the milliseconds max duration in your backend configuration | | distributionNumberOfPoints | Yes | No | The default value filled in for the Number of Points field for all Distribution aggregations | | distributionQuantilePoints | No | No | The default value filled in for the Points field for Quantile Distribution aggregations | | distributionQuantileStart | No | No | The default value filled in for the Start field for Quantile Distribution aggregations | | distributionQuantileEnd | No | No | The default value filled in for the End field for Quantile Distribution aggregations | | distributionQuantileIncrement | No | No | The default value filled in for the Increment field for Quantile Distribution aggregations | -| windowEmitFrequencyMinSecs | Yes | No | The minimum time interval at which a time based window can be returned. Set this to the minimum window emit frequency from your backend configuration | +| windowEmitFrequencyMinSecs | Yes | No | The minimum time interval at which a time based window can be returned in seconds. Set this to the minimum window emit frequency from your backend configuration | | everyForRecordBasedWindow | No | No | The default value for the number of records in a window for a record based window | -| everyForTimeBasedWindow | No | No | The default value for the number of records in a window for a time based window | +| everyForTimeBasedWindow | No | No | The default value for the number of records in a window for a time based window in milliseconds | | sketches.countDistinctMaxEntries | No | Yes | The maximum entries configured for your Count Distinct sketch in your backend configuration | | sketches.groupByMaxEntries | No | Yes | The maximum entries configured for your Group sketch in your backend configuration | | sketches.distributionMaxEntries | No | Yes | The maximum entries configured for your Distribution sketch in your backend configuration | @@ -126,14 +127,17 @@ These are the properties in the ```defaultValues``` object. The Validated column You can specify values for each property above in the ```env-settings.json``` file. These will be used when running a custom instance of the UI (see [above](#Running)). The ```default``` property in the ```env-settings.json``` that loads default settings for the UI that can be selectively overridden based on which environment you are running on. All settings explained above have default values -that are the same as the [default backend settings](https://github.com/bullet-db/bullet-storm/blob/master/src/main/resources/bullet_defaults.yaml). However, the defaults do not add the ```defaultQuery``` setting explained above. +that are the same as the [default backend settings](https://github.com/bullet-db/bullet-storm/blob/master/src/main/resources/bullet_defaults.yaml). ```json { "default": { "queryHost": "http://localhost:5555", - "queryNamespace": "api/bullet", - "queryPath": "query", + "queryNamespace": "api/bullet/queries", + "queryPath": "ws-query", + "validationPath": "validate-query", + "queryStompRequestChannel": "/server/request", + "queryStompResponseChannel": "/client/response", "schemaHost": "http://localhost:5555", "schemaNamespace": "api/bullet", "helpLinks": [ @@ -143,17 +147,23 @@ that are the same as the [default backend settings](https://github.com/bullet-db } ], "bugLink": "https://github.com/bullet-db/bullet-ui/issues", - "modelVersion": 1, + "modelVersion": 4, + "migrations": { + "deletions": "query" + }, + "defaultQuery": "SELECT COUNT(*) FROM STREAM(60000, TIME) WINDOWING TUMBLING(2000, TIME);", "defaultValues": { - "aggregationMaxSize": 512, + "aggregationMaxSize": 500, "rawMaxSize": 100, - "durationMaxSecs": 120, + "durationMaxSecs": 9007199254740, "distributionNumberOfPoints": 11, "distributionQuantilePoints": "0, 0.25, 0.5, 0.75, 0.9, 1", "distributionQuantileStart": 0, "distributionQuantileEnd": 1, "distributionQuantileIncrement": 0.1, - "queryTimeoutSecs": 3, + "windowEmitFrequencyMinSecs": 1, + "everyForRecordBasedWindow": 1, + "everyForTimeBasedWindow": 2000, "sketches": { "countDistinctMaxEntries": 16384, "groupByMaxEntries": 512, @@ -163,17 +173,24 @@ that are the same as the [default backend settings](https://github.com/bullet-db "topKErrorType": "No False Negatives" }, "metadataKeyMapping": { - "theta": "theta", - "uniquesEstimate": "uniques_estimate", - "queryCreationTime": "query_receive_time", - "queryTerminationTime": "query_finish_time", - "estimatedResult": "was_estimated", - "standardDeviations": "standard_deviations", - "normalizedRankError": "normalized_rank_error", - "maximumCountError": "maximum_count_error", - "itemsSeen": "items_seen", - "minimumValue": "minimum_value", - "maximumValue": "maximum_value" + "querySection": "Query", + "windowSection": "Window", + "sketchSection": "Sketch", + "theta": "Theta", + "uniquesEstimate": "Uniques Estimate", + "queryCreationTime": "Receive Time", + "queryTerminationTime": "Finish Time", + "estimatedResult": "Was Estimated", + "standardDeviations": "Standard Deviations", + "normalizedRankError": "Normalized Rank Error", + "maximumCountError": "Maximum Count Error", + "itemsSeen": "Items Seen", + "minimumValue": "Minimum Value", + "maximumValue": "Maximum Value", + "windowNumber": "Number", + "windowSize": "Size", + "windowEmitTime": "Emit Time", + "expectedEmitTime": "Expected Emit Time" } } } @@ -215,13 +232,14 @@ To cement all this, if you wanted an instance of the UI in your CI environment, Your UI on your CI environment will: - * POST to ```http://bullet-ws.dev.domain.com:4080/bullet/api/drpc``` for UI created Bullet queries - * GET the schema from ```http://bullet-ws.dev.domain.com:4080/bullet/api/columns``` + * Talk using Websockets to ```http://bullet-ws.dev.domain.com:4080/api/bullet/ws-query``` for UI created Bullet queries + * GET the schema from ```http://bullet-ws.dev.domain.com:4080/api/bullet/columns``` + * Validate queries in the BQL page with ```http://bullet-ws.dev.domain.com:4080/api/bullet/validate-query``` * Populate an additional link on the Help drop-down pointing to ```http://data.docs.domain.com``` * Allow queries to run as long as 300 seconds * Use 32768 in the help menu for the max number of unique elements that can be counted exactly * Allow only 50 points to be generated for Distribution queries - * GET and cache a defaultQuery from ```http://bullet-ws.dev.domain.com:4080/custom-endpoint/api/defaultQuery``` + * GET and cache a default query from ```http://bullet-ws.dev.domain.com:4080/custom-endpoint/api/defaultQuery``` You would make express use these settings by running diff --git a/docs/ws/api-bql.md b/docs/ws/api-bql.md deleted file mode 100644 index db0f3df4..00000000 --- a/docs/ws/api-bql.md +++ /dev/null @@ -1,192 +0,0 @@ -# Bullet BQL API - -This section gives a comprehensive overview of the Web Service API for launching Bullet BQL queries. - -For examples of BQL queries, see the [examples page](examples.md). - -BQL queries that are received by the Web Service will be detenced and automatically converted to [the JSON format](api-json.md) before being sent to the backend (which requires the basic JSON format). This conversion is done in the web service using [the bullet-bql library](../releases/#bullet-bql). - -## Overview - -Bullet-BQL provides users with a friendly SQL-like API to submit queries to the Web Service instead of using the more cumbersome [JSON API](api-json.md). - -## Statement Syntax - - SELECT DISTINCT? select_clause - FROM from_clause - ( WHERE where_clause )? - ( GROUP BY groupBy_clause )? - ( HAVING having_clause )? - ( ORDER BY orderBy_clause )? - ( WINDOWING windowing_clause )? - ( LIMIT limit_clause )?; - -where `select_clause` is one of - - * - COUNT( DISTINCT reference_expr ( , reference_expr )? ) - group_function ( AS? ColumnReference )? ( , group_function ( AS? ColumnReference )? )? ( , reference_expr ( AS? ColumnReference )? )? - reference_expr ( AS? ColumnReference )? ( , reference_expr ( AS? ColumnReference )? )? - distribution_type( reference_expr, input_mode ) ( AS? ColumnReference )? - TOP ( ( Integer | Long ) ( , Integer | Long ) )? , reference_expr ( , reference_expr )? ) ( AS? ColumnReference )? - - -`reference_expr` is one of `ColumnReference` or `Dereference`. - -and `group_function` is one of `SUM(reference_expr)`, `MIN(reference_expr)`, `MAX(reference_expr)`, `AVG(reference_expr)` and `COUNT(*)`. `reference_expr` is one of ColumnReference and Dereference. `distribution_type` is one of `QUANTILE`, `FREQ` and `CUMFREQ`. The 1st number in `TOP` is K, and the 2nd number is an optional threshold. The `input_mode` is one of - - LINEAR, ( Integer | Long ) evenly spaced - REGION, ( Integer | Long ), ( Integer | Long ), ( Integer | Long ) evenly spaced in a region - MANUAL, ( Integer | Long ) (, ( Integer | Long ) )* defined points - -and `from_clause` is one of - - STREAM() default time duration will be set from BQLConfig - STREAM( ( Long | MAX ), TIME ) time based duration control. - STREAM( ( Long | MAX ), TIME, ( Long | MAX ), RECORD ) time and record based duration control. - -`RECORD` will be supported in the future. - -and `where_clause` is one of - - NOT where_clause - where_clause AND where_clause - where_clause OR where_clause - reference_expr IS NOT? NULL - reference_expr IS NOT? EMPTY - reference_expr IS NOT? DISTINCT FROM value_expr - reference_expr NOT? BETWEEN value_expr AND value_expr - reference_expr NOT? IN ( value_expr ( , value_expr )* ) - reference_expr NOT? LIKE ( value_expr ( , value_expr )* ) - reference_expr NOT? CONTAINSKEY ( value_expr ( , value_expr )* ) - reference_expr NOT? CONTAINSVALUE ( value_expr ( , value_expr )* ) - reference_expr ( = | <> | != | < | > | <= | >= ) value_expr - SIZEOF(reference_expr) ( = | <> | != ) value_expr - SIZEOF(reference_expr) NOT? IN ( value_expr ( , value_expr )* ) - SIZEOF(reference_expr) NOT? DISTINCT FROM value_expr - -`value_expr` is one of Null, Boolean, Integer, Long, Double, Decimal, String or `reference_expr`. - -and `groupBy_clause` is one of - - () group all - reference_expr ( , reference_expr )* group by - ( reference_expr ( , reference_expr )* ) group by - -and `HAVING` and `ORDER BY` are only supported for TopK. In which case, `having_clause` is - - COUNT(*) >= Integer - -and `orderBy_clause` is - - COUNT(*) - -and `windowing_clause` is one of - - ( EVERY, ( Integer | Long ), ( TIME | RECORD ), include ) - ( TUMBLING, ( Integer | Long ), ( TIME | RECORD ) ) - -`include` is one of - - ALL - FIRST, ( Integer | Long ), ( TIME | RECORD ) - LAST, ( Integer | Long ), ( TIME | RECORD ) will be supported - -and `limit_clause` is one of - - Integer | Long - ALL will be supported - -## Data Types - -* **Null**: `NULL`. - -* **Boolean**: `TRUE`, `FALSE`. - -* **Integer**: 32-bit signed two’s complement integer with a minimum value of `-2^31` and a maximum value of `2^31 - 1`. Example: `65`. - -* **Long**: 64-bit signed two’s complement integer with a minimum value of `-2^63 + 1` and a maximum value of `2^63 - 1`. Example: `9223372036854775807`, `-9223372036854775807`. - -* **Double**: 64-bit inexact, variable-precision with a minimum value of `2^-1074` and a maximum value of `(2-2^-52)·2^1023`. Example: `1.7976931348623157E+308`, `.17976931348623157E+309`, `4.9E-324`. - -* **Decimal**: decimal number can be treated as Double, String or ParsingException. This is controlled by `ParsingOptions`. `1.7976931348623157`, `.17976931348623157`. - -* **String**: character string which can have escapes. Example: `'this is a string'`, `'this is ''another'' string'`. - -* **ColumnReference**: representation of a column field. Unquoted ColumnReference must start with a letter or `_`. Example: `column_name` or `column_name.foo` or `column_name.foo.bar` or `column_name.0.bar`. - -* **All**: representation of all columns. Example: `*`. `column_name.*` is interpreted as `column_name`. - -## Reserved Keywords - -| Keyword | SQL:2016 | SQL-92 | -| --------------------- | :-------------: | :-----------: | -| `ALTER` | reserved | reserved | -| `AND` | reserved | reserved | -| `AS` | reserved | reserved | -| `BETWEEN` | reserved | reserved | -| `BY` | reserved | reserved | -| `CASE` | reserved | reserved | -| `CAST` | reserved | reserved | -| `CONSTRAINT` | reserved | reserved | -| `CREATE` | reserved | reserved | -| `CROSS` | reserved | reserved | -| `CUBE` | reserved | | -| `CURRENT_DATE` | reserved | reserved | -| `CURRENT_TIME` | reserved | reserved | -| `CURRENT_TIMESTAMP` | reserved | reserved | -| `CURRENT_USER` | reserved | | -| `DEALLOCATE` | reserved | reserved | -| `DELETE` | reserved | reserved | -| `DESCRIBE` | reserved | reserved | -| `DISTINCT` | reserved | reserved | -| `DROP` | reserved | reserved | -| `ELSE` | reserved | reserved | -| `END` | reserved | reserved | -| `ESCAPE` | reserved | reserved | -| `EXCEPT` | reserved | reserved | -| `EXECUTE` | reserved | reserved | -| `EXISTS` | reserved | reserved | -| `EXTRACT` | reserved | reserved | -| `FALSE` | reserved | reserved | -| `FOR` | reserved | reserved | -| `FROM` | reserved | reserved | -| `FULL` | reserved | reserved | -| `GROUP` | reserved | reserved | -| `GROUPING` | reserved | | -| `HAVING` | reserved | reserved | -| `IN` | reserved | reserved | -| `INNER` | reserved | reserved | -| `INSERT` | reserved | reserved | -| `INTERSECT` | reserved | reserved | -| `INTO` | reserved | reserved | -| `IS` | reserved | reserved | -| `JOIN` | reserved | reserved | -| `LEFT` | reserved | reserved | -| `LIKE` | reserved | reserved | -| `LOCALTIME` | reserved | | -| `LOCALTIMESTAMP` | reserved | | -| `NATURAL` | reserved | reserved | -| `NORMALIZE` | reserved | | -| `NOT` | reserved | reserved | -| `NULL` | reserved | reserved | -| `ON` | reserved | reserved | -| `OR` | reserved | reserved | -| `ORDER` | reserved | reserved | -| `OUTER` | reserved | reserved | -| `PREPARE` | reserved | reserved | -| `RECURSIVE` | reserved | | -| `RIGHT` | reserved | reserved | -| `ROLLUP` | reserved | | -| `SELECT` | reserved | reserved | -| `TABLE` | reserved | reserved | -| `THEN` | reserved | reserved | -| `TRUE` | reserved | reserved | -| `UESCAPE` | reserved | | -| `UNION` | reserved | reserved | -| `UNNEST` | reserved | | -| `USING` | reserved | reserved | -| `VALUES` | reserved | reserved | -| `WHEN` | reserved | reserved | -| `WHERE` | reserved | reserved | -| `WITH` | reserved | reserved | diff --git a/docs/ws/api-json.md b/docs/ws/api-json.md index c28328a8..5ac355f9 100644 --- a/docs/ws/api-json.md +++ b/docs/ws/api-json.md @@ -1,8 +1,8 @@ # Bullet JSON API -This section gives a comprehensive overview of the Web Service API for launching Bullet JSON queries. +This section gives a comprehensive overview of the old Web Service API for launching Bullet JSON queries. This was **deprecated** in favor of [BQL](api.md) in Bullet 1.0+. -The JSON API is the actual Query format that is expected by the backend. [The BQL API](api-bql.md) is a more user-friendly API which can also be used - the Web Service will automatically detect the BQL query and convert the query to this JSON format before submitting it to the backend. With the addition of Post Aggregations and Expressions, +The JSON API is the old Query format that was expected by the API and the Backend prior to Bullet 1.0. [The API](api.md) is a more user-friendly API which can also be used - the Web Service prior to Bullet 1.0 will automatically detect the BQL query and convert the query to this JSON format before submitting it to the backend. With the addition of Post Aggregations and Expressions, it is a lot easier to use BQL rather than construct the JSON. The Bullet Web Service also provides [an API](https://github.com/bullet-db/bullet-service/releases/tag/bullet-service-0.4.2) to convert BQL to JSON if you so desire. * For info on how to use the UI, see the [UI Usage section](../ui/usage.md) diff --git a/docs/ws/api.md b/docs/ws/api.md new file mode 100644 index 00000000..c7b8c044 --- /dev/null +++ b/docs/ws/api.md @@ -0,0 +1,147 @@ +# Bullet API + +This section gives a comprehensive overview of the Web Service API for launching Bullet queries. + +For examples of queries, see the [examples page](examples.md). + +BQL is the interface that is exposed to users to query Bullet. BQL queries that are received by the Web Service are converted to an underlying querying format before being sent to the backend. This conversion is done in the web service using [the bullet-bql library](../releases/#bullet-bql). + +## Overview + +Bullet-BQL provides users with a friendly SQL-like API to submit queries to the Web Service. + +## Statement Syntax + + SELECT select + FROM stream + ( WHERE expression )? + ( GROUP BY expression ( , expression )* )? + ( HAVING expression )? + ( ORDER BY orderBy )? + ( WINDOWING window )? + ( LIMIT Integer )? + ';'? + +where `select` is + + DISTINCT? selectItem ( , selectItem )* + +and `selectItem` is one of + + expression ( AS? identifier )? + * + +and `expression` is one of + + valueExpression + fieldExpression + listExpression + expression IS NULL + expression IS NOT NULL + unaryExpression + functionExpression + expression NOT? IN expression + expression RLIKE ANY? expression + expression ( * | / ) expression + expression ( + | - ) expression + expression ( < | <= | > | >= ) ( ANY | ALL )? expression + expression ( = | != ) ( ANY | ALL )? expression + expression AND expression + expression XOR expression + expression OR expression + ( expression ) + +where `valueExpression` is one of Null, Boolean, Integer, Long, Float, Double, or String + +and `fieldExpression` is one of + + identifier ( : fieldType )? + identifier [ Integer ] ( : fieldType )? + identifier [ Integer ] . identifier ( : fieldType )? + identifier . identifier ( : fieldType )? + identifier . identifier . identifier ( : fieldType )? + +`fieldType` is one of + + primitiveType + LIST [ primitiveType ] + MAP [ primitiveType ] + LIST [ MAP [ primitiveType ] ] + MAP [ MAP [ primitiveType ] ] + +and `primitiveType` is `INTEGER`, `LONG`, `FLOAT`, `DOUBLE`, `BOOLEAN`, or `STRING` + +where `listExpression` is one of + + [] + [ expression ( , expression )* ] + +`unaryExpression` is + + ( NOT | SIZEOF ) ( expression ) with optional parentheses + +`functionExpression` is one of + + ( SIZEIS | CONTAINSKEY | CONTAINSVALUE | FILTER ) ( expression, expression ) + IF ( expression ( , expression )* ) three arguments + aggregateExpression + CAST ( expression AS primitiveType ) + +where `aggregateExpression` is one of + + COUNT ( * ) + ( SUM | AVG | MIN | MAX ) ( expression ) + COUNT ( DISTINCT expression ( , expression )* ) + distributionType ( expression, inputMode ) + TOP ( Integer ( , Integer )?, expression ( , expression )* ) + +where `distributionType` is `QUANTILE`, `FREQ`, or `CUMFREQ` + +and `inputMode` is one of + + LINEAR, Integer evenly spaced + REGION, Number, Number, Number evenly spaced in a region + MANUAL, Number ( , Number )* defined points + + +and `stream` is one of + + STREAM() default time duration will be set from BQLConfig + STREAM( ( Integer | MAX ), TIME ) time based duration control + +`RECORD` will be supported in the future. + +and `orderBy` is + + expression ( ASC | DESC )? ( , expression ( ASC | DESC )? )* + +and `window` is one of + + EVERY ( Integer, ( TIME | RECORD ), include ) + TUMBLING ( Integer, ( TIME | RECORD ) ) + +`include` is one of + + ALL + FIRST, Integer, ( TIME | RECORD ) + + +## Data Types + +* **Null**: `NULL`. + +* **Boolean**: `TRUE`, `FALSE`. + +* **Integer**: 32-bit signed two’s complement integer with a minimum value of `-2^31` and a maximum value of `2^31 - 1`. Example: `65`. + +* **Long**: 64-bit signed two’s complement integer with a minimum value of `-2^63 + 1` and a maximum value of `2^63 - 1`. Example: `9223372036854775807`, `-9223372036854775807`. + +* **Float**: 32-bit inexact, variable-precision with a minimum value of `2^-149` and a maximum value of `(2-2^-23)·2^127`. Example: `1.70141183E+38`, `1.17549435E-38`, `0.15625`. + +* **Double**: 64-bit inexact, variable-precision with a minimum value of `2^-1074` and a maximum value of `(2-2^-52)·2^1023`. Example: `1.7976931348623157E+308`, `.17976931348623157E+309`, `4.9E-324`. + +* **String**: character string which can have escapes. Example: `'this is a string'`, `'this is ''another'' string'`. + +* **Identifier**: representation of a field. Unquoted identifier must start with a letter or `_`. Example: `column_name`, `column_name.foo`, `column_name.foo.bar`, `column_name[0].bar`, or `"123column"`. + +* **All**: representation of all fields. Example: `*`. diff --git a/docs/ws/examples.md b/docs/ws/examples.md index e870fc89..0f7f367c 100644 --- a/docs/ws/examples.md +++ b/docs/ws/examples.md @@ -24,7 +24,7 @@ If you wanted to write a smaller or shorter query to, for example, quickly test !!! note "WINDOW?" - There is only one unified data stream in Bullet, so for clarity the ```FROM``` clause is given a ```STREAM``` function to denote the look-forward time window for the Bullet query. + There is only one unified data stream in Bullet, so for clarity the ```FROM``` clause is given a ```STREAM``` function to denote the look-forward time window for the Bullet query. ### Simple Filtering @@ -81,7 +81,7 @@ WHERE id = 'btsg8l9b234ha' AND page_id IS NOT NULL LIMIT 10; ``` -The above query finds all events where id is set to 'btsg8l9b234ha' and page_id is not null, projects the fields selected above with their aliases (timestamp as ts, etc.) and limits the results to at most 10 records. The query would wait at most 20 seconds for records to show up. +The above query finds all events where id is set to 'btsg8l9b234ha' and page_id is not null, projects the fields selected above with their aliases (timestamp as ts, etc.) and limits the results to at most 10 records. The query would wait at most 20 seconds for records to show up. The resulting response could look like (only 3 events were generated that matched the criteria): @@ -123,7 +123,7 @@ The resulting response could look like (only 3 events were generated that matche For the following examples, we will simply show and explain the queries. They also use the extended syntax for specify values in a filter using the ```kind``` field. -#### SIZEIS Filter +#### SIZEOF Filter This query checks to see if the size of the ```data_map``` is equal to 4 and returns all records that satisfy this. diff --git a/docs/ws/setup.md b/docs/ws/setup.md index 15e7d695..ce931cff 100644 --- a/docs/ws/setup.md +++ b/docs/ws/setup.md @@ -2,16 +2,14 @@ The Web Service is a Java JAR file that you can deploy on a machine to communicate with the Bullet Backend. You then plug in a particular Bullet PubSub implementation such as [Kafka PubSub](../pubsub/kafka.md) or [Storm DRPC PubSub](../pubsub/storm-drpc.md). For an example on how to set up a Bullet backend, see the [Storm example setup](../backend/storm-setup.md). -There are two main purposes for this layer at this time: +There are three main purposes for this layer at this time: -1) It provides an endpoint that can serve a [JSON API schema](http://jsonapi.org/format/) for the Bullet UI. Currently, static schemas from a file are supported. +1) It converts queries and sends them through the PubSub to the backend. It handles responses from the backend for both synchronous and asynchronous queries. -2) It generates unique identifiers and other metadata for a JSON Bullet query before sending the query to the Bullet backend. It wraps errors if the backend is unreachable. +2) It provides an endpoint that can serve a [JSON API schema](http://jsonapi.org/format/) for the Bullet UI. Currently, static schemas from a file are supported. +3) It manages metadata for queries such unique identifiers or storing queries for resilience for Backends that support replaying. -!!! note "That's it?" - - The Web Service essentially just wraps the PubSub layer and provides some helpful endpoints. When incremental updates drop, it will translate a PubSub's streaming responses back into incremental results for the user. It is also there to be a point of abstraction for implementing things like security, monitoring, access-control, rate-limiting, sharding, different query formats (e.g. SQL Bullet queries) etc, which are planned in the near future. ## Prerequisites @@ -48,18 +46,39 @@ You can also add ```sources``` or ```javad ## Configuration -There are two levels of configuration: +There are a few different modules in the Web Service: + +1. **API**: Configure the Web Service, the web server, the names of various endpoints, and other Spring Boot settings. You can also configure certain top-level settings for the various modules below - such as the number of publishers and subscribers to use for the PubSub etc. +2. **PubSub**: Configure what PubSub to use and the various settings for it. +3. **Schema** (Optional): Configure the Schema file (that powers the [UI](../ui/usage.md). +4. **Query** (Optional): Configure the various query defaults for queries coming into the API. You can also point to the schema used by the BQL module to do type-checking and other semantic validation. +5. **Storage** (Optional): Configure what Storage to use, the various settings for it through another configuration file. +6. **Asynchronous Queries** (Optional): Configure the Asynchronous query module which lets you send queries to an API but not wait for the results. The results, when received, are sent through a PubSubResponder interface that you can plug in - such as email or writing to another PubSub etc. +7. **Metrics** (Optional): Configure the Metrics collection system which collects various statistics about the endpoints and sends them through a Publisher interface that you can plug in. You can use this for monitoring status codes and errors. +8. **Status** (Optional): Configure the Status checking system which disables the API if the backend is down or unreachable. It works by sending a simple query through and waiting for results periodically. + +### API Configuration + +Take a look at the [settings](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/application.yaml) for a list of the settings that are configured. The Web Service settings start with ```bullet.```. You can configure various WebSocket settings and other API level configuration. + +If you provide a custom settings ```application.yaml```, you will **need** to specify the default values in this file since the framework uses your file instead of these defaults. You can also pass in overrides as command-line arguments when launching the server. + +#### Spring Boot Configuration + +You can also configure various Spring and web server settings here. Take a look at [this page](https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html) page for the various values you can supply. -1. You can configure the Web Service, the web server and other Spring Boot settings through a configuration file (or through the command line when launching). By default, this file is called ```application.yaml```. This is where settings like where to find your schema file (optional for if you want to power the [UI](../ui/usage.md) schema with a static file) or how many publishers and subscribers to use for your PubSub etc. -2. You can configure what PubSub to use, the various settings for it through another configuration file. The location for this file is provided in the Web Service configuration step above. +### PubSub Configuration + +You configure the PubSub by providing a configuration YAML file and setting the ```bullet.pubsub.config``` to its path. In *that* file, you will set these two settings at a minimum: -### Web Service Configuration +1. ```bullet.pubsub.class.name``` should be set to the fully qualified package to your PubSub implementation. Example: ```com.yahoo.bullet.kafka.KafkaPubSub``` for the [Kafka PubSub](../pubsub/kafka.md). +2. ```bullet.pubsub.context.name: QUERY_SUBMISSION```. The Web Service requires the PubSub to be in the ```QUERY_SUBMISSION``` context. -Take a look at the [settings](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/application.yaml) for a list of the settings that are configured. The Web Service settings start with ```bullet.```. +You will also specify other parameters that your chosen PubSub requires or can use. -If you provide a custom settings ```application.yaml```, you will **need** to specify the default values in this file since the framework uses your file instead of these defaults. +In the top level configuration for the PubSub in ```application.yaml```, you may configure the number of threads for reading and writing the PubSub as well as enabling and configuring the built-in [REST PubSub](../pubsub/rest.md) if you choose to use that. -#### File based schema +### Schema Configuration The Web Service can also provide a endpoint that serves your data schema to your UI. You do not necessarily have to use this to serve your schema. The UI can use any JSON API schema specification. But if your schema is fixed or does not change often, it might be simpler for you to use this endpoint to provide the schema for the UI, instead of creating a new one. The Web Service also takes care to provide the right [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) headers so that your UI can communicate with it. @@ -67,18 +86,39 @@ You can use [sample_columns.json](https://github.com/bullet-db/bullet-service/bl Once you have your schema file, you can provide it to the Web Service by setting the ```bullet.schema.file``` to the path to your file. -#### Spring Boot Configuration -You can also configure various Spring and web server here. Take a look at [this page](https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html) page for the various values you can supply. +### Query Configuration -### PubSub Configuration +You can provide a file containing the various query defaults and maximums by using the `bullet.query.config` setting. This is configured used by the query building module to make sure incoming queries respect various configurations provided here such as default aggregation sizes or minimum window emit intervals etc. You can also point to a schema file (ideally the same one used if you chose to enable the schema module) that the query builder layer can use for advanced checking. See [the defaults](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/query_defaults.yaml) for more information. -You configure the PubSub by providing a configuration YAML file and setting the ```bullet.pubsub.config``` to its path. In *that* file, you will set these two settings at a minimum: +!!! note "Querying and Schema" + If you provide a schema, the query creation layer in BQL can leverage this for type-checking and advanced semantic validation. This can error out otherwise erroneous queries right at the API layer without having to run a query that returns no results or errors out in the backend. -1. ```bullet.pubsub.class.name``` should be set to the fully qualified package to your PubSub implementation. Example: ```com.yahoo.bullet.kafka.KafkaPubSub``` for the [Kafka PubSub](../pubsub/kafka.md). -2. ```bullet.pubsub.context.name: QUERY_SUBMISSION```. The Web Service requires the PubSub to be in the ```QUERY_SUBMISSION``` context. +### Storage Configuration -You will also specify other parameters that your chosen PubSub requires or can use. +This module lets you set up a Storage layer to write queries to when submitted. These are cleaned up when the query is terminated and the final result sent back to the API. This is particularly relevant if your Bullet instance is fielding long-running queries that need to be resilient. This coupled with a Backend implementation that can leverage the Storage lets you recreate queries in the Backend in case of component failure or restarts. The Storage layer is also particularly relevant if you're using the asynchronous query module with a PubSubResponder interface that relies on the Storage to do additional metadata lookups. + +You can configure and provide a Storage implementation by implementing the [StorageManager interface](https://github.com/bullet-db/bullet-core/blob/master/src/main/java/com/yahoo/bullet/storage/StorageManager.java). Note that you cannot turn off the Storage module in the API but by default, the `NullStorageManager` is used, which does nothing. You can provide a configuration yaml file that supplies your particular settings for your StorageManager by using the `bullet.storage.config` setting. See [the defaults](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/storage_defaults.yaml) for more details. + +!!! note "So you DO have persistence?" + + This is not the same as storing the data. Bullet's philosophy is to avoid storing the incoming data stream that it is field queries on. This layer is meant for storing query related information. When we extend the storage to storing intermediate results in the backend for extra resiliency between windows, the size of the storage should still be well defined for sketch-based aggregations. + +### Asynchronous Query Configuration + +This module enables the asynchronous query submission endpoint (the `bullet.endpoint.async` setting) that lets you submit queries to it without having to hang around for the results to stream back. Instead you use [the PubSubResponder interface](https://github.com/bullet-db/bullet-core/blob/master/src/main/java/com/yahoo/bullet/pubsub/PubSubResponder.java) to provide an instance that is used to write results that come back for that query. You can use this for *alerting* use-cases where you need to send e-mails on certain alert queries being triggered or if you want your results written to a PubSub that you can consume in a different manner etc. + +By default, this module is disabled. However, it is mock configured to use [a standard Bullet PubSubResponder](https://github.com/bullet-db/bullet-core/blob/master/src/main/java/com/yahoo/bullet/pubsub/BulletPubSubResponder.java) that we provide to write the result back to a REST PubSub that is assumed to be running locally. You can change this to write the results to your own PubSub if you desire or plug in something else entirely. You can provide a configuration yaml file that supplies your particular settings for your PubSubResponder by using the `bullet.async.config` setting. See the [defaults](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/async_defaults.yaml) for more information. + +### Metrics Configuration + +This module lets you monitor the Web Service for information on what is happening. It tracks the various status codes and publishes them using the [MetricPublisher interface](https://github.com/bullet-db/bullet-core/blob/master/src/main/java/com/yahoo/bullet/common/metrics/MetricPublisher.java) to a place of your choice. By default, the [HTTPMetricPublisher interface](https://github.com/bullet-db/bullet-core/blob/master/src/main/java/com/yahoo/bullet/common/metrics/HTTPMetricEventPublisher.java) is configured, which can post to a URL of your choice. + +You can provide a configuration yaml file that supplies your particular settings for your MetricPublisher by using the `bullet.metric.config` setting. See the [defaults](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/metric_defaults.yaml) for more information. + +### Status Configuration + +This module periodically sends a *tick* query to the backend to make sure it is functioning properly. You can configure various settings for it here. If enabled, this module can disable the whole API if the backend is unreachable. This can be used if you front multiple Web Service instances talking to different instances of a backend behind a proxy and take down the backends one at a time for upgrades. ## Launch @@ -114,4 +154,4 @@ You should receive a random record flowing through Bullet instantly (if you left If you provided a path to a schema file in your configuration file when you [launch](#launch) the Web Service, you can also HTTP GET your schema at ```http://localhost:5555/api/bullet/columns``` -If you did not, the schema in [sample_columns.json](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/sample_columns.json) is the response. The Web Service converts it to a JSON API response and provides the right headers for CORS. +If you did not, the schema in [sample_fields.json](https://github.com/bullet-db/bullet-service/blob/master/src/main/resources/sample_fields.json) is the response. The Web Service converts it to a JSON API response and provides the right headers for CORS. diff --git a/examples/Makefile b/examples/Makefile index ca849b77..3b39aba9 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -17,7 +17,7 @@ build-spark: mkdir -p bullet-examples/backend/spark cp install-all-spark.sh bullet-examples/ cd spark && mvn package - cp spark/target/bullet-spark-example-0.0.1-SNAPSHOT.jar bullet-examples/backend/spark/bullet-spark-example.jar + cp spark/target/bullet-spark-example-*-SNAPSHOT.jar bullet-examples/backend/spark/bullet-spark-example.jar cp spark/src/main/resources/bullet_spark_kafka_settings.yaml bullet-examples/backend/spark build-web-service: diff --git a/examples/install-all-spark.sh b/examples/install-all-spark.sh index 236a69b5..4cd21eff 100755 --- a/examples/install-all-spark.sh +++ b/examples/install-all-spark.sh @@ -2,15 +2,15 @@ set -euo pipefail -BULLET_EXAMPLES_VERSION=0.6.1 -BULLET_UI_VERSION=0.6.2 -BULLET_WS_VERSION=0.4.3 -BULLET_KAFKA_VERSION=0.3.2 -BULLET_SPARK_VERSION=0.2.2 -KAFKA_VERSION=0.11.0.1 -SPARK_VERSION=2.2.1 -NVM_VERSION=0.33.1 -NODE_VERSION=6.9.4 +BULLET_EXAMPLES_VERSION=1.0.0 +BULLET_UI_VERSION=1.0.0 +BULLET_WS_VERSION=1.0.0 +BULLET_KAFKA_VERSION=1.0.1 +BULLET_SPARK_VERSION=1.0.0 +KAFKA_VERSION=2.3.1 +SPARK_VERSION=3.0.1 +NVM_VERSION=0.37.2 +NODE_VERSION=10.20.1 KAFKA_TOPIC_REQUESTS=bullet.requests KAFKA_TOPIC_RESPONSES=bullet.responses @@ -130,42 +130,37 @@ create_topics() { println "Done!" } -install_web_service() { - local BULLET_WEB_SERVICE="bullet-service-${BULLET_WS_VERSION}-embedded.jar" - - println "Downloading Bullet Web Service version ${BULLET_WS_VERSION}..." - download "http://jcenter.bintray.com/com/yahoo/bullet/bullet-service/${BULLET_WS_VERSION}" "${BULLET_WEB_SERVICE}" - - println "Installing Bullet Web Service..." - cp ${BULLET_DOWNLOADS}/${BULLET_WEB_SERVICE} ${BULLET_HOME}/service/ - cp ${BULLET_EXAMPLES}/web-service/example_kafka_pubsub_config.yaml ${BULLET_HOME}/service/ - cp ${BULLET_EXAMPLES}/web-service/example_columns.json ${BULLET_HOME}/service/ - export BULLET_WS_JAR=${BULLET_HOME}/service/${BULLET_WEB_SERVICE} +launch_bullet_web_service() { + local BULLET_WS_JAR="bullet-service-${BULLET_WS_VERSION}-embedded.jar" + local BULLET_SERVICE_HOME="${BULLET_HOME}/service" - println "Done!" -} + println "Downloading Bullet Web Service ${BULLET_WS_VERSION}..." + download "http://jcenter.bintray.com/com/yahoo/bullet/bullet-service/${BULLET_WS_VERSION}" "${BULLET_WS_JAR}" -launch_web_service() { - local BULLET_SERVICE_HOME="${BULLET_HOME}/service" + println "Configuring Bullet Web Service and plugging in Kafka PubSub..." + cp "${BULLET_DOWNLOADS}/${BULLET_WS_JAR}" "${BULLET_SERVICE_HOME}/bullet-service.jar" + cp "${BULLET_EXAMPLES}/web-service/"example_* "${BULLET_SERVICE_HOME}/" - println "Launching Bullet Web Service..." + println "Launching Bullet Web Service with the Kafka PubSub..." cd "${BULLET_SERVICE_HOME}" - java -Dloader.path=${BULLET_HOME}/pubsub/bullet-kafka-${BULLET_KAFKA_VERSION}-fat.jar -jar ${BULLET_WS_JAR} \ - --bullet.pubsub.config=${BULLET_SERVICE_HOME}/example_kafka_pubsub_config.yaml \ - --bullet.schema.file=${BULLET_SERVICE_HOME}/example_columns.json \ - --server.port=9999 \ - --logging.path=${BULLET_SERVICE_HOME} \ - --logging.file=log.txt &> ${BULLET_SERVICE_HOME}/log.txt & + java -Dloader.path=${BULLET_HOME}/pubsub/bullet-kafka-${BULLET_KAFKA_VERSION}-fat.jar -jar ${BULLET_SERVICE_HOME}/bullet-service.jar \ + --bullet.pubsub.config=${BULLET_SERVICE_HOME}/example_kafka_pubsub_config.yaml \ + --bullet.query.config=${BULLET_SERVICE_HOME}/example_query_config.yaml \ + --bullet.schema.file=${BULLET_SERVICE_HOME}/example_columns.json \ + --server.port=9999 --logging.path="${BULLET_SERVICE_HOME}" \ + --logging.file=log.txt &> "${BULLET_SERVICE_HOME}/log.txt" & println "Sleeping for 15 s to ensure Bullet Web Service is up..." sleep 15 - println "Getting one random record from Bullet through the Web Service..." - curl -s -H 'Content-Type: text/plain' -X POST -d '{"aggregation": {"size": 1}}' http://localhost:9999/api/bullet/sse-query - println "" + println "Testing the Web Service" println "Getting column schema from the Web Service..." println "" curl -s http://localhost:9999/api/bullet/columns + println "" + println "Getting one random record from Bullet through the Web Service..." + curl -s -H 'Content-Type: text/plain' -X POST -d 'SELECT * FROM STREAM(2000, TIME) LIMIT 1;' http://localhost:9999/api/bullet/queries/sse-query + println "" println "Finished Bullet Web Service test!" } @@ -217,7 +212,7 @@ launch_bullet_spark() { install_node() { # NVM unset var bug - set +u + set +eu println "Trying to install nvm. If there is a failure, manually perform: " println " curl -s https://raw.githubusercontent.com/creationix/nvm/v${NVM_VERSION}/install.sh | bash" @@ -236,7 +231,7 @@ install_node() { nvm install "v${NODE_VERSION}" nvm use "v${NODE_VERSION}" - set -u + set -eu println "Done!" } @@ -269,7 +264,7 @@ cleanup() { pkill -f "[e]xpress-server.js" pkill -f "[e]xample_kafka_pubsub_config.yaml" - pkill -f "[b]ullet-spark" + pkill -9 -f "[b]ullet-spark" ${KAFKA_INSTALL_DIR}/bin/kafka-server-stop.sh ${KAFKA_INSTALL_DIR}/bin/zookeeper-server-stop.sh @@ -316,8 +311,7 @@ launch() { install_bullet_spark launch_bullet_spark - install_web_service - launch_web_service + launch_bullet_web_service install_node launch_bullet_ui diff --git a/examples/install-all-storm.sh b/examples/install-all-storm.sh index 414a6421..b46cb980 100755 --- a/examples/install-all-storm.sh +++ b/examples/install-all-storm.sh @@ -2,12 +2,12 @@ set -euo pipefail -BULLET_EXAMPLES_VERSION=0.6.1 -BULLET_UI_VERSION=0.6.2 -BULLET_WS_VERSION=0.4.3 -STORM_VERSION=1.2.2 -NVM_VERSION=0.33.1 -NODE_VERSION=6.9.4 +BULLET_EXAMPLES_VERSION=1.0.0 +BULLET_UI_VERSION=1.0.0 +BULLET_WS_VERSION=1.0.0 +STORM_VERSION=2.2.0 +NVM_VERSION=0.37.2 +NODE_VERSION=10.20.1 println() { local DATE @@ -132,7 +132,8 @@ launch_bullet_web_service() { println "Launching Bullet Web Service with the built-in REST PubSub enabled..." cd "${BULLET_SERVICE_HOME}" java -jar ${BULLET_SERVICE_HOME}/bullet-service.jar \ - --bullet.pubsub.config=${BULLET_SERVICE_HOME}/example_rest_pubsub_config.yaml \ + --bullet.pubsub.config=${BULLET_SERVICE_HOME}/example_rest_pubsub_config.yaml \ + --bullet.query.config=${BULLET_SERVICE_HOME}/example_query_config.yaml \ --bullet.schema.file=${BULLET_SERVICE_HOME}/example_columns.json \ --server.port=9999 --bullet.pubsub.builtin.rest.enabled=true --logging.path="${BULLET_SERVICE_HOME}" \ --logging.file=log.txt &> "${BULLET_SERVICE_HOME}/log.txt" & @@ -141,19 +142,19 @@ launch_bullet_web_service() { sleep 15 println "Testing the Web Service" - println "" - println "Getting one random record from Bullet through the Web Service..." - curl -s -H 'Content-Type: text/plain' -X POST -d '{"aggregation": {"size": 1}}' http://localhost:9999/api/bullet/sse-query - println "" println "Getting column schema from the Web Service..." println "" curl -s http://localhost:9999/api/bullet/columns + println "" + println "Getting one random record from Bullet through the Web Service..." + curl -s -H 'Content-Type: text/plain' -X POST -d 'SELECT * FROM STREAM(2000, TIME) LIMIT 1;' http://localhost:9999/api/bullet/queries/sse-query + println "" println "Finished Bullet Web Service test!" } install_node() { # NVM unset var bug - set +u + set +eu println "Trying to install nvm. If there is a failure, manually perform: " println " curl -s https://raw.githubusercontent.com/creationix/nvm/v${NVM_VERSION}/install.sh | bash" @@ -172,7 +173,7 @@ install_node() { nvm install "v${NODE_VERSION}" nvm use "v${NODE_VERSION}" - set -u + set -eu println "Done!" } diff --git a/examples/spark/bin/launch.sh b/examples/spark/bin/launch.sh deleted file mode 100644 index d23299ab..00000000 --- a/examples/spark/bin/launch.sh +++ /dev/null @@ -1,2 +0,0 @@ - -# This will launch bullet-spark diff --git a/examples/spark/pom.xml b/examples/spark/pom.xml index 78696ba9..a173904a 100644 --- a/examples/spark/pom.xml +++ b/examples/spark/pom.xml @@ -7,11 +7,12 @@ 1.0.0-SNAPSHOT jar - 2.11.7 - 2.11 - 2.3.0 + 2.12.8 + 2.12 + 3.0.1 1.0.0 - 1.0.0 + 1.1.0 + 1.9.2 @@ -56,6 +57,11 @@ bullet-record ${bullet.record.version} + + org.apache.avro + avro + ${avro.version} + src/main/scala diff --git a/examples/spark/src/main/resources/bullet_spark_kafka_settings.yaml b/examples/spark/src/main/resources/bullet_spark_kafka_settings.yaml index ba4c7312..f7827b78 100644 --- a/examples/spark/src/main/resources/bullet_spark_kafka_settings.yaml +++ b/examples/spark/src/main/resources/bullet_spark_kafka_settings.yaml @@ -100,7 +100,8 @@ bullet.pubsub.kafka.response.topic.name: "bullet.responses" ######################################################################################################################## ######################################################################################################################## bullet.query.aggregation.raw.max.size: 500 -bullet.query.aggregation.max.size: 1024 +# This setting is enforced in the API at this time +# bullet.query.aggregation.max.size: 1024 bullet.query.aggregation.count.distinct.sketch.entries: 16384 bullet.query.aggregation.group.sketch.entries: 1024 bullet.query.aggregation.distribution.sketch.entries: 1024 diff --git a/examples/storm/pom.xml b/examples/storm/pom.xml index 5824d42c..e625e022 100644 --- a/examples/storm/pom.xml +++ b/examples/storm/pom.xml @@ -27,9 +27,9 @@ 1.8 1.8 1.0.0 - 1.0.0 - 1.0.0 - 2.1.0 + 1.2.0 + 1.1.0 + 2.2.0 @@ -56,6 +56,24 @@ test --> + + + com.yahoo.bullet + bullet-storm + ${bullet.storm.version} + + + com.yahoo.bullet + bullet-record + ${bullet.record.version} + + + com.yahoo.bullet + bullet-core + ${bullet.core.version} + + log4j log4j @@ -91,21 +109,6 @@ ${storm.version} --> - - com.yahoo.bullet - bullet-storm - ${bullet.storm.version} - - - com.yahoo.bullet - bullet-record - ${bullet.record.version} - - - com.yahoo.bullet - bullet-core - ${bullet.core.version} - diff --git a/examples/storm/src/main/java/com/yahoo/bullet/storm/examples/RandomSpout.java b/examples/storm/src/main/java/com/yahoo/bullet/storm/examples/RandomSpout.java index 9bae1659..f3235ef1 100644 --- a/examples/storm/src/main/java/com/yahoo/bullet/storm/examples/RandomSpout.java +++ b/examples/storm/src/main/java/com/yahoo/bullet/storm/examples/RandomSpout.java @@ -35,7 +35,7 @@ public class RandomSpout extends BaseRichSpout { protected SpoutOutputCollector outputCollector; public static final String RECORD_FIELD = "record"; - // This is the message ID for all tuples. This enables acking from this Spout to the FilterBolt. However + // This is the message ID for all tuples. This enables acking from this Spout to the Filterbolt. However // this spout does not handle dealing with failures. So, we use this as a way to simply enable acking. public static final Long DUMMY_ID = 42L; diff --git a/examples/storm/src/main/resources/bullet_settings.yaml b/examples/storm/src/main/resources/bullet_settings.yaml index 1c852357..82c7d50c 100644 --- a/examples/storm/src/main/resources/bullet_settings.yaml +++ b/examples/storm/src/main/resources/bullet_settings.yaml @@ -39,7 +39,8 @@ bullet.topology.bullet.spout.memory.off.heap.load: 160.0 # Bullet Core settings bullet.query.aggregation.raw.max.size: 500 -bullet.query.aggregation.max.size: 1024 +# This setting is enforced in the API at this time +# bullet.query.aggregation.max.size: 1024 bullet.query.aggregation.count.distinct.sketch.entries: 16384 bullet.query.aggregation.group.sketch.entries: 1024 bullet.query.aggregation.distribution.sketch.entries: 1024 diff --git a/examples/ui/env-settings.json b/examples/ui/env-settings.json index 27643f77..9c1bc744 100644 --- a/examples/ui/env-settings.json +++ b/examples/ui/env-settings.json @@ -1,8 +1,9 @@ { "default": { "queryHost": "http://localhost:9999", - "queryNamespace": "api/bullet", + "queryNamespace": "api/bullet/queries", "queryPath": "ws-query", + "validationPath": "validate-query", "queryStompRequestChannel": "/server/request", "queryStompResponseChannel": "/client/response", "schemaHost": "http://localhost:9999", @@ -14,14 +15,14 @@ } ], "bugLink": "https://github.com/bullet-db/bullet-ui/issues", - "modelVersion": 3, + "modelVersion": 4, "migrations": { "deletions": "query" }, "defaultValues": { "aggregationMaxSize": 1024, "rawMaxSize": 500, - "durationMaxSecs": 86400, + "durationMaxSecs": 9007199254740, "distributionNumberOfPoints": 11, "distributionQuantilePoints": "0, 0.25, 0.5, 0.75, 0.9, 1", "distributionQuantileStart": 0, @@ -29,7 +30,7 @@ "distributionQuantileIncrement": 0.1, "windowEmitFrequencyMinSecs": 1, "everyForRecordBasedWindow": 1, - "everyForTimeBasedWindow": 2, + "everyForTimeBasedWindow": 2000, "sketches": { "countDistinctMaxEntries": 16384, "groupByMaxEntries": 512, diff --git a/examples/web-service/example_query_config.yaml b/examples/web-service/example_query_config.yaml new file mode 100644 index 00000000..aa1b6dc1 --- /dev/null +++ b/examples/web-service/example_query_config.yaml @@ -0,0 +1,4 @@ +# Custom or notable settings for the example +# Settings not overridden will default to values in bullet_defaults.yaml in the bullet-core artifact. + +bullet.query.aggregation.max.size: 1024 diff --git a/mkdocs.yml b/mkdocs.yml index 82939f59..8c8a9b22 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -32,9 +32,9 @@ pages: - Web Service: - Setup: ws/setup.md - API: - - BQL: ws/api-bql.md - - JSON: ws/api-json.md - - Query Examples: ws/examples.md + - BQL: ws/api.md + - Examples: ws/examples.md + - JSON (DEPRECATED): ws/api-json.md - UI: - Setup: ui/setup.md - Usage: ui/usage.md @@ -50,7 +50,7 @@ markdown_extensions: extra: collapse_toc: true include_search: true - service_version: v0.6.1 + service_version: v1.0.0 extra_css: - css/extra.css