<p dir="auto">Apache Druid 0.18.0 contains over 200 new features, performance enhancements, bug fixes, and major documentation improvements from 42 contributors. Check out the <a href="https://github.com/apache/druid/compare/0.17.0...0.18.0">complete list of changes</a> and <a href="https://github.com/apache/druid/milestone/37">everything tagged to the milestone</a>.</p>
<h1 dir="auto">New Features</h1>
<h2 dir="auto">Join support</h2>
<p dir="auto">Join is a key operation in data analytics. Prior to 0.18.0, Druid supported some join-related features, such as Lookups or semi-joins in SQL. However, the use cases for those features were pretty limited and, for other join use cases, users had to denormalize their datasources when they ingest data instead of joining them at query time, which could result in exploding data volume and long ingestion time.</p>
<p dir="auto">Druid 0.18.0 supports real joins for the first time ever in its history. Druid supports INNER, LEFT, and CROSS joins for now. For native queries, the <code class="notranslate">join</code> datasource has been newly introduced to represent a join of two datasources. Currently, only the <em>left-deep</em> join is allowed. That means, only a <code class="notranslate">table</code> or another <code class="notranslate">join</code> datasource is allowed for the left datasource. For the right datasource, <code class="notranslate">lookup</code>, <code class="notranslate">inline</code>, or <code class="notranslate">query</code> datasources are allowed. Note that join of Druid datasources is not supported yet. There should be only one <code class="notranslate">table</code> datasource in the same join query.</p>
<p dir="auto">Druid SQL also supports joins. Under the covers, SQL join queries are translated into one or several native queries that include join datasources. See <a href="TBD">Query translation</a> for more details of SQL translation and best practices to write efficient queries.</p>
<p dir="auto">When a join query is issued, the Broker first <em>evaluates</em> all datasources except for the base datasource which is the only <code class="notranslate">table</code> datasource in the query. The evaluation can include executing subqueries for <code class="notranslate">query</code> datasources. Once the Broker evaluates all non-base datasources, it replaces them with <code class="notranslate">inline</code> datasources and sends the rewritten query to data nodes (see the below "Query inlining in Brokers" section for more details). Data nodes use the hash join to process join queries. They build a hash table for each non-primary leaf datasource unless it already exists. Note that only <code class="notranslate">lookup</code> datasource currently has a pre-built hash table. See <a href="TBD">Query execution</a> for more details about join query execution.</p>
<p dir="auto">Joins can affect performance of your queries. In general, any queries including joins can be slower than equivalent queries against a denormalized datasource. The <code class="notranslate">LOOKUP</code> function could perform better than joins with lookup datasources. See <a href="TBD">Join performance</a> for more details about join query performance and future plans for performance improvement.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="511652171" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/8728" data-hovercard-type="issue" data-hovercard-url="/apache/druid/issues/8728/hovercard" href="https://github.com/apache/druid/issues/8728">#8728</a><br>
<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="585148693" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9545" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9545/hovercard" href="https://github.com/apache/druid/pull/9545">#9545</a><br>
<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="543934097" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9111" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9111/hovercard" href="https://github.com/apache/druid/pull/9111">#9111</a></p>
<h2 dir="auto">Query inlining in Brokers</h2>
<p dir="auto">Druid is now able to execute a nested query by inlining subqueries. Any type of subquery can be on top of any type of another, such as in the following example:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="             topN
               |
       (join datasource)
         /          \
(table datasource)  groupBy"><pre class="notranslate"><code class="notranslate">             topN
               |
       (join datasource)
         /          \
(table datasource)  groupBy
</code></pre></div>
<p dir="auto">To execute this query, the Broker first evaluates the leaf groupBy subquery; it sends the subquery to data nodes and collects the result. The collected result is materialized in the Broker memory. Once the Broker collects all results for the groupBy query, it rewrites the topN query by replacing the leaf groupBy with an inline datasource which has the result of the groupBy query. Finally, the rewritten query is sent to data nodes to execute the topN query.</p>
<h2 dir="auto">Query laning and prioritization</h2>
<p dir="auto">When you run multiple queries of heterogenous workloads at a time, you may sometimes want to control the resource commitment for a query based on its priority. For example, you would want to limit the resources assigned to less important queries, so that important queries can be executed in time without being disrupted by less important ones.</p>
<p dir="auto">Query laning allows you to control capacity utilization for heterogeneous query workloads. With laning, the broker examines and classifies a query for the purpose of assigning it to a 'lane'. Lanes have capacity limits, enforced by the Broker, that can be used to ensure sufficient resources are available for other lanes or for interactive queries (with no lane), or to limit overall throughput for queries within the lane.</p>
<p dir="auto">Automatic query prioritization determines the query priority based on the configured strategy. The threshold-based prioritization strategy has been added; it automatically lowers the priority of queries that cross any of a configurable set of thresholds, such as how far in the past the data is, how large of an interval a query covers, or the number of segments taking part in a query.</p>
<p dir="auto">See <a href="https://github.com/apache/druid/blob/0.18.0/docs/configuration/index.md#query-prioritization-and-laning">https://github.com/apache/druid/blob/0.18.0/docs/configuration/index.md#query-prioritization-and-laning</a> for more details.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="406046659" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/6993" data-hovercard-type="issue" data-hovercard-url="/apache/druid/issues/6993/hovercard" href="https://github.com/apache/druid/issues/6993">#6993</a><br>
<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="571307671" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9407" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9407/hovercard" href="https://github.com/apache/druid/pull/9407">#9407</a><br>
<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="578533015" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9493" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9493/hovercard" href="https://github.com/apache/druid/pull/9493">#9493</a></p>
<h3 dir="auto">New dimension in query metrics</h3>
<p dir="auto">Since a native query containing subqueries can be executed part-by-part, a new <code class="notranslate">subQueryId</code> has been introduced. Each subquery has different <code class="notranslate">subQueryId</code>s but same <code class="notranslate">queryId</code>. The <code class="notranslate">subQueryId</code> is available as a new dimension in query metrics.</p>
<h3 dir="auto">New configuration</h3>
<p dir="auto">A new <code class="notranslate">druid.server.http.maxSubqueryRows</code> configuration controls the maximum number of rows materialized in the Broker memory.</p>
<p dir="auto">Please see <a href="TBD">docs (TBD)</a> for more details.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="583475386" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9533" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9533/hovercard" href="https://github.com/apache/druid/pull/9533">#9533</a></p>
<h2 dir="auto">SQL grouping sets</h2>
<p dir="auto">GROUPING SETS is now supported, allowing you to combine multiple GROUP BY clauses into one GROUP BY clause. This GROUPING SETS clause is internally translated into the groupBy query with <code class="notranslate">subtotalsSpec</code>. The LIMIT clause is now applied after subtotalsSpec, rather than applied to each grouping set.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="545118059" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9122" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9122/hovercard" href="https://github.com/apache/druid/pull/9122">#9122</a></p>
<h2 dir="auto">SQL Dynamic parameters</h2>
<p dir="auto">Druid now supports dynamic parameters for SQL. To use dynamic parameters, replace any literal in the query with a question mark (<code class="notranslate">?</code>) character. These question marks represent the places where the parameters will be bound at execution time. See <a href="https://github.com/apache/druid/blob/0.18.0/docs/querying/sql.md#query-syntax">https://github.com/apache/druid/blob/0.18.0/docs/querying/sql.md#query-syntax</a> for more details.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="405489291" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/6974" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/6974/hovercard" href="https://github.com/apache/druid/pull/6974">#6974</a></p>
<h1 dir="auto">Important Changes</h1>
<h2 dir="auto"><code class="notranslate">applyLimitPushDownToSegments</code> is disabled by default</h2>
<p dir="auto"><code class="notranslate">applyLimitPushDownToSegments</code> was added in 0.17.0 to push down limit evaluation to queryable nodes, limiting results during segment scan for groupBy v2. This can lead to performance degradation, as reported in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="598446512" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9689" data-hovercard-type="issue" data-hovercard-url="/apache/druid/issues/9689/hovercard" href="https://github.com/apache/druid/issues/9689">#9689</a>, if many segments are involved in query processing. This is because “limit push down to segment scan” initializes an aggregation buffer per segment, the overhead for which is not negligible. Enable this configuration only if your query involves a relatively small number of segments per historical or realtime task.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="600785080" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9711" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9711/hovercard" href="https://github.com/apache/druid/pull/9711">#9711</a></p>
<h2 dir="auto">New lag metrics for Kinesis</h2>
<p dir="auto">Kinesis indexing service now provides new lag metrics, listed below, which are computed based on <a href="https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html#Streams-GetRecords-response-MillisBehindLatest" rel="nofollow">MillisBehindLatest in GetRecords response in Kinesis</a>:</p>
<ul dir="auto">
<li><code class="notranslate">ingest/{supervisor type}/lag/time</code>: total time in millis behind the latest offsets of the stream</li>
<li><code class="notranslate">ingest/{supervisor type}/maxLag/time</code>: max time in millis behind the latest offsets of the stream</li>
<li><code class="notranslate">ingest/{supervisor type}/avgLag/time</code>: avg time in millis behind the latest offsets of the stream</li>
</ul>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="579825886" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9509" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9509/hovercard" href="https://github.com/apache/druid/pull/9509">#9509</a></p>
<h2 dir="auto">Roaring bitmaps as default</h2>
<p dir="auto">Druid supports two bitmap types, i.e., Roaring and CONCISE. Since Roaring bitmaps provide a better out-of-box experience (faster query speed in general), the default bitmap type is now switched to Roaring bitmaps. See <a href="https://github.com/apache/druid/blob/0.18.0/docs/design/segments.md#compression">https://github.com/apache/druid/blob/0.18.0/docs/design/segments.md#compression</a> for more details about bitmaps.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="585298476" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9548" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9548/hovercard" href="https://github.com/apache/druid/pull/9548">#9548</a></p>
<h2 dir="auto">Complex metrics behavior change at ingestion time when SQL-compatible null handling is disabled (default mode)</h2>
<p dir="auto">When SQL-compatible null handling is disabled, the behavior of complex metric aggregation at ingestion time has now changed to be consistent with that at query time. The complex metrics are aggregated to the default 0 values for nulls instead of skipping them during ingestion.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="578029940" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9484" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9484/hovercard" href="https://github.com/apache/druid/pull/9484">#9484</a></p>
<h2 dir="auto">Array expression syntax change</h2>
<p dir="auto">Druid expression now supports typed constructors for creating arrays. Arrays can be defined with an explicit type. For example, <code class="notranslate">&lt;LONG&gt;[1, 2, null]</code> creates an array of <code class="notranslate">LONG</code> type containing <code class="notranslate">1</code>, <code class="notranslate">2</code>, and <code class="notranslate">null</code>. Note that you can still create an array without an explicit type. For example, <code class="notranslate">[1, 2, null]</code> is still a valid syntax to create an equivalent array. In this case, Druid will infer the type of array from its elements. This new syntax applies to empty arrays as well. <code class="notranslate">&lt;STRING&gt;[]</code>, <code class="notranslate">&lt;DOUBLE&gt;[]</code>, and <code class="notranslate">&lt;LONG&gt;[]</code> will create an empty array of <code class="notranslate">STRING</code>, <code class="notranslate">DOUBLE</code>, and <code class="notranslate">LONG</code> type, respectively.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="565732574" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9367" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9367/hovercard" href="https://github.com/apache/druid/pull/9367">#9367</a></p>
<h2 dir="auto">Enabling pending segments cleanup by default</h2>
<p dir="auto">The <code class="notranslate">pendingSegments</code> table in the metadata store is used to create unique new segment IDs for appending tasks such as Kafka/Kinesis indexing tasks or batch tasks of appending mode. Automatic pending segments cleanup was introduced in 0.12.0, but has been disabled by default prior to 0.18.0. This configuration is now enabled by default.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="568663888" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9385" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9385/hovercard" href="https://github.com/apache/druid/pull/9385">#9385</a></p>
<h2 dir="auto">Creating better input splits for native parallel indexing</h2>
<p dir="auto">The Parallel task now can create better splits. Each split can contain multiple input files based on their size. Empty files will be ignored. The split size is controllable with the new split hint spec. See <a href="https://github.com/apache/druid/blob/0.18.0/docs/ingestion/native-batch.md#split-hint-spec">https://github.com/apache/druid/blob/0.18.0/docs/ingestion/native-batch.md#split-hint-spec</a> for more details.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="564948364" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9360" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9360/hovercard" href="https://github.com/apache/druid/pull/9360">#9360</a><br>
<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="574410320" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9450" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9450/hovercard" href="https://github.com/apache/druid/pull/9450">#9450</a></p>
<h2 dir="auto">Transform is now an extension point</h2>
<p dir="auto"><a href="https://github.com/apache/druid/blob/0.18.0/processing/src/main/java/org/apache/druid/segment/transform/Transform.java"><code class="notranslate">Transform</code></a> is an <code class="notranslate">Interface</code> that represents a transformation to be applied to each row at ingestion time. This interface is now an Extension point. Please see <a href="https://druid.apache.org/docs/0.18.0/development/modules.html#writing-your-own-extensions" rel="nofollow">https://druid.apache.org/docs/0.18.0/development/modules.html#writing-your-own-extensions</a> for how to add your custom <code class="notranslate">Transform</code>.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="560814383" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9319" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9319/hovercard" href="https://github.com/apache/druid/pull/9319">#9319</a></p>
<h2 dir="auto"><code class="notranslate">chunkPeriod</code> query context is removed</h2>
<p dir="auto"><code class="notranslate">chunkPeriod</code> has been deprecated since 0.14.0 because of its limited usage (it was sometimes useful for only groupBy v1). This query context is now removed in 0.18.0.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="551694818" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9216" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9216/hovercard" href="https://github.com/apache/druid/pull/9216">#9216</a></p>
<h2 dir="auto">Experimental support for Java 11</h2>
<p dir="auto">Druid now experimentally supports Java 11. You can run the same Druid binary distribution with Java 11 which is compiled with Java 8. Our tests on Travis include:</p>
<ul dir="auto">
<li>Compiling and running unit tests with Java 11</li>
<li>Compiling with Java 8 and running integration tests with Java 11</li>
</ul>
<p dir="auto">Performance testing results are not available yet.</p>
<h3 dir="auto">Warnings for illegal reflective accesses when running Druid with Java 11</h3>
<p dir="auto">Since Java 9, it issues a warning when it is found that some libraries use reflection to illegally access internal APIs of the JDK. These warnings will be fixed by modifying Druid codes or upgrading library versions in future releases. For now, these warnings can be suppressed by adding JVM options such as <code class="notranslate">--add-opens</code> or <code class="notranslate">--add-exports</code>. See <a href="https://docs.oracle.com/en/java/javase/11/migrate/index.html#JSMIG-GUID-7BB28E4D-99B3-4078-BDC4-FC24180CE82B" rel="nofollow">JDK 11 Migration Guide</a> for more details.</p>
<p dir="auto">Some of the warnings are:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="2020-01-22T21:30:08,893 WARN [main] org.apache.druid.java.util.metrics.AllocationMetricCollectors - Cannot initialize org.apache.druid.java.util.metrics.AllocationMetricCollector
java.lang.reflect.InaccessibleObjectException: Unable to make public long[] com.sun.management.internal.HotSpotThreadImpl.getThreadAllocatedBytes(long[]) accessible: module jdk.management does not &quot;exports com.sun.management.internal&quot; to unnamed module @6955cb39"><pre class="notranslate"><code class="notranslate">2020-01-22T21:30:08,893 WARN [main] org.apache.druid.java.util.metrics.AllocationMetricCollectors - Cannot initialize org.apache.druid.java.util.metrics.AllocationMetricCollector
java.lang.reflect.InaccessibleObjectException: Unable to make public long[] com.sun.management.internal.HotSpotThreadImpl.getThreadAllocatedBytes(long[]) accessible: module jdk.management does not "exports com.sun.management.internal" to unnamed module @6955cb39
</code></pre></div>
<p dir="auto">This warning can be suppressed by adding <code class="notranslate">--add-exports jdk.management/com.sun.management.internal=ALL-UNNAMED</code>.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="2020-01-22T21:30:08,902 WARN [main] org.apache.druid.java.util.metrics.JvmMonitor - Cannot initialize GC counters. If running JDK11 and above, add --add-exports java.base/jdk.internal.perf=ALL-UNNAMED to the JVM arguments to enable GC counters."><pre class="notranslate"><code class="notranslate">2020-01-22T21:30:08,902 WARN [main] org.apache.druid.java.util.metrics.JvmMonitor - Cannot initialize GC counters. If running JDK11 and above, add --add-exports java.base/jdk.internal.perf=ALL-UNNAMED to the JVM arguments to enable GC counters.
</code></pre></div>
<p dir="auto">This warning can be suppressed by adding <code class="notranslate">--add-exports java.base/jdk.internal.perf=ALL-UNNAMED</code>.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release"><pre class="notranslate"><code class="notranslate">WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
</code></pre></div>
<p dir="auto">This warning can be suppressed by adding <code class="notranslate">--add-opens java.base/java.lang=ALL-UNNAMED</code>.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="423470156" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/7306" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/7306/hovercard" href="https://github.com/apache/druid/pull/7306">#7306</a><br>
<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="578334470" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9491" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9491/hovercard" href="https://github.com/apache/druid/pull/9491">#9491</a></p>
<h1 dir="auto">New Extension</h1>
<h2 dir="auto">New Pac4j extension</h2>
<p dir="auto">A new extension is added in 0.18.0 to enable <a href="https://openid.net/connect/" rel="nofollow">OpenID Connect</a> based Authentication for Druid Processes. This can be used  with any authentication server that supports same e.g. <a href="https://developer.okta.com/" rel="nofollow">Okta</a>. This extension should only be used at the router node to enable a group of users in existing authentication server to interact with Druid cluster, using the <a href="../../operations/druid-console.html">Web Console</a>.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="533030368" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/8992" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/8992/hovercard" href="https://github.com/apache/druid/pull/8992">#8992</a></p>
<h1 dir="auto">Security Issues</h1>
<h2 dir="auto">[<a title="CVE-2020-1958" data-hovercard-type="advisory" data-hovercard-url="/advisories/GHSA-qh2g-7h5p-mxf4/hovercard" href="https://github.com/advisories/GHSA-qh2g-7h5p-mxf4">CVE-2020-1958</a>] Apache Druid LDAP injection vulnerability</h2>
<p dir="auto"><a href="https://nvd.nist.gov/vuln/detail/CVE-2020-1958" rel="nofollow">CVE-2020-1958</a> has been reported recently and fixed in 0.18.0 and 0.17.1. When LDAP authentication is enabled, callers of Druid APIs can bypass the credentialsValidator.userSearch filter barrier or retrieve any LDAP attribute values of users that exist on the LDAP server, so long as that information is visible to the Druid server. Please see the description in the link for more details. It is <em>strongly</em> recommended to upgrade to 0.18.0 or 0.17.1 if you are using LDAP authentication with Druid.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="592179143" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9600" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9600/hovercard" href="https://github.com/apache/druid/pull/9600">#9600</a></p>
<h2 dir="auto">Updating Kafka client to 2.2.2</h2>
<p dir="auto">Kafka client library has been updated to 2.2.2, in which <a href="https://nvd.nist.gov/vuln/detail/CVE-2019-12399" rel="nofollow">CVE-2019-12399</a> is fixed.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="555325819" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9259" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9259/hovercard" href="https://github.com/apache/druid/pull/9259">#9259</a></p>
<h1 dir="auto">Bug fixes</h1>
<p dir="auto">Druid 0.18.0 includes 40 bug fixes. Please see <a href="https://github.com/apache/druid/pulls?page=1&amp;q=is%3Apr+milestone%3A0.18.0+is%3Aclosed+label%3ABug">https://github.com/apache/druid/pulls?page=1&amp;q=is%3Apr+milestone%3A0.18.0+is%3Aclosed+label%3ABug</a> for the full list of bug fixes.</p>
<ul dir="auto">
<li>Fix superbatch merge last partition boundaries (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="574187821" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9448" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9448/hovercard" href="https://github.com/apache/druid/pull/9448">#9448</a>)</li>
<li>Reuse transformer in stream indexing (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="595336848" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9625" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9625/hovercard" href="https://github.com/apache/druid/pull/9625">#9625</a>)</li>
<li>Preserve the null values for numeric type dimensions post-compaction (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="594747217" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9622" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9622/hovercard" href="https://github.com/apache/druid/pull/9622">#9622</a>)</li>
<li>DruidInputSource can add new dimensions during re-ingestion (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="590711581" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9590" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9590/hovercard" href="https://github.com/apache/druid/pull/9590">#9590</a>)</li>
<li>Error on value counter overflow instead of writing bad segments (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="587402449" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9559" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9559/hovercard" href="https://github.com/apache/druid/pull/9559">#9559</a>)</li>
<li>Fix some issues with filters on numeric columns with nulls (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="554623547" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9251" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9251/hovercard" href="https://github.com/apache/druid/pull/9251">#9251</a>)</li>
<li>Fix timestamp_format expr outside UTC time zone (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="556610731" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9282" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9282/hovercard" href="https://github.com/apache/druid/pull/9282">#9282</a>)</li>
<li>KIS task fail when setting segmentGranularity with time zone (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="508295642" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/8690" data-hovercard-type="issue" data-hovercard-url="/apache/druid/issues/8690/hovercard" href="https://github.com/apache/druid/issues/8690">#8690</a>)</li>
<li>Fix issue with group by limit pushdown for extractionFn, expressions, joins, etc (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="597675822" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9662" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9662/hovercard" href="https://github.com/apache/druid/pull/9662">#9662</a>)</li>
</ul>
<h1 dir="auto">Upgrading to Druid 0.18.0</h1>
<p dir="auto">Be aware of the following changes between 0.17.1 and 0.18.0 that you should be aware of before upgrading. If you're updating from an earlier version than 0.17.1, please see the release notes of the relevant intermediate versions.</p>
<h2 dir="auto">S3 extension</h2>
<p dir="auto">The S3 storage extension now supports cleanup of stale task logs and segments. When deploying 0.18.0, please ensure that your <code class="notranslate">extensions</code> directory does not have any older versions of <code class="notranslate">druid-s3-extensions</code> extension.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="576067495" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9459" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9459/hovercard" href="https://github.com/apache/druid/pull/9459">#9459</a></p>
<h2 dir="auto">Core extension for Azure</h2>
<p dir="auto">The Azure storage extension has been promoted to a core extension. It also supports cleanup of stale task logs and segments now. When deploying 0.18.0, please ensure that your <code class="notranslate">extensions-contrib</code> directory does not have any older versions of <code class="notranslate">druid-azure-extensions</code> extension.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="569676193" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9394" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9394/hovercard" href="https://github.com/apache/druid/pull/9394">#9394</a><br>
<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="582696455" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9523" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9523/hovercard" href="https://github.com/apache/druid/pull/9523">#9523</a></p>
<h2 dir="auto">Google Storage extension</h2>
<p dir="auto">The Google storage extension now supports cleanup of stale task logs and segments. When deploying 0.18.0, please ensure that your <code class="notranslate">extensions</code> directory does not have any older versions of <code class="notranslate">druid-google-extensions</code> extension.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="581548895" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9519" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9519/hovercard" href="https://github.com/apache/druid/pull/9519">#9519</a></p>
<h2 dir="auto">Hadoop AWS library included in binary distribution</h2>
<p dir="auto">Hadoop AWS library is now included in the binary distribution for better out-of-box experience. When deploying 0.18.0, please ensure that your <code class="notranslate">hadoop-dependencies</code> directory or any other directories in the classpath does not have duplicate libraries.</p>
<h2 dir="auto">PostgreSQL JDBC driver for Lookups included in binary distribution</h2>
<p dir="auto">PostgreSQL JDBC driver for Lookups is now included in the binary distribution for better out-of-box experience. When deploying 0.18.0, please ensure that your <code class="notranslate">extensions/druid-lookups-cached-single</code> directory or any other directories in the classpath does not have duplicate JDBC drivers.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="570007928" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9399" data-hovercard-type="pull_request" data-hovercard-url="/apache/druid/pull/9399/hovercard" href="https://github.com/apache/druid/pull/9399">#9399</a></p>
<h1 dir="auto">Known Issues</h1>
<h2 dir="auto">Query failure with <code class="notranslate">topN</code> or <code class="notranslate">groupBy</code> on <code class="notranslate">scan</code> with multi-valued columns</h2>
<p dir="auto">Query inlining in Brokers is newly introduced in 0.18.0 but has a bug that queries with <code class="notranslate">topN</code> or <code class="notranslate">groupBy</code> on top of <code class="notranslate">scan</code> fail if the scan query selects multi-valued dimensions. See <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="599218662" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9697" data-hovercard-type="issue" data-hovercard-url="/apache/druid/issues/9697/hovercard" href="https://github.com/apache/druid/issues/9697">#9697</a> for more details.</p>
<h2 dir="auto">Misleading <code class="notranslate">segment/unavailable/count</code> metric during handoff</h2>
<p dir="auto">This metric is supposed to take the number of segments served by realtime tasks into consideration as well, but it isn't now. As a result, it appears that unavailability spikes up before the new segments are loaded by historicals, even if all segments actually are continuously available on some combination of realtime tasks and historicals.</p>
<p dir="auto"><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="598168011" data-permission-text="Title is private" data-url="https://github.com/apache/druid/issues/9677" data-hovercard-type="issue" data-hovercard-url="/apache/druid/issues/9677/hovercard" href="https://github.com/apache/druid/issues/9677">#9677</a></p>
<h2 dir="auto">Slight difference between the result of <code class="notranslate">explain plan for</code> query and the actual execution plan</h2>
<p dir="auto">The result of <code class="notranslate">explain plan for</code> can be slightly different from what Druid actually executes when the query includes joins or subqueries. The difference can be found in that each part of the query plan would be represented as if it was its own native query in the result of <code class="notranslate">explain plan for</code>. For example, for a join of a datasource <code class="notranslate">d1</code> and a groupBy subquery on datasource <code class="notranslate">d2</code>, the <code class="notranslate">explain plan for</code> could return a plan like below</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="     join
    /    \
scan    groupBy
 |        |
d1       d2"><pre class="notranslate"><code class="notranslate">     join
    /    \
scan    groupBy
 |        |
d1       d2
</code></pre></div>
<p dir="auto">whereas the actual query plan Druid would execute is</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="     join
    /    \
  d1    groupBy
          |
         d2"><pre class="notranslate"><code class="notranslate">     join
    /    \
  d1    groupBy
          |
         d2
</code></pre></div>
<h2 dir="auto">Other known issues</h2>
<p dir="auto">For a full list of open issues, please see 
<a id="label-e4f282" href="https://github.com/apache/druid/labels/Bug" data-name="Bug" style="--label-r:252;--label-g:41;--label-b:41;--label-h:0;--label-s:97;--label-l:57;" data-view-component="true" class="IssueLabel hx_IssueLabel Label--inline">
  Bug</a>
.</p>
<h1 dir="auto">Credits</h1>
<p dir="auto">Thanks to everyone who contributed to this release!</p>
<p dir="auto"><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/a2l007/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/a2l007">@a2l007</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/abhishekrb19/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/abhishekrb19">@abhishekrb19</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/aditya-r-m/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/aditya-r-m">@aditya-r-m</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/AlexanderSaydakov/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/AlexanderSaydakov">@AlexanderSaydakov</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/als-sdin/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/als-sdin">@als-sdin</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/aP0StAl/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/aP0StAl">@aP0StAl</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/asdf2014/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/asdf2014">@asdf2014</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/benhopp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/benhopp">@benhopp</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/bjozet/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/bjozet">@bjozet</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/capistrant/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/capistrant">@capistrant</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Caroline1000/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Caroline1000">@Caroline1000</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ccaominh/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ccaominh">@ccaominh</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/clintropolis/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/clintropolis">@clintropolis</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dampcake/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dampcake">@dampcake</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/fjy/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/fjy">@fjy</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Fokko/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Fokko">@Fokko</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/frnidito/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/frnidito">@frnidito</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/gianm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/gianm">@gianm</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/himanshug/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/himanshug">@himanshug</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/JaeGeunBang/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/JaeGeunBang">@JaeGeunBang</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/jihoonson/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/jihoonson">@jihoonson</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/jon-wei/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/jon-wei">@jon-wei</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/JulianJaffePinterest/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/JulianJaffePinterest">@JulianJaffePinterest</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/kou64yama/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/kou64yama">@kou64yama</a><br>
@lamber-ken<br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/leventov/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/leventov">@leventov</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/liutang123/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/liutang123">@liutang123</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/maytasm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/maytasm">@maytasm</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mcbrewster/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mcbrewster">@mcbrewster</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mgill25/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mgill25">@mgill25</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mitchlloyd/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mitchlloyd">@mitchlloyd</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mrsrinivas/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mrsrinivas">@mrsrinivas</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/nvolungis/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/nvolungis">@nvolungis</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/prabcs/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/prabcs">@prabcs</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/samarthjain/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/samarthjain">@samarthjain</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/sthetland/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/sthetland">@sthetland</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/suneet-s/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/suneet-s">@suneet-s</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/themaric/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/themaric">@themaric</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/vogievetsky/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/vogievetsky">@vogievetsky</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/xvrl/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/xvrl">@xvrl</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/zachjsh/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/zachjsh">@zachjsh</a><br>
<a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/zhenxiao/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/zhenxiao">@zhenxiao</a></p>
<p dir="auto">We heavily use the Google Cloud extensions internally, and have encountered some pain points with it being in a contrib extension.</p>
<p dir="auto">Like the AWS module at <a href="https://github.com/apache/incubator-druid/tree/druid-0.13.0-incubating/aws-common">https://github.com/apache/incubator-druid/tree/druid-0.13.0-incubating/aws-common</a> this ask is that there be a GCP common which supplies a default <code class="notranslate">com.google.api.client.http.HttpRequestInitializer</code>, <code class="notranslate">com.google.api.client.http.HttpTransport</code>, and <code class="notranslate">com.google.api.client.json.JsonFactory</code>. Any extensions which use the client api can then pull from the parent classpath's instance of these or supply their own. And modules are able to then override the default supplied ones if required.</p>
<p dir="auto">The overall suggestion is to do the following (in no specific order):</p>
<ol dir="auto">
<li>Move <code class="notranslate">aws-common</code> into <code class="notranslate">cloud/aws-common</code></li>
<li>Create <code class="notranslate">gcp-common</code> at <code class="notranslate">cloud/gcp-common</code> which contains a simple module for supplying <code class="notranslate">com.google.api.client.http.HttpRequestInitializer</code>, <code class="notranslate">com.google.api.client.http.HttpTransport</code>, and <code class="notranslate">com.google.api.client.json.JsonFactory</code></li>
<li>Move the google-extension into extensions-core , we are willing to put effort into maintaining this extension as time goes on.</li>
<li>Modify google-extension to use the base gcp-common.</li>
</ol>