Skip to content

Druid 0.10.0 release notes #3944

Closed
Closed

Description

@gianm

DRAFT

Druid 0.10.0 contains hundreds of performance improvements, stability improvements, and bug fixes from over 40 contributors. Major new features include a built-in SQL layer, numeric dimensions, Kerberos authentication support, a revamp of the "index" task, a new "like" filter, large columns, ability to run the coordinator and overlord as a single service, better performing defaults, and eight new extensions.

If you are upgrading from a previous version of Druid, please see "Updating from 0.9.2 and earlier" below for upgrade notes, including some backwards incompatible changes.

The full list of changes is here: https://github.com/druid-io/druid/pulls?utf8=%E2%9C%93&q=is%3Apr%20is%3Aclosed%20milestone%3A0.10.0

Documentation for this release is at: http://druid.io/docs/0.10.0-rc2/

Highlights

Built-in SQL

Druid now includes a built-in SQL server powered by Apache Calcite. Druid provides two SQL APIs: HTTP POST and JDBC. This provides an alternative to Druid's native JSON API which is more familiar to new developers, and which makes it easier to integrate pre-existing applications that natively speak SQL. Not all Druid and SQL features are supported by the SQL layer in this initial release, but we intend to expand both in future releases.

SQL support can be enabled by setting druid.sql.enable=true in your configuration. See http://druid.io/docs/0.10.0-rc2/querying/sql.html for details and documentation.

Added in #3682 by @gianm.

Numeric dimensions

Druid now supports numeric dimensions at ingestion and query time. Users can ingest long and float columns as dimensions (i.e., treating the numeric columns as part of the ingestion-time grouping key instead of as aggregators, if rollup is enabled). Additionally, Druid queries can now accept any long or float column as a dimension for grouping or for filtering.

There are performance tradeoffs between string and numeric columns. Numeric columns are generally faster to group on than string columns. Numeric columns don't have indexes, so they are generally slower to filter on than string columns.

See http://druid.io/docs/0.10.0-rc2/ingestion/schema-design.html#numeric-dimensions for ingestion documentation and http://druid.io/docs/0.10.0-rc2/querying/dimensionspecs.html for query documentation.

Added in #3838, #3966, and other patches by @jon-wei.

Kerberos authentication support

Added a new extension named 'druid-kerberos' which adds support for User Authentication for Druid Nodes using Kerberos. It uses the simple and protected GSSAPI negotiation mechanism, SPNEGO(https://en.wikipedia.org/wiki/SPNEGO) for authentication via HTTP.

See http://druid.io/docs/0.10.0-rc2/development/extensions-core/druid-kerberos.html for documentation on how to configure kerberos authentication.

Added in #3853 by @nishantmonu51.

Index task revamp

The indexing task was re-written to improve performance, particularly for jobs spanning multiple intervals that generated many shards. The segmentGranularity intervals can now be automatically determined and no longer needs to be specified, but ingestion time can be reduced if both intervals and numShards are provided.

Additionally, the indexing task now supports an appendToExisting flag which causes the data to be indexed as an additional shard of the current version rather than as a new version overshadowing the previous version.

See http://druid.io/docs/0.10.0-rc2/ingestion/tasks.html#index-task for documentation.

Added in #3611 by @dclim.

Like filter

Druid now includes a "like" filter that enables SQL LIKE-style filtering, such as foo LIKE 'bar%'. The implementation is generally faster than regex filters, and is encouraged over regex filters when possible. In particular, like filters on prefixes such as bar% are significantly faster than equivalent regex filters such as ^bar.*.

See http://druid.io/docs/0.10.0-rc2/querying/filters.html#like-filter for documentation.

Added in #3642 by @gianm.

Large columns

Druid now supports individual columns larger than 2GB. This feature is not typically required, since general guidance is that segments should generally be 500MB–1GB in size, but is useful in situations where one column is much larger than all the others (for example, large sketches).

This functionality is available to all Druid users and no special configuration is necessary when using the built-in column types. If you have developed a custom metric column type as a Druid extension, you can enable large column support by overriding getSerializer in your ComplexMetricsSerde.

Added in #3743 by @akashdw.

Coordinator/Overlord combination option

Druid deployments can now be simplified by combining the Coordinator and Overlord functions into the Coordinator process. To do this, set druid.coordinator.asOverlord.enabled and druid.coordinator.asOverlord.overlordService appropriately on your Coordinators and then stop your Overlords.

This is currently an experimental feature and is off by default. We intend to consider making this the default in a future version of Druid.

See http://druid.io/docs/0.10.0-rc2/configuration/coordinator.html for documentation on this feature and configuration options.

Added in #3711 by @himanshug.

Better performing defaults

This release changes two default settings to improve out-of-the-box performance:

  • The buildV9Directly option introduced in Druid 0.9.0 is now enabled by default. This option improves performance of indexing by creating the v9 data format directly rather than creating v8 first and then converting to v9. If necessary, you can roll back to the old code by setting "buildV9Directly" to false in your indexing tasks.

  • The v2 groupBy engine introduced in Druid 0.9.2 is now enabled by default. This new groupBy engine was rewritten from the ground up for better performance and memory management. If necessary, you can roll back to the old engine by setting either "druid.groupBy.query.defaultStrategy" in your runtime.properties, or "groupByStrategy" in your query context, to "v1". See http://druid.io/docs/0.10.0-rc2/querying/groupbyquery.html for details on the differences between groupBy v1 and v2.

Other performance improvements

In addition to better performing defaults, Druid 0.10.0 has a number of other performance improvements, including:

New extensions

And much more!

The full list of changes is here: https://github.com/druid-io/druid/pulls?utf8=%E2%9C%93&q=is%3Apr%20is%3Aclosed%20milestone%3A0.10.0

Updating from 0.9.2 and earlier

Please see below for changes between 0.9.2 and 0.10.0 that you should be aware of before upgrading. If you're updating from an earlier version than 0.9.2, please see release notes of the relevant intermediate versions for additional notes.

Rolling updates

The standard Druid update process described by http://druid.io/docs/0.10.0-rc2/operations/rolling-updates.html should be followed for rolling updates.

Query API changes

Please note the following backwards-incompatible query API changes when updating. Some queries may need to be adjusted to continue to behave as expected.

Deployment and configuration changes

Please note the following deployment-related changes when updating.

  • Druid now requires Java 8 to run (Require Java 8 and include some Java 8 dependencies. #3914). If you are currently running on Java 7, we suggest upgrading Java first and then Druid.

  • Druid now defaults to the "v2" engine for groupBy rather than the legacy "v1" engine. As part of this, memory usage limits have changed from row-based to byte-based limits, so it is possible that some queries which met resource limits before will now exceed them and fail. You can avoid this by tuning the new groupBy engine appropriately. If necessary, you can roll back to the old engine by setting either "druid.groupBy.query.defaultStrategy" in your runtime.properties, or "groupByStrategy" in your query context, to "v1". See http://druid.io/docs/0.10.0-rc2/querying/groupbyquery.html for more details on the differences between groupBy v1 and v2.

    This new groupBy engine was rewritten from the ground up for better performance and memory management. The query API and results are compatible between the two engines; however, there are some differences from a cluster configuration perspective: (1) groupBy v2 uses primarily off-heap memory instead of on-heap memory; (2) it requires one merge buffer for each concurrent query; (3) if you've configured caching for groupBy, it must be on historicals; and (4) it doesn't support chunkPeriod.

  • Druid now has a non-zero default value for druid.processing.numMergeBuffers (Use GroupBy V2 as default #3953). This will increase the amount of direct memory used in its default configuration. This change was made in connection with changing the default groupBy engine, since the new "v2" engine requires merge buffers. If you were formerly using groupBy v1, you should be able to offset this by reducing your JVM heap, since groupBy v2 uses off-heap memory rather than on-heap memory.

  • Druid query-related processes (broker, historical, indexing tasks) now eagerly allocate druid.processing.numThreads number of DirectByteBuffer instances of size druid.processing.buffer.sizeBytes for query processing at startup (eagerly allocate the intermediate computation buffers #3628). This allocation was lazy in earlier versions of Druid. This change does not affect memory use of a long-running Druid cluster, but it means that memory for processing buffers must be available when Druid starts up.

  • When running in non-UTC timezones, behavior of predefined segmentGranularity constants such as "day" will change when upgrading. Formerly, this would generate segments using local days. In Druid 0.10.0, this will generate segments using UTC days. If you were running Druid in the UTC timezone, this change has no effect. Please note that running Druid in a non-UTC timezone is not officially supported (see http://druid.io/docs/0.10.0-rc2/configuration/index.html) and we recommend always running all processes in UTC timezones. To create local-day segments using Druid 0.10.0, you can use a local-time segmentGranularity such as:

"segmentGranularity" : {
     "type" : "period",
     "period" : "P1D",
     "timeZone" : "America/Los_Angeles"
}

Extension changes

Credits

Thanks to everyone who contributed to this release!

@akashdw
@Aveplatter
@b-slim
@baruchz
@cheddar
@clintropolis
@DaimonPl
@dclim
@dpenas
@drcrallen
@du00cs
@erikdubbelboer
@Fokko
@freakyzoidberg
@GabrielPage
@gianm
@gvsmirnov
@himanshug
@hland
@hzy001
@jaehc
@jihoonson
@jisookim0513
@jkukul
@joanvr
@jon-wei
@kaijianding
@leventov
@mark1900
@michaelschiff
@navis
@ncolomer
@niketh
@nishantmonu51
@pjain1
@praveev
@sirpkt
@tranv94
@xiaoyao1991
@yuusaku-t
@zhxiaogg

Activity

  1. added this to the 0.10.0 milestone on Feb 16, 2017
  2. gianm commented on Feb 16, 2017

    @gianm
    ContributorAuthor

    Starting up the release notes with a list of contributors generated from a script (anyone that raised a PR or issue which was part of the release)

  3. mszone commented on Feb 22, 2017

    @mszone

    Release notes - http://druid.io/docs/0.10.0-rc1/ is not available. Can you please fix it.

  4. gianm commented on Feb 22, 2017

    @gianm
    ContributorAuthor

    @mszone, 0.10.0-rc1 hasn't been released yet, this issue is just a place to draft the notes for when it does get released. This will likely be soon.

  5. gianm commented on Feb 28, 2017

    @gianm
    ContributorAuthor

    Updated the release notes with blurbs or at least TODO references to all issues tagged "Incompatible", "Release Notes", or "Performance" — except for #3628 since I wasn't sure what to write about that one.

  6. gianm commented on Feb 28, 2017

    @gianm
    ContributorAuthor

    @b-slim, @nishantmonu51 could you please write a blurb for "Improved Kerberos support" as a comment on this issue?

  7. gianm commented on Feb 28, 2017

    @gianm
    ContributorAuthor

    @dclim could you please write a blurb for "Index task revamp" as a comment on this issue?

  8. gianm commented on Feb 28, 2017

    @gianm
    ContributorAuthor

    @himanshug could you please write a blurb for "Coordinator/Overlord combination option" as a comment on this issue?

  9. dclim commented on Feb 28, 2017

    @dclim
    Contributor

    @gianm added it directly by editing the initial comment

  10. gianm commented on Feb 28, 2017

    @gianm
    ContributorAuthor

    thanks, although a new comment is easier to work with than editing the initial comment, since GitHub doesn't have good tools for resolving conflicts on issue comments.

  11. patelh commented on Feb 28, 2017

    @patelh
    Contributor

    I hope #3983 was already fixed before making v2 group by as default.

  12. gianm commented on Mar 1, 2017

    @gianm
    ContributorAuthor

    @patelh I think the root cause of that issue is lack of thread safety on the "time" extraction fn, and if so then #3984 should fix it.

  13. akashdw commented on Mar 1, 2017

    @akashdw
    Contributor

    @gianm On large column support,Generic Indexed V2 is disabled by default for custom extensions and can be enabled by overriding https://github.com/druid-io/druid/blob/master/processing/src/main/java/io/druid/segment/serde/ComplexMetricSerde.java#L113.
    Created a small pr to enable it for druid-io complex metrics. #3987

  14. gianm commented on Mar 1, 2017

    @gianm
    ContributorAuthor

    Thanks @akashdw, I updated the notes

  15. 6 remaining items

  16. yaochitc commented on Mar 3, 2017

    @yaochitc

    lgtm

  17. patelh commented on Mar 8, 2017

    @patelh
    Contributor

    Was the chunkPeriod bug in v2 group by engine fixed? I would not recommend setting v2 as default until that is deprecated or fixed.

  18. gianm commented on Mar 8, 2017

    @gianm
    ContributorAuthor

    Yes, that was fixed in #4004.

  19. gianm commented on Mar 10, 2017

    @gianm
    ContributorAuthor

    Added the following to clarify numeric dimension performance.

    There are performance tradeoffs between string and numeric columns. Numeric columns are generally faster to group on than string columns. Numeric columns don't have indexes, so they are generally slower to filter on than string columns.

  20. hamlet-lee commented on Apr 6, 2017

    @hamlet-lee
    Contributor

    There are two upgrade points may should be mentioned in the release notes:

    1. "segmentGranularity" semantics changed.
      If running in some locale other than "GMT", and set as "DAY" / "WEEK" / "MONTH", the result segments boundary may be changed.
      In my production running, I found that:
      In previous version, it generates segments align on "local 00:00:00"
      In 0.10.0, it generates segments boundary align on "GMT 00:00:00"
      To generate compatible segments, I had to specify something like

         {
           "type" : "period",
           "period" : "P1D",
           "timeZone" : "+08:00",
           "origin" : null
         }
      
    2. parameter in hadoop index spec changed.
      tuningConfig: "maxRowsInMemory" has changed to "maxRowsInMemory"

  21. gianm commented on Apr 10, 2017

    @gianm
    ContributorAuthor

    @hamlet-lee,

    For (1) do you mean this is a behavior change when you're running Druid with some TZ other than UTC? If so, that configuration isn't supported (we officially only support running in UTC) and so behavior there is undefined and may change for any feature that relies on time zones. I'll add something to the release notes, but please run Druid in the UTC tz if at all possible, for your own benefit!

    For (2) I don't understand what you're saying. It looks like "maxRowsInMemory" is the same as before. Could you please be more specific?

  22. gianm commented on Apr 10, 2017

    @gianm
    ContributorAuthor

    I added this to the release notes:

    When running in non-UTC timezones, behavior of predefined segmentGranularity constants such as "day" will change when upgrading. Formerly, this would generate segments using local days. In Druid 0.10.0, this will generate segments using UTC days. If you were running Druid in the UTC timezone, this change has no effect. Please note that running Druid in a non-UTC timezone is not officially supported (see http://druid.io/docs/0.10.0-rc2/configuration/index.html) and we recommend always running all processes in UTC timezones. To create local-day segments using Druid 0.10.0, you can use a local-time segmentGranularity such as:

    "segmentGranularity" : {
        "type" : "period",
        "period" : "P1D",
        "timeZone" : "America/Los_Angeles"
    }
    
  23. gianm commented on Apr 11, 2017

    @gianm
    ContributorAuthor

    I updated the groupBy section of the release notes based on the dev sync discussion today:

    Druid now defaults to the "v2" engine for groupBy rather than the legacy "v1" engine. As part of this, memory usage limits have changed from row-based to byte-based limits, so it is possible that some queries which met resource limits before will now exceed them and fail. You can avoid this by tuning the new groupBy engine appropriately. If necessary, you can roll back to the old engine by setting either "druid.groupBy.query.defaultStrategy" in your runtime.properties, or "groupByStrategy" in your query context, to "v1". See http://druid.io/docs/0.10.0-rc2/querying/groupbyquery.html for more details on the differences between groupBy v1 and v2.

    This new groupBy engine was rewritten from the ground up for better performance and memory management. The query API and results are compatible between the two engines; however, there are some differences from a cluster configuration perspective: (1) groupBy v2 uses primarily off-heap memory instead of on-heap memory; (2) it requires one merge buffer for each concurrent query; (3) if you've configured caching for groupBy, it must be on historicals; and (4) it doesn't support chunkPeriod.

  24. hamlet-lee commented on Apr 12, 2017

    @hamlet-lee
    Contributor

    @gianm
    My mistake, it should be:
    tuningConfig: "rowFlushBoundary" has changed to "maxRowsInMemory"

  25. gianm commented on Apr 12, 2017

    @gianm
    ContributorAuthor

    rowFlushBoundary should still work in 0.10.0 (but it is deprecated and has been since 0.9.0).

  26. gianm commented on Apr 18, 2017

    @gianm
    ContributorAuthor
  27. himanshug commented on Apr 25, 2017

    @himanshug
    Contributor

    https://groups.google.com/forum/#!topic/druid-user/_SDm2MgVAoM

    should we update the release notes to tell where overlord console would be found ?

  28. gianm commented on Apr 26, 2017

    @gianm
    ContributorAuthor

    Is that in the docs? If not it should be, that seems like the right place for it.

    We could update release notes too (if you want, edit https://github.com/druid-io/druid/releases/tag/druid-0.10.0 and add a note there) but the doc change is more important.

  29. himanshug commented on Apr 26, 2017

    @himanshug
    Contributor

    i updated the docs #4213 and release notes for 0.10.0 .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions