Modified: kylin/site/feed.xml URL: http://svn.apache.org/viewvc/kylin/site/feed.xml?rev=1864154&r1=1864153&r2=1864154&view=diff ============================================================================== --- kylin/site/feed.xml (original) +++ kylin/site/feed.xml Thu Aug 1 14:04:52 2019 @@ -19,11 +19,281 @@ <description>Apache Kylin Home</description> <link>http://kylin.apache.org/</link> <atom:link href="http://kylin.apache.org/feed.xml" rel="self" type="application/rss+xml"/> - <pubDate>Thu, 01 Aug 2019 04:10:17 -0700</pubDate> - <lastBuildDate>Thu, 01 Aug 2019 04:10:17 -0700</lastBuildDate> + <pubDate>Thu, 01 Aug 2019 06:52:56 -0700</pubDate> + <lastBuildDate>Thu, 01 Aug 2019 06:52:56 -0700</lastBuildDate> <generator>Jekyll v2.5.3</generator> <item> + <title>Detailed Analysis of refine query cache</title> + <description><hr /> + +<h2 id="part-i-basic-introduction">Part-I Basic Introduction</h2> + +<h3 id="backgroud">Backgroud</h3> +<p>In the past, query cache are not efficiently used in Kylin due to two aspects: <strong>coarse-grained cache expiration strategy</strong> and <strong>lack of external cache</strong>. Because of the aggressive cache expiration strategy, useful caches are often cleaned up unnecessarily. Because query caches are stored in local servers, they cannot be shared between servers. And because of the size limitation of local cache, not all useful query results can be cached.</p> + +<p>To deal with these shortcomings, we change the query cache expiration strategy by signature checking and introduce the memcached as Kylinâs distributed cache so that Kylin servers are able to share cache between servers. And itâs easy to add memcached servers to scale out distributed cache.</p> + +<p>These features is proposed and developed by eBay Kylin team. Thanks so much for their contribution.</p> + +<h3 id="related-jira">Related JIRA</h3> + +<ul> + <li><a href="https://issues.apache.org/jira/browse/KYLIN-2895">KYLIN-2895 Refine Query Cache</a> + <ul> + <li><a href="https://issues.apache.org/jira/browse/KYLIN-2899">KYLIN-2899 Introduce segment level query cache</a></li> + <li><a href="https://issues.apache.org/jira/browse/KYLIN-2898">KYLIN-2898 Introduce memcached as a distributed cache for queries</a></li> + <li><a href="https://issues.apache.org/jira/browse/KYLIN-2894">KYLIN-2894 Change the query cache expiration strategy by signature checking</a></li> + <li><a href="https://issues.apache.org/jira/browse/KYLIN-2897">KYLIN-2897 Improve the query execution for a set of duplicate queries in a short period</a></li> + <li><a href="https://issues.apache.org/jira/browse/KYLIN-2896">KYLIN-2896 Refine query exception cache</a></li> + </ul> + </li> +</ul> + +<hr /> + +<h2 id="part-ii-deep-dive">Part-II Deep Dive</h2> + +<ul> + <li>Introduce memcached as a Distributed Query Cache</li> + <li>Segment Level Cache</li> + <li>Query Cache Expiration Strategy by Signature Checking</li> + <li>Other Enhancement</li> +</ul> + +<h3 id="introduce-memcached-as-a-distributed-query-cache">Introduce memcached as a Distributed Query Cache</h3> + +<p><strong>Memcached</strong> is a Free and open source, high-performance, distributed memory object caching system. It is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering. It is simple yet powerful. Its simple design promotes quick deployment, ease of development, and solves many problems facing large data caches. Its API is available for most popular languages.</p> + +<p>By KYLIN-2898, Kylin use <strong>Memcached</strong> as distributed cache service, and use <strong>EhCache</strong> as local cache service. When <code class="highlighter-rouge">RemoteLocalFailOverCacheManager</code> is configured in <code class="highlighter-rouge">applicationContext.xml</code>, for each cache put/get action, Kylin will first check if remote cache service is available, only if remote cache service is unavailable, local cache service will be used.</p> + +<p>Firstly, multi query server can share query cache. For each kylin server, less jvm memory will be occupied which help to reduce GC pressure. Secondly, since memcached is centralized so duplicated cache entry will avoid in serval Kylin process. Thirdly, memcached has larger size and easy to scale out, this will help to reduce the chance which useful cache entry have to be dropped due to limited memory capacity.</p> + +<p>To handle node failure and to scale out memcached cluster, author has introduced a consistent hash strategy to smoothly solve such problem. Ketama is an implementation of a consistent hashing algorithm, meaning you can add or remove servers from the memcached pool without causing a complete remap of all keys. Detail could be checked at <a href="https://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients">Ketama consistent hash strategy</a>.</p> + +<p><img src="/images/blog/refine-query-cache/consistent-hashing.png" alt="consistent hashing" /></p> + +<h3 id="segment-level-cache">Segment level Cache</h3> + +<p>Currently Kylin use sql as the cache key, when sql comes, if result exists in the cache, it will directly returned the cached result and donât need to query hbase. When there is new segment build or existing segment refresh, all related cache result need to be evicted. For some frequently build cube such as streaming cube(NRT Streaming or Real-time OLAP), the cache miss will increase dramatically, that may decrease the query performance.</p> + +<p>Since for Kylin cube, most historical segments are immutable, the same query against historical segments should be always same, donât need to be evicted for new segment building. So we decide to implement the segment level cache, it is a complement of the existing front-end cache, the idea is similar as the level1/level2 cache in operating system.</p> + +<p><img src="/images/blog/refine-query-cache/l1-l2-cache.png" alt="l1-l2-cache" /></p> + +<h3 id="query-cache-expiration-strategy-by-signature-checking">Query Cache Expiration Strategy by Signature Checking</h3> + +<p>Currently, to invalid query cache, <code class="highlighter-rouge">CacheService</code> will either invoke <code class="highlighter-rouge">cleanDataCache</code> or <code class="highlighter-rouge">cleanAllDataCache</code>. Both methods will clear all of the query cache , which is very inefficient and unnecessary. In production environment, thereâs around hundreds of cubing jobs per day, which means the query cache will be cleared very several minutes. Then we introduced a signature to upgrade cache invalidation strategy.</p> + +<p>The basic idea is as follows:<br /> +When put SQLResponse into cache, we add signature for each SQLResponse. To calculate signature for SQLResponse, we choose the cube last build time and its segments to as input of <code class="highlighter-rouge">SignatureCalculator</code>.<br /> +When fetch <code class="highlighter-rouge">SQLResponse</code> for cache, first check whether the signature is consistent. If not, this cached value is overdue and will be invalidate.</p> + +<p>As for the calculation of signature is show as follows:<br /> +1. <code class="highlighter-rouge">toString</code> of <code class="highlighter-rouge">ComponentSignature</code> will concatenate member varible into a large String; if a <code class="highlighter-rouge">ComponentSignature</code> has other <code class="highlighter-rouge">ComponentSignature</code> as member, toString will be calculated recursively<br /> +2. return value of <code class="highlighter-rouge">toString</code> will be input of <code class="highlighter-rouge">SignatureCalculator</code>,<br /> +<code class="highlighter-rouge">SignatureCalculator</code> encode string using MD5 as identifer of signature of query cache</p> + +<p><img src="/images/blog/refine-query-cache/cache-signature.png" alt="cache-signature" /></p> + +<h3 id="other-enhancement">Other Enhancement</h3> + +<h4 id="improve-the-query-execution-for-a-set-of-duplicate-queries-in-a-short-period">Improve the query execution for a set of duplicate queries in a short period</h4> + +<p>If same query enter Kylin at the same time by different client, for each query they can not find query cache so they must be calculated respectively. And even wrose, if these query are complex, they usually cost a long duration so Kylin have less chance to utilize cache query; and them cost large computation resources that will make query server has poor performance has harm to HBase cluster.</p> + +<p>To reduce the impact of duplicated and complex query, it may be a good idea to block query which came later, wait to first one return result as far as possible. This lazy strategy is especially useful if you have duplicated complex query came in same time. To enbale it, you should set <code class="highlighter-rouge">kylin.query.lazy-query-enabled</code> to <code class="highlighter-rouge">true</code>. Optionlly, you may set <code class="highlighter-rouge">kylin.query.lazy-query-waiting-timeout-milliseconds</code> to what you think later duplicated query wait duration to meet your situation.</p> + +<h4 id="remove-exception-cache">Remove exception cache</h4> +<p>Formerly, query cache has been divided into two part, one part for storing success query result, another for failed query result, and they are invalidated respectively. It looks like not a good classification criteria because it is not fine-grained enough. After query cache signature was introduced, we have no reason to take them apart, so exception cache was removed.</p> + +<hr /> + +<h2 id="part-iii-how-to-use">Part-III How to Use</h2> + +<p>To get prepared, you need to install memcached, you may refer to https://github.com/memcached/memcached/wiki/Install. Then you should modify <code class="highlighter-rouge">kylin.properties</code> and <code class="highlighter-rouge">applicationContext.xml</code>.</p> + +<ul> + <li>kylin.properties</li> +</ul> + +<div class="highlight"><pre><code class="language-groff" data-lang="groff">kylin.cache.memcached.hosts=10.1.2.42:11211 +kylin.query.cache-signature-enabled=true +kylin.query.lazy-query-enabled=true +kylin.metrics.memcached.enabled=true +kylin.query.segment-cache-enabled=true</code></pre></div> + +<ul> + <li>applicationContext.xml</li> +</ul> + +<div class="highlight"><pre><code class="language-groff" data-lang="groff">&lt;cache:annotation-driven/&gt; + +&lt;bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" + p:configLocation="classpath:ehcache-test.xml" p:shared="true"/&gt; + +&lt;bean id="remoteCacheManager" class="org.apache.kylin.cache.cachemanager.MemcachedCacheManager"/&gt; +&lt;bean id="localCacheManager" class="org.apache.kylin.cache.cachemanager.InstrumentedEhCacheCacheManager" + p:cacheManager-ref="ehcache"/&gt; +&lt;bean id="cacheManager" class="org.apache.kylin.cache.cachemanager.RemoteLocalFailOverCacheManager"/&gt; + +&lt;bean id="memcachedCacheConfig" class="org.apache.kylin.cache.memcached.MemcachedCacheConfig"&gt; + &lt;property name="timeout" value="500"/&gt; + &lt;property name="hosts" value="${kylin.cache.memcached.hosts}"/&gt; +&lt;/bean&gt;</code></pre></div> + +<h3 id="configuration-for-query-cache">Configuration for query cache</h3> + +<h4 id="general-part">General part</h4> + +<table> + <thead> + <tr> + <th style="text-align: left">Conf Key</th> + <th style="text-align: left">Conf value</th> + <th style="text-align: left">Explanation</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: left">kylin.query.cache-enabled</td> + <td style="text-align: left">boolean, default true</td> + <td style="text-align: left">whether to enable query cache</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.cache-threshold-duration</td> + <td style="text-align: left">long, in milliseconds, default is 2000</td> + <td style="text-align: left">query duration threshold</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.cache-threshold-scan-count</td> + <td style="text-align: left">long, default is 10240</td> + <td style="text-align: left">query scan row count threshold</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.cache-threshold-scan-bytes</td> + <td style="text-align: left">long, default is 1024 * 1024 (1MB)</td> + <td style="text-align: left">query scan byte threshold</td> + </tr> + </tbody> +</table> + +<h4 id="memcached-part">Memcached part</h4> + +<table> + <thead> + <tr> + <th style="text-align: left">Conf Key</th> + <th style="text-align: left">Conf value</th> + <th style="text-align: left">Explanation</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: left">kylin.cache.memcached.hosts</td> + <td style="text-align: left">host1:port1,host2:port2</td> + <td style="text-align: left">host list of memcached host</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.segment-cache-enabled</td> + <td style="text-align: left">default false</td> + <td style="text-align: left">wether to enable</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.segment-cache-timeout</td> + <td style="text-align: left">default 2000</td> + <td style="text-align: left">timeout of memcached</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.segment-cache-max-size</td> + <td style="text-align: left">200 (MB)</td> + <td style="text-align: left">max size put into memcached</td> + </tr> + </tbody> +</table> + +<h4 id="cache-signature-part">Cache signature part</h4> + +<table> + <thead> + <tr> + <th style="text-align: left">Conf Key</th> + <th style="text-align: left">Conf value</th> + <th style="text-align: left">Explanation</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: left">kylin.query.cache-signature-enabled</td> + <td style="text-align: left">default false</td> + <td style="text-align: left">whether to use signature for query cache</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.signature-class</td> + <td style="text-align: left">default is org.apache.kylin.rest.signature.FactTableRealizationSetCalculator</td> + <td style="text-align: left">use which class to calculate signature of query cache</td> + </tr> + </tbody> +</table> + +<h4 id="other-optimize-part">Other optimize part</h4> + +<table> + <thead> + <tr> + <th style="text-align: left">Conf Key</th> + <th style="text-align: left">Conf value</th> + <th style="text-align: left">Explanation</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: left">kylin.query.lazy-query-enabled</td> + <td style="text-align: left">default false</td> + <td style="text-align: left">whether to block duplicated sql query</td> + </tr> + <tr> + <td style="text-align: left">kylin.query.lazy-query-waiting-timeout-milliseconds</td> + <td style="text-align: left">long , in milliseconds, default is 60000</td> + <td style="text-align: left">max druation for blocking duplicated sql query</td> + </tr> + </tbody> +</table> + +<h4 id="metrics-part">Metrics part</h4> + +<table> + <thead> + <tr> + <th style="text-align: left">Conf Key</th> + <th style="text-align: left">Conf value</th> + <th style="text-align: left">Explanation</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: left">kylin.metrics.memcached.enabled</td> + <td style="text-align: left">true</td> + <td style="text-align: left">Enable memcached metrics in memcached.</td> + </tr> + <tr> + <td style="text-align: left">kylin.metrics.memcached.metricstype</td> + <td style="text-align: left">off/performance/debug</td> + <td style="text-align: left">refer to net.spy.memcached.metrics.MetricType</td> + </tr> + </tbody> +</table> +</description> + <pubDate>Tue, 30 Jul 2019 03:30:00 -0700</pubDate> + <link>http://kylin.apache.org/blog/2019/07/30/detailed-analysis-of-refine-query-cache/</link> + <guid isPermaLink="true">http://kylin.apache.org/blog/2019/07/30/detailed-analysis-of-refine-query-cache/</guid> + + + <category>blog</category> + + </item> + + <item> <title>Deep dive into Kylin's Real-time OLAP</title> <description><h2 id="preface">Preface</h2> @@ -921,114 +1191,114 @@ Security: (depend on your security setti </item> <item> - <title>Apache Kylin v3.0.0-alpha Release Announcement</title> - <description><p>The Apache Kylin community is pleased to announce the release of Apache Kylin v3.0.0-alpha.</p> + <title>Apache Kylin v3.0.0-alpha åå¸</title> + <description><p>è¿æ¥ Apache Kylin 社åºå¾é«å ´å°å®£å¸ï¼Apache Kylin v3.0.0-alpha æ£å¼åå¸ã</p> -<p>Apache Kylin is an open source Distributed Analytics Engine designed to provide SQL interface and multi-dimensional analysis (OLAP) on Big Data supporting extremely large datasets.</p> +<p>Apache Kylin æ¯ä¸ä¸ªå¼æºçåå¸å¼åæå¼æï¼æ¨å¨ä¸ºæå¤§æ°æ®éæä¾ SQL æ¥å£åå¤ç»´åæï¼OLAPï¼çè½åã</p> -<p>This is the first release of the new generation v3.x, the main feature introduced is the Real-time OLAP. All of the changes can be found in the <a href="/docs/release_notes.html">release notes</a>. Here we just highlight the main features.</p> +<p>è¿æ¯ Kylin ä¸ä¸ä»£ v3.x ç第ä¸ä¸ªåå¸çæ¬ï¼ç¨äºæ©æé¢è§ï¼ä¸»è¦çåè½æ¯å®æ¶ ï¼Real-timeï¼ OLAPã宿´çæ¹å¨å表请åè§<a href="/docs/release_notes.html">release notes</a>ï¼è¿éæä¸äºä¸»è¦æ¹è¿å说æã</p> -<h1 id="important-features">Important features</h1> +<h1 id="section">éè¦æ°åè½</h1> -<h3 id="kylin-3654---real-time-olap">KYLIN-3654 - Real-time OLAP</h3> -<p>With the newly introduced Kylin real-time receiver and coordinator components, Kylin can implement a millisecond-level data preparation delay for streaming data from sources like Apache Kafka. This means since v3.0 on, Kylin can support sub-second level OLAP over historical batch data, near real-time streaming as well as real-time streaming. The user can use one OLAP platform to serve different scenarios. This solution has been deployed and verified in early adopters like eBay since 2018. For how to enable it, please refer to <a href="/docs30/tutorial/realtime_olap.html">this tutorial</a>.</p> +<h3 id="kylin-3654----olap">KYLIN-3654 - 宿¶ OLAP</h3> +<p>éçå¼å ¥æ°ç real-time receiver å coordinator ç»ä»¶ï¼Kylin è½å¤å®ç°æ¯«ç§çº§å«çæ°æ®åå¤å»¶è¿ï¼æ°æ®æºæ¥èªæµå¼æ°æ®å¦ Apache Kafkaãè¿æå³çï¼ä» v3.0 å¼å§ï¼Kylin æ¢è½å¤æ¯æå岿¹éæ°æ®ç OLAPï¼ä¹æ¯æå¯¹æµå¼æ°æ®çå宿¶ï¼Near real-timeï¼ä»¥åå®å ¨å®æ¶(real-time)åæãç¨æ·å¯ä»¥ä½¿ç¨ä¸ä¸ª OLAP 平尿¥æå¡ä¸åç使ç¨åºæ¯ãæ¤æ¹æ¡å·²ç»å¨æ©æç¨æ·å¦ eBay å¾å°é¨ç½²åéªè¯ãå ³äºå¦ä½ä½¿ç¨æ¤åè½ï¼è¯·åè<a href="/docs30/tutorial/realtime_olap.html">æ¤æ ç¨</a>ã</p> -<h3 id="kylin-3795---submit-spark-jobs-via-apache-livy">KYLIN-3795 - Submit Spark jobs via Apache Livy</h3> -<p>This feature allows the administrator to configure Kylin to integrate with Apache Livy (incubating) for Spark job submissions. The Spark job is submitted to the Livy Server through Livyâs REST API, instead of starting the Spark Driver process in local, which facilitates the management and monitoring of the Spark resources, and also releases the pressure of the nodes where the Kylin job server is running.</p> +<h3 id="kylin-3795----apache-livy--spark-">KYLIN-3795 - éè¿ Apache Livy é交 Spark ä»»å¡</h3> +<p>è¿ä¸ªåè½å 许管çå为 Kylin é ç½®ä½¿ç¨ Apache Livy (incubating) æ¥å®æä»»å¡çé交ãSpark ä½ä¸çæäº¤éè¿ Livy ç REST API æ¥æäº¤ï¼èæ é卿¬å°å¯å¨ Spark Driver è¿ç¨ï¼ä»èæ¹ä¾¿å¯¹ Spark èµæºç管ççæ§ï¼åæ¶ä¹éä½å¯¹ Kylin ä»»å¡è¿ç¨æå¨èç¹çååã</p> -<h3 id="kylin-3820---a-curator-based-job-scheduler">KYLIN-3820 - A curator-based job scheduler</h3> -<p>A new job scheduler is added to automatically discover the Kylin nodes and do an automatic leader selection among them (only the leader will submit jobs). With this feature, you can easily deploy and scale out Kylin nodes without manually update the node address in <code class="highlighter-rouge">kylin.properties</code> and restart Kylin to take effective.</p> +<h3 id="kylin-3820----curator-">KYLIN-3820 - åºäº Curator çä»»å¡èç¹åé åæå¡åç°</h3> +<p>æ°å¢ä¸ç§åºäºApache Zookeeper å Curatorä½ä¸è°åº¦å¨ï¼å¯ä»¥èªå¨åç° Kylin èç¹ï¼å¹¶èªå¨åé ä¸ä¸ªèç¹æ¥è¿è¡ä»»å¡ç管çä»¥åæ éæ¢å¤ãæäºè¿ä¸ªåè½åï¼ç®¡çåå¯ä»¥æ´å 容æå°é¨ç½²åæ©å± Kylin èç¹ï¼èä¸åéè¦å¨ <code class="highlighter-rouge">kylin.properties</code> ä¸é ç½®æ¯ä¸ª Kylin èç¹çå°åå¹¶éå¯ Kylin 以使ä¹çæã</p> -<h1 id="other-enhancements">Other enhancements</h1> +<h1 id="section-1">å ¶å®æ¹è¿</h1> -<h3 id="kylin-3716---fastthreadlocal-replaces-threadlocal">KYLIN-3716 - FastThreadLocal replaces ThreadLocal</h3> -<p>Using FastThreadLocal instead of ThreadLocal can improve Kylinâs overall performance to some extent.</p> +<h3 id="kylin-3716---fastthreadlocal--threadlocal">KYLIN-3716 - FastThreadLocal æ¿æ¢ ThreadLocal</h3> +<p>ä½¿ç¨ Netty ä¸ç FastThreadLocal æ¿ä»£ JDK åçç ThreadLocalï¼å¯ä»¥ä¸å®ç¨åº¦ä¸æå Kylin å¨é«å¹¶åä¸çæ§è½ã</p> <h3 id="kylin-3867---enable-jdbc-to-use-key-store--trust-store-for-https-connection">KYLIN-3867 - Enable JDBC to use key store &amp; trust store for https connection</h3> -<p>By using HTTPS, the authentication information used by JDBC is protected, making Kylin more secure.</p> +<p>éè¿ä½¿ç¨HTTPSï¼ä¿æ¤äºJDBC使ç¨ç身份éªè¯ä¿¡æ¯ï¼ä½¿å¾Kylinæ´å å®å ¨</p> <h3 id="kylin-3905---enable-shrunken-dictionary-default">KYLIN-3905 - Enable shrunken dictionary default</h3> -<p>By default, the shrunken dictionary is enabled, and the precise counting scene for high cardinal dimensions can significantly reduce the build time.</p> +<p>é»è®¤å¼å¯ shrunken dictionaryï¼é对é«åºç»´è¿è¡ç²¾ç¡®å»éçåºæ¯ï¼å¯ä»¥æ¾èåå°æå»ºç¨æ¶ã</p> <h3 id="kylin-3839---storage-clean-up-after-the-refreshing-and-deleting-a-segment">KYLIN-3839 - Storage clean up after the refreshing and deleting a segment</h3> -<p>Clear unnecessary data files in a timely manner</p> +<p>æ´å åæ¶å°æ¸ é¤ä¸å¿ è¦çæ°æ®æä»¶</p> -<p><strong>Download</strong></p> +<p><strong>ä¸è½½</strong></p> -<p>To download Apache Kylin v3.0.0-alpha source code or binary package, visit the <a href="http://kylin.apache.org/download">download</a> page.</p> +<p>è¦ä¸è½½Apache Kylin æºä»£ç æäºè¿å¶å ï¼è¯·è®¿é®<a href="/download">ä¸è½½é¡µé¢</a> page.</p> -<p><strong>Upgrade</strong></p> +<p><strong>å级</strong></p> -<p>Follow the <a href="/docs/howto/howto_upgrade.html">upgrade guide</a>.</p> +<p>åè<a href="/docs/howto/howto_upgrade.html">å级æå</a>.</p> -<p><strong>Feedback</strong></p> +<p><strong>åé¦</strong></p> -<p>If you face issue or question, please send mail to Apache Kylin dev or user mailing list: d...@kylin.apache.org , u...@kylin.apache.org; Before sending, please make sure you have subscribed the mailing list by dropping an email to dev-subscr...@kylin.apache.org or user-subscr...@kylin.apache.org.</p> +<p>妿æ¨éå°é®é¢æçé®ï¼è¯·åéé®ä»¶è³ Apache Kylin dev æ user é®ä»¶å表ï¼d...@kylin.apache.orgï¼u...@kylin.apache.org; å¨åéä¹åï¼è¯·ç¡®ä¿æ¨å·²éè¿åéçµåé®ä»¶è³ dev-subscr...@kylin.apache.org æ user-subscr...@kylin.apache.org 订é äºé®ä»¶å表ã</p> -<p><em>Great thanks to everyone who contributed!</em></p> +<p><em>é常æè°¢ææè´¡ç®Apache Kylinçæå!</em></p> </description> <pubDate>Fri, 19 Apr 2019 13:00:00 -0700</pubDate> - <link>http://kylin.apache.org/blog/2019/04/19/release-v3.0.0-alpha/</link> - <guid isPermaLink="true">http://kylin.apache.org/blog/2019/04/19/release-v3.0.0-alpha/</guid> + <link>http://kylin.apache.org/cn_blog/2019/04/19/release-v3.0.0-alpha/</link> + <guid isPermaLink="true">http://kylin.apache.org/cn_blog/2019/04/19/release-v3.0.0-alpha/</guid> - <category>blog</category> + <category>cn_blog</category> </item> <item> - <title>Apache Kylin v3.0.0-alpha åå¸</title> - <description><p>è¿æ¥ Apache Kylin 社åºå¾é«å ´å°å®£å¸ï¼Apache Kylin v3.0.0-alpha æ£å¼åå¸ã</p> + <title>Apache Kylin v3.0.0-alpha Release Announcement</title> + <description><p>The Apache Kylin community is pleased to announce the release of Apache Kylin v3.0.0-alpha.</p> -<p>Apache Kylin æ¯ä¸ä¸ªå¼æºçåå¸å¼åæå¼æï¼æ¨å¨ä¸ºæå¤§æ°æ®éæä¾ SQL æ¥å£åå¤ç»´åæï¼OLAPï¼çè½åã</p> +<p>Apache Kylin is an open source Distributed Analytics Engine designed to provide SQL interface and multi-dimensional analysis (OLAP) on Big Data supporting extremely large datasets.</p> -<p>è¿æ¯ Kylin ä¸ä¸ä»£ v3.x ç第ä¸ä¸ªåå¸çæ¬ï¼ç¨äºæ©æé¢è§ï¼ä¸»è¦çåè½æ¯å®æ¶ ï¼Real-timeï¼ OLAPã宿´çæ¹å¨å表请åè§<a href="/docs/release_notes.html">release notes</a>ï¼è¿éæä¸äºä¸»è¦æ¹è¿å说æã</p> +<p>This is the first release of the new generation v3.x, the main feature introduced is the Real-time OLAP. All of the changes can be found in the <a href="/docs/release_notes.html">release notes</a>. Here we just highlight the main features.</p> -<h1 id="section">éè¦æ°åè½</h1> +<h1 id="important-features">Important features</h1> -<h3 id="kylin-3654----olap">KYLIN-3654 - 宿¶ OLAP</h3> -<p>éçå¼å ¥æ°ç real-time receiver å coordinator ç»ä»¶ï¼Kylin è½å¤å®ç°æ¯«ç§çº§å«çæ°æ®åå¤å»¶è¿ï¼æ°æ®æºæ¥èªæµå¼æ°æ®å¦ Apache Kafkaãè¿æå³çï¼ä» v3.0 å¼å§ï¼Kylin æ¢è½å¤æ¯æå岿¹éæ°æ®ç OLAPï¼ä¹æ¯æå¯¹æµå¼æ°æ®çå宿¶ï¼Near real-timeï¼ä»¥åå®å ¨å®æ¶(real-time)åæãç¨æ·å¯ä»¥ä½¿ç¨ä¸ä¸ª OLAP 平尿¥æå¡ä¸åç使ç¨åºæ¯ãæ¤æ¹æ¡å·²ç»å¨æ©æç¨æ·å¦ eBay å¾å°é¨ç½²åéªè¯ãå ³äºå¦ä½ä½¿ç¨æ¤åè½ï¼è¯·åè<a href="/docs30/tutorial/realtime_olap.html">æ¤æ ç¨</a>ã</p> +<h3 id="kylin-3654---real-time-olap">KYLIN-3654 - Real-time OLAP</h3> +<p>With the newly introduced Kylin real-time receiver and coordinator components, Kylin can implement a millisecond-level data preparation delay for streaming data from sources like Apache Kafka. This means since v3.0 on, Kylin can support sub-second level OLAP over historical batch data, near real-time streaming as well as real-time streaming. The user can use one OLAP platform to serve different scenarios. This solution has been deployed and verified in early adopters like eBay since 2018. For how to enable it, please refer to <a href="/docs30/tutorial/realtime_olap.html">this tutorial</a>.</p> -<h3 id="kylin-3795----apache-livy--spark-">KYLIN-3795 - éè¿ Apache Livy é交 Spark ä»»å¡</h3> -<p>è¿ä¸ªåè½å 许管çå为 Kylin é ç½®ä½¿ç¨ Apache Livy (incubating) æ¥å®æä»»å¡çé交ãSpark ä½ä¸çæäº¤éè¿ Livy ç REST API æ¥æäº¤ï¼èæ é卿¬å°å¯å¨ Spark Driver è¿ç¨ï¼ä»èæ¹ä¾¿å¯¹ Spark èµæºç管ççæ§ï¼åæ¶ä¹éä½å¯¹ Kylin ä»»å¡è¿ç¨æå¨èç¹çååã</p> +<h3 id="kylin-3795---submit-spark-jobs-via-apache-livy">KYLIN-3795 - Submit Spark jobs via Apache Livy</h3> +<p>This feature allows the administrator to configure Kylin to integrate with Apache Livy (incubating) for Spark job submissions. The Spark job is submitted to the Livy Server through Livyâs REST API, instead of starting the Spark Driver process in local, which facilitates the management and monitoring of the Spark resources, and also releases the pressure of the nodes where the Kylin job server is running.</p> -<h3 id="kylin-3820----curator-">KYLIN-3820 - åºäº Curator çä»»å¡èç¹åé åæå¡åç°</h3> -<p>æ°å¢ä¸ç§åºäºApache Zookeeper å Curatorä½ä¸è°åº¦å¨ï¼å¯ä»¥èªå¨åç° Kylin èç¹ï¼å¹¶èªå¨åé ä¸ä¸ªèç¹æ¥è¿è¡ä»»å¡ç管çä»¥åæ éæ¢å¤ãæäºè¿ä¸ªåè½åï¼ç®¡çåå¯ä»¥æ´å 容æå°é¨ç½²åæ©å± Kylin èç¹ï¼èä¸åéè¦å¨ <code class="highlighter-rouge">kylin.properties</code> ä¸é ç½®æ¯ä¸ª Kylin èç¹çå°åå¹¶éå¯ Kylin 以使ä¹çæã</p> +<h3 id="kylin-3820---a-curator-based-job-scheduler">KYLIN-3820 - A curator-based job scheduler</h3> +<p>A new job scheduler is added to automatically discover the Kylin nodes and do an automatic leader selection among them (only the leader will submit jobs). With this feature, you can easily deploy and scale out Kylin nodes without manually update the node address in <code class="highlighter-rouge">kylin.properties</code> and restart Kylin to take effective.</p> -<h1 id="section-1">å ¶å®æ¹è¿</h1> +<h1 id="other-enhancements">Other enhancements</h1> -<h3 id="kylin-3716---fastthreadlocal--threadlocal">KYLIN-3716 - FastThreadLocal æ¿æ¢ ThreadLocal</h3> -<p>ä½¿ç¨ Netty ä¸ç FastThreadLocal æ¿ä»£ JDK åçç ThreadLocalï¼å¯ä»¥ä¸å®ç¨åº¦ä¸æå Kylin å¨é«å¹¶åä¸çæ§è½ã</p> +<h3 id="kylin-3716---fastthreadlocal-replaces-threadlocal">KYLIN-3716 - FastThreadLocal replaces ThreadLocal</h3> +<p>Using FastThreadLocal instead of ThreadLocal can improve Kylinâs overall performance to some extent.</p> <h3 id="kylin-3867---enable-jdbc-to-use-key-store--trust-store-for-https-connection">KYLIN-3867 - Enable JDBC to use key store &amp; trust store for https connection</h3> -<p>éè¿ä½¿ç¨HTTPSï¼ä¿æ¤äºJDBC使ç¨ç身份éªè¯ä¿¡æ¯ï¼ä½¿å¾Kylinæ´å å®å ¨</p> +<p>By using HTTPS, the authentication information used by JDBC is protected, making Kylin more secure.</p> <h3 id="kylin-3905---enable-shrunken-dictionary-default">KYLIN-3905 - Enable shrunken dictionary default</h3> -<p>é»è®¤å¼å¯ shrunken dictionaryï¼é对é«åºç»´è¿è¡ç²¾ç¡®å»éçåºæ¯ï¼å¯ä»¥æ¾èåå°æå»ºç¨æ¶ã</p> +<p>By default, the shrunken dictionary is enabled, and the precise counting scene for high cardinal dimensions can significantly reduce the build time.</p> <h3 id="kylin-3839---storage-clean-up-after-the-refreshing-and-deleting-a-segment">KYLIN-3839 - Storage clean up after the refreshing and deleting a segment</h3> -<p>æ´å åæ¶å°æ¸ é¤ä¸å¿ è¦çæ°æ®æä»¶</p> +<p>Clear unnecessary data files in a timely manner</p> -<p><strong>ä¸è½½</strong></p> +<p><strong>Download</strong></p> -<p>è¦ä¸è½½Apache Kylin æºä»£ç æäºè¿å¶å ï¼è¯·è®¿é®<a href="/download">ä¸è½½é¡µé¢</a> page.</p> +<p>To download Apache Kylin v3.0.0-alpha source code or binary package, visit the <a href="http://kylin.apache.org/download">download</a> page.</p> -<p><strong>å级</strong></p> +<p><strong>Upgrade</strong></p> -<p>åè<a href="/docs/howto/howto_upgrade.html">å级æå</a>.</p> +<p>Follow the <a href="/docs/howto/howto_upgrade.html">upgrade guide</a>.</p> -<p><strong>åé¦</strong></p> +<p><strong>Feedback</strong></p> -<p>妿æ¨éå°é®é¢æçé®ï¼è¯·åéé®ä»¶è³ Apache Kylin dev æ user é®ä»¶å表ï¼d...@kylin.apache.orgï¼u...@kylin.apache.org; å¨åéä¹åï¼è¯·ç¡®ä¿æ¨å·²éè¿åéçµåé®ä»¶è³ dev-subscr...@kylin.apache.org æ user-subscr...@kylin.apache.org 订é äºé®ä»¶å表ã</p> +<p>If you face issue or question, please send mail to Apache Kylin dev or user mailing list: d...@kylin.apache.org , u...@kylin.apache.org; Before sending, please make sure you have subscribed the mailing list by dropping an email to dev-subscr...@kylin.apache.org or user-subscr...@kylin.apache.org.</p> -<p><em>é常æè°¢ææè´¡ç®Apache Kylinçæå!</em></p> +<p><em>Great thanks to everyone who contributed!</em></p> </description> <pubDate>Fri, 19 Apr 2019 13:00:00 -0700</pubDate> - <link>http://kylin.apache.org/cn_blog/2019/04/19/release-v3.0.0-alpha/</link> - <guid isPermaLink="true">http://kylin.apache.org/cn_blog/2019/04/19/release-v3.0.0-alpha/</guid> + <link>http://kylin.apache.org/blog/2019/04/19/release-v3.0.0-alpha/</link> + <guid isPermaLink="true">http://kylin.apache.org/blog/2019/04/19/release-v3.0.0-alpha/</guid> - <category>cn_blog</category> + <category>blog</category> </item> @@ -1185,85 +1455,6 @@ The checkpoint info is the smallest part </item> <item> - <title>Apache Kylin v2.6.0 æ£å¼åå¸</title> - <description><p>è¿æ¥Apache Kylin 社åºå¾é«å ´å°å®£å¸ï¼Apache Kylin 2.6.0 æ£å¼åå¸ã</p> - -<p>Apache Kylin æ¯ä¸ä¸ªå¼æºçåå¸å¼åæå¼æï¼æ¨å¨ä¸ºæå¤§æ°æ®éæä¾ SQL æ¥å£åå¤ç»´åæï¼OLAPï¼çè½åã</p> - -<p>è¿æ¯ç»§2.5.0 åçä¸ä¸ªæ°åè½çæ¬ãè¯¥çæ¬å¼å ¥äºå¾å¤æä»·å¼çæ¹è¿ï¼å®æ´çæ¹å¨å表请åè§<a href="https://kylin.apache.org/docs/release_notes.html">release notes</a>ï¼è¿éæä¸äºä¸»è¦æ¹è¿å说æï¼</p> - -<h3 id="jdbcsdk">é对以JDBCä¸ºæ°æ®æºçSDK</h3> -<p>Kylinç®åå·²ç»æ¯æéè¿JDBCè¿æ¥å æ¬Amazon Redshift, SQL Serverå¨å çå¤ç§æ°æ®æºã<br /> -为äºä¾¿äºå¼åè æ´ä¾¿å©å°å¤çåç§ SQL æ¹è¨ï¼dialectï¼ çä¸å以æ´å ç®åå°å¼åæ°ç JDBC æ°æ®æºï¼Kylin æä¾äºç¸åºç SDK åç»ä¸ç API å ¥å£ï¼<br /> -* åæ¥å æ°æ®åæ°æ®<br /> -* æå»º cube<br /> -* 彿¾ä¸å°ç¸åºçcubeæ¥è§£çæ¥è¯¢æ¶ï¼ä¸æ¨æ¥è¯¢å°æ°æ®æº</p> - -<p>æ´å¤å 容åè§ KYLIN-3552ã</p> - -<h3 id="memcached--kylin-">ä½¿ç¨ Memcached ä½ Kylin çåå¸å¼ç¼å</h3> -<p>å¨è¿å»ï¼Kylin 对æ¥è¯¢ç»æçç¼å䏿¯åå髿ï¼ä¸»è¦æä»¥ä¸ä¸¤ä¸ªæ¹é¢çåå ï¼<br /> -ä¸ä¸ªæ¯å½ Kylin ç metadata åçååæ¶ï¼ä¼ä¸»å¨ç²ç®å°å»æ¸ é¤å¤§éç¼åï¼ä½¿å¾ç¼åä¼è¢«é¢ç¹å·æ°è导è´å©ç¨çéä½ã<br /> -å¦ä¸ç¹æ¯ç±äºåªä½¿ç¨æ¬å°ç¼åèå¯¼è´ Kylin server ä¹é´ä¸è½å ±äº«å½¼æ¤çç¼åï¼è¿æ ·æ¥è¯¢çç¼åå½ä¸çå°±ä¼éä½ã<br /> -æ¬å°ç¼åçä¸ä¸ªç¼ºç¹æ¯å¤§å°åå°éå¶ï¼ä¸è½ååå¸å¼ç¼å飿 ·æ°´å¹³æ©å±ãè¿æ ·å¯¼è´è½ç¼åçæ¥è¯¢ç»æéåå°äºéå¶ã</p> - -<p>é对è¿äºç¼ºé·ï¼æä»¬æ¹åäºç¼å失æçæºå¶ï¼ä¸å主å¨å»æ¸ çç¼åï¼èæ¯éåå¦ä¸çæ¹æ¡ï¼<br /> -1. å¨å°æ¥è¯¢ç»ææ¾å ¥ç¼åä¹åï¼æ ¹æ®å½åçå æ°æ®ä¿¡æ¯è®¡ç®ä¸ä¸ªæ°åç¾åï¼å¹¶ä¸æ¥è¯¢ç»æä¸åæ¾å ¥ç¼åä¸<br /> -2. ä»ç¼åä¸è·åæ¥è¯¢ç»æä¹åï¼æ ¹æ®å½åçå æ°æ®ä¿¡æ¯è®¡ç®ä¸ä¸ªæ°åç¾åï¼å¯¹æ¯ä¸¤è çæ°åç¾åæ¯å¦ä¸è´ã妿ä¸è´ï¼é£ä¹ç¼åææï¼åä¹ï¼è¯¥ç¼å失æå¹¶å é¤</p> - -<p>æä»¬è¿å¼å ¥äº Memcached ä½ä¸º Kylin çåå¸å¼ç¼åãè¿æ · Kylin server ä¹é´å¯ä»¥å ±äº«æ¥è¯¢ç»æçç¼åï¼èä¸ç±äº Memcached server ä¹é´çç¬ç«æ§ï¼é常æäºæ°´å¹³æå±ï¼æ´å æå©äºç¼åæ´å¤çæ°æ®ã<br /> -ç¸å ³å¼å任塿¯ KYLIN-2895, KYLIN-2894, KYLIN-2896, KYLIN-2897, KYLIN-2898, KYLIN-2899ã</p> - -<h3 id="forkjoinpool--fast-cubing-">ForkJoinPool ç®å fast cubing ççº¿ç¨æ¨¡å</h3> -<p>å¨è¿å»è¿è¡ fast cubing æ¶ï¼Kylin 使ç¨èªå·±å®ä¹çä¸ç³»å线ç¨ï¼å¦ split 线ç¨ï¼task 线ç¨ï¼main 线ç¨ççè¿è¡å¹¶åç cube æå»ºã<br /> -å¨è¿ä¸ªçº¿ç¨æ¨¡åä¸ï¼çº¿ç¨ä¹é´çå ³ç³»ååç夿ï¼èä¸å¯¹å¼å¸¸å¤çä¹åå容æåºéã</p> - -<p>ç°å¨æä»¬å¼å ¥äº ForkJoinPoolï¼å¨ä¸»çº¿ç¨ä¸å¤ç split é»è¾ï¼æå»º cuboid çä»»å¡ä»¥ååä»»å¡é½å¨ fork join pool䏿§è¡ï¼cuboid æå»ºçç»æå¯ä»¥è¢«å¼æ¥çæ¶éå¹¶ä¸å¯ä»¥æ´æ©å°è¾åºç»ä¸æ¸¸ç merge æä½ãæ´å¤å 容åè§ KYLIN-2932ã</p> - -<h3 id="hllcounter-">æ¹è¿ HLLCounter çæ§è½</h3> -<p>å¯¹äº HLLCounterï¼ æä»¬ä»ä¸¤æ¹é¢è¿è¡äºæ¹è¿ï¼æå»º HLLCounter å计ç®è°åå¹³åçæ¹å¼ã<br /> -1. å ³äº HLLCounter çæå»ºï¼æä»¬ä¸å使ç¨mergeçæ¹å¼ï¼èæ¯ç´æ¥copyå«çHLLCounteréé¢çregisters<br /> -2. å ³äºè®¡ç® HLLCSnapshot éé¢çè°åå¹³åï¼åäºä»¥ä¸ä¸ä¸ªæ¹é¢çæ¹è¿ï¼<br /> -* ç¼åææç1/2^r<br /> -* ä½¿ç¨æ´åç¸å ä»£æ¿æµ®ç¹åç¸å <br /> -* å 餿¡ä»¶åæ¯ï¼ä¾å¦æ éæ£æ¥ registers[i] æ¯ä¸æ¯ä¸º0</p> - -<p>æ´å¤å 容åè§ KYLIN-3656ã</p> - -<h3 id="cube-planner-">æ¹è¿ Cube Planner ç®æ³</h3> -<p>å¨è¿å»ï¼cube planner ç phase two å¢å æªè¢«é¢è®¡ç®ç cuboid çæ¹å¼åªè½éè¿ mandatory cuboid çæ¹å¼ãèä¸ä¸ª cuboid æ¯å¦ä¸º mandatoryï¼åæä¸¤ç§æ¹å¼ï¼<br /> -æå¨è®¾ç½®ï¼æ¥è¯¢æ¶ rollup çè¡æ°è¶³å¤å¤§ãè¿ééè¿å¤ææ¥è¯¢æ¶ rollup çè¡æ°æ¯å¦è¶³å¤å¤§æ¥å¤ææ¯å¦ä¸º mandatory cuboid çæ¹å¼æä¸¤å¤§ç¼ºé·ï¼<br /> -* 䏿¯ä¼°ç® rollup çè¡æ°çç®æ³ä¸æ¯å¾å¥½<br /> -* äºæ¯å¾é¾è®¾ç«ä¸ä¸ªéæçé弿¥åå¤å®</p> - -<p>ç°å¨æä»¬ä¸åä» rollup è¡æ°çè§åº¦çé®é¢äºãä¸å齿¯ä» cuboid è¡æ°çè§åº¦çé®é¢ï¼è¿æ ·å°±å cost based ç cube planner ç®æ³åäºç»ä¸ã<br /> -ä¸ºæ¤æä»¬éè¿ä½¿ç¨ rollup æ¯çæ¥æ¹è¿äºæªè¢«é¢å æå»ºç cuboid çè¡æ°çä¼°ç®ï¼ç¶å让 cost based ç cube planner ç®æ³æ¥å¤å®åªäºæªè¢«æå»ºç cuboid 该被æå»ºï¼åªäºè¯¥è¢«éå¼ã<br /> -éè¿è¿æ ·çæ¹è¿ï¼æ ééè¿è®¾å®éæçé弿¥æ¨è mandatory cuboid äºï¼è mandatory cuboid åªè½è¢«æå¨è®¾ç½®ï¼ä¸è½è¢«æ¨èäºãæ´å¤å 容åè§ KYLIN-3540ã</p> - -<p><strong>ä¸è½½</strong></p> - -<p>è¦ä¸è½½Apache Kylin v2.6.0æºä»£ç æäºè¿å¶å ï¼è¯·è®¿é®<a href="http://kylin.apache.org/download">ä¸è½½é¡µé¢</a> .</p> - -<p><strong>å级</strong></p> - -<p>åè<a href="/docs/howto/howto_upgrade.html">å级æå</a>.</p> - -<p><strong>åé¦</strong></p> - -<p>妿æ¨éå°é®é¢æçé®ï¼è¯·åéé®ä»¶è³ Apache Kylin dev æ user é®ä»¶å表ï¼d...@kylin.apache.orgï¼u...@kylin.apache.org; å¨åéä¹åï¼è¯·ç¡®ä¿æ¨å·²éè¿åéçµåé®ä»¶è³ dev-subscr...@kylin.apache.org æ user-subscr...@kylin.apache.org订é äºé®ä»¶å表ã</p> - -<p><em>é常æè°¢ææè´¡ç®Apache Kylinçæå!</em></p> -</description> - <pubDate>Fri, 18 Jan 2019 12:00:00 -0800</pubDate> - <link>http://kylin.apache.org/cn_blog/2019/01/18/release-v2.6.0/</link> - <guid isPermaLink="true">http://kylin.apache.org/cn_blog/2019/01/18/release-v2.6.0/</guid> - - - <category>cn_blog</category> - - </item> - - <item> <title>Apache Kylin v2.6.0 Release Announcement</title> <description><p>The Apache Kylin community is pleased to announce the release of Apache Kylin v2.6.0.</p> @@ -1342,274 +1533,81 @@ By this improvement, we donât need </item> <item> - <title>How Cisco's Big Data Team Improved the High Concurrent Throughput of Apache Kylin by 5x</title> - <description><h2 id="background">Background</h2> - -<p>As part of the development group of Ciscoâs Big Data team, one of our responsibilities is to provide BI reports to our stakeholders. Stakeholders rely on the reporting system to check the usage of Ciscoâs business offerings. These reports are also used as a reference for billing, so they are critical to our stakeholders and the business overall.</p> - -<p>The raw data for these reports is sourced across multiple tables in our Oracle database. The monthly data volume for one table is in the billions, and if a customer wants to run a report for one year, at least one billion to two billion rows of data need to be aggregated or processed through other operations. Additionally, all results need to be provided in a short amount of time. In the course of our research, we discovered Apache Kylin, a distributed preprocessing engine for massive datasets based on pre-calculation, which enables you to query those massive datasets at sub-second latency.</p> - -<p>With the simulation test using our production data, we found that Kylin was ideal for our needs and was indeed capable of providing aggregated results on one billion rows of data in one second. However, we still needed to undergo additional tests for another use case. For one stakeholder, we provide 15 charts displayed on a single page. The BI system will send REST API requests to Kylin to query the data for each chart asynchronously. Based on the production data volume, if there are 20 stakeholders viewing the report on one node, they will trigger 15*20 = 300 requests. The high concurrent query performance of Kylin is what we needed to test here.</p> - -<h2 id="the-testing-stage">The Testing Stage</h2> - -<p><strong>Precondition</strong>: To reduce the impact from network cost, we deployed the testing tools in the same network environment with Kylin. Meanwhile, we turned off the query cache for Kylin to make sure that each request was executed on the bottom layer.</p> - -<p><strong>Testing Tools</strong>: Aside from our traditional testing tool, Apache Jmeter, we also used another open source tool: Gatlin (<a href="https://gatling.io/">https://gatling.io/</a>) to test the same case. We excluded the impact from the tools.</p> - -<p><strong>Testing Strategy</strong>: We simulated user requests of different sizes by increasing the number of concurrent threads, tracking the average response in 60 seconds, finding the bottleneck for Kylin query responses, and observing the maximum response time and success rate.</p> - -<p><strong>Testing Results</strong>:</p> - -<table> - <thead> - <tr> - <th style="text-align: center">Thread</th> - <th style="text-align: center">Handled Queries (in 60 seconds)</th> - <th style="text-align: center">Handled Queries (per second)</th> - <th style="text-align: center">Mean Response Time (ms)</th> - </tr> - </thead> - <tbody> - <tr> - <td style="text-align: center">1</td> - <td style="text-align: center">773</td> - <td style="text-align: center">13</td> - <td style="text-align: center">77</td> - </tr> - <tr> - <td style="text-align: center">15</td> - <td style="text-align: center">3245</td> - <td style="text-align: center">54</td> - <td style="text-align: center">279</td> - </tr> - <tr> - <td style="text-align: center">25</td> - <td style="text-align: center">3844</td> - <td style="text-align: center">64</td> - <td style="text-align: center">390</td> - </tr> - <tr> - <td style="text-align: center">50</td> - <td style="text-align: center">4912</td> - <td style="text-align: center">82</td> - <td style="text-align: center">612</td> - </tr> - <tr> - <td style="text-align: center">75</td> - <td style="text-align: center">5405</td> - <td style="text-align: center">90</td> - <td style="text-align: center">841</td> - </tr> - <tr> - <td style="text-align: center">100</td> - <td style="text-align: center">5436</td> - <td style="text-align: center">91</td> - <td style="text-align: center">1108</td> - </tr> - <tr> - <td style="text-align: center">150</td> - <td style="text-align: center">5434</td> - <td style="text-align: center">91</td> - <td style="text-align: center">1688</td> - </tr> - </tbody> -</table> - -<p>Resulting in the line chart as follows:</p> - -<p><img src="/images/blog/cisco_throughput_5x/handled_queries_1.png" alt="" width="500px" height="300px" /></p> - -<p>â</p> - -<p><strong>Finding</strong>: When the number of concurrent threads reach 75, executed queries per second reach a peak of 90. The number does not become better even as we continue to increase the threads. 90 concurrent query responses in one second only allows 90/15 = 6 users to view a report at the same time. Even when we extend the Kylin query nodes to 3, query capability with 18 users per second is far behind our business demands.</p> - -<h2 id="root-cause-analysis">Root Cause Analysis</h2> - -<p>After reading and analyzing the query engine code of Kylin, we learned that Kylinâs query performs parallel filtering and calculation in HBaseâs region server by launching HBase Coprocessor. Based on this information, we checked the resource usage of the HBase cluster. The count of RPC Tasks processed on the region server did not increase linearly with the number of Kylin query requests when high concurrent queries occured. We concluded that there was a thread block on the Kylin side.</p> - -<p>We used Flame graph and JProfile to collect and analyze data from the Kylin query node and could not find the root cause. Then we tried to catch a thread snapshot of Kylin with Jstack. Analyzing the Jstack log, we discovered the root cause of the bottleneck causing this concurrent query issue. The example is as follows (Kylin version 2.5.0):</p> - -<p>One thread is locked at sun.misc.URLClassPath.getNextLoader. TID is 0x000000048007a180ï¼</p> - -<div class="highlighter-rouge"><pre class="highlight"><code>"Query e9c44a2d-6226-ff3b-f984-ce8489107d79-3425" #3425 daemon prio=5 os_prio=0 tid=0x000000000472b000 nid=0x1433 waiting ] - java.lang.Thread.State: BLOCKED (on object monitor) - at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:469) - - locked &lt;0x000000048007a180&gt; (a sun.misc.URLClassPath) - at sun.misc.URLClassPath.findResource(URLClassPath.java:214) - at java.net.URLClassLoader$2.run(URLClassLoader.java:569) - at java.net.URLClassLoader$2.run(URLClassLoader.java:567) - at java.security.AccessController.doPrivileged(Native Method) - at java.net.URLClassLoader.findResource(URLClassLoader.java:566) - at java.lang.ClassLoader.getResource(ClassLoader.java:1096) - at java.lang.ClassLoader.getResource(ClassLoader.java:1091) - at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1666) - at org.apache.kylin.common.KylinConfig.buildSiteOrderedProps(KylinConfig.java:338) -</code></pre> -</div> - -<p>43 threads were waiting to lock &lt;0x000000048007a180&gt; at the same time:</p> - -<div class="highlighter-rouge"><pre class="highlight"><code>"Query f1f0bbec-a3f7-04b2-1ac6-fd3e03a0232d-4002" #4002 daemon prio=5 os_prio=0 tid=0x00007f27e71e7800 nid=0x1676 waiting ] - java.lang.Thread.State: BLOCKED (on object monitor) - at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:469) - - waiting to lock &lt;0x000000048007a180&gt; (a sun.misc.URLClassPath) - at sun.misc.URLClassPath.findResource(URLClassPath.java:214) - at java.net.URLClassLoader$2.run(URLClassLoader.java:569) - at java.net.URLClassLoader$2.run(URLClassLoader.java:567) - at java.security.AccessController.doPrivileged(Native Method) - at java.net.URLClassLoader.findResource(URLClassLoader.java:566) - at java.lang.ClassLoader.getResource(ClassLoader.java:1096) - at java.lang.ClassLoader.getResource(ClassLoader.java:1091) - at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1666) - at org.apache.kylin.common.KylinConfig.buildSiteOrderedProps(KylinConfig.java:338) -</code></pre> -</div> - -<p>We found that the closest code logic to Kylin was:</p> - -<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.kylin.common.KylinConfig.buildSiteOrderedProps(KylinConfig.java:338) -</code></pre> -</div> - -<p>Further analyzing the Kylin source code showed we were getting close to the resolution.</p> - -<h2 id="code-analysis">Code Analysis</h2> - -<p>When Kylin query engine builds a request to HBase Coprocessor, it will export Kylin properties (various properties used in Kylin) as Strings. This issue is caused by the relative code logic.</p> - -<div class="highlighter-rouge"><pre class="highlight"><code>function private static OrderedProperties buildSiteOrderedProps() -</code></pre> -</div> - -<ul> - <li>Each thread will getResouce to load âkylin-defaults.propertiesâ (the default properties file that users cannot modify).</li> -</ul> - -<div class="highlighter-rouge"><pre class="highlight"><code>// 1. load default configurations from classpath. -// we have a kylin-defaults.properties in kylin/core-common/src/main/resources -URL resource = Thread.currentThread().getContextClassLoader().getResource("kylin-defaults.properties"); -Preconditions.checkNotNull(resource); -logger.info("Loading kylin-defaults.properties from {}", resource.getPath()); -OrderedProperties orderedProperties = new OrderedProperties(); -loadPropertiesFromInputStream(resource.openStream(), orderedProperties); -</code></pre> -</div> - -<ul> - <li>Loop 10 times to getResouce for âkylin-defaultsâ + (i) + â.propertiesâ. Thread LOCKED occurs here.</li> -</ul> - -<div class="highlighter-rouge"><pre class="highlight"><code>for (int i = 0; i &lt; 10; i++) { -String fileName = "kylin-defaults" + + ".properties"; - URL additionalResource = Thread.currentThread().getContextClassLoader().getResource(fileName); - if (additionalResource != null) { - logger.info("Loading {} from {} ", fileName, additionalResource.getPath()); - loadPropertiesFromInputStream(additionalResource.openStream(), orderedProperties); - } -</code></pre> -</div> + <title>Apache Kylin v2.6.0 æ£å¼åå¸</title> + <description><p>è¿æ¥Apache Kylin 社åºå¾é«å ´å°å®£å¸ï¼Apache Kylin 2.6.0 æ£å¼åå¸ã</p> -<p>Those logics were introduced in 2017/6/7, with JIRA ID KYLIN-2659 <em>Refactor KylinConfig so that all the default configurations are hidden in kylin-defaults.properties</em> reported by Hongbin Ma.</p> +<p>Apache Kylin æ¯ä¸ä¸ªå¼æºçåå¸å¼åæå¼æï¼æ¨å¨ä¸ºæå¤§æ°æ®éæä¾ SQL æ¥å£åå¤ç»´åæï¼OLAPï¼çè½åã</p> -<h2 id="issue-fixing">Issue Fixing</h2> +<p>è¿æ¯ç»§2.5.0 åçä¸ä¸ªæ°åè½çæ¬ãè¯¥çæ¬å¼å ¥äºå¾å¤æä»·å¼çæ¹è¿ï¼å®æ´çæ¹å¨å表请åè§<a href="https://kylin.apache.org/docs/release_notes.html">release notes</a>ï¼è¿éæä¸äºä¸»è¦æ¹è¿å说æï¼</p> -<p>For the first part of the logic, because kylin-defaults.properties is built in kylin-core-common-xxxx.jar, thereâs no need to getResource for it every time. We moved this logic to getInstanceFromEnv(). This logic gets called only once when service starts.</p> +<h3 id="jdbcsdk">é对以JDBCä¸ºæ°æ®æºçSDK</h3> +<p>Kylinç®åå·²ç»æ¯æéè¿JDBCè¿æ¥å æ¬Amazon Redshift, SQL Serverå¨å çå¤ç§æ°æ®æºã<br /> +为äºä¾¿äºå¼åè æ´ä¾¿å©å°å¤çåç§ SQL æ¹è¨ï¼dialectï¼ çä¸å以æ´å ç®åå°å¼åæ°ç JDBC æ°æ®æºï¼Kylin æä¾äºç¸åºç SDK åç»ä¸ç API å ¥å£ï¼<br /> +* åæ¥å æ°æ®åæ°æ®<br /> +* æå»º cube<br /> +* 彿¾ä¸å°ç¸åºçcubeæ¥è§£çæ¥è¯¢æ¶ï¼ä¸æ¨æ¥è¯¢å°æ°æ®æº</p> -<p>We found one regression issue when fixing this bug. One class, CubeVisitService, is a Coprocessor. It will use KylinConfig as util class to generate KylinConfig object. Itâs dangerous to induce any logic to load properties. Due to this, there is no Kylin.properties file in Coprocessor.</p> +<p>æ´å¤å 容åè§ KYLIN-3552ã</p> -<div class="highlighter-rouge"><pre class="highlight"><code>buildDefaultOrderedProperties(); -</code></pre> -</div> +<h3 id="memcached--kylin-">ä½¿ç¨ Memcached ä½ Kylin çåå¸å¼ç¼å</h3> +<p>å¨è¿å»ï¼Kylin 对æ¥è¯¢ç»æçç¼å䏿¯åå髿ï¼ä¸»è¦æä»¥ä¸ä¸¤ä¸ªæ¹é¢çåå ï¼<br /> +ä¸ä¸ªæ¯å½ Kylin ç metadata åçååæ¶ï¼ä¼ä¸»å¨ç²ç®å°å»æ¸ é¤å¤§éç¼åï¼ä½¿å¾ç¼åä¼è¢«é¢ç¹å·æ°è导è´å©ç¨çéä½ã<br /> +å¦ä¸ç¹æ¯ç±äºåªä½¿ç¨æ¬å°ç¼åèå¯¼è´ Kylin server ä¹é´ä¸è½å ±äº«å½¼æ¤çç¼åï¼è¿æ ·æ¥è¯¢çç¼åå½ä¸çå°±ä¼éä½ã<br /> +æ¬å°ç¼åçä¸ä¸ªç¼ºç¹æ¯å¤§å°åå°éå¶ï¼ä¸è½ååå¸å¼ç¼å飿 ·æ°´å¹³æ©å±ãè¿æ ·å¯¼è´è½ç¼åçæ¥è¯¢ç»æéåå°äºéå¶ã</p> -<p>For the second part, this design should be future-proof and allow users to define 10 default properties (and override with each other), but after a year and a half, this logic seemed to never be used. However, to reduce risk, we kept this logic because it only gets called once during service start up which resulted in an insignificant waste of additional time.</p> +<p>é对è¿äºç¼ºé·ï¼æä»¬æ¹åäºç¼å失æçæºå¶ï¼ä¸å主å¨å»æ¸ çç¼åï¼èæ¯éåå¦ä¸çæ¹æ¡ï¼<br /> +1. å¨å°æ¥è¯¢ç»ææ¾å ¥ç¼åä¹åï¼æ ¹æ®å½åçå æ°æ®ä¿¡æ¯è®¡ç®ä¸ä¸ªæ°åç¾åï¼å¹¶ä¸æ¥è¯¢ç»æä¸åæ¾å ¥ç¼åä¸<br /> +2. ä»ç¼åä¸è·åæ¥è¯¢ç»æä¹åï¼æ ¹æ®å½åçå æ°æ®ä¿¡æ¯è®¡ç®ä¸ä¸ªæ°åç¾åï¼å¯¹æ¯ä¸¤è çæ°åç¾åæ¯å¦ä¸è´ã妿ä¸è´ï¼é£ä¹ç¼åææï¼åä¹ï¼è¯¥ç¼å失æå¹¶å é¤</p> -<h2 id="performance-testing-after-bug-fixes">Performance Testing After Bug Fixes</h2> +<p>æä»¬è¿å¼å ¥äº Memcached ä½ä¸º Kylin çåå¸å¼ç¼åãè¿æ · Kylin server ä¹é´å¯ä»¥å ±äº«æ¥è¯¢ç»æçç¼åï¼èä¸ç±äº Memcached server ä¹é´çç¬ç«æ§ï¼é常æäºæ°´å¹³æå±ï¼æ´å æå©äºç¼åæ´å¤çæ°æ®ã<br /> +ç¸å ³å¼å任塿¯ KYLIN-2895, KYLIN-2894, KYLIN-2896, KYLIN-2897, KYLIN-2898, KYLIN-2899ã</p> -<p>Based on the same data volume and testing environment, results were as follows:</p> +<h3 id="forkjoinpool--fast-cubing-">ForkJoinPool ç®å fast cubing ççº¿ç¨æ¨¡å</h3> +<p>å¨è¿å»è¿è¡ fast cubing æ¶ï¼Kylin 使ç¨èªå·±å®ä¹çä¸ç³»å线ç¨ï¼å¦ split 线ç¨ï¼task 线ç¨ï¼main 线ç¨ççè¿è¡å¹¶åç cube æå»ºã<br /> +å¨è¿ä¸ªçº¿ç¨æ¨¡åä¸ï¼çº¿ç¨ä¹é´çå ³ç³»ååç夿ï¼èä¸å¯¹å¼å¸¸å¤çä¹åå容æåºéã</p> -<table> - <thead> - <tr> - <th style="text-align: center">Thread</th> - <th style="text-align: center">Handled Queries (in 60 seconds)</th> - <th style="text-align: center">Handled Queries (per second)</th> - <th style="text-align: center">Mean Response Time (ms)</th> - </tr> - </thead> - <tbody> - <tr> - <td style="text-align: center">1</td> - <td style="text-align: center">2451</td> - <td style="text-align: center">41</td> - <td style="text-align: center">12</td> - </tr> - <tr> - <td style="text-align: center">15</td> - <td style="text-align: center">12422</td> - <td style="text-align: center">207</td> - <td style="text-align: center">37</td> - </tr> - <tr> - <td style="text-align: center">25</td> - <td style="text-align: center">15600</td> - <td style="text-align: center">260</td> - <td style="text-align: center">56</td> - </tr> - <tr> - <td style="text-align: center">50</td> - <td style="text-align: center">18481</td> - <td style="text-align: center">308</td> - <td style="text-align: center">129</td> - </tr> - <tr> - <td style="text-align: center">75</td> - <td style="text-align: center">21055</td> - <td style="text-align: center">351</td> - <td style="text-align: center">136</td> - </tr> - <tr> - <td style="text-align: center">100</td> - <td style="text-align: center">24036</td> - <td style="text-align: center">400</td> - <td style="text-align: center">251</td> - </tr> - <tr> - <td style="text-align: center">150</td> - <td style="text-align: center">28014</td> - <td style="text-align: center">467</td> - <td style="text-align: center">277</td> - </tr> - </tbody> -</table> +<p>ç°å¨æä»¬å¼å ¥äº ForkJoinPoolï¼å¨ä¸»çº¿ç¨ä¸å¤ç split é»è¾ï¼æå»º cuboid çä»»å¡ä»¥ååä»»å¡é½å¨ fork join pool䏿§è¡ï¼cuboid æå»ºçç»æå¯ä»¥è¢«å¼æ¥çæ¶éå¹¶ä¸å¯ä»¥æ´æ©å°è¾åºç»ä¸æ¸¸ç merge æä½ãæ´å¤å 容åè§ KYLIN-2932ã</p> -<p>And the resulting line chart:</p> +<h3 id="hllcounter-">æ¹è¿ HLLCounter çæ§è½</h3> +<p>å¯¹äº HLLCounterï¼ æä»¬ä»ä¸¤æ¹é¢è¿è¡äºæ¹è¿ï¼æå»º HLLCounter å计ç®è°åå¹³åçæ¹å¼ã<br /> +1. å ³äº HLLCounter çæå»ºï¼æä»¬ä¸å使ç¨mergeçæ¹å¼ï¼èæ¯ç´æ¥copyå«çHLLCounteréé¢çregisters<br /> +2. å ³äºè®¡ç® HLLCSnapshot éé¢çè°åå¹³åï¼åäºä»¥ä¸ä¸ä¸ªæ¹é¢çæ¹è¿ï¼<br /> +* ç¼åææç1/2^r<br /> +* ä½¿ç¨æ´åç¸å ä»£æ¿æµ®ç¹åç¸å <br /> +* å 餿¡ä»¶åæ¯ï¼ä¾å¦æ éæ£æ¥ registers[i] æ¯ä¸æ¯ä¸º0</p> -<p><img src="/images/blog/cisco_throughput_5x/handled_queries_2.png" alt="" width="500px" height="300px" /></p> +<p>æ´å¤å 容åè§ KYLIN-3656ã</p> -<p>When the concurrent threads reached 150, Kylin processed 467 requests per second. The concurrent query capability increased by five times with linear growth . It could be concluded then that the bottleneck was eliminated . We didnât increase the concurrent threads due to the Kylin query engineâs settings for cluster load balancing which meant that increasing the concurrent connections on a single node increased the workload on the Tomcat server (Max connection is 150 in Kylin by default). The thread blocking issue disappeared after re-collecting and analyzing the Jstack log.</p> +<h3 id="cube-planner-">æ¹è¿ Cube Planner ç®æ³</h3> +<p>å¨è¿å»ï¼cube planner ç phase two å¢å æªè¢«é¢è®¡ç®ç cuboid çæ¹å¼åªè½éè¿ mandatory cuboid çæ¹å¼ãèä¸ä¸ª cuboid æ¯å¦ä¸º mandatoryï¼åæä¸¤ç§æ¹å¼ï¼<br /> +æå¨è®¾ç½®ï¼æ¥è¯¢æ¶ rollup çè¡æ°è¶³å¤å¤§ãè¿ééè¿å¤ææ¥è¯¢æ¶ rollup çè¡æ°æ¯å¦è¶³å¤å¤§æ¥å¤ææ¯å¦ä¸º mandatory cuboid çæ¹å¼æä¸¤å¤§ç¼ºé·ï¼<br /> +* 䏿¯ä¼°ç® rollup çè¡æ°çç®æ³ä¸æ¯å¾å¥½<br /> +* äºæ¯å¾é¾è®¾ç«ä¸ä¸ªéæçé弿¥åå¤å®</p> -<p>After the fix, each Kylin node could now handle requests for 467/15 = 31 users, which meets our business requirement. Additionally, Kylinâs concurrent query capability can be further improved by several times once we enable query cache, so it is more than sufficient to fulfill our needs.</p> +<p>ç°å¨æä»¬ä¸åä» rollup è¡æ°çè§åº¦çé®é¢äºãä¸å齿¯ä» cuboid è¡æ°çè§åº¦çé®é¢ï¼è¿æ ·å°±å cost based ç cube planner ç®æ³åäºç»ä¸ã<br /> +ä¸ºæ¤æä»¬éè¿ä½¿ç¨ rollup æ¯çæ¥æ¹è¿äºæªè¢«é¢å æå»ºç cuboid çè¡æ°çä¼°ç®ï¼ç¶å让 cost based ç cube planner ç®æ³æ¥å¤å®åªäºæªè¢«æå»ºç cuboid 该被æå»ºï¼åªäºè¯¥è¢«éå¼ã<br /> +éè¿è¿æ ·çæ¹è¿ï¼æ ééè¿è®¾å®éæçé弿¥æ¨è mandatory cuboid äºï¼è mandatory cuboid åªè½è¢«æå¨è®¾ç½®ï¼ä¸è½è¢«æ¨èäºãæ´å¤å 容åè§ KYLIN-3540ã</p> -<h2 id="summary">Summary</h2> +<p><strong>ä¸è½½</strong></p> -<p>Apache Kylin lets you query massive datasets at sub-second latency, thanks to the pre-calculation design of cubes, the optimization of Apache Calcite operator in queries, and also the introduction of âPrepared Statement Cacheâ to reduce the cost of Calcite SQL parses. Query performance optimization is not easy. We need to pay more attention to impacts on the Kylin query engine when new features are introduced or bugs are fixed, since even a minor code change could spell disaster. Issues like these in high concurrency scenarios can often be hard to reproduce and analyze.</p> +<p>è¦ä¸è½½Apache Kylin v2.6.0æºä»£ç æäºè¿å¶å ï¼è¯·è®¿é®<a href="http://kylin.apache.org/download">ä¸è½½é¡µé¢</a> .</p> -<p>Lastly, query performance testing should not be limited to a single or small set of queries. High concurrecy performance testing should take place considering actual business requirements. For enterprise reporting systems, 3 seconds is the user tolerance limit for new page loading, which includes page rendering and network consumption. Ultimately, the backend data service should provide a response within 1 second. This is indeed a big challenge in a business scenario with big data sets. Fortunately, Kylin easily meets this requirement.</p> +<p><strong>å级</strong></p> -<p>This issue has already been submitted on JIRA as <a href="https://issues.apache.org/jira/browse/KYLIN-3672">KYLIN-3672</a>, and released in Kylin v2.5.2. Thanks to Shaofeng Shi of Kyligence Inc. for help.</p> +<p>åè<a href="/docs/howto/howto_upgrade.html">å级æå</a>.</p> -<p>ã1ã<a href="https://issues.apache.org/jira/browse/KYLIN-3672">https://issues.apache.org/jira/browse/KYLIN-3672</a></p> +<p><strong>åé¦</strong></p> -<p><em>Author Zongwie Li as a Cisco engineer and a team member in the companyâs Big Data architecture team, currently responsible for OLAP platform construction and customer business reporting systems.</em></p> +<p>妿æ¨éå°é®é¢æçé®ï¼è¯·åéé®ä»¶è³ Apache Kylin dev æ user é®ä»¶å表ï¼d...@kylin.apache.orgï¼u...@kylin.apache.org; å¨åéä¹åï¼è¯·ç¡®ä¿æ¨å·²éè¿åéçµåé®ä»¶è³ dev-subscr...@kylin.apache.org æ user-subscr...@kylin.apache.org订é äºé®ä»¶å表ã</p> +<p><em>é常æè°¢ææè´¡ç®Apache Kylinçæå!</em></p> </description> - <pubDate>Thu, 17 Jan 2019 09:30:00 -0800</pubDate> - <link>http://kylin.apache.org/blog/2019/01/17/cisco-throughput-5x/</link> - <guid isPermaLink="true">http://kylin.apache.org/blog/2019/01/17/cisco-throughput-5x/</guid> + <pubDate>Fri, 18 Jan 2019 12:00:00 -0800</pubDate> + <link>http://kylin.apache.org/cn_blog/2019/01/18/release-v2.6.0/</link> + <guid isPermaLink="true">http://kylin.apache.org/cn_blog/2019/01/18/release-v2.6.0/</guid> - <category>blog</category> + <category>cn_blog</category> </item>
Added: kylin/site/images/blog/refine-query-cache/cache-signature.png URL: http://svn.apache.org/viewvc/kylin/site/images/blog/refine-query-cache/cache-signature.png?rev=1864154&view=auto ============================================================================== Binary file - no diff available. Propchange: kylin/site/images/blog/refine-query-cache/cache-signature.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: kylin/site/images/blog/refine-query-cache/consistent-hashing.png URL: http://svn.apache.org/viewvc/kylin/site/images/blog/refine-query-cache/consistent-hashing.png?rev=1864154&view=auto ============================================================================== Binary file - no diff available. Propchange: kylin/site/images/blog/refine-query-cache/consistent-hashing.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: kylin/site/images/blog/refine-query-cache/l1-l2-cache.png URL: http://svn.apache.org/viewvc/kylin/site/images/blog/refine-query-cache/l1-l2-cache.png?rev=1864154&view=auto ============================================================================== Binary file - no diff available. Propchange: kylin/site/images/blog/refine-query-cache/l1-l2-cache.png ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream