| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <!DOCTYPE html> |
| |
| |
| |
| <html lang="en"> |
| <head> |
| <!-- Global site tag (gtag.js) - Google Analytics --> |
| <script async src="https://www.googletagmanager.com/gtag/js?id=UA-1382082-1"></script> |
| <script> |
| window.dataLayer = window.dataLayer || []; |
| function gtag(){dataLayer.push(arguments);} |
| gtag('js', new Date()); |
| |
| gtag('config', 'UA-61232409-1'); |
| </script> |
| |
| |
| |
| <meta charset="UTF-8"> |
| <title>Apache Kafka Streamer | Ignite Documentation</title> |
| |
| <link rel="canonical" href="/docs/kafka/kafka-streamer" /> |
| |
| |
| <link rel="stylesheet" href="/assets/css/styles.css?1651672546"> |
| <link rel="stylesheet" href="/assets/css/asciidoc-pygments.css"> |
| <link rel="shortcut icon" href="/favicon.ico"> |
| <meta name='viewport' content='width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0'> |
| |
| <link rel="stylesheet" |
| href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> |
| |
| <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> |
| <script type="text/javascript" src="/assets/js/jquery.swiftype.autocomplete.js?1651672546"></script> |
| <script type="text/javascript" src="/assets/js/anchor.min.js?1651672546"></script> |
| |
| |
| </head> |
| <body> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <header> |
| <div class="container"> |
| <button type='button' class='menu' title='Docs menu'> |
| <img src="/assets/images/menu-icon.svg"/> |
| </button> |
| |
| <div class='home'> |
| <a href="/" class='home' title='Apache Ignite home'> |
| <img src="/assets/images/apache_ignite_logo.svg" alt="Apache Ignite logo" width="103" height="36" > |
| </a> |
| </div> |
| |
| <nav> |
| |
| </nav> |
| <form class='search'> |
| <button class="search-close" type='button'><img src='/assets/images/cancel.svg'></button> |
| <input type="search" placeholder="Search…" id="search-input"> |
| </form> |
| <button type='button' class='search-toggle'><img src='/assets/images/search.svg'></button> |
| <button type='button' class='top-nav-toggle'>⋮</button> |
| <a href="https://github.com/ignite" title='GitHub' class='github' target="_blank"> |
| <img src="/assets/images/github-gray.svg" alt="GitHub logo"> |
| </a> |
| </div> |
| </header> |
| |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <link rel="stylesheet" href="/assets/css/docs.css"> |
| <section class='page-docs'> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| |
| |
| |
| |
| |
| |
| <nav class='left-nav' data-swiftype-index='false'> |
| |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/aws/aws" class='' >Amazon S3 IP Finder</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/camel/camel-streamer" class='' >Apache Camel Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/flink/flink-streamer" class='' >Apache Flink Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/flume/flume-sink" class='' >Apache Flume Sink</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/azure/azure" class='' >Apache Ignite Azure Module</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/gce/gce" class='' >Apache Ignite GCE Module</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/pub-sub/pub-sub" class='' >Apache Ignite Pub/Sub Module</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/spring/spring-boot" class='' >Apache Ignite and Spring Boot</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/spring/spring-data" class='' >Apache Ignite and Spring Data</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/spring/spring-caching" class='' >Apache Ignite and Spring Cache</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/spring/spring-tx" class='' >Apache Ignite and Spring Transactions</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/kafka/kafka-streamer" class='' >Apache Kafka Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/storm/storm-streamer" class='' >Apache Storm Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/cdc/change-data-capture-extensions" class='' >Change Data Capture Extension</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/jms/jms-streamer" class='' >JMS Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/mqtt/mqtt-streamer" class='' >MQTT Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/perf-statistics/performance-statistics" class='' >Performance Statistics Extension</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/rocketmq/rocketmq-streamer" class='' >RocketMQ Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/topology-validator/topology-validator" class='' >Topology Validator</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/twitter/twitter-streamer" class='' >Twitter Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/zeromq/zeromq-streamer" class='' >ZeroMQ Streamer</a> |
| |
| </li> |
| |
| <li> |
| |
| |
| <a href="/docs/extensions/zookeeper/zookeeper-ip" class='' >ZooKeeper IP Finder</a> |
| |
| </li> |
| |
| </nav> |
| <div class="left-nav__overlay"></div> |
| |
| |
| <article data-swiftype-index='true'> |
| <a class='edit-link' href="/_docs/kafka/kafka-streamer.adoc" target="_blank">Edit</a> |
| |
| <h1>Apache Kafka Streamer</h1> |
| |
| <div class="sect1"> |
| <h2 id="overview">Overview</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Apache Ignite Kafka Streamer module provides streaming from Kafka to Ignite cache. |
| Either of the following two methods can be used to achieve such streaming:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>using Kafka Connect functionality with Ignite sink</p> |
| </li> |
| <li> |
| <p>importing the Kafka Streamer module in your Maven project and instantiating KafkaStreamer for data streaming</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="streaming-data-via-kafka-connect">Streaming Data via Kafka Connect</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p><code>IgniteSinkConnector</code> will help you export data from Kafka to Ignite cache by polling data from Kafka topics and writing |
| it to your specified cache. The connector can be found in the <code>optional/ignite-kafka</code> module. It and its dependencies |
| have to be on the classpath of a Kafka running instance, as described in the following subsection. <em>For more information |
| on Kafka Connect, see <a href="http://kafka.apache.org/documentation.html#connect" target="_blank" rel="noopener">Kafka Documentation</a>.</em></p> |
| </div> |
| <div class="sect2"> |
| <h3 id="setting-up-and-running">Setting up and Running</h3> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>Add the <code>IGNITE_HOME/libs/optional/ignite-kafka</code> module to the application classpath.</p> |
| </li> |
| <li> |
| <p>Prepare worker configurations, e.g.,</p> |
| <code-tabs><code-tab data-tab='Configuration'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="yaml"><span class="s">bootstrap.servers=localhost:9092</span> |
| |
| <span class="s">key.converter=org.apache.kafka.connect.storage.StringConverter</span> |
| <span class="s">value.converter=org.apache.kafka.connect.storage.StringConverter</span> |
| <span class="s">key.converter.schemas.enable=false</span> |
| <span class="s">value.converter.schemas.enable=false</span> |
| |
| <span class="s">internal.key.converter=org.apache.kafka.connect.storage.StringConverter</span> |
| <span class="s">internal.value.converter=org.apache.kafka.connect.storage.StringConverter</span> |
| <span class="s">internal.key.converter.schemas.enable=false</span> |
| <span class="s">internal.value.converter.schemas.enable=false</span> |
| |
| <span class="s">offset.storage.file.filename=/tmp/connect.offsets</span> |
| <span class="s">offset.flush.interval.ms=10000</span></code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| </li> |
| <li> |
| <p>Prepare connector configurations, e.g.,</p> |
| <code-tabs><code-tab data-tab='Configuration'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="yaml"><span class="c1"># connector</span> |
| <span class="s">name=my-ignite-connector</span> |
| <span class="s">connector.class=org.apache.ignite.stream.kafka.connect.IgniteSinkConnector</span> |
| <span class="s">tasks.max=2</span> |
| <span class="s">topics=someTopic1,someTopic2</span> |
| |
| <span class="c1"># cache</span> |
| <span class="s">cacheName=myCache</span> |
| <span class="s">cacheAllowOverwrite=true</span> |
| <span class="s">igniteCfg=/some-path/ignite.xml</span> |
| <span class="s">singleTupleExtractorCls=my.company.MyExtractor</span></code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>where <code>cacheName</code> is the name of the cache you specify in <code>/some-path/ignite.xml</code> and the data from <code>someTopic1,someTopic2</code> |
| will be pulled and stored.</p> |
| </li> |
| <li> |
| <p><code>cacheAllowOverwrite</code> can be set to <code>true</code> if you want to enable overwriting existing values in the cache.</p> |
| </li> |
| <li> |
| <p>If you need to parse the incoming data and decide on your new key and value, you can implement it as <code>StreamSingleTupleExtractor</code> and specify as <code>singleTupleExtractorCls</code>.</p> |
| </li> |
| <li> |
| <p>You can also set <code>cachePerNodeDataSize</code> and <code>cachePerNodeParOps</code> to adjust per-node buffer and the maximum number of parallel stream operations for a single node.</p> |
| </li> |
| </ul> |
| </div> |
| </li> |
| <li> |
| <p>Start connector, for instance, in a standalone mode as follows,</p> |
| <code-tabs><code-tab data-tab='Shell'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="shell">bin/connect-standalone.sh myconfig/connect-standalone.properties myconfig/ignite-connector.properties</code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| </li> |
| </ol> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="checking-the-flow">Checking the Flow</h3> |
| <div class="paragraph"> |
| <p>To perform a very basic functionality check, you can do the following,</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>Start Zookeeper</p> |
| <code-tabs><code-tab data-tab='Shell'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="shell">bin/zookeeper-server-start.sh config/zookeeper.properties</code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| </li> |
| <li> |
| <p>Start Kafka server</p> |
| <code-tabs><code-tab data-tab='Shell'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="shell">bin/kafka-server-start.sh config/server.properties</code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| </li> |
| <li> |
| <p>Provide some data input to the Kafka server</p> |
| <code-tabs><code-tab data-tab='Shell'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="shell">bin/kafka-console-producer.sh <span class="nt">--broker-list</span> localhost:9092 <span class="nt">--topic</span> <span class="nb">test</span> <span class="nt">--property</span> parse.key<span class="o">=</span><span class="nb">true</span> <span class="nt">--property</span> key.separator<span class="o">=</span>,k1,v1</code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| </li> |
| <li> |
| <p>Start the connector</p> |
| <code-tabs><code-tab data-tab='Shell'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="shell">bin/connect-standalone.sh myconfig/connect-standalone.properties myconfig/ignite-connector.properties</code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| </li> |
| <li> |
| <p>Check the value is in the cache. For example, via REST API,</p> |
| <code-tabs><code-tab data-tab='Shell'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="shell">http://node1:8080/ignite?cmd<span class="o">=</span>size&cacheName<span class="o">=</span>cache1</code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| </li> |
| </ol> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="streaming-data-with-ignite-kafka-streamer-module">Streaming data with Ignite Kafka Streamer Module</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>If you are using Maven to manage dependencies of your project, first of all you will have to add Kafka Streamer module |
| dependency like this (replace <code>${ignite-kafka-ext.version}</code> with actual Ignite Kafka Extension version you are interested in):</p> |
| </div> |
| <code-tabs><code-tab data-tab='pom.xml'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="xml"><span class="nt"><project</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/POM/4.0.0"</span> |
| <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span> |
| <span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/POM/4.0.0 |
| http://maven.apache.org/xsd/maven-4.0.0.xsd"</span><span class="nt">></span> |
| ... |
| <span class="nt"><dependencies></span> |
| ... |
| <span class="nt"><dependency></span> |
| <span class="nt"><groupId></span>org.apache.ignite<span class="nt"></groupId></span> |
| <span class="nt"><artifactId></span>ignite-kafka-ext<span class="nt"></artifactId></span> |
| <span class="nt"><version></span>${ignite-kafka-ext.version}<span class="nt"></version></span> |
| <span class="nt"></dependency></span> |
| ... |
| <span class="nt"></dependencies></span> |
| ... |
| <span class="nt"></project></span></code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| <div class="paragraph"> |
| <p>Having a cache with <code>String</code> keys and <code>String</code> values, the streamer can be started as follows</p> |
| </div> |
| <code-tabs><code-tab data-tab='Java'><div class="listingblock"> |
| <div class="content"> |
| <pre class="rouge highlight"><code data-lang="java"><span class="nc">KafkaStreamer</span><span class="o"><</span><span class="nc">String</span><span class="o">,</span> <span class="nc">String</span><span class="o">,</span> <span class="nc">String</span><span class="o">></span> <span class="n">kafkaStreamer</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">KafkaStreamer</span><span class="o"><>();</span> |
| |
| <span class="nc">IgniteDataStreamer</span><span class="o"><</span><span class="nc">String</span><span class="o">,</span> <span class="nc">String</span><span class="o">></span> <span class="n">stmr</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">dataStreamer</span><span class="o">(</span><span class="s">"myCache"</span><span class="o">));</span> |
| |
| <span class="c1">// allow overwriting cache data</span> |
| <span class="n">stmr</span><span class="o">.</span><span class="na">allowOverwrite</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span> |
| |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">setIgnite</span><span class="o">(</span><span class="n">ignite</span><span class="o">);</span> |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">setStreamer</span><span class="o">(</span><span class="n">stmr</span><span class="o">);</span> |
| |
| <span class="c1">// set the topic</span> |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">setTopic</span><span class="o">(</span><span class="n">someKafkaTopic</span><span class="o">);</span> |
| |
| <span class="c1">// set the number of threads to process Kafka streams</span> |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">setThreads</span><span class="o">(</span><span class="mi">4</span><span class="o">);</span> |
| |
| <span class="c1">// set Kafka consumer configurations</span> |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">setConsumerConfig</span><span class="o">(</span><span class="n">kafkaConsumerConfig</span><span class="o">);</span> |
| |
| <span class="c1">// set extractor</span> |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">setSingleTupleExtractor</span><span class="o">(</span><span class="n">strExtractor</span><span class="o">);</span> |
| |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">start</span><span class="o">();</span> |
| |
| <span class="o">...</span> |
| |
| <span class="c1">// stop on shutdown</span> |
| <span class="n">kafkaStreamer</span><span class="o">.</span><span class="na">stop</span><span class="o">();</span> |
| |
| <span class="n">strm</span><span class="o">.</span><span class="na">close</span><span class="o">();</span></code></pre> |
| </div> |
| </div></code-tab></code-tabs> |
| <div class="paragraph"> |
| <p>For the detailed information on Kafka consumer properties, refer to <a href="http://kafka.apache.org/documentation.html" class="bare">http://kafka.apache.org/documentation.html</a></p> |
| </div> |
| </div> |
| </div> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <div class="copyright"> |
| © 2022 The Apache Software Foundation.<br/> |
| Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are either registered trademarks or trademarks of The Apache Software Foundation. |
| |
| </div> |
| |
| </article> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <nav class="right-nav" data-swiftype-index='false'> |
| <ul class="sectlevel1"> |
| <li><a href="#overview">Overview</a></li> |
| <li><a href="#streaming-data-via-kafka-connect">Streaming Data via Kafka Connect</a> |
| <ul class="sectlevel2"> |
| <li><a href="#setting-up-and-running">Setting up and Running</a></li> |
| <li><a href="#checking-the-flow">Checking the Flow</a></li> |
| </ul> |
| </li> |
| <li><a href="#streaming-data-with-ignite-kafka-streamer-module">Streaming data with Ignite Kafka Streamer Module</a></li> |
| </ul> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| |
| <footer> |
| </footer> |
| |
| </nav> |
| |
| </section> |
| <script type='module' src='/assets/js/code-copy-to-clipboard.js' async></script> |
| |
| <script> |
| // inits deep anchors -- needs to be done here because of https://www.bryanbraun.com/anchorjs/#dont-run-it-too-late |
| anchors.add('.page-docs h1, .page-docs h2, .page-docs h3:not(.discrete), .page-docs h4, .page-docs h5'); |
| anchors.options = { |
| placement: 'right', |
| visible: 'always' |
| }; |
| </script> |
| </body> |
| <script type='module' src='/assets/js/index.js?1651672546' async></script> |
| </html> |