From 5bf0d5cde488bb602ed74df99eed8c73fcd41485 Mon Sep 17 00:00:00 2001 From: Apurva Mehta Date: Tue, 5 Dec 2017 08:16:57 -0800 Subject: [PATCH] Revert commits which broke the docs (#501) * Revert "Make doc links point to GH repo (#496)" This reverts commit 0371a0890a8e621cea3a62dabfc18321aed4e43a. * Revert "DOCS-127 - Add KSQL doc to CP (#472)" This reverts commit c4881258d1c31676a23a0ca20badeed01d5022fa. --- README.md | 14 +- docs/Makefile | 181 ----- docs/README.md | 30 +- docs/concepts.md | 143 ++++ docs/concepts.rst | 167 ----- docs/conf.py | 266 ------- docs/config-ksql.rst | 79 --- contributing.md => docs/contributing.md | 34 +- docs/examples.md | 325 +++++++++ docs/examples.rst | 308 --------- docs/faq.md | 87 +++ docs/faq.rst | 131 ---- docs/img/grafana-success.png | Bin 325529 -> 0 bytes docs/index.rst | 66 -- docs/ksql-clickstream-demo/Dockerfile | 31 - .../docker-clickstream.rst | 381 ---------- docs/ksql-clickstream-demo/index.rst | 31 - .../non-docker-clickstream.rst | 364 ---------- docs/ksql-clickstream-demo/pom.xml | 109 --- docs/make.bat | 242 ------- docs/quickstart/README.md | 241 +++++++ docs/quickstart/index.rst | 263 ------- .../ksql-quickstart-schemas.jpg | Bin docs/quickstart/quickstart-docker.md | 153 +++++ docs/quickstart/quickstart-docker.rst | 200 ------ docs/quickstart/quickstart-non-docker.md | 118 ++++ docs/quickstart/quickstart-non-docker.rst | 152 ---- docs/roadmap.md | 22 + docs/syntax-reference.md | 557 +++++++++++++++ docs/syntax-reference.rst | 649 ------------------ 30 files changed, 1680 insertions(+), 3664 deletions(-) delete mode 100644 docs/Makefile create mode 100644 docs/concepts.md delete mode 100644 docs/concepts.rst delete mode 100644 docs/conf.py delete mode 100644 docs/config-ksql.rst rename contributing.md => docs/contributing.md (74%) create mode 100644 docs/examples.md delete mode 100644 docs/examples.rst create mode 100644 docs/faq.md delete mode 100644 docs/faq.rst delete mode 100644 docs/img/grafana-success.png delete mode 100644 docs/index.rst delete mode 100644 docs/ksql-clickstream-demo/Dockerfile delete mode 100644 docs/ksql-clickstream-demo/docker-clickstream.rst delete mode 100644 docs/ksql-clickstream-demo/index.rst delete mode 100644 docs/ksql-clickstream-demo/non-docker-clickstream.rst delete mode 100644 docs/ksql-clickstream-demo/pom.xml delete mode 100644 docs/make.bat create mode 100644 docs/quickstart/README.md delete mode 100644 docs/quickstart/index.rst rename docs/{img => quickstart}/ksql-quickstart-schemas.jpg (100%) create mode 100644 docs/quickstart/quickstart-docker.md delete mode 100644 docs/quickstart/quickstart-docker.rst create mode 100644 docs/quickstart/quickstart-non-docker.md delete mode 100644 docs/quickstart/quickstart-non-docker.rst create mode 100644 docs/roadmap.md create mode 100644 docs/syntax-reference.md delete mode 100644 docs/syntax-reference.rst diff --git a/README.md b/README.md index 75002731b94f..7828661de8d3 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ Click here to watch a screencast of the KSQL demo on YouTube. KSQL screencast

-# Getting Started +# Quick Start If you are ready to see the power of KSQL, try out these: -- [KSQL Quick Start](/docs/quickstart/index.rst): Demonstrates a simple workflow using KSQL to write streaming queries against data in Kafka. -- [Clickstream Analysis Demo](/docs/ksql-clickstream-demo/index.rst): Shows how to build an application that performs real-time user analytics. +- [KSQL Quick Start](/docs/quickstart#quick-start): Demonstrates a simple workflow using KSQL to write streaming queries against data in Kafka. +- [Clickstream Analysis Demo](/ksql-clickstream-demo#clickstream-analysis): Shows how to build an application that performs real-time user analytics. # Use Cases and Examples @@ -61,8 +61,7 @@ CREATE TABLE error_counts AS # Documentation -You can find the KSQL documentation at [docs.confluent.io](https://docs.confluent.io/current/ksql/docs/index.html). The source -is located in [https://github.com/confluentinc/ksql/docs/](/docs/). +You can [find the KSQL documentation here](/docs#ksql-documentation). # Join the Community Whether you need help, want to contribute, or are just looking for the latest news, you can find out how to [connect with your fellow Confluent community members here](https://www.confluent.io/contact-us-thank-you/). @@ -71,13 +70,10 @@ Whether you need help, want to contribute, or are just looking for the latest ne * Join the [Confluent Google group](https://groups.google.com/forum/#!forum/confluent-platform). # Contributing -Contributions to the code, examples, documentation, etc, are very much appreciated. For more information, see the [contribution guidelines](contributing.md). +Contributions to the code, examples, documentation, etc, are very much appreciated. For more information, see the [contribution guidelines](/docs/contributing.md). - Report issues and bugs directly in [this GitHub project](https://github.com/confluentinc/ksql/issues). -# Issues -Report issues in [this GitHub project](https://github.com/confluentinc/ksql/issues). - # License The project is licensed under the Apache License, version 2.0. diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index e0722507ee3c..000000000000 --- a/docs/Makefile +++ /dev/null @@ -1,181 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext livehtml - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " livehtml to make standalone HTML files automatically watching for changes" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -livehtml: - python autoreload.py - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/KafkaRESTProxy.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/KafkaRESTProxy.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/KafkaRESTProxy" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/KafkaRESTProxy" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/README.md b/docs/README.md index e0d26bea7fb8..2206cbd18a9a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,8 +1,32 @@ # KSQL Documentation -The KSQL documentation is available on the Confluent Platform documentation site at [docs.confluent.io](https://docs.confluent.io/current/ksql/docs/index.html). +| Overview |[Quick Start](/docs/quickstart#quick-start) | [Concepts](/docs/concepts.md#concepts) | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | [FAQ](/docs/faq.md#frequently-asked-questions) | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| +> *Important: This release is a **developer preview** and is free and open-source from Confluent under the Apache 2.0 license. Do not run KSQL against a production cluster.* + +# Overview +KSQL is an open source streaming SQL engine that implements continuous, interactive queries against Apache Kafka™. It allows you to query, read, write, and process data in Apache Kafka in real-time, at scale using SQL commands. KSQL interacts directly with the [Kafka Streams API](https://kafka.apache.org/documentation/streams/), removing the requirement of building a Java app. + +### Use cases +Common KSQL use cases are: + +- Fraud detection - identify and act on out of the ordinary data to provide real-time awareness. +- Personalization - create real-time experiences and insight for end users driven by data. +- Notifications - build custom alerts and messages based on real-time data. +- Real-time Analytics - power real-time dashboards to understand what’s happening as it does. +- Sensor data and IoT - understand and deliver sensor data how and where it needs to be. +- Customer 360 - provide a clear, real-time understanding of your customers across every interaction. + +KSQL lowers the barriers for using real-time data in your applications. It is powered by a scalable streaming platform without the learning curve or additional management complexity of other stream processing solutions. + +## Modes of operation + +You can use KSQL in standalone, client-server, application, and embedded modes. See [Concepts](/docs/concepts.md#concepts) for more information. + +## Getting Started + +* Beginners: Try the [interactive quick start](/docs/quickstart#quick-start). The quick start configures a single instance in a lightweight Docker container or in a Kafka cluster. It demonstrates a simple workflow using KSQL to write streaming queries against data in Kafka. +* Advanced users: Try the [end-to-end Clickstream Analysis demo](/ksql-clickstream-demo#clickstream-analysis). -# Contributing -This documentation is built using [Sphinx](http://sphinx-doc.org). For information on how to contribute, see the [contributing guidelines](contributing.md). \ No newline at end of file diff --git a/docs/concepts.md b/docs/concepts.md new file mode 100644 index 000000000000..90cad6dba0aa --- /dev/null +++ b/docs/concepts.md @@ -0,0 +1,143 @@ +# Concepts + +| [Overview](/docs#ksql-documentation) |[Quick Start](/docs/quickstart#quick-start) | Concepts | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | [FAQ](/docs/faq.md#frequently-asked-questions) | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| + + +**Table of Contents** +- [Components](#components) +- [Terminology](#terminology) +- [Modes of operation](#modes-of-operation) + +# Components +The main components of KSQL are the KSQL CLI and the KSQL server. + +#### KSQL CLI +The KSQL CLI allows you to interactively write KSQL queries. +Its interface should be familiar to users of MySQL, Postgres, Oracle, Hive, Presto, etc. + +The KSQL CLI acts as a client to the KSQL server (see next section). + +#### KSQL Server +The KSQL server runs the engine that executes KSQL queries, which includes the data processing as well as reading +data from and writing data to the target Kafka cluster. + +# Terminology +When using KSQL, the following terminology is used. + +#### Stream + +A stream is an unbounded sequence of structured data ("facts"). For example, we could have a stream of financial transactions such as "Alice sent $100 to Bob, then Charlie sent $50 to Bob". Facts in a stream are immutable, which means new facts can be inserted to a stream, but existing facts can never be updated or deleted. Streams can be created from a Kafka topic or derived from existing streams and tables. In both cases, a stream's underlying data is durably stored (persisted) within a Kafka topic on the Kafka brokers. + +#### Table + +A table is a view of a stream, or another table, and represents a collection of evolving facts. For example, we could have a table that contains the latest financial information such as "Bob’s current account balance is $150". It is the equivalent of a traditional database table but enriched by streaming semantics such as windowing. Facts in a table are mutable, which means new facts can be inserted to the table, and existing facts can be updated or deleted. Tables can be created from a Kafka topic or derived from existing streams and tables. In both cases, a table's underlying data is +durably stored (persisted) within a Kafka topic on the Kafka brokers. + +# Modes of operation + +## Standalone mode + +In stand-alone mode, both the KSQL client and server components are co-located on the same machine, in the same JVM, +and are started together. This makes standalone mode very convenient for local development and testing. + +![Standalone mode](/docs/img/standalone-mode.png) + +To run KSQL in standalone mode: + +- Start the KSQL CLI and the server components all in the same JVM: + - Start with default settings: + + ```bash + $ ./bin/ksql-cli local + ``` + + - Start with [custom settings](/docs/syntax-reference.md#configuring-ksql), pointing KSQL at a specific + Kafka cluster (see Kafka's [bootstrap.servers](https://kafka.apache.org/documentation/#newconsumerconfigs) + setting): + + ```bash + $ ./bin/ksql-cli local --bootstrap-server kafka-broker-1:9092 \ + --properties-file path/to/ksql-cli.properties + ``` + + +## Client-server mode + +In client-server mode, you can run a pool of KSQL servers on remote machines, VMs, or containers. +The CLI then connects to these remote KSQL servers over HTTP. + +![Client-server mode](/docs/img/client-server.png) + +To run KSQL in client-server mode: + +- Start any number of server nodes: + - Start with default settings: + + ```bash + $ ./bin/ksql-server-start + ``` + + - Start with [custom settings](/docs/syntax-reference.md#configuring-ksql), pointing KSQL at a specific + Kafka cluster (see Kafka's [bootstrap.servers](https://kafka.apache.org/documentation/#newconsumerconfigs) + setting): + + ```bash + $ hostname + my-ksql-server + + $ cat ksql-server.properties + # You must set at least the following two properties + bootstrap.servers=kafka-broker-1:9092 + # Note: `application.id` is not really needed but you must set it + # because of a known issue in the KSQL Developer Preview + application.id=app-id-setting-is-ignored + + # Optional settings below, only for illustration purposes + # The hostname/port on which the server node will listen for client connections + listeners=http://0.0.0.0:8090 + ``` + + To start the server node with the settings above: + + ```bash + $ ./bin/ksql-server-start ksql-server.properties + ``` +- Start any number of CLIs, specifying the desired KSQL server address as the `remote` endpoint: + + ```bash + $ ./bin/ksql-cli remote http://my-ksql-server:8090 + ``` + +All KSQL servers (and their engines) share the work of processing KSQL queries that are submitted to them: +- To add processing capacity, start more KSQL servers (scale out). You can do this during live operations. +- To remove processing capacity, stop some of the running KSQL servers. You can do this during live operations. + The remaining KSQL servers will automatically take over the processing work of the stopped servers. Make sure + that at least one KSQL server is running, otherwise your queries will not be executed any longer. + + + diff --git a/docs/concepts.rst b/docs/concepts.rst deleted file mode 100644 index eb5c8171cf6a..000000000000 --- a/docs/concepts.rst +++ /dev/null @@ -1,167 +0,0 @@ -.. _ksql_concepts: - -Concepts -======== - -.. contents:: - -========== -Components -========== - -The main components of KSQL are the KSQL CLI and the KSQL server. - -KSQL CLI --------- - -The KSQL CLI allows you to interactively write KSQL queries. Its -interface should be familiar to users of MySQL, Postgres, Oracle, Hive, -Presto, etc. - -The KSQL CLI acts as a client to the KSQL server. - -KSQL Server ------------ - -The KSQL server runs the engine that executes KSQL queries, which -includes the data processing as well as reading data from and writing -data to the target Kafka cluster. - -Servers can run in containers, virtual machines, and bare-metal machines. You can add or remove multiple servers in the -same resource pool to elastically scale query processing in or out. You can use different resource pools to achieve -workload isolation. - -=========== -Terminology -=========== - -When using KSQL, the following terminology is used. - -Stream ------- - -A stream is an unbounded sequence of structured data (“facts”). For -example, we could have a stream of financial transactions such as “Alice -sent $100 to Bob, then Charlie sent $50 to Bob”. Facts in a stream are -immutable, which means new facts can be inserted to a stream, but -existing facts can never be updated or deleted. Streams can be created -from a Kafka topic or derived from an existing table. A stream’s underlying data is durably stored (persisted) within a -Kafka topic on the Kafka brokers. - -Table ------ - -A table is a view of a stream, or another table, and represents a -collection of evolving facts. For example, we could have a table that -contains the latest financial information such as “Bob’s current account -balance is $150”. It is the equivalent of a traditional database table -but enriched by streaming semantics such as windowing. Facts in a table -are mutable, which means new facts can be inserted to the table, and -existing facts can be updated or deleted. Tables can be created from a -Kafka topic or derived from existing streams and tables. In both cases, -a table’s underlying data is durably stored (persisted) within a Kafka -topic on the Kafka brokers. - -.. _modes-of-operation: - -================== -Modes of operation -================== - -Standalone mode ---------------- - -In standalone mode, both the KSQL client and server components are -co-located on the same machine, in the same JVM, and are started -together. This makes standalone mode very convenient for local -development and testing. - -.. image:: img/standalone-mode.png - -To run KSQL in standalone mode: - -- Start the KSQL CLI and the server components all in the same JVM: - - - Start with default settings: - - .. code:: bash - - $ ./bin/ksql-cli local - - - Start with :ref:`custom - settings `, pointing - KSQL at a specific Kafka cluster (see the Streams - `bootstrap.servers ` - setting): - - .. code:: bash - - $ ./bin/ksql-cli local --bootstrap-server kafka-broker-1:9092 \ - --properties-file path/to/ksql-cli.properties - -Client-server mode ------------------- - -In client-server mode, the KSQL servers are run separately from the KSQL CLI client. You can deploy servers on remote machines, -VMs, or containers and then the CLI connects to these remote servers. - -You can add or remove servers from the same resource pool during live operations, to elastically scale query processing. You -can use different resource pools to achieve workload isolation. For example, you can deploy separate pools for production -and for testing. - -.. image:: img/client-server.png - -To run KSQL in client-server mode: - -- Start any number of server nodes: - - - Start with default settings: - - .. code:: bash - - $ ./bin/ksql-server-start - - - Start with :ref:`custom - settings `, pointing - KSQL at a specific Kafka cluster (see Streams :ref:`bootstrap servers ` setting): - - .. code:: bash - - $ hostname - my-ksql-server - - $ cat ksql-server.properties - # You must set at least the following two properties - bootstrap.servers=kafka-broker-1:9092 - # Note: `application.id` is not really needed but you must set it - # because of a known issue in the KSQL Developer Preview - application.id=app-id-setting-is-ignored - - # Optional settings below, only for illustration purposes - # The hostname/port on which the server node will listen for client connections - listeners=http://0.0.0.0:8090 - - To start the server node with the settings above: - - .. code:: bash - - $ ./bin/ksql-server-start ksql-server.properties - -- Start any number of CLIs, specifying the desired KSQL server address - as the ``remote`` endpoint: - - .. code:: bash - - $ ./bin/ksql-cli remote http://my-ksql-server:8090 - -KSQL servers that share the same ``command`` topic belong to the same resource pool. By default, a KSQL server uses the -``ksql__commands`` command topic. To assign a server to a different pool, change the ``ksql.command.topic.suffix`` setting in its configuration: - -.. code:: bash - - # Default value: `commands`. - # - # Changing this to `production_commands` as shown below will result in - # the command topic named `ksql__production_commands` being used. - ksql.command.topic.suffix = production_commands - diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 7b3287a234ae..000000000000 --- a/docs/conf.py +++ /dev/null @@ -1,266 +0,0 @@ -# -*- coding: utf-8 -*- -# -# KSQL documentation build configuration file, created by -# sphinx-quickstart on Wed Dec 17 14:17:15 2014. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['sphinx.ext.ifconfig', 'sphinxcontrib.httpdomain'] - -def setup(app): - app.add_config_value('platform_docs', True, 'env') - -# Even if it has a default, these options need to be specified -platform_docs = False - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'KSQL' -copyright = u'2017, Confluent, Inc.' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '4.1' -# The full version, including alpha/beta/rc tags. -release = '4.1.0-SNAPSHOT' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - - -# -- Options for HTML output ---------------------------------------------- - -import sphinx_rtd_theme - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'sphinx_rtd_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'KSQLRegistryDoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ('index', 'KSQL.tex', u'KSQL Documentation', - u'Confluent, Inc.', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -# man_pages = [ -# ('index', 'schemaregistry', u'Schema Registry Documentation', -# [u'Confluent, Inc.'], 1) -# ] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -# texinfo_documents = [ -# ('index', 'SchemaRegistry', u'Schema Registry Documentation', -# u'Confluent, Inc.', 'SchemaRegistry', 'One line description of project.', -# 'Miscellaneous'), -# ] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False diff --git a/docs/config-ksql.rst b/docs/config-ksql.rst deleted file mode 100644 index 29f9123086ca..000000000000 --- a/docs/config-ksql.rst +++ /dev/null @@ -1,79 +0,0 @@ -.. _configuring-ksql: - -Configuring KSQL -================ - -You can set configuration properties for KSQL and your queries with the -SET statement. This includes :cp-javadoc:`settings for Kafka’s Streams -API |streams/javadocs/index.html` (e.g., -``cache.max.bytes.buffering``) as well as settings for Kafka’s :cp-javadoc:`producer -client |clients/javadocs/org/apache/kafka/clients/producer/ProducerConfig.html` and -:cp-javadoc:`consumer -client |clients/javadocs/org/apache/kafka/clients/consumer/ConsumerConfig.html` -(e.g., ``auto.offset.reset``). - -The basic syntax is: - -.. code:: sql - - SET ''=''; - -The property name and value must be enclosed in single quotes. - -**Tip:** You can view the current settings with the ``SHOW PROPERTIES`` command. - -After a property has been set, it remains in effect for the remainder -of the KSQL CLI session, or until you issue another SET statement to change -it. - -.. caution:: - When using KSQL in Docker, the properties file must be available inside the Docker container. If you - don’t want to customize your Docker setup so that it contains an appropriate properties file, you can use the SET statement. - -Examples --------- - -Common configuration properties that you might want to change from their -default values include: - -- :cp-javadoc:`auto.offset.reset |clients/javadocs/org/apache/kafka/clients/consumer/ConsumerConfig.html#AUTO_OFFSET_RESET_CONFIG`: - The default value in KSQL is ``latest`` meaning all the Kafka topics - will be read from the current offset (aka latest available data). You - can change it using the following statement: - - .. code:: bash - - ksql> SET 'auto.offset.reset'='earliest'; - -- :cp-javadoc:`commit.interval.ms |streams/javadocs/org/apache/kafka/streams/StreamsConfig.html#COMMIT_INTERVAL_MS_CONFIG`: - The default value in KSQL is ``2000``. Here is an example to change - the value to ``5000``: - - .. code:: bash - - ksql> SET 'commit.interval.ms'='5000'; - -- :cp-javadoc:`cache.max.bytes.buffering |streams/javadocs/org/apache/kafka/streams/StreamsConfig.html#CACHE_MAX_BYTES_BUFFERING_CONFIG`: - The default value in KSQL is ``10000000`` (~ 10 MB). Here is an example to change the value to ``20000000``: - - .. code:: bash - - ksql> SET 'cache.max.bytes.buffering'='20000000'; - - -You can also use a properties file instead of the SET statement. The -syntax of properties files follow Java conventions, which are slightly -different to the syntax of the SET statement above. - -.. code:: bash - - # Show the example contents of a properties file - $ cat ksql.properties - auto.offset.reset=earliest - - # Start KSQL in standalone mode with the custom properties above - $ ksql-cli local --properties-file ./ksql.properties - - # Start a KSQL server node (for client-server mode) with the custom properties above - $ ksql-server-start ./ksql.properties - diff --git a/contributing.md b/docs/contributing.md similarity index 74% rename from contributing.md rename to docs/contributing.md index 384db4dd2e83..5a0366e4e3cf 100644 --- a/contributing.md +++ b/docs/contributing.md @@ -1,8 +1,4 @@ # Contributing -- [How to Contribute](#how-to-contribute) - - [General Guidelines](#general-guidelines) - - [GitHub Workflow](#github-workflow) -- [Building the docs locally](#building-the-docs-locally) ## How to Contribute @@ -108,32 +104,6 @@ When submitting a pull request (PR), use the following guidelines: git push origin --force feature-xxx ``` -### Building the docs locally + ### Issues -This documentation is built using [Sphinx](http://sphinx-doc.org). It also uses some extensions for theming and REST API -documentation support. - -Follow these instructions to build a local version of the documentation. - -Start by installing the requirements: - - pip install -r requirements.txt - -Then you can generate the HTML version of the docs: - - make html - -The root of the documentation will be at `_build/html/index.html` - -While editing the documentation, you can get a live preview using python-livepreview. Install the Python library: - - pip install livereload - -Then run the monitoring script in the background: - - python autoreload.py & - -If you install the [browser extensions](http://livereload.com/) then everything should update every time any files are -saved without any manual steps on your part. - -Note: If you're already running the autoreloader, you may need to run `make clean html` if you add new sections. \ No newline at end of file + Report issues in [this GitHub project](https://github.com/confluentinc/ksql/issues). \ No newline at end of file diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 000000000000..50b30bbe7a0d --- /dev/null +++ b/docs/examples.md @@ -0,0 +1,325 @@ +# Examples + +| [Overview](/docs#ksql-documentation) |[Quick Start](/docs/quickstart#quick-start) | [Concepts](/docs/concepts.md#concepts) | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | Examples | [FAQ](/docs/faq.md#frequently-asked-questions) | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| + +**Table of Contents** + +- [Overview](#overview) +- [Creating streams](#creating-streams) +- [Creating tables](#creating-tables) +- [Working with streams and tables](#working-with-streams-and-tables) + - [Transforming](#transforming) + - [Joining](#joining) + - [Aggregating, windowing, and sessionization](#aggregating) + - [Working with arrays and maps](#working-with-arrays-and-maps) +- [Configuring KSQL](#configuring-ksql) +- [Running KSQL](#running-ksql) + + +## Overview + +This documents lists example queries to illustrate the look and feel of the KSQL syntax. +The following examples use a `pageviews` stream and a `users` table similar to the +[quick start](/docs/quickstart#quick-start), but slightly adapted to showcase more functionality. + + +## Creating streams + +> *Note: The following statements require that the corresponding Kafka topic already exists in your Kafka cluster.* + +You can start with creating a stream: + +```sql +CREATE STREAM pageviews \ + (viewtime BIGINT, \ + userid VARCHAR, \ + pageid VARCHAR) \ + WITH (kafka_topic='pageviews-topic', \ + value_format='DELIMITED'); +``` + +The above statement creates a stream with three columns on the Kafka topic that is named `pageviews`. You should also +tell KSQL the format of the values that are stored in the topic. In this example, the values format is `DELIMITED`. + +**Associating Kafka message keys:** +The above statement does not make any assumptions about the Kafka message key in the underlying Kafka topic. However, +if the value of the message key in Kafka is the same as one of the columns defined in the stream in KSQL, you can +provide such information in the WITH clause. For instance, if the Kafka message key has the same value as the `pageid` +column, you can write the CREATE STREAM statement as follows: + +```sql +CREATE STREAM pageviews \ + (viewtime BIGINT, \ + userid VARCHAR, \ + pageid VARCHAR) \ + WITH (kafka_topic='pageviews-topic', \ + value_format='DELIMITED', \ + key='pageid'); +``` + +**Associating Kafka message timestamps:** +If you want to use the value of one of the columns as the Kafka message timestamp, you can provide +such information to KSQL in the WITH clause. The message timestamp is used in window-based +operations in KSQL (such as windowed aggregations) and to support event-time based processing in KSQL. +For instance, if you want to use the value of the `viewtime` column as the message timestamp, you can rewrite the above +statement as follows: + +```sql +CREATE STREAM pageviews \ + (viewtime BIGINT, \ + userid VARCHAR, \ + pageid VARCHAR) \ + WITH (kafka_topic='pageviews-topic', \ + value_format='DELIMITED', \ + key='pageid', \ + timestamp='viewtime'); +``` + + +## Creating tables + +> *Note: The following statements require that the corresponding Kafka topic already exists in your Kafka cluster.* + +Here's how you can create a table with several columns: + +```sql +CREATE TABLE users \ + (registertime BIGINT, \ + gender VARCHAR, \ + regionid VARCHAR, \ + userid VARCHAR, \ + interests array, \ + contact_info map) \ + WITH (kafka_topic='users-topic', \ + value_format='JSON'); +``` + +As you can see the above table has, next to columns with primitive data types, a column of `array` type and another +column of `map` type. We will look at working with arrays and maps later on. + + +## Working with streams and tables + +Now that you have the `pageviews` stream and `users` table, take a look at some example queries that you can write +in KSQL. The focus is on two types of KSQL statements: CREATE STREAM AS SELECT and CREATE TABLE AS SELECT. For these +statements KSQL persists the results of the query in a new stream or table, which is backed by a Kafka topic. + + +### Transforming + +For this example, imagine you want to create a new stream by transforming `pageviews` in the following way: + +- The `viewtime` column value is used as the Kafka message timestamp in the new stream's underlying Kafka topic. +- The new stream's Kafka topic has 5 partitions. +- The data in the new stream is in JSON format. +- Add a new column that shows the message timestamp in human-readable string format. +- The `userid` column is the key for the new stream. + +The following statement will generate a new stream, `pageviews_transformed` with the above properties: + +```sql +CREATE STREAM pageviews_transformed \ + WITH (timestamp='viewtime', \ + partitions=5, \ + value_format='JSON') AS \ + SELECT viewtime, \ + userid, \ + pageid, \ + TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring \ + FROM pageviews \ + PARTITION BY userid; +``` + +Use a `[ WHERE condition ]` clause to select a subset of data. If you want to route streams with different criteria to different streams backed by different underlying Kafka topics, e.g. content-based routing, write multiple KSQL statements as follows: + +```sql +CREATE STREAM pageviews_transformed_priority_1 \ + WITH (timestamp='viewtime', \ + partitions=5, \ + value_format='JSON') AS \ + SELECT viewtime, \ + userid, \ + pageid, \ + TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring \ + FROM pageviews \ + WHERE userid='User_1' OR userid='User_2' \ + PARTITION BY userid; +``` + +```sql +CREATE STREAM pageviews_transformed_priority_2 \ + WITH (timestamp='viewtime', \ + partitions=5, \ + value_format='JSON') AS \ + SELECT viewtime, \ + userid, \ + pageid, \ + TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring \ + FROM pageviews \ + WHERE userid<>'User_1' AND userid<>'User_2' \ + PARTITION BY userid; +``` + + +### Joining + +The following query creates a new stream by joining the `pageviews_transformed` stream with +the `users` table: + +```sql +CREATE STREAM pageviews_enriched AS \ + SELECT pv.viewtime, \ + pv.userid AS userid, \ + pv.pageid, \ + pv.timestring, \ + u.gender, \ + u.regionid, \ + u.interests, \ + u.contact_info \ + FROM pageviews_transformed pv \ + LEFT JOIN users u ON pv.userid = users.userid; +``` + +Note that by default all the Kafka topics will be read from the current offset (aka the latest available data); +however, in a stream-table join, the table topic will be read from the beginning. + + + +### Aggregating, windowing, and sessionization + +Now assume that you want to count the number of pageviews per region. Here is the query that would perform this count: + +```sql +CREATE TABLE pageviews_per_region AS \ + SELECT regionid, \ + count(*) \ + FROM pageviews_enriched \ + GROUP BY regionid; +``` + +The above query counts the pageviews from the time you start the query until you terminate the query. Note +that we used CREATE TABLE AS SELECT statement here since the result of the query is a KSQL table. +The results of aggregate queries in KSQL are always a table because it computes the aggregate for +each key (and possibly for each window per key) and *updates* these results as it processes new input data. + +KSQL supports aggregation over WINDOW too. Let's rewrite the above query so that we compute the +pageview count per region every 1 minute: + +```sql +CREATE TABLE pageviews_per_region_per_minute AS \ + SELECT regionid, \ + count(*) \ + FROM pageviews_enriched \ + WINDOW TUMBLING (SIZE 1 MINUTE) \ + GROUP BY regionid; +``` + +If you want to count the pageviews for only "Region_6" by female users for every 30 seconds, +you can change the above query as the following: + +```sql +CREATE TABLE pageviews_per_region_per_30secs AS \ + SELECT regionid, \ + count(*) \ + FROM pageviews_enriched \ + WINDOW TUMBLING (SIZE 30 SECONDS) \ + WHERE UCASE(gender)='FEMALE' AND LCASE(regionid)='region_6' \ + GROUP BY regionid; +``` + +UCASE and LCASE functions in KSQL are used to convert the values of gender and regionid columns to +upper and lower case, so that you can match them correctly. KSQL also + supports LIKE operator for prefix, suffix and substring matching. + +KSQL supports HOPPING windows and SESSION windows too. The following query is the same query as above +that computes the count for hopping window of 30 seconds that advances by 10 seconds: + +```sql +CREATE TABLE pageviews_per_region_per_30secs10secs AS \ + SELECT regionid, \ + count(*) \ + FROM pageviews_enriched \ + WINDOW HOPPING (SIZE 30 SECONDS, ADVANCE BY 10 SECONDS) \ + WHERE UCASE(gender)='FEMALE' AND LCASE (regionid) LIKE '%_6' \ + GROUP BY regionid; +``` + +The next statement counts the number of pageviews per region for session windows with a session inactivity gap of 60 +seconds. In other words, you are *sessionizing* the input data and then perform the counting/aggregation step per +region. + +```sql +CREATE TABLE pageviews_per_region_per_session AS \ + SELECT regionid, \ + count(*) \ + FROM pageviews_enriched \ + WINDOW SESSION (60 SECONDS) \ + GROUP BY regionid; +``` + + +### Working with arrays and maps + +The `interests` column in the `users` table is an `array` of strings that represents the interest of each user. The `contact_info` column is a string-to-string `map` that represents the following +contact information for each user: phone, city, state, and zipcode. + +The following query will create a new stream from `pageviews_enriched` that includes the first interest of each +user along with the city and zipcode for each user: + +```sql +CREATE STREAM pageviews_interest_contact AS \ + SELECT interests[0] AS first_interest, \ + contact_info['zipcode'] AS zipcode, \ + contact_info['city'] AS city, \ + viewtime, \ + userid, \ + pageid, \ + timestring, \ + gender, \ + regionid \ + FROM pageviews_enriched; +``` + + +## Configuring KSQL + +Common configuration properties that you might want to change from their default values include: + +- [auto.offset.reset](https://kafka.apache.org/documentation/#newconsumerconfigs): + The default value in KSQL is `latest` meaning all the Kafka topics will be read from the current offset (aka latest + available data). You can change it using the following statement: + + ```sql + SET 'auto.offset.reset'='earliest'; + ``` + +- [commit.interval.ms](https://kafka.apache.org/documentation/#streamsconfigs): + The default value in KSQL is `2000`. Here is an example to change the value to `5000`: + + ```sql + SET 'commit.interval.ms'='5000'; + ``` + +- [cache.max.bytes.buffering](https://kafka.apache.org/documentation/#streamsconfigs): + The default value in KSQL is `10000000` (~ 10 MB); + +- fail.on.deserialization.error: + When set to false (the default), any errors that occur when deserializing a record will result in the the error being logged and the record being dropped. + If you wish to halt processing on deserialization errors you should set this to true. + + + +## Running KSQL + +KSQL supports various [modes of operation](concepts.md#modes-of-operation), including a standalone mode and a +client-server mode. + +Additionally, you can also instruct KSQL to execute a single statement from the command line. +The following example command runs the given `SELECT` statement and show the results in the terminal. In this +particular case, the query will run until 5 records have been found, and then terminate. + +```shell +$ ksql-cli local --exec "SELECT * FROM pageviews LIMIT 5;" +``` + diff --git a/docs/examples.rst b/docs/examples.rst deleted file mode 100644 index 28eadd0b13e3..000000000000 --- a/docs/examples.rst +++ /dev/null @@ -1,308 +0,0 @@ -.. _ksql_examples: - -KSQL Examples -============= - -These examples use a ``pageviews`` stream and a ``users`` table. - -.. contents:: Contents - :local: - :depth: 1 - - -Creating streams ----------------- - -Prerequisite: - The corresponding Kafka topics must already exist in your Kafka cluster. - -Create a stream with three columns on the Kafka topic that is named ``pageviews``. It is important to instruct KSQL the format -of the values that are stored in the topic. In this example, the values format is ``DELIMITED``. - -.. code:: sql - - CREATE STREAM pageviews \ - (viewtime BIGINT, \ - userid VARCHAR, \ - pageid VARCHAR) \ - WITH (kafka_topic='pageviews-topic', \ - value_format='DELIMITED'); - -**Associating Kafka message keys:** The above statement does not make -any assumptions about the Kafka message key in the underlying Kafka -topic. However, if the value of the message key in Kafka is the same as -one of the columns defined in the stream in KSQL, you can provide such -information in the WITH clause. For instance, if the Kafka message key -has the same value as the ``pageid`` column, you can write the CREATE -STREAM statement as follows: - -.. code:: sql - - CREATE STREAM pageviews \ - (viewtime BIGINT, \ - userid VARCHAR, \ - pageid VARCHAR) \ - WITH (kafka_topic='pageviews-topic', \ - value_format='DELIMITED', \ - key='pageid'); - -**Associating Kafka message timestamps:** If you want to use the value -of one of the columns as the Kafka message timestamp, you can provide -such information to KSQL in the WITH clause. The message timestamp is -used in window-based operations in KSQL (such as windowed aggregations) -and to support event-time based processing in KSQL. For instance, if you -want to use the value of the ``viewtime`` column as the message -timestamp, you can rewrite the above statement as follows: - -.. code:: sql - - CREATE STREAM pageviews \ - (viewtime BIGINT, \ - userid VARCHAR, \ - pageid VARCHAR) \ - WITH (kafka_topic='pageviews-topic', \ - value_format='DELIMITED', \ - key='pageid', \ - timestamp='viewtime'); - -Creating tables ---------------- - -Prerequisite: - The corresponding Kafka topics must already exist in your Kafka cluster. - -Create a table with several columns. In this example, the table has columns with primitive data -types, a column of ``array`` type, and a column of ``map`` type: - -.. code:: sql - - CREATE TABLE users \ - (registertime BIGINT, \ - gender VARCHAR, \ - regionid VARCHAR, \ - userid VARCHAR, \ - interests array, \ - contact_info map) \ - WITH (kafka_topic='users-topic', \ - key = 'userid',\ - value_format='JSON'); - - - -Working with streams and tables -------------------------------- - -Now that you have the ``pageviews`` stream and ``users`` table, take a -look at some example queries that you can write in KSQL. The focus is on -two types of KSQL statements: CREATE STREAM AS SELECT and CREATE TABLE -AS SELECT. For these statements KSQL persists the results of the query -in a new stream or table, which is backed by a Kafka topic. - -Transforming -~~~~~~~~~~~~ - -For this example, imagine you want to create a new stream by -transforming ``pageviews`` in the following way: - -- The ``viewtime`` column value is used as the Kafka message timestamp - in the new stream’s underlying Kafka topic. -- The new stream’s Kafka topic has 5 partitions. -- The data in the new stream is in JSON format. -- Add a new column that shows the message timestamp in human-readable - string format. -- The ``userid`` column is the key for the new stream. - -The following statement will generate a new stream, -``pageviews_transformed`` with the above properties: - -.. code:: sql - - CREATE STREAM pageviews_transformed \ - WITH (timestamp='viewtime', \ - partitions=5, \ - value_format='JSON') AS \ - SELECT viewtime, \ - userid, \ - pageid, \ - TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring \ - FROM pageviews \ - PARTITION BY userid; - -Use a ``[ WHERE condition ]`` clause to select a subset of data. If you -want to route streams with different criteria to different streams -backed by different underlying Kafka topics, e.g. content-based routing, -write multiple KSQL statements as follows: - -.. code:: sql - - CREATE STREAM pageviews_transformed_priority_1 \ - WITH (timestamp='viewtime', \ - partitions=5, \ - value_format='JSON') AS \ - SELECT viewtime, \ - userid, \ - pageid, \ - TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring \ - FROM pageviews \ - WHERE userid='User_1' OR userid='User_2' \ - PARTITION BY userid; - -.. code:: sql - - CREATE STREAM pageviews_transformed_priority_2 \ - WITH (timestamp='viewtime', \ - partitions=5, \ - value_format='JSON') AS \ - SELECT viewtime, \ - userid, \ - pageid, \ - TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring \ - FROM pageviews \ - WHERE userid<>'User_1' AND userid<>'User_2' \ - PARTITION BY userid; - -Joining -~~~~~~~ - -The following query creates a new stream by joining the -``pageviews_transformed`` stream with the ``users`` table: - -.. code:: sql - - CREATE STREAM pageviews_enriched AS \ - SELECT pv.viewtime, \ - pv.userid AS userid, \ - pv.pageid, \ - pv.timestring, \ - u.gender, \ - u.regionid, \ - u.interests, \ - u.contact_info \ - FROM pageviews_transformed pv \ - LEFT JOIN users u ON pv.userid = users.userid; - -Note that by default all the Kafka topics will be read from the current -offset (aka the latest available data); however, in a stream-table join, -the table topic will be read from the beginning. - -Aggregating, windowing, and sessionization -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Now assume that you want to count the number of pageviews per region. -Here is the query that would perform this count: - -.. code:: sql - - CREATE TABLE pageviews_per_region AS \ - SELECT regionid, \ - count(*) \ - FROM pageviews_enriched \ - GROUP BY regionid; - -The above query counts the pageviews from the time you start the query -until you terminate the query. Note that we used CREATE TABLE AS SELECT -statement here since the result of the query is a KSQL table. The -results of aggregate queries in KSQL are always a table because it -computes the aggregate for each key (and possibly for each window per -key) and *updates* these results as it processes new input data. - -KSQL supports aggregation over WINDOW too. Let’s rewrite the above query -so that we compute the pageview count per region every 1 minute: - -.. code:: sql - - CREATE TABLE pageviews_per_region_per_minute AS \ - SELECT regionid, \ - count(*) \ - FROM pageviews_enriched \ - WINDOW TUMBLING (SIZE 1 MINUTE) \ - GROUP BY regionid; - -If you want to count the pageviews for only “Region_6” by female users -for every 30 seconds, you can change the above query as the following: - -.. code:: sql - - CREATE TABLE pageviews_per_region_per_30secs AS \ - SELECT regionid, \ - count(*) \ - FROM pageviews_enriched \ - WINDOW TUMBLING (SIZE 30 SECONDS) \ - WHERE UCASE(gender)='FEMALE' AND LCASE(regionid)='region_6' \ - GROUP BY regionid; - -UCASE and LCASE functions in KSQL are used to convert the values of -gender and regionid columns to upper and lower case, so that you can -match them correctly. KSQL also supports LIKE operator for prefix, -suffix and substring matching. - -KSQL supports HOPPING windows and SESSION windows too. The following -query is the same query as above that computes the count for hopping -window of 30 seconds that advances by 10 seconds: - -.. code:: sql - - CREATE TABLE pageviews_per_region_per_30secs10secs AS \ - SELECT regionid, \ - count(*) \ - FROM pageviews_enriched \ - WINDOW HOPPING (SIZE 30 SECONDS, ADVANCE BY 10 SECONDS) \ - WHERE UCASE(gender)='FEMALE' AND LCASE (regionid) LIKE '%_6' \ - GROUP BY regionid; - -The next statement counts the number of pageviews per region for session -windows with a session inactivity gap of 60 seconds. In other words, you -are *sessionizing* the input data and then perform the -counting/aggregation step per region. - -.. code:: sql - - CREATE TABLE pageviews_per_region_per_session AS \ - SELECT regionid, \ - count(*) \ - FROM pageviews_enriched \ - WINDOW SESSION (60 SECONDS) \ - GROUP BY regionid; - -Working with arrays and maps -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``interests`` column in the ``users`` table is an ``array`` of -strings that represents the interest of each user. The ``contact_info`` -column is a string-to-string ``map`` that represents the following -contact information for each user: phone, city, state, and zipcode. - -The following query will create a new stream from ``pageviews_enriched`` -that includes the first interest of each user along with the city and -zipcode for each user: - -.. code:: sql - - CREATE STREAM pageviews_interest_contact AS \ - SELECT interests[0] AS first_interest, \ - contact_info['zipcode'] AS zipcode, \ - contact_info['city'] AS city, \ - viewtime, \ - userid, \ - pageid, \ - timestring, \ - gender, \ - regionid \ - FROM pageviews_enriched; - -Running KSQL ------------- - -KSQL supports various :ref:`modes of -operation `, including a standalone -mode and a client-server mode. - -Additionally, you can also instruct KSQL to execute a single statement -from the command line. The following example command runs the given -``SELECT`` statement and show the results in the terminal. In this -particular case, the query will run until 5 records have been found, and -then terminate. - -.. code:: shell - - $ ksql-cli local --exec "SELECT * FROM pageviews LIMIT 5;" diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 000000000000..317fdce48dda --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,87 @@ +# Frequently Asked Questions + +| [Overview](/docs#ksql-documentation) |[Quick Start](/docs/quickstart#quick-start) | [Concepts](/docs/concepts.md#concepts) | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | FAQ | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| + + +**What are the benefits of KSQL?** + +KSQL allows you to query, read, write, and process data in Apache Kafka in real-time and at scale using intuitive SQL-like syntax. KSQL does not require proficiency with a programming language such as Java or Scala, and you don’t have to install a separate processing cluster technology. + +**What are the technical requirements of KSQL?** + +KSQL only requires: + +1. A Java runtime environment +2. Access to an Apache Kafka cluster for reading and writing data in real-time. The cluster can be on-premises or in + the cloud. KSQL works with clusters running vanilla Apache Kafka as well as with clusters running the Kafka + versions included in Confluent Platform. + +We recommend the use of [Confluent Platform](https://www.confluent.io/product/confluent-platform/) or [Confluent Cloud](https://www.confluent.io/confluent-cloud/) for running Apache Kafka. + +**Is KSQL owned by the Apache Software Foundation?** + +No, KSQL is owned and maintained by [Confluent Inc.](https://www.confluent.io/) as part of its free [Confluent Open Source](https://www.confluent.io/product/confluent-open-source/) product. + +**How does KSQL compare to Apache Kafka’s Streams API?** + +KSQL is complementary to the Kafka Streams API, and indeed executes queries through Kafka Streams applications. One of the key benefits of KSQL is that it does not require the user to develop any code in Java or Scala. +This enables users to use a SQL-like interface alone to construct streaming ETL pipelines, as well as responding to a real-time, continuous business requests. For full-fledged stream processing applications Kafka Streams remains a more appropriate choice. +As with many technologies each has its sweet-spot based on technical requirements, mission-criticality, and user skill set. + +**Does KSQL work with vanilla Apache Kafka clusters, or does it require the Kafka version included in Confluent** +**Platform?** + +KSQL works with both vanilla Apache Kafka clusters as well as with the Kafka versions included in Confluent Platform. + + +**Does KSQL support Kafka's exactly-once processing semantics?** + +Yes, KSQL supports exactly-once processing, which means it will compute correct results even in the face of failures +such as machine crashes. + +**Is KSQL ready for production?** + +KSQL is a technical preview at this point in time. We do not yet recommend its use for production purposes. + +**Can I use KSQL with my favorite data format (e.g. JSON, Avro)?** + +KSQL currently supports formats: + +* DELIMITED (e.g. CSV) +* JSON + +_Support for Apache Avro is expected soon._ + +**Is KSQL fully compliant to ANSI SQL?** + +KSQL is a dialect inspired by ANSI SQL. It has some differences because it is geared at processing streaming data. For example, ANSI SQL has no notion of “windowing” for use cases such as performing aggregations on data grouped into 5-minute windows, which is a commonly required functionality in the streaming world. + +**How do I shutdown a KSQL environment?** + +- To stop DataGen tasks that were started with the `-daemon` flag + (cf. [Demo](/ksql-clickstream-demo#clickstream-analysis)). + + ``` + $ jps | grep DataGen + 25379 DataGen + $ kill 25379 + ``` + +- Exit KSQL. + + ``` + ksql> exit + ``` + +- Stop Confluent Platform by shutting down all services including Kafka. + + ``` + $ confluent stop + ``` + +- To remove all data, topics, and streams: + + ``` + $ confluent destroy + ``` diff --git a/docs/faq.rst b/docs/faq.rst deleted file mode 100644 index fa386bf95201..000000000000 --- a/docs/faq.rst +++ /dev/null @@ -1,131 +0,0 @@ -.. _ksql_faq: - -Frequently Asked Questions -========================== - -.. contents:: Contents - :local: - :depth: 1 - -============================== -What are the benefits of KSQL? -============================== - -KSQL allows you to query, read, write, and process data in Apache Kafka -in real-time and at scale using intuitive SQL-like syntax. KSQL does not -require proficiency with a programming language such as Java or Scala, -and you don’t have to install a separate processing cluster technology. - -============================================ -What are the technical requirements of KSQL? -============================================ - -KSQL only requires: - -1. A Java runtime environment -2. Access to an Apache Kafka cluster for reading and writing data in - real-time. The cluster can be on-premises or in the cloud. KSQL works - with clusters running vanilla Apache Kafka as well as with clusters - running the Kafka versions included in Confluent Platform. - -We recommend the use of `Confluent -Platform `__ or -`Confluent Cloud `__ for -running Apache Kafka. - -================================================ -Is KSQL owned by the Apache Software Foundation? -================================================ - -No, KSQL is owned and maintained by `Confluent -Inc. `__ as part of its free `Confluent Open -Source `__ -product. - -==================================================== -How does KSQL compare to Apache Kafka’s Streams API? -==================================================== - -KSQL is complementary to the Kafka Streams API, and indeed executes -queries through Kafka Streams applications. One of the key benefits of -KSQL is that it does not require the user to develop any code in Java or -Scala. This enables users to use a SQL-like interface alone to construct -streaming ETL pipelines, as well as responding to a real-time, -continuous business requests. For full-fledged stream processing -applications Kafka Streams remains a more appropriate choice. As with -many technologies, each has its sweet-spot based on technical -requirements, mission-criticality, and user skillset. - -======================================================================================================================= -Does KSQL work with vanilla Apache Kafka clusters, or does it require the Kafka version included in Confluent Platform? -======================================================================================================================= - -KSQL works with both vanilla Apache Kafka clusters as well as with the -Kafka versions included in Confluent Platform. - -============================================================ -Does KSQL support Kafka’s exactly-once processing semantics? -============================================================ - -Yes, KSQL supports exactly-once processing, which means it will compute -correct results even in the face of failures such as machine crashes. - -============================= -Is KSQL ready for production? -============================= - -KSQL is a technical preview at this point in time. We do not yet -recommend its use for production purposes. - -============================================================== -Can I use KSQL with my favorite data format (e.g. JSON, Avro)? -============================================================== - -KSQL currently supports formats: - -- DELIMITED (e.g. CSV) -- JSON - -*Support for Apache Avro is expected soon.* - -==================================== -Is KSQL fully compliant to ANSI SQL? -==================================== - -KSQL is a dialect inspired by ANSI SQL. It has some differences because -it is geared at processing streaming data. For example, ANSI SQL has no -notion of “windowing” for use cases such as performing aggregations on -data grouped into 5-minute windows, which is a commonly required -functionality in the streaming world. - -===================================== -How do I shutdown a KSQL environment? -===================================== - -- To stop DataGen tasks that were started with the ``-daemon`` flag - (cf. :ref:`ksql_clickstream`). - - .. code:: bash - - $ jps | grep DataGen - 25379 DataGen - $ kill 25379 - -- Exit KSQL. - - .. code:: bash - - ksql> exit - -- Stop Confluent Platform by shutting down all services including - Kafka. - - .. code:: bash - - $ confluent stop - -- To remove all data, topics, and streams: - - .. code:: bash - - $ confluent destroy diff --git a/docs/img/grafana-success.png b/docs/img/grafana-success.png deleted file mode 100644 index 1d43171be8cff95281af6dcfc5203d2d3b43a1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325529 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

+PiToBS8Yy0dKVP0!B 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�RMe(9OJI<8PO;%Tt8K_C(rJ5^{-hCL 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

    ?d}{}C60C_g=SJdc|DDt2)7JOMj3N7 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 on YouTube. - -.. raw:: html - -
    - -
    - - ---------- -Use cases ---------- - -Common KSQL use cases are: - -- Streaming ETL: Apache Kafka is a popular choice for powering data pipelines. KSQL makes it simple to transform data within the pipeline, readying messages to cleanly land in another system. -- Real-time Monitoring and Analytics: track, understand, and manage infrastructure, applications, and data feeds by quickly building real-time dashboards, generating metrics, and creating custom alerts and messages. -- Data exploration and discovery: navigate and browse through your data in Kafka. -- Anomaly detection: identify patterns and spot anomalies in real-time data with millisecond latency, allowing you to properly surface out of the ordinary events and to handle fraudulent activities separately. -- Personalization: create data driven real-time experiences and insight for users. -- Sensor data and IoT: understand and deliver sensor data how and where it needs to be. -- Customer 360-view: achieve a comprehensive understanding of your customers across every interaction through a variety of channels, where new information is continuously incorporated in real-time. - diff --git a/docs/ksql-clickstream-demo/Dockerfile b/docs/ksql-clickstream-demo/Dockerfile deleted file mode 100644 index 06d8de88427e..000000000000 --- a/docs/ksql-clickstream-demo/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# https://confluentinc.atlassian.net/browse/KSQL-292 - -ARG DOCKER_REGISTRY - -FROM ${DOCKER_REGISTRY}confluentinc/docker-demo-base:3.3.1 - -ARG KSQL_VERSION -ARG ARTIFACT_ID - -EXPOSE 3000 - -ENV ES_JAVA_OPTS="-Xms512M -Xmx512M" -ENV KSQL_CLASSPATH=/usr/share/java/${ARTIFACT_ID}/${ARTIFACT_ID}-${KSQL_VERSION}-standalone.jar -ENV KSQL_CONFIG_DIR="/etc/ksql" -ENV KSQL_LOG4J_OPTS="-Dlog4j.configuration=file:/etc/ksql/log4j-rolling.properties" - -RUN wget -q https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.4.3_amd64.deb \ - && wget -q https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.deb \ - && dpkg -i grafana_4.4.3_amd64.deb \ - && dpkg -i elasticsearch-5.5.2.deb \ - && rm grafana_4.4.3_amd64.deb \ - && rm elasticsearch-5.5.2.deb - -ADD target/${ARTIFACT_ID}-${KSQL_VERSION}-standalone.jar /usr/share/java/${ARTIFACT_ID}/${ARTIFACT_ID}-${KSQL_VERSION}-standalone.jar -ADD target/${ARTIFACT_ID}-${KSQL_VERSION}-package/bin/* /usr/bin/ -ADD target/${ARTIFACT_ID}-${KSQL_VERSION}-package/etc/* /etc/ksql/ - -ADD demo/*sh /usr/share/doc/ksql-clickstream-demo/ -ADD demo/*sql /usr/share/doc/ksql-clickstream-demo/ -ADD demo/*json /usr/share/doc/ksql-clickstream-demo/ -ADD demo/connect-config/null-filter-4.0.0-SNAPSHOT.jar /usr/share/java/kafka-connect-elasticsearch/ diff --git a/docs/ksql-clickstream-demo/docker-clickstream.rst b/docs/ksql-clickstream-demo/docker-clickstream.rst deleted file mode 100644 index 2e20a18b0de3..000000000000 --- a/docs/ksql-clickstream-demo/docker-clickstream.rst +++ /dev/null @@ -1,381 +0,0 @@ -.. _ksql_clickstream_docker: - -Clickstream Analysis with KSQL running in Docker -================================================ - -These steps will guide you through how to setup your environment and run -the clickstream analysis demo from a Docker container. For instructions -without using Docker, see :ref:`this -documentation `. - -Prerequisites -------------- - -- Docker - - - `macOS `__ - - `All platforms `__ - - **Important:** Docker should be configured to run with 5 GB of memory (the default is 2 GB). - -- `Git `__ - -1. Download and start the KSQL clickstream container. This container - image is large and contains Confluent, Grafana, and Elasticsearch. - Depending on your network speed, this may take up to 10-15 minutes. - The ``-p`` flag will forward the Grafana dashboard to port 33000 on - your local host. - - .. code:: bash - - $ docker run -p 33000:3000 -it confluentinc/ksql-clickstream-demo:0.2 bash - - Your output should resemble: - - .. code:: bash - - Unable to find image 'confluentinc/ksql-clickstream-demo:0.2' locally - latest: Pulling from confluentinc/ksql-clickstream-demo - ad74af05f5a2: Already exists - d02e292e7b5e: Already exists - 8de7f5c81ab0: Already exists - ed0b76dc2730: Already exists - cfc44fa8a002: Already exists - d9ece951ea0c: Pull complete - f26010779356: Pull complete - c9dad5440731: Pull complete - 935591799d9d: Pull complete - 696df0f65482: Pull complete - 14fd98e52325: Pull complete - fcbeb94bace2: Pull complete - 32cca4f1567d: Pull complete - 5df0d25e7260: Pull complete - e16097edc4fc: Pull complete - 72b33b348958: Pull complete - 015da01a41b0: Pull complete - 80e29f47abe0: Pull complete - Digest: sha256:f3b2b19668b851d1300f77aa8c2236a126b628b911578cc688c7e0de442c1cd3 - Status: Downloaded newer image for confluentinc/ksql-clickstream-demo:0.2 - root@d98186dd8d6c:/# - - You should now be in the Docker container. - -2. Start the container services. - - - Elasticsearch - - .. code:: bash - - $ /etc/init.d/elasticsearch start - - - Grafana - - .. code:: bash - - $ /etc/init.d/grafana-server start - - - Confluent Platform - - .. code:: bash - - $ confluent start - -3. From your terminal, create the clickStream data using the - ksql-datagen utility. This stream will run continuously until you - terminate. - - **Tip:** Because of shell redirection, this command does not print a - newline and so it might look like it’s still in the foreground. The - process is running as a daemon, so just press return again to see - the shell prompt. - - .. code:: bash - - $ ksql-datagen -daemon quickstart=clickstream format=json topic=clickstream maxInterval=100 iterations=500000 - - Your output should resemble: - - :: - - Writing console output to /tmp/ksql-logs/ksql.out - -4. From your terminal, create the status codes using the ksql-datagen - utility. This stream runs once to populate the table. - - .. code:: bash - - $ ksql-datagen quickstart=clickstream_codes format=json topic=clickstream_codes maxInterval=20 iterations=100 - - Your output should resemble: - - :: - - 200 --> ([ 200 | 'Successful' ]) - 302 --> ([ 302 | 'Redirect' ]) - 200 --> ([ 200 | 'Successful' ]) - 406 --> ([ 406 | 'Not acceptable' ]) - ... - -5. From your terminal, create a set of users using ksql-datagen - utility. This stream runs once to populate the table. - - .. code:: bash - - $ ksql-datagen quickstart=clickstream_users format=json topic=clickstream_users maxInterval=10 iterations=1000 - - Your output should resemble: - - :: - - 1 --> ([ 1 | 'GlenAlan_23344' | 1424796387808 | 'Curran' | 'Lalonde' | 'Palo Alto' | 'Gold' ]) - 2 --> ([ 2 | 'ArlyneW8ter' | 1433932319457 | 'Oriana' | 'Vanyard' | 'London' | 'Platinum' ]) - 3 --> ([ 3 | 'akatz1022' | 1478233258664 | 'Ferd' | 'Trice' | 'Palo Alto' | 'Platinum' ]) - ... - -6. Launch the KSQL CLI in local mode. - - 1. Start the KSQL server. - - .. code:: bash - - $ ksql-server-start /etc/ksql/ksqlserver.properties > /tmp/ksql-logs/ksql-server.log 2>&1 & - - 2. Start the CLI on port 8080. - - .. code:: bash - - $ ksql-cli remote http://localhost:8080 - - You should now be in the KSQL CLI. - - .. code:: bash - - ====================================== - = _ __ _____ ____ _ = - = | |/ // ____|/ __ \| | = - = | ' /| (___ | | | | | = - = | < \___ \| | | | | = - = | . \ ____) | |__| | |____ = - = |_|\_\_____/ \___\_\______| = - = = - = Streaming SQL Engine for Kafka = - Copyright 2017 Confluent Inc. - - CLI v0.2, Server v0.1 located at http://localhost:9098 - - Having trouble? Type 'help' (case-insensitive) for a rundown of how things work! - - ksql> - -7. From the the KSQL CLI, load the ``clickstream.sql`` schema file that - will run the demo app. - - **Important:** Before running this step, you must have already run - ksql-datagen utility to create the clickstream data, status codes, - and set of users. - - :: - - ksql> RUN SCRIPT '/usr/share/doc/ksql-clickstream-demo/clickstream-schema.sql'; - - The output should resemble: - - :: - - Message - ------------------------------------ - Executing statement - ksql> - -8. From the the KSQL CLI, verify that the tables are created. - - :: - - ksql> LIST TABLES; - - Your output should resemble: - - :: - - Table Name | Kafka Topic | Format | Windowed - ----------------------------------------------------------------------------- - WEB_USERS | clickstream_users | JSON | false - ERRORS_PER_MIN_ALERT | ERRORS_PER_MIN_ALERT | JSON | true - CLICKSTREAM_CODES_TS | CLICKSTREAM_CODES_TS | JSON | false - USER_IP_ACTIVITY | USER_IP_ACTIVITY | JSON | true - CLICKSTREAM_CODES | clickstream_codes | JSON | false - PAGES_PER_MIN | PAGES_PER_MIN | JSON | true - CLICK_USER_SESSIONS | CLICK_USER_SESSIONS | JSON | true - ENRICHED_ERROR_CODES_COUNT | ENRICHED_ERROR_CODES_COUNT | JSON | true - EVENTS_PER_MIN_MAX_AVG | EVENTS_PER_MIN_MAX_AVG | JSON | true - ERRORS_PER_MIN | ERRORS_PER_MIN | JSON | true - EVENTS_PER_MIN | EVENTS_PER_MIN | JSON | true - -9. From the the KSQL CLI, verify that the streams are created. - - :: - - ksql> LIST STREAMS; - - Your output should resemble: - - :: - - Stream Name | Kafka Topic | Format - ---------------------------------------------------------------- - USER_CLICKSTREAM | USER_CLICKSTREAM | JSON - EVENTS_PER_MIN_MAX_AVG_TS | EVENTS_PER_MIN_MAX_AVG_TS | JSON - ERRORS_PER_MIN_TS | ERRORS_PER_MIN_TS | JSON - EVENTS_PER_MIN_TS | EVENTS_PER_MIN_TS | JSON - ENRICHED_ERROR_CODES | ENRICHED_ERROR_CODES | JSON - ERRORS_PER_MIN_ALERT_TS | ERRORS_PER_MIN_ALERT_TS | JSON - CLICK_USER_SESSIONS_TS | CLICK_USER_SESSIONS_TS | JSON - PAGES_PER_MIN_TS | PAGES_PER_MIN_TS | JSON - ENRICHED_ERROR_CODES_TS | ENRICHED_ERROR_CODES_TS | JSON - USER_IP_ACTIVITY_TS | USER_IP_ACTIVITY_TS | JSON - CUSTOMER_CLICKSTREAM | CUSTOMER_CLICKSTREAM | JSON - CLICKSTREAM | clickstream | JSON - -10. From the the KSQL CLI, verify that data is being streamed through - various tables and streams. - - **View clickstream data** - - .. code:: bash - - ksql> SELECT * FROM CLICKSTREAM LIMIT 5; - - Your output should resemble: - - .. code:: bash - - 1503585407989 | 222.245.174.248 | 1503585407989 | 24/Aug/2017:07:36:47 -0700 | 233.90.225.227 | GET /site/login.html HTTP/1.1 | 407 | 19 | 4096 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585407999 | 233.168.257.122 | 1503585407999 | 24/Aug/2017:07:36:47 -0700 | 233.173.215.103 | GET /site/user_status.html HTTP/1.1 | 200 | 15 | 14096 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585408009 | 222.168.57.122 | 1503585408009 | 24/Aug/2017:07:36:48 -0700 | 111.249.79.93 | GET /images/track.png HTTP/1.1 | 406 | 22 | 4096 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585408019 | 122.145.8.244 | 1503585408019 | 24/Aug/2017:07:36:48 -0700 | 122.249.79.233 | GET /site/user_status.html HTTP/1.1 | 404 | 6 | 4006 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585408029 | 222.152.45.45 | 1503585408029 | 24/Aug/2017:07:36:48 -0700 | 222.249.79.93 | GET /images/track.png HTTP/1.1 | 200 | 29 | 14096 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 - LIMIT reached for the partition. - Query terminated - - **View the events per minute** - - .. code:: bash - - ksql> SELECT * FROM EVENTS_PER_MIN_TS LIMIT 5; - - Your output should resemble: - - .. code:: bash - - 1503585450000 | 29^�8 | 1503585450000 | 29 | 19 - 1503585450000 | 37^�8 | 1503585450000 | 37 | 25 - 1503585450000 | 8^�8 | 1503585450000 | 8 | 35 - 1503585450000 | 36^�8 | 1503585450000 | 36 | 14 - 1503585450000 | 24^�8 | 1503585450000 | 24 | 22 - LIMIT reached for the partition. - Query terminated - - **View pages per minute** - - .. code:: bash - - ksql> SELECT * FROM PAGES_PER_MIN LIMIT 5; - - Your output should resemble: - - .. code:: bash - - 1503585475000 | 4 : Window{start=1503585475000 end=-} | 4 | 14 - 1503585480000 | 25 : Window{start=1503585480000 end=-} | 25 | 9 - 1503585480000 | 16 : Window{start=1503585480000 end=-} | 16 | 6 - 1503585475000 | 25 : Window{start=1503585475000 end=-} | 25 | 20 - 1503585480000 | 37 : Window{start=1503585480000 end=-} | 37 | 6 - LIMIT reached for the partition. - Query terminated - -11. Go to your terminal and send the KSQL tables to Elasticsearch and - Grafana. - - 1. Exit the KSQL CLI with ``CTRL+D``. - - 2. From your terminal, navigate to the demo directory: - - .. code:: bash - - $ cd /usr/share/doc/ksql-clickstream-demo/ - - 3. Run this command to send the KSQL tables to Elasticsearch and - Grafana: - - .. code:: bash - - $ ./ksql-tables-to-grafana.sh - - Your output should resemble: - - :: - - Loading Clickstream-Demo TABLES to Confluent-Connect => Elastic => Grafana datasource - Logging to: /tmp/ksql-connect.log - Charting CLICK_USER_SESSIONS_TS - Charting USER_IP_ACTIVITY_TS - Charting CLICKSTREAM_STATUS_CODES_TS - Charting ENRICHED_ERROR_CODES_TS - Charting ERRORS_PER_MIN_ALERT_TS - Charting ERRORS_PER_MIN_TS - Charting EVENTS_PER_MIN_MAX_AVG_TS - Charting EVENTS_PER_MIN_TS - Charting PAGES_PER_MIN_TS - Navigate to http://localhost:3000/dashboard/db/click-stream-analysis - - 4. From your terminal, load the dashboard into Grafana. - - .. code:: bash - - $ ./clickstream-analysis-dashboard.sh - - Your output should resemble: - - .. code:: bash - - Loading Grafana ClickStream Dashboard - {"slug":"click-stream-analysis","status":"success","version":5} - -12. Go to your browser and view the Grafana output at - http://localhost:33000/dashboard/db/click-stream-analysis. You can - login with user ID ``admin`` and password ``admin``. - - **Important:** If you already have Grafana UI open, you may need to - enter the specific clickstream URL: - http://localhost:33000/dashboard/db/click-stream-analysis. - - .. figure:: grafana-success.png - :alt: Grafana UI success - - Grafana UI success - -**About:** This dashboard demonstrates a series of streaming -functionality where the title of each panel describes the type of stream -processing required to generate the data. For example, the large chart -in the middle is showing web-resource requests on a per-username basis -using a Session window - where a sessions expire after 300 seconds of -inactivity. Editing the panel allows you to view the datasource - which -is named after the streams and tables captured in the -clickstream-schema.sql file. - -| **Interesting things to try:** \* Understand how the - ``clickstream-schema.sql`` file is structured. We use a - DataGen.KafkaTopic.clickstream -> Stream -> Table (for window & - analytics with group-by) -> Table (to Add EVENT_TS for time-index) -> - ElastiSearch/Connect topic -| \* Run the ``LIST TOPICS;`` command to see where data is persisted \* - Run the KSQL CLI ``history`` command - -Troubleshooting ---------------- - -- Check the Data Sources page in Grafana. - - - If your data source is shown, select it and scroll to the bottom - and click the **Save & Test** button. This will indicate whether - your data source is valid. diff --git a/docs/ksql-clickstream-demo/index.rst b/docs/ksql-clickstream-demo/index.rst deleted file mode 100644 index 5bae71d2239a..000000000000 --- a/docs/ksql-clickstream-demo/index.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. _ksql_clickstream: - -Clickstream Analysis Demo -========================= - -Clickstream analysis is the process of collecting, analyzing, and -reporting aggregate data about which pages a website visitor visits and -in what order. The path the visitor takes though a website is called the -clickstream. - -This demo focuses on building real-time analytics of users to determine: - -* General website analytics, such as hit count and visitors -* Bandwidth use -* Mapping user-IP addresses to actual users and their location -* Detection of high-bandwidth user sessions -* Error-code occurrence and enrichment -* Sessionization to track user-sessions and understand behavior (such as per-user-session-bandwidth, per-user-session-hits etc) - -The demo uses standard streaming functions (i.e., min, max, etc), as -well as enrichment using child tables, table-stream joins and different -types of windowing functionality. - -.. toctree:: - :maxdepth: 1 - :caption: Table of Contents - - non-docker-clickstream - docker-clickstream - - diff --git a/docs/ksql-clickstream-demo/non-docker-clickstream.rst b/docs/ksql-clickstream-demo/non-docker-clickstream.rst deleted file mode 100644 index 53aebe5b0e2a..000000000000 --- a/docs/ksql-clickstream-demo/non-docker-clickstream.rst +++ /dev/null @@ -1,364 +0,0 @@ -.. _ksql_clickstream_non_docker: - -Clickstream Analysis with KSQL running locally -============================================== - -These steps will guide you through how to setup your environment and run -the clickstream analysis demo. - -Prerequisites -------------- - -- :ref:`Confluent 4.0.0 ` locally - - - Make sure you only have one broker running on the host - -- `ElasticSearch `__ -- `Grafana `__ -- `Git `__ -- `Maven `__ -- Java: Minimum version 1.8. Install Oracle Java JRE or JDK >= 1.8 on - your local machine - -1. Clone the Confluent KSQL repository. - - .. code:: bash - - $ git clone git@github.com:confluentinc/ksql.git - -2. Change directory to the ``ksql`` directory and compile the KSQL - code. - - .. code:: bash - - $ cd ksql - $ mvn clean compile install -DskipTests - -3. Copy the Kafka Connect Elasticsearch configuration file - (``ksql/ksql-clickstream-demo/demo/connect-config/null-filter-4.0.0-SNAPSHOT.jar``) - to your Confluent installation ``share`` directory - (``confluent-3.3.0/share/java/kafka-connect-elasticsearch/``). - - .. code:: bash - - cp ksql-clickstream-demo/demo/connect-config/null-filter-4.0.0-SNAPSHOT.jar /share/java/kafka-connect-elasticsearch/ - -4. From your terminal, start the Confluent Platform. It should be - running on default port 8083. - - .. code:: bash - - $ /bin/confluent start - - The output should resemble: - - .. code:: bash - - Starting zookeeper - zookeeper is [UP] - Starting kafka - kafka is [UP] - Starting schema-registry - schema-registry is [UP] - Starting kafka-rest - kafka-rest is [UP] - Starting connect - connect is [UP] - -5. From your terminal, start the Elastic and Grafana servers. - ElasticSearch should be running on the default port 9200. Grafana - should be running on the default port 3000. - - - `Start - Elastic `__ - - `Start Grafana `__ - -6. From your terminal, create the clickStream data using the - ksql-datagen utility. This stream will run continuously until you - terminate. - - **Tip:** Because of shell redirection, this command does not print a - newline and so it might look like it’s still in the foreground. The - process is running as a daemon, so just press return again to see - the shell prompt. - - .. code:: bash - - $ /bin/ksql-datagen -daemon quickstart=clickstream format=json topic=clickstream maxInterval=100 iterations=500000 - - Your output should resemble: - - .. code:: bash - - Writing console output to /tmp/ksql-logs/ksql.out - -7. From your terminal, create the status codes using the ksql-datagen - utility. This stream runs once to populate the table. - - .. code:: bash - - $ /bin/ksql-datagen quickstart=clickstream_codes format=json topic=clickstream_codes maxInterval=20 iterations=100 - - Your output should resemble: - - .. code:: bash - - 200 --> ([ 200 | 'Successful' ]) - 302 --> ([ 302 | 'Redirect' ]) - 200 --> ([ 200 | 'Successful' ]) - 406 --> ([ 406 | 'Not acceptable' ]) - ... - -8. From your terminal, create a set of users using ksql-datagen - utility. This stream runs once to populate the table. - - .. code:: bash - - $ /bin/ksql-datagen quickstart=clickstream_users format=json topic=clickstream_users maxInterval=10 iterations=1000 - - Your output should resemble: - - .. code:: bash - - 1 --> ([ 1 | 'GlenAlan_23344' | 1424796387808 | 'Curran' | 'Lalonde' | 'Palo Alto' | 'Gold' ]) - 2 --> ([ 2 | 'ArlyneW8ter' | 1433932319457 | 'Oriana' | 'Vanyard' | 'London' | 'Platinum' ]) - 3 --> ([ 3 | 'akatz1022' | 1478233258664 | 'Ferd' | 'Trice' | 'Palo Alto' | 'Platinum' ]) - ... - -9. Launch the KSQL CLI in local mode. - - .. code:: bash - - $ /bin/ksql-cli local - - You should see the KSQL CLI welcome screen. - - .. code:: bash - - ====================================== - = _ __ _____ ____ _ = - = | |/ // ____|/ __ \| | = - = | ' /| (___ | | | | | = - = | < \___ \| | | | | = - = | . \ ____) | |__| | |____ = - = |_|\_\_____/ \___\_\______| = - = = - = Streaming SQL Engine for Kafka = - Copyright 2017 Confluent Inc. - - CLI v0.2, Server v0.1 located at http://localhost:9098 - - Having trouble? Type 'help' (case-insensitive) for a rundown of how things work! - - ksql> - -10. From the the KSQL CLI, load the ``clickstream.sql`` schema file that - will run the demo app. - - **Important:** Before running this step, you must have already run - ksql-datagen utility to create the clickstream data, status codes, - and set of users. - - :: - - ksql> RUN SCRIPT 'ksql-clickstream-demo/demo/clickstream-schema.sql'; - - The output should resemble: - - .. code:: bash - - Message - ------------------------------------ - Executing statement - ksql> - -11. From the the KSQL CLI, verify that the tables are created. - - .. code:: bash - - ksql> LIST TABLES; - - Your output should resemble: - - .. code:: bash - - Table Name | Kafka Topic | Format | Windowed - ----------------------------------------------------------------------------- - WEB_USERS | clickstream_users | JSON | false - ERRORS_PER_MIN_ALERT | ERRORS_PER_MIN_ALERT | JSON | true - CLICKSTREAM_CODES_TS | CLICKSTREAM_CODES_TS | JSON | false - USER_IP_ACTIVITY | USER_IP_ACTIVITY | JSON | true - CLICKSTREAM_CODES | clickstream_codes | JSON | false - PAGES_PER_MIN | PAGES_PER_MIN | JSON | true - CLICK_USER_SESSIONS | CLICK_USER_SESSIONS | JSON | true - ENRICHED_ERROR_CODES_COUNT | ENRICHED_ERROR_CODES_COUNT | JSON | true - EVENTS_PER_MIN_MAX_AVG | EVENTS_PER_MIN_MAX_AVG | JSON | true - ERRORS_PER_MIN | ERRORS_PER_MIN | JSON | true - EVENTS_PER_MIN | EVENTS_PER_MIN | JSON | true - -12. From the the KSQL CLI, verify that the streams are created. - - .. code:: bash - - ksql> LIST STREAMS; - - Your output should resemble: - - .. code:: bash - - Stream Name | Kafka Topic | Format - ---------------------------------------------------------------- - USER_CLICKSTREAM | USER_CLICKSTREAM | JSON - EVENTS_PER_MIN_MAX_AVG_TS | EVENTS_PER_MIN_MAX_AVG_TS | JSON - ERRORS_PER_MIN_TS | ERRORS_PER_MIN_TS | JSON - EVENTS_PER_MIN_TS | EVENTS_PER_MIN_TS | JSON - ENRICHED_ERROR_CODES | ENRICHED_ERROR_CODES | JSON - ERRORS_PER_MIN_ALERT_TS | ERRORS_PER_MIN_ALERT_TS | JSON - CLICK_USER_SESSIONS_TS | CLICK_USER_SESSIONS_TS | JSON - PAGES_PER_MIN_TS | PAGES_PER_MIN_TS | JSON - ENRICHED_ERROR_CODES_TS | ENRICHED_ERROR_CODES_TS | JSON - USER_IP_ACTIVITY_TS | USER_IP_ACTIVITY_TS | JSON - CUSTOMER_CLICKSTREAM | CUSTOMER_CLICKSTREAM | JSON - CLICKSTREAM | clickstream | JSON - -13. From the the KSQL CLI, verify that data is being streamed through - various tables and streams. - - **View clickstream data** - - .. code:: bash - - ksql> SELECT * FROM CLICKSTREAM LIMIT 5; - - Your output should resemble: - - .. code:: bash - - 1503585407989 | 222.245.174.248 | 1503585407989 | 24/Aug/2017:07:36:47 -0700 | 233.90.225.227 | GET /site/login.html HTTP/1.1 | 407 | 19 | 4096 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585407999 | 233.168.257.122 | 1503585407999 | 24/Aug/2017:07:36:47 -0700 | 233.173.215.103 | GET /site/user_status.html HTTP/1.1 | 200 | 15 | 14096 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585408009 | 222.168.57.122 | 1503585408009 | 24/Aug/2017:07:36:48 -0700 | 111.249.79.93 | GET /images/track.png HTTP/1.1 | 406 | 22 | 4096 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585408019 | 122.145.8.244 | 1503585408019 | 24/Aug/2017:07:36:48 -0700 | 122.249.79.233 | GET /site/user_status.html HTTP/1.1 | 404 | 6 | 4006 | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) - 1503585408029 | 222.152.45.45 | 1503585408029 | 24/Aug/2017:07:36:48 -0700 | 222.249.79.93 | GET /images/track.png HTTP/1.1 | 200 | 29 | 14096 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 - LIMIT reached for the partition. - Query terminated - - **View the events per minute** - - .. code:: bash - - ksql> SELECT * FROM EVENTS_PER_MIN_TS LIMIT 5; - - Your output should resemble: - - .. code:: bash - - 1503585450000 | 29^�8 | 1503585450000 | 29 | 19 - 1503585450000 | 37^�8 | 1503585450000 | 37 | 25 - 1503585450000 | 8^�8 | 1503585450000 | 8 | 35 - 1503585450000 | 36^�8 | 1503585450000 | 36 | 14 - 1503585450000 | 24^�8 | 1503585450000 | 24 | 22 - LIMIT reached for the partition. - Query terminated - - **View pages per minute** - - .. code:: bash - - ksql> SELECT * FROM PAGES_PER_MIN LIMIT 5; - - Your output should resemble: - - .. code:: bash - - 1503585475000 | 4 : Window{start=1503585475000 end=-} | 4 | 14 - 1503585480000 | 25 : Window{start=1503585480000 end=-} | 25 | 9 - 1503585480000 | 16 : Window{start=1503585480000 end=-} | 16 | 6 - 1503585475000 | 25 : Window{start=1503585475000 end=-} | 25 | 20 - 1503585480000 | 37 : Window{start=1503585480000 end=-} | 37 | 6 - LIMIT reached for the partition. - Query terminated - -14. Go to your terminal and send the KSQL tables to Elasticsearch and - Grafana. - - 1. From your terminal, navigate to the demo directory: - - .. code:: bash - - cd ksql-clickstream-demo/demo/ - - 2. Run this command to send the KSQL tables to Elasticsearch and - Grafana: - - .. code:: bash - - $ ./ksql-tables-to-grafana.sh - - Your output should resemble: - - .. code:: bash - - Loading Clickstream-Demo TABLES to Confluent-Connect => Elastic => Grafana datasource - Logging to: /tmp/ksql-connect.log - Charting CLICK_USER_SESSIONS_TS - Charting USER_IP_ACTIVITY_TS - Charting CLICKSTREAM_STATUS_CODES_TS - Charting ENRICHED_ERROR_CODES_TS - Charting ERRORS_PER_MIN_ALERT_TS - Charting ERRORS_PER_MIN_TS - Charting EVENTS_PER_MIN_MAX_AVG_TS - Charting EVENTS_PER_MIN_TS - Charting PAGES_PER_MIN_TS - Navigate to http://localhost:3000/dashboard/db/click-stream-analysis - - **Important:** The ``http://localhost:3000/`` URL is only - available inside the container. We will access the dashboard with - a slightly different URL, after running the next command. - - 3. From your terminal, load the dashboard into Grafana. - - .. code:: bash - - $ ./clickstream-analysis-dashboard.sh - - Your output should resemble: - - .. code:: bash - - Loading Grafana ClickStream Dashboard - {"slug":"click-stream-analysis","status":"success","version":1} - -15. Go to your browser and view the Grafana output at - http://localhost:3000/dashboard/db/click-stream-analysis. You can - login with user ID ``admin`` and password ``admin``. - - **Important:** If you already have Grafana UI open, you may need to - enter the specific clickstream URL: - http://localhost:3000/dashboard/db/click-stream-analysis. - - .. figure:: grafana-success.png - :alt: Grafana UI success - - Grafana UI success - -| Interesting things to try: \* Understand how the - ``clickstream-schema.sql`` file is structured. We use a - DataGen.KafkaTopic.clickstream -> Stream -> Table (for window & - analytics with group-by) -> Table (to Add EVENT_TS for time-index) -> - ElasticSearch/Connect topic -| \* Run the ``LIST TOPICS;`` command to see where data is persisted \* - Run the KSQL CLI ``history`` command - -Troubleshooting ---------------- - -- Docker must not be running on the host machine. -- Check that Elasticsearch is running: http://localhost:9200/. -- Check the Data Sources page in Grafana. - - - If your data source is shown, select it and scroll to the bottom - and click the **Save & Test** button. This will indicate whether - your data source is valid. - - If your data source is not shown, go to - ``/demo/`` and run - ``./ksql-tables-to-grafana.sh``. diff --git a/docs/ksql-clickstream-demo/pom.xml b/docs/ksql-clickstream-demo/pom.xml deleted file mode 100644 index 8a3535a4afb9..000000000000 --- a/docs/ksql-clickstream-demo/pom.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - 4.0.0 - - - io.confluent.ksql - ksql-parent - 0.1-SNAPSHOT - - - io.confluent.ksql - ksql-clickstream-demo - KSQL Clickstream Analysis Demo - - - - io.confluent.ksql - ksql-examples - ${project.version} - - - - io.confluent.ksql - ksql-cli - ${project.version} - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - src/assembly/development.xml - src/assembly/package.xml - src/assembly/standalone.xml - - - - ${main-class} - - - false - - - - make-assembly - package - - single - - - - - - - - - - packaging - - - - com.spotify - dockerfile-maven-plugin - ${dockerfile-maven-plugin.version} - - - default - - build - - - - ${project.artifactId} - ${project.version} - ${docker.registry} - - ${docker.tag} - ${docker.registry}confluentinc/${project.artifactId} - - - - - - - - - diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 54966cf1bdb8..000000000000 --- a/docs/make.bat +++ /dev/null @@ -1,242 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\KafkaRESTProxy.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\KafkaRESTProxy.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end diff --git a/docs/quickstart/README.md b/docs/quickstart/README.md new file mode 100644 index 000000000000..2343ab95e06b --- /dev/null +++ b/docs/quickstart/README.md @@ -0,0 +1,241 @@ +# Quick Start + +| [Overview](/docs#ksql-documentation) | Quick Start | [Concepts](/docs/concepts.md#concepts) | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | [FAQ](/docs/faq.md#frequently-asked-questions) | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| + +Welcome to the quick start for KSQL! + +The goal of this quick start is to demonstrate a simple workflow using KSQL to write streaming queries against data in Kafka. + +**Table of Contents** + +- [Setup](#setup) +- [Create a STREAM and TABLE](#create-a-stream-and-table) +- [Write Queries](#write-queries) +- [Terminate and Exit](#terminate-and-exit) + +## Setup + +Because KSQL queries data in a Kafka cluster, you will need to bring up a Kafka cluster, including ZooKeeper and a Kafka broker. Do not run KSQL against a production Kafka cluster while KSQL is in developer preview. + +1. Bring up a Kafka cluster and start KSQL. + + * [Follow these instructions if you are using Docker](/docs/quickstart/quickstart-docker.md#docker-setup-for-ksql) (we recommend Docker for simplicity) + * [Follow these instructions if you are not using Docker](quickstart-non-docker.md#non-docker-setup-for-ksql) + +2. After you have successfully started the Kafka cluster and started KSQL, you will see the KSQL prompt: + + ```bash + ====================================== + = _ __ _____ ____ _ = + = | |/ // ____|/ __ \| | = + = | ' /| (___ | | | | | = + = | < \___ \| | | | | = + = | . \ ____) | |__| | |____ = + = |_|\_\_____/ \___\_\______| = + = = + = Streaming SQL Engine for Kafka = + Copyright 2017 Confluent Inc. + + CLI v0.1, Server v0.1 located at http://localhost:9098 + + Having trouble? Type 'help' (case-insensitive) for a rundown of how things work! + + ksql> + ``` + +3. KSQL provides a structured query language to query Kafka data, so you need some data to query. For this quick start, you will produce mock streams to the Kafka cluster. + + * If you are using our Docker Compose files, a Docker container is already running with a data generator that is continuously producing Kafka messages to the Kafka cluster. No further action is required + * If you are not using our Docker environment, then follow these [instructions](quickstart-non-docker.md#produce-topic-data) to generate data to the Kafka cluster + +## Create a Stream and Table + +This KSQL quick start shows examples querying data from Kafka topics called `pageviews` and `users` using the following schemas: + +![image](/docs/quickstart/ksql-quickstart-schemas.jpg) + +Before proceeding, please check: + +* In the terminal window where you started KSQL, you see the `ksql>` prompt +* If you are not using Docker, you must manually have run the data generator to produce topics called `pageviews` and `users`. If you haven't done this, please follow these [instructions](/docs/quickstart/quickstart-non-docker.md#produce-topic-data) to generate data. (Docker compose file automatically runs the data generator) + + +1. Create a STREAM `pageviews_original` from the Kafka topic `pageviews`, specifying the `value_format` of `DELIMITED`. Describe the new STREAM. Notice that KSQL created additional columns called `ROWTIME`, which corresponds to the Kafka message timestamp, and `ROWKEY`, which corresponds to the Kafka message key. + + ```bash + ksql> CREATE STREAM pageviews_original (viewtime bigint, userid varchar, pageid varchar) WITH (kafka_topic='pageviews', value_format='DELIMITED'); + + ksql> DESCRIBE pageviews_original; + + Field | Type + ---------------------------- + ROWTIME | BIGINT + ROWKEY | VARCHAR(STRING) + VIEWTIME | BIGINT + USERID | VARCHAR(STRING) + PAGEID | VARCHAR(STRING) + ``` + +2. Create a TABLE `users_original` from the Kafka topic `users`, specifying the `value_format` of `JSON`. Describe the new TABLE. + + ```bash + ksql> CREATE TABLE users_original (registertime bigint, gender varchar, regionid varchar, userid varchar) WITH (kafka_topic='users', value_format='JSON'); + + ksql> DESCRIBE users_original; + + Field | Type + -------------------------------- + ROWTIME | BIGINT + ROWKEY | VARCHAR(STRING) + REGISTERTIME | BIGINT + GENDER | VARCHAR(STRING) + REGIONID | VARCHAR(STRING) + USERID | VARCHAR(STRING) + ``` + +3. Show all STREAMS and TABLES. + + ```bash + ksql> SHOW STREAMS; + + Stream Name | Kafka Topic | Format + ----------------------------------------------------------------- + PAGEVIEWS_ORIGINAL | pageviews | DELIMITED + + ksql> SHOW TABLES; + + Table Name | Kafka Topic | Format | Windowed + -------------------------------------------------------------- + USERS_ORIGINAL | users | JSON | false + ``` + + +## Write Queries + +**Note:** By default KSQL reads the topics for streams and tables from the latest offset. + +1. Use `SELECT` to create a query that returns data from a STREAM. To stop viewing the data, press ``. You may optionally include the `LIMIT` keyword to limit the number of rows returned in the query result. Note that exact data output may vary because of the randomness of the data generation. + + ```bash + ksql> SELECT pageid FROM pageviews_original LIMIT 3; + Page_24 + Page_73 + Page_78 + LIMIT reached for the partition. + Query terminated + ksql> + ``` + +2. Create a persistent query by using the `CREATE STREAM` keywords to precede the `SELECT` statement. Unlike the non-persistent query above, results from this query are written to a Kafka topic `PAGEVIEWS_FEMALE`. The query below enriches the `pageviews` STREAM by doing a `LEFT JOIN` with the `users_original` TABLE on the user ID, where a condition is met. + + ```bash + ksql> CREATE STREAM pageviews_female AS SELECT users_original.userid AS userid, pageid, regionid, gender FROM pageviews_original LEFT JOIN users_original ON pageviews_original.userid = users_original.userid WHERE gender = 'FEMALE'; + + ksql> DESCRIBE pageviews_female; + Field | Type + ---------------------------- + ROWTIME | BIGINT + ROWKEY | VARCHAR(STRING) + USERID | VARCHAR(STRING) + PAGEID | VARCHAR(STRING) + REGIONID | VARCHAR(STRING) + GENDER | VARCHAR(STRING) + ``` + +3. Use `SELECT` to view query results as they come in. To stop viewing the query results, press ``. This stops printing to the console but it does not terminate the actual query. The query continues to run in the underlying KSQL application. + + ```bash + ksql> SELECT * FROM pageviews_female; + 1502477856762 | User_2 | User_2 | Page_55 | Region_9 | FEMALE + 1502477857946 | User_5 | User_5 | Page_14 | Region_2 | FEMALE + 1502477858436 | User_3 | User_3 | Page_60 | Region_3 | FEMALE + ^CQuery terminated + ksql> + ``` + +4. Create a new persistent query where another condition is met, using `LIKE`. Results from this query are written to a Kafka topic called `pageviews_enriched_r8_r9`. + + ```bash + ksql> CREATE STREAM pageviews_female_like_89 WITH (kafka_topic='pageviews_enriched_r8_r9', value_format='DELIMITED') AS SELECT * FROM pageviews_female WHERE regionid LIKE '%_8' OR regionid LIKE '%_9'; + ``` + +5. Create a new persistent query that counts the pageviews for each region and gender combination in a [tumbling window](http://docs.confluent.io/current/streams/developer-guide.html#tumbling-time-windows) of 30 seconds when the count is greater than 1. Results from this query are written to a Kafka topic called `PAGEVIEWS_REGIONS`. + + ```bash + ksql> CREATE TABLE pageviews_regions AS SELECT gender, regionid , COUNT(*) AS numusers FROM pageviews_female WINDOW TUMBLING (size 30 second) GROUP BY gender, regionid HAVING COUNT(*) > 1; + + ksql> DESCRIBE pageviews_regions; + + Field | Type + ---------------------------- + ROWTIME | BIGINT + ROWKEY | VARCHAR(STRING) + GENDER | VARCHAR(STRING) + REGIONID | VARCHAR(STRING) + NUMUSERS | BIGINT + ``` + +6. Use `SELECT` to view results from the above query. + + ```bash + ksql> SELECT regionid, numusers FROM pageviews_regions LIMIT 5; + Region_3 | 4 + Region_3 | 5 + Region_6 | 5 + Region_6 | 6 + Region_3 | 8 + LIMIT reached for the partition. + Query terminated + ksql> + ``` + +7. Show all persistent queries. + + ```bash + ksql> SHOW QUERIES; + + Query ID | Kafka Topic | Query String + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1 | PAGEVIEWS_FEMALE | CREATE STREAM pageviews_female AS SELECT users_original.userid AS userid, pageid, regionid, gender FROM pageviews_original LEFT JOIN users_original ON pageviews_original.userid = users_original.userid WHERE gender = 'FEMALE'; + 2 | pageviews_enriched_r8_r9 | CREATE STREAM pageviews_female_like_89 WITH (kafka_topic='pageviews_enriched_r8_r9', value_format='DELIMITED') AS SELECT * FROM pageviews_female WHERE regionid LIKE '%_8' OR regionid LIKE '%_9'; + 3 | PAGEVIEWS_REGIONS | CREATE TABLE pageviews_regions AS SELECT gender, regionid , COUNT(*) AS numusers FROM pageviews_female WINDOW TUMBLING (size 30 second) GROUP BY gender, regionid HAVING COUNT(*) > 1; + ``` + + +## Terminate and Exit + +### KSQL + +**Important:** Queries will continuously run as KSQL applications until they are manually terminated. Exiting KSQL does not terminate persistent queries. + +1. From the output of `SHOW QUERIES;` identify a query ID you would like to terminate. For example, if you wish to terminate query ID `2`: + + ```bash + ksql> TERMINATE 2; + ``` + +2. To exit from KSQL, type 'exit'. + + ```bash + ksql> exit + ``` + +### Docker +If you are running Docker Compose, you must explicitly shut down Docker Compose. For more information, see the [docker-compose down](https://docs.docker.com/compose/reference/down/) documentation. + +**Important:** This command will delete all KSQL queries and topic data. + +``` +$ docker-compose down +``` + +### Confluent Platform +If you are running the Confluent Platform, you can stop it with this command. + +``` +$ confluent stop +``` + +## Next steps +Try the end-to-end [Clickstream Analysis demo](/ksql-clickstream-demo#clickstream-analysis), which shows how to build an application that performs real-time user analytics. diff --git a/docs/quickstart/index.rst b/docs/quickstart/index.rst deleted file mode 100644 index caaab2367029..000000000000 --- a/docs/quickstart/index.rst +++ /dev/null @@ -1,263 +0,0 @@ -.. _ksql_quickstart: - -Quick Start -=========== - -.. important:: - - This release is a developer preview. It is strongly recommended that you test before running KSQL against a production Kafka cluster. - -The goal of this quick start is to demonstrate a simple workflow using -KSQL to write streaming queries against messages in Kafka. - -.. contents:: - :depth: 2 - -Setup ------ - -.. toctree:: - :hidden: - - quickstart-non-docker - quickstart-docker - -To get started, you must start a Kafka cluster, including ZooKeeper and a Kafka broker. KSQL will then query messages from this Kafka cluster. - -Launch a Kafka cluster, start KSQL, and produce messages to query. Follow the instructions based on whether you are using Docker: - -:ref:`ksql_quickstart_docker` (recommended) - The Docker container starts a Kafka cluster, starts KSQL, and automatically runs a data generator that continuously produces Kafka messages to the Kafka cluster. No additional setup is required. - -:ref:`ksql_quickstart_non_docker` - With this method you start a Kafka cluster, start KSQL, and manually run a data generator to produce topics called ``pageviews`` and ``users`` - -.. _create-a-stream-and-table: - -Create a Stream and Table -------------------------- - -These examples query messages from Kafka topics called ``pageviews`` and ``users`` using the following schemas: - -.. image:: ../img/ksql-quickstart-schemas.jpg - -#. Create a STREAM ``pageviews_original`` from the Kafka topic - ``pageviews``, specifying the ``value_format`` of ``DELIMITED``. - Describe the new STREAM. Notice that KSQL created additional columns - called ``ROWTIME``, which corresponds to the Kafka message timestamp, - and ``ROWKEY``, which corresponds to the Kafka message key. - - .. code:: bash - - ksql> CREATE STREAM pageviews_original (viewtime BIGINT, userid VARCHAR, pageid VARCHAR) WITH (kafka_topic='pageviews', value_format='DELIMITED'); - - ksql> DESCRIBE pageviews_original; - - Field | Type - ---------------------------- - ROWTIME | BIGINT - ROWKEY | VARCHAR(STRING) - VIEWTIME | BIGINT - USERID | VARCHAR(STRING) - PAGEID | VARCHAR(STRING) - -#. Create a TABLE ``users_original`` from the Kafka topic ``users``, - specifying the ``value_format`` of ``JSON``. Describe the new TABLE. - - .. code:: bash - - ksql> CREATE TABLE users_original (registertime BIGINT, gender VARCHAR, regionid VARCHAR, userid VARCHAR) WITH (kafka_topic='users', value_format='JSON'); - - ksql> DESCRIBE users_original; - - Field | Type - -------------------------------- - ROWTIME | BIGINT - ROWKEY | VARCHAR(STRING) - REGISTERTIME | BIGINT - GENDER | VARCHAR(STRING) - REGIONID | VARCHAR(STRING) - USERID | VARCHAR(STRING) - -#. Show all STREAMS and TABLES. - - .. code:: bash - - ksql> SHOW STREAMS; - - Stream Name | Kafka Topic | Format - ----------------------------------------------------------------- - PAGEVIEWS_ORIGINAL | pageviews | DELIMITED - - ksql> SHOW TABLES; - - Table Name | Kafka Topic | Format | Windowed - -------------------------------------------------------------- - USERS_ORIGINAL | users | JSON | false - -Write Queries -------------- - -These examples write queries using KSQL. - -**Note:** By default KSQL reads the topics for streams and tables from -the latest offset. - -#. Use ``SELECT`` to create a query that returns data from a STREAM. To - stop viewing the data, press ````. You may optionally include - the ``LIMIT`` keyword to limit the number of rows returned in the - query result. Note that exact data output may vary because of the - randomness of the data generation. - - .. code:: bash - - ksql> SELECT pageid FROM pageviews_original LIMIT 3; - Page_24 - Page_73 - Page_78 - LIMIT reached for the partition. - Query terminated - ksql> - -#. Create a persistent query by using the ``CREATE STREAM`` keywords to - precede the ``SELECT`` statement. Unlike the non-persistent query - above, results from this query are written to a Kafka topic - ``PAGEVIEWS_FEMALE``. The query below enriches the ``pageviews`` - STREAM by doing a ``LEFT JOIN`` with the ``users_original`` TABLE on - the user ID, where a condition is met. - - .. code:: bash - - ksql> CREATE STREAM pageviews_female AS SELECT users_original.userid AS userid, pageid, regionid, gender FROM pageviews_original LEFT JOIN users_original ON pageviews_original.userid = users_original.userid WHERE gender = 'FEMALE'; - - ksql> DESCRIBE pageviews_female; - Field | Type - ---------------------------- - ROWTIME | BIGINT - ROWKEY | VARCHAR(STRING) - USERID | VARCHAR(STRING) - PAGEID | VARCHAR(STRING) - REGIONID | VARCHAR(STRING) - GENDER | VARCHAR(STRING) - -#. Use ``SELECT`` to view query results as they come in. To stop viewing - the query results, press ````. This stops printing to the - console but it does not terminate the actual query. The query - continues to run in the underlying KSQL application. - - .. code:: bash - - ksql> SELECT * FROM pageviews_female; - 1502477856762 | User_2 | User_2 | Page_55 | Region_9 | FEMALE - 1502477857946 | User_5 | User_5 | Page_14 | Region_2 | FEMALE - 1502477858436 | User_3 | User_3 | Page_60 | Region_3 | FEMALE - ^CQuery terminated - ksql> - -#. Create a new persistent query where another condition is met, using - ``LIKE``. Results from this query are written to a Kafka topic called - ``pageviews_enriched_r8_r9``. - - .. code:: bash - - ksql> CREATE STREAM pageviews_female_like_89 WITH (kafka_topic='pageviews_enriched_r8_r9', value_format='DELIMITED') AS SELECT * FROM pageviews_female WHERE regionid LIKE '%_8' OR regionid LIKE '%_9'; - -#. Create a new persistent query that counts the pageviews for each - region and gender combination in a `tumbling - window `__ - of 30 seconds when the count is greater than 1. Results from this - query are written to a Kafka topic called ``PAGEVIEWS_REGIONS``. - - .. code:: bash - - ksql> CREATE TABLE pageviews_regions AS SELECT gender, regionid , COUNT(*) AS numusers FROM pageviews_female WINDOW TUMBLING (size 30 second) GROUP BY gender, regionid HAVING COUNT(*) > 1; - - ksql> DESCRIBE pageviews_regions; - - Field | Type - ---------------------------- - ROWTIME | BIGINT - ROWKEY | VARCHAR(STRING) - GENDER | VARCHAR(STRING) - REGIONID | VARCHAR(STRING) - NUMUSERS | BIGINT - -#. Use ``SELECT`` to view results from the above query. - - .. code:: bash - - ksql> SELECT regionid, numusers FROM pageviews_regions LIMIT 5; - Region_3 | 4 - Region_3 | 5 - Region_6 | 5 - Region_6 | 6 - Region_3 | 8 - LIMIT reached for the partition. - Query terminated - ksql> - -#. Show all persistent queries. - - .. code:: bash - - ksql> SHOW QUERIES; - - Query ID | Kafka Topic | Query String - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 1 | PAGEVIEWS_FEMALE | CREATE STREAM pageviews_female AS SELECT users_original.userid AS userid, pageid, regionid, gender FROM pageviews_original LEFT JOIN users_original ON pageviews_original.userid = users_original.userid WHERE gender = 'FEMALE'; - 2 | pageviews_enriched_r8_r9 | CREATE STREAM pageviews_female_like_89 WITH (kafka_topic='pageviews_enriched_r8_r9', value_format='DELIMITED') AS SELECT * FROM pageviews_female WHERE regionid LIKE '%_8' OR regionid LIKE '%_9'; - 3 | PAGEVIEWS_REGIONS | CREATE TABLE pageviews_regions AS SELECT gender, regionid , COUNT(*) AS numusers FROM pageviews_female WINDOW TUMBLING (size 30 second) GROUP BY gender, regionid HAVING COUNT(*) > 1; - -Terminate and Exit ------------------- - -KSQL -~~~~ - -**Important:** Queries will continuously run as KSQL applications until -they are manually terminated. Exiting KSQL does not terminate persistent -queries. - -#. From the output of ``SHOW QUERIES;`` identify a query ID you would - like to terminate. For example, if you wish to terminate query ID - ``2``: - - .. code:: bash - - ksql> TERMINATE 2; - -#. To exit from KSQL, type ‘exit’. - - .. code:: bash - - ksql> exit - -Docker -~~~~~~ - -If you are running Docker Compose, you must explicitly shut down Docker -Compose. For more information, see the `docker-compose -down `__ documentation. - -**Important:** This command will delete all KSQL queries and topic data. - -.. code:: bash - - $ docker-compose down - -Confluent Platform -~~~~~~~~~~~~~~~~~~ - -If you are running the Confluent Platform, you can stop it with this -command. - -.. code:: bash - - $ confluent stop - -Next steps ----------- - -Try the end-to-end :ref:`Clickstream Analysis -demo `, which shows how -to build an application that performs real-time user analytics. diff --git a/docs/img/ksql-quickstart-schemas.jpg b/docs/quickstart/ksql-quickstart-schemas.jpg similarity index 100% rename from docs/img/ksql-quickstart-schemas.jpg rename to docs/quickstart/ksql-quickstart-schemas.jpg diff --git a/docs/quickstart/quickstart-docker.md b/docs/quickstart/quickstart-docker.md new file mode 100644 index 000000000000..f991e2268557 --- /dev/null +++ b/docs/quickstart/quickstart-docker.md @@ -0,0 +1,153 @@ +# Docker Setup for KSQL + +| [Overview](/docs#ksql-documentation) |[Quick Start](/docs/quickstart#quick-start) | [Concepts](/docs/concepts.md#concepts) | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | [FAQ](/docs/faq.md#frequently-asked-questions) | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| + +This part of the quick start will guide you through the steps to setup a Kafka cluster and start KSQL for Docker environments. After you complete these steps, you can start using KSQL to query the Kafka cluster. + +**Table of Contents** + +- [Start a Kafka cluster](#start-a-kafka-cluster) +- [Start KSQL](#start-ksql) +- [Appendix](#appendix) + +**Prerequisites:** +- Docker + - [macOS](https://docs.docker.com/docker-for-mac/install/) + - [All platforms](https://docs.docker.com/engine/installation/) +- [Git](https://git-scm.com/downloads) +- Java: Minimum version 1.8 + +## Start a Kafka cluster + +1. Clone the Confluent KSQL repository. + + ```bash + $ git clone git@github.com:confluentinc/ksql.git + ``` + +2. Change directory to the quickstart and launch the KSQL quick start in Docker. + + ```bash + $ cd ksql/docs/quickstart/ + $ docker-compose up -d + ``` + +Proceed to [starting KSQL](#start-ksql). + + +## Start KSQL + +1. From the host machine, start KSQL CLI on the container. + + ```bash + $ docker-compose exec ksql-cli ksql-cli local --bootstrap-server kafka:29092 + ``` + +2. Return to the [main KSQL quick start](README.md#create-a-stream-and-table) to start querying the data in the Kafka cluster. + + +## Appendix + +The following instructions in the Appendix are not required to run the quick start. They are optional steps to produce extra topic data and verify the environment. + +### Produce more topic data + +The Compose file automatically runs a data generator that continuously produces data to two Kafka topics `pageviews` and `users`. No further action is required if you want to use just the data available. You can return to the [main KSQL quick start](README.md#create-a-stream-and-table) to start querying the data in these two topics. + +However, if you want to produce additional data, you can use any of the following methods. + +- Produce Kafka data with the Kafka command line `kafka-console-producer`. The following example generates data with a value in DELIMITED format. + + ```bash + $ docker-compose exec kafka kafka-console-producer --topic t1 --broker-list kafka:29092 --property parse.key=true --property key.separator=: + ``` + + Your data input should resemble this. + + ```bash + key1:v1,v2,v3 + key2:v4,v5,v6 + key3:v7,v8,v9 + key1:v10,v11,v12 + ``` + +- Produce Kafka data with the Kafka command line `kafka-console-producer`. The following example generates data with a value in JSON format. + + ```bash + $ docker-compose exec kafka kafka-console-producer --topic t2 --broker-list kafka:29092 --property parse.key=true --property key.separator=: + ``` + + Your data input should resemble this. + + ```bash + key1:{"id":"key1","col1":"v1","col2":"v2","col3":"v3"} + key2:{"id":"key2","col1":"v4","col2":"v5","col3":"v6"} + key3:{"id":"key3","col1":"v7","col2":"v8","col3":"v9"} + key1:{"id":"key1","col1":"v10","col2":"v11","col3":"v12"} + ``` + + +### Verify your environment + +The next three steps are optional verification steps to ensure your environment is properly setup. + +1. Verify that six Docker containers were created. + + ```bash + $ docker-compose ps + ``` + + Your output should resemble this. Take note of the `Up` state. + + ```bash + Name Command State Ports + ------------------------------------------------------------------------------------------------------------------------- + quickstart_kafka_1 /etc/confluent/docker/run Up 0.0.0.0:29092->29092/tcp, 0.0.0.0:9092->9092/tcp + quickstart_ksql-cli_1 perl -e while(1){ sleep 99 ... Up + quickstart_ksql-datagen-pageviews_1 bash -c echo Waiting for K ... Up + quickstart_ksql-datagen-users_1 bash -c echo Waiting for K ... Up + quickstart_schema-registry_1 /etc/confluent/docker/run Up 0.0.0.0:8081->8081/tcp + quickstart_zookeeper_1 /etc/confluent/docker/run Up 2181/tcp, 2888/tcp, 0.0.0.0:32181->32181/tcp, 3888/tcp + ``` + +2. The docker-compose file already runs a data generator that pre-populates two Kafka topics `pageviews` and `users` with mock data. Verify that the data generator created two Kafka topics, including `pageviews` and `users`. + + ```bash + $ docker-compose exec kafka kafka-topics --zookeeper zookeeper:32181 --list + ``` + + Your output should resemble this. + + ```bash + _confluent-metrics + _schemas + pageviews + users + ``` + +3. Use the `kafka-console-consumer` to view a few messages from each topic. The topic `pageviews` has a key that is a mock time stamp and a value that is in `DELIMITED` format. The topic `users` has a key that is the user ID and a value that is in `Json` format. + + ```bash + $ docker-compose exec kafka kafka-console-consumer --topic pageviews --bootstrap-server kafka:29092 --from-beginning --max-messages 3 --property print.key=true + ``` + + Your output should resemble this. + + ```bash + 1491040409254 1491040409254,User_5,Page_70 + 1488611895904 1488611895904,User_8,Page_76 + 1504052725192 1504052725192,User_8,Page_92 + ``` + + ```bash + $ docker-compose exec kafka kafka-console-consumer --topic users --bootstrap-server kafka:29092 --from-beginning --max-messages 3 --property print.key=true + ``` + + Your output should resemble this. + + ```bash + User_2 {"registertime":1509789307038,"gender":"FEMALE","regionid":"Region_1","userid":"User_2"} + User_6 {"registertime":1498248577697,"gender":"OTHER","regionid":"Region_8","userid":"User_6"} + User_8 {"registertime":1494834474504,"gender":"MALE","regionid":"Region_5","userid":"User_8"} + ``` diff --git a/docs/quickstart/quickstart-docker.rst b/docs/quickstart/quickstart-docker.rst deleted file mode 100644 index 47af02fdfdd2..000000000000 --- a/docs/quickstart/quickstart-docker.rst +++ /dev/null @@ -1,200 +0,0 @@ -.. _ksql_quickstart_docker: - -Running KSQL Using Docker -========================= - -This topic describes how to setup a Kafka cluster and start KSQL in a Docker container. After you complete these steps, -you can return to the :ref:`create-a-stream-and-table` and start querying the data in the Kafka cluster. - -.. contents:: Contents - :local: - :depth: 1 - -**Prerequisites** - -- Docker - - `macOS `__ - - `All platforms `__ -- `Git `__ -- Java: Minimum version 1.8 - -Start a Kafka cluster ---------------------- - -1. Clone the Confluent KSQL repository. - - .. code:: bash - - $ git clone git@github.com:confluentinc/ksql.git - -2. Change directory to the quickstart and launch the KSQL quick start in - Docker. - - .. code:: bash - - $ cd ksql/docs/quickstart/ - $ docker-compose up -d - - After you have successfully started the Kafka cluster and started - KSQL, you will see the KSQL prompt: - - .. code:: bash - - ====================================== - = _ __ _____ ____ _ = - = | |/ // ____|/ __ \| | = - = | ' /| (___ | | | | | = - = | < \___ \| | | | | = - = | . \ ____) | |__| | |____ = - = |_|\_\_____/ \___\_\______| = - = = - = Streaming SQL Engine for Kafka = - Copyright 2017 Confluent Inc. - - CLI v0.2, Server v0.1 located at http://localhost:9098 - - Having trouble? Type 'help' (case-insensitive) for a rundown of how things work! - - ksql> - -Proceed to :ref:`start-ksql`. - -.. _start-ksql: - -Start KSQL ----------- - -1. From the host machine, start KSQL CLI on the container. - - .. code:: bash - - $ docker-compose exec ksql-cli ksql-cli local --bootstrap-server kafka:29092 - -2. Return to the :ref:`create-a-stream-and-table` to start querying the - data in the Kafka cluster. - -Appendix --------- - -The following instructions in the Appendix are not required to run the -quick start. They are optional steps to produce extra topic data and -verify the environment. - -Produce more topic data -~~~~~~~~~~~~~~~~~~~~~~~ - -The Compose file automatically runs a data generator that continuously -produces data to two Kafka topics ``pageviews`` and ``users``. No -further action is required if you want to use just the data available. -You can return to the :ref:`main KSQL quick -start ` to start querying the -data in these two topics. - -However, if you want to produce additional data, you can use any of the -following methods. - -- Produce Kafka data with the Kafka command line - ``kafka-console-producer``. The following example generates data with - a value in DELIMITED format. - - .. code:: bash - - $ docker-compose exec kafka kafka-console-producer --topic t1 --broker-list kafka:29092 --property parse.key=true --property key.separator=: - - Your data input should resemble this. - - .. code:: bash - - key1:v1,v2,v3 - key2:v4,v5,v6 - key3:v7,v8,v9 - key1:v10,v11,v12 - -- Produce Kafka data with the Kafka command line - ``kafka-console-producer``. The following example generates data with - a value in JSON format. - - .. code:: bash - - $ docker-compose exec kafka kafka-console-producer --topic t2 --broker-list kafka:29092 --property parse.key=true --property key.separator=: - - Your data input should resemble this. - - .. code:: bash - - key1:{"id":"key1","col1":"v1","col2":"v2","col3":"v3"} - key2:{"id":"key2","col1":"v4","col2":"v5","col3":"v6"} - key3:{"id":"key3","col1":"v7","col2":"v8","col3":"v9"} - key1:{"id":"key1","col1":"v10","col2":"v11","col3":"v12"} - -Verify your environment -~~~~~~~~~~~~~~~~~~~~~~~ - -The next three steps are optional verification steps to ensure your -environment is properly setup. - -1. Verify that six Docker containers were created. - - .. code:: bash - - $ docker-compose ps - - Your output should resemble this. Take note of the ``Up`` state. - - .. code:: bash - - Name Command State Ports - ------------------------------------------------------------------------------------------------------------------------- - quickstart_kafka_1 /etc/confluent/docker/run Up 0.0.0.0:29092->29092/tcp, 0.0.0.0:9092->9092/tcp - quickstart_ksql-cli_1 perl -e while(1){ sleep 99 ... Up - quickstart_ksql-datagen-pageviews_1 bash -c echo Waiting for K ... Up - quickstart_ksql-datagen-users_1 bash -c echo Waiting for K ... Up - quickstart_schema-registry_1 /etc/confluent/docker/run Up 0.0.0.0:8081->8081/tcp - quickstart_zookeeper_1 /etc/confluent/docker/run Up 2181/tcp, 2888/tcp, 0.0.0.0:32181->32181/tcp, 3888/tcp - -2. The docker-compose file already runs a data generator that - pre-populates two Kafka topics ``pageviews`` and ``users`` with mock - data. Verify that the data generator created two Kafka topics, - including ``pageviews`` and ``users``. - - .. code:: bash - - $ docker-compose exec kafka kafka-topics --zookeeper zookeeper:32181 --list - - Your output should resemble this. - - .. code:: bash - - _confluent-metrics - _schemas - pageviews - users - -3. Use the ``kafka-console-consumer`` to view a few messages from each - topic. The topic ``pageviews`` has a key that is a mock time stamp - and a value that is in ``DELIMITED`` format. The topic ``users`` has - a key that is the user ID and a value that is in ``Json`` format. - - .. code:: bash - - $ docker-compose exec kafka kafka-console-consumer --topic pageviews --bootstrap-server kafka:29092 --from-beginning --max-messages 3 --property print.key=true - - Your output should resemble this. - - .. code:: bash - - 1491040409254 1491040409254,User_5,Page_70 - 1488611895904 1488611895904,User_8,Page_76 - 1504052725192 1504052725192,User_8,Page_92 - - .. code:: bash - - $ docker-compose exec kafka kafka-console-consumer --topic users --bootstrap-server kafka:29092 --from-beginning --max-messages 3 --property print.key=true - - Your output should resemble this. - - .. code:: bash - - User_2 {"registertime":1509789307038,"gender":"FEMALE","regionid":"Region_1","userid":"User_2"} - User_6 {"registertime":1498248577697,"gender":"OTHER","regionid":"Region_8","userid":"User_6"} - User_8 {"registertime":1494834474504,"gender":"MALE","regionid":"Region_5","userid":"User_8"} diff --git a/docs/quickstart/quickstart-non-docker.md b/docs/quickstart/quickstart-non-docker.md new file mode 100644 index 000000000000..8b2fa6021207 --- /dev/null +++ b/docs/quickstart/quickstart-non-docker.md @@ -0,0 +1,118 @@ +# Non-Docker Setup for KSQL + +| [Overview](/docs#ksql-documentation) |[Quick Start](/docs/quickstart#quick-start) | [Concepts](/docs/concepts.md#concepts) | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | [FAQ](/docs/faq.md#frequently-asked-questions) | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| + +This part of the quick start will guide you through the steps to setup a Kafka cluster and start KSQL for non-Docker environments. After you complete these steps, you can return to the [main Quick Start](/docs/quickstart#quick-start) and use KSQL to query the Kafka cluster. + +**Table of Contents** + +- [Start Kafka](#start-kafka) +- [Start KSQL](#start-ksql) +- [Produce topic data](#produce-topic-data) + +**Prerequisites:** +- KSQL is in developer preview. Do not run KSQL against a production cluster. +- [Confluent Platform 3.3.0](http://docs.confluent.io/current/installation.html) is installed. This installation includes a Kafka broker, ZooKeeper, Schema Registry, REST Proxy, and Kafka Connect. + - If you installed Confluent Platform via tar or zip, navigate into the installation directory. The paths and commands used throughout this quick start assume that your are in this installation directory. +- [Maven](https://maven.apache.org/install.html) +- [Git](https://git-scm.com/downloads) +- Java: Minimum version 1.8. Install Oracle Java JRE or JDK \>= 1.8 on your local machine + +## Start Kafka + +Navigate to the `confluent-3.3.0` directory and start the Confluent Platform using the new Confluent CLI (part of the free Confluent Open Source distribution). ZooKeeper is listening on `localhost:2181`, Kafka broker is listening on `localhost:9092`, and Confluent Schema Registry is listening on `localhost:8081`. + +```bash +$ ./bin/confluent start +``` + +Your output should resemble this. + +```bash +Starting zookeeper +zookeeper is [UP] +Starting kafka +kafka is [UP] +Starting schema-registry +schema-registry is [UP] +Starting kafka-rest +kafka-rest is [UP] +Starting connect +connect is [UP] +``` + +## Start KSQL + +1. Clone the Confluent KSQL repository. + + ```bash + $ git clone git@github.com:confluentinc/ksql.git + ``` + +1. Change directory to the `ksql` directory and compile the code. + + ```bash + $ cd ksql + $ mvn clean compile install -DskipTests + ``` + +1. Start KSQL. The `local` argument starts KSQL in [standalone mode](/docs/concepts.md#modes-of-operation). + + ```bash + $ ./bin/ksql-cli local + ``` + + After KSQL is started, your terminal should resemble this. + + ```bash + ksql> + ``` + +See the steps below to generate data to the Kafka cluster. + +## Produce topic data +Minimally, to use the [quick start exercises](/docs/quickstart#quick-start), you must run the following steps to produce data to the Kafka topics `pageviews` and `users`. + +1. Produce Kafka data to the `pageviews` topic using the data generator. The following example continuously generates data with a value in DELIMITED format. + + ```bash + $ java -jar ksql-examples/target/ksql-examples-4.0.0-SNAPSHOT-standalone.jar \ + quickstart=pageviews format=delimited topic=pageviews maxInterval=10000 + ``` + +1. Produce Kafka data to the `users` topic using the data generator. The following example continuously generates data with a value in JSON format. + + ```bash + $ java -jar ksql-examples/target/ksql-examples-4.0.0-SNAPSHOT-standalone.jar \ + quickstart=users format=json topic=users maxInterval=10000 + ``` + +Optionally, you can return to the [main KSQL quick start page](/docs/quickstart#quick-start) to start querying the Kafka cluster. Or you can do additional testing with topic data produced from the command line tools. + +1. You can produce Kafka data with the Kafka command line `kafka-console-producer`. The following example generates data with a value in DELIMITED format. + + ```bash + $ kafka-console-producer --broker-list localhost:9092 \ + --topic t1 \ + --property parse.key=true \ + --property key.separator=: + key1:v1,v2,v3 + key2:v4,v5,v6 + key3:v7,v8,v9 + key1:v10,v11,v12 + ``` + +1. This example generates data with a value in JSON format. + + ```bash + $ kafka-console-producer --broker-list localhost:9092 \ + --topic t2 \ + --property parse.key=true \ + --property key.separator=: + key1:{"id":"key1","col1":"v1","col2":"v2","col3":"v3"} + key2:{"id":"key2","col1":"v4","col2":"v5","col3":"v6"} + key3:{"id":"key3","col1":"v7","col2":"v8","col3":"v9"} + key1:{"id":"key1","col1":"v10","col2":"v11","col3":"v12"} + ``` + diff --git a/docs/quickstart/quickstart-non-docker.rst b/docs/quickstart/quickstart-non-docker.rst deleted file mode 100644 index da72f4398caf..000000000000 --- a/docs/quickstart/quickstart-non-docker.rst +++ /dev/null @@ -1,152 +0,0 @@ -.. _ksql_quickstart_non_docker: - -Running KSQL Locally -==================== - -This topic describes how to setup a Kafka cluster and start KSQL in your local environment. After you complete these steps, -you can return to the :ref:`create-a-stream-and-table` and start querying the data in the Kafka cluster. - -.. contents:: Contents - :local: - :depth: 1 - -Prerequisites - - :ref:`Confluent Platform 4.0.0 ` or later is installed. This installation includes a Kafka broker, ZooKeeper, Schema Registry, REST Proxy, and Kafka Connect. - - If you installed Confluent Platform via TAR or ZIP, navigate into the installation directory. The paths and commands used throughout this quick start assume that your are in this installation directory. - - `Maven `__ - - `Git `__ - - Java: Minimum version 1.8. Install Oracle Java JRE or JDK >= 1.8 on your local machine - -Start Kafka ------------ - -Navigate to the ``confluent-3.3.0`` directory and start the Confluent -Platform using the new Confluent CLI (part of the free Confluent Open -Source distribution). ZooKeeper is listening on ``localhost:2181``, -Kafka broker is listening on ``localhost:9092``, and Confluent Schema -Registry is listening on ``localhost:8081``. - -.. code:: bash - - $ /bin/confluent start - -Your output should resemble this. - -.. code:: bash - - Starting zookeeper - zookeeper is [UP] - Starting kafka - kafka is [UP] - Starting schema-registry - schema-registry is [UP] - Starting kafka-rest - kafka-rest is [UP] - Starting connect - connect is [UP] - -Start KSQL ----------- - -1. Clone the Confluent KSQL repository. - - .. code:: bash - - $ git clone git@github.com:confluentinc/ksql.git - -2. Change directory to the ``ksql`` directory and compile the code. - - .. code:: bash - - $ cd ksql - $ mvn clean compile install -DskipTests - -3. Start KSQL. The ``local`` argument starts KSQL in :ref:`standalone - mode `. - - .. code:: bash - - $ ./bin/ksql-cli local - - After you have successfully started the Kafka cluster and started - KSQL, you will see the KSQL prompt: - - .. code:: bash - - ====================================== - = _ __ _____ ____ _ = - = | |/ // ____|/ __ \| | = - = | ' /| (___ | | | | | = - = | < \___ \| | | | | = - = | . \ ____) | |__| | |____ = - = |_|\_\_____/ \___\_\______| = - = = - = Streaming SQL Engine for Kafka = - Copyright 2017 Confluent Inc. - - CLI v0.2, Server v0.1 located at http://localhost:9098 - - Having trouble? Type 'help' (case-insensitive) for a rundown of how things work! - - ksql> - -See the steps below to generate data to the Kafka cluster. - -.. _produce-topic-data: - -Produce topic data ------------------- - -Minimally, to use the :ref:`ksql_quickstart`, you must run the following -steps to produce data to the Kafka topics ``pageviews`` and ``users``. - -1. Produce Kafka data to the ``pageviews`` topic using the data - generator. The following example continuously generates data with a - value in DELIMITED format. - - .. code:: bash - - $ java -jar ksql-examples/target/ksql-examples-0.1-SNAPSHOT-standalone.jar \ - quickstart=pageviews format=delimited topic=pageviews maxInterval=10000 - -2. Produce Kafka data to the ``users`` topic using the data generator. - The following example continuously generates data with a value in - JSON format. - - .. code:: bash - - $ java -jar ksql-examples/target/ksql-examples-0.1-SNAPSHOT-standalone.jar \ - quickstart=users format=json topic=users maxInterval=10000 - -Optionally, you can return to the :ref:`main KSQL quick start -page ` to start querying the Kafka -cluster. Or you can do additional testing with topic data produced from -the command line tools. - -1. You can produce Kafka data with the Kafka command line - ``kafka-console-producer``. The following example generates data with - a value in DELIMITED format. - - .. code:: bash - - $ kafka-console-producer --broker-list localhost:9092 \ - --topic t1 \ - --property parse.key=true \ - --property key.separator=: - key1:v1,v2,v3 - key2:v4,v5,v6 - key3:v7,v8,v9 - key1:v10,v11,v12 - -2. This example generates data with a value in JSON format. - - .. code:: bash - - $ kafka-console-producer --broker-list localhost:9092 \ - --topic t2 \ - --property parse.key=true \ - --property key.separator=: - key1:{"id":"key1","col1":"v1","col2":"v2","col3":"v3"} - key2:{"id":"key2","col1":"v4","col2":"v5","col3":"v6"} - key3:{"id":"key3","col1":"v7","col2":"v8","col3":"v9"} - key1:{"id":"key1","col1":"v10","col2":"v11","col3":"v12"} diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 000000000000..c34c388b1086 --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,22 @@ +# Roadmap + +| [Overview](/docs#ksql-documentation) |[Quick Start](/docs/quickstart#quick-start) | [Concepts](/docs/concepts.md#concepts) | [Syntax Reference](/docs/syntax-reference.md#syntax-reference) |[Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | [FAQ](/docs/faq.md#frequently-asked-questions) | Roadmap | +|---|----|-----|----|----|----|----|----| + +* Improved quality, stability, and operations: We will continue to focus on refining the overall experience of working with KSQL. As such this will involve streamlining processes, further expand our testing efforts and improving visibility and feedback mechanisms. + + +* Support for ‘point-in-time’ SELECT. This feature will introduce the ability to retrieve a snapshot of the current state of a Table. In doing so making it possible to retrieve data snapshots at various times throughout the day. This would support the need for audits, ad hoc requests, reference tables and other use-cases. + + +* Support INSERT into STREAM. Inserting data directly into Streams will continue to lower the barrier to entry and complete the data-in, data-out semantics. + + +* Additional aggregate functions. We will continue to expand the set of analytics functions. If you have suggestions that you would like to see, please send them to the mailing list or create a [GitHub issue](https://github.com/confluentinc/ksql/issues). + + +* Testing tools. Many data-platforms suffer from an inherent inability to test. With KSQL testing capability is a primary focus and we will provide frameworks to support continuous integration and unit test. + + +* Scale stream processing via cluster mode and containers. We will release a set of Docker images and configuration that is targeted at running KSQL as a cluster using Docker Compose. + diff --git a/docs/syntax-reference.md b/docs/syntax-reference.md new file mode 100644 index 000000000000..d550b4f5345e --- /dev/null +++ b/docs/syntax-reference.md @@ -0,0 +1,557 @@ +# Syntax Reference + +| [Overview](/docs#ksql-documentation) | [Quick Start](/docs/quickstart#quick-start) | [Concepts](/docs/concepts.md#concepts) | Syntax Reference | [Demo](/ksql-clickstream-demo#clickstream-analysis) | [Examples](/docs/examples.md#examples) | [FAQ](/docs/faq.md#frequently-asked-questions) | [Roadmap](/docs/roadmap.md#roadmap) | +|---|----|-----|----|----|----|----|----| + + +The KSQL CLI provides a terminal-based interactive shell for running queries. + +**Table of Contents** + +- [CLI-specific commands](#cli-specific-commands) +- [KSQL statements](#ksql-statements) +- [Scalar functions](#scalar-functions) +- [Aggregate functions](#aggregate-functions) +- [Configuring KSQL](#configuring-ksql) + + +# CLI-specific commands + +Unlike KSQL statements such as `SELECT`, these commands are for setting a KSQL configuration, exiting the CLI, etc. +Run the CLI with `--help` to see the available options. + +**Tip:** You can search and browse your command history in the KSQL CLI with `Ctrl-R`. After pressing `Ctrl-R`, start +typing the command or any part of the command to show an auto-complete of past commands. + +``` +Description: + The KSQL CLI provides a terminal-based interactive shell for running queries. Each command must be on a separate + line. For KSQL command syntax, see the documentation at https://github.com/confluentinc/ksql/docs/. + +help: + Show this message. + +clear: + Clear the current terminal. + +output: + View the current output format. + +output : + Set the output format to (valid formats: 'JSON', 'TABULAR') + For example: "output JSON" + +history: + Show previous lines entered during the current CLI session. You can use up and down arrow keys to navigate to the + previous lines too. + +version: + Get the current KSQL version. + +exit: + Exit the CLI. + + +Default behavior: + + Lines are read one at a time and are sent to the server as KSQL unless one of the following is true: + + 1. The line is empty or entirely whitespace. In this case, no request is made to the server. + + 2. The line ends with backslash (`\`). In this case, lines are continuously read and stripped of their trailing + newline and `\` until one is encountered that does not end with `\`; then, the concatenation of all lines read + during this time is sent to the server as KSQL. +``` + + +# KSQL statements + +**Important:** + +* KSQL statements must be terminated with a semicolon (`;`). +* Multi-line statements: + * In the CLI you must use a back-slash (`\`) to indicate continuation of a statement on the next line. + * Do not use `\` for multi-line statements in `.sql` files. + + +### DESCRIBE + +**Synopsis** + +```sql +DESCRIBE (stream_name|table_name); +``` + +**Description** + +List the columns in a stream or table along with their data type and other attributes. + + +### CREATE STREAM + +**Synopsis** + +```sql +CREATE STREAM stream_name ( { column_name data_type } [, ...] ) + WITH ( property_name = expression [, ...] ); +``` + +**Description** + +Create a new stream with the specified columns and properties. + +The supported column data types are: + +* `BOOLEAN` +* `INTEGER` +* `BIGINT` +* `DOUBLE` +* `VARCHAR` (or `STRING`) +* `ARRAY` (JSON only) +* `MAP` (JSON only) + +KSQL adds the implicit columns `ROWTIME` and `ROWKEY` to every stream and table, which represent the +corresponding Kafka message timestamp and message key, respectively. + +The WITH clause supports the following properties: + +| Property | Description | +|-------------------------|--------------------------------------------------------------------------------------------| +| KAFKA_TOPIC (required) | The name of the Kafka topic that backs this stream. The topic must already exist in Kafka. | +| VALUE_FORMAT (required) | Specifies the serialization format of the message value in the topic. Supported formats: `JSON`, `DELIMITED` | +| KEY | Associates the message key in the Kafka topic with a column in the KSQL stream. | +| TIMESTAMP | Associates the message timestamp in the Kafka topic with a column in the KSQL stream. Time-based operations such as windowing will process a record according to this timestamp. | + +Example: + +```sql +CREATE STREAM pageviews (viewtime BIGINT, user_id VARCHAR, page_id VARCHAR) + WITH (VALUE_FORMAT = 'JSON', + KAFKA_TOPIC = 'my-pageviews-topic'); +``` + + +### CREATE TABLE + +**Synopsis** + +```sql +CREATE TABLE table_name ( { column_name data_type } [, ...] ) + WITH ( property_name = expression [, ...] ); +``` + +**Description** + +Create a new table with the specified columns and properties. + +The supported column data types are: + +* `BOOLEAN` +* `INTEGER` +* `BIGINT` +* `DOUBLE` +* `VARCHAR` (or `STRING`) +* `ARRAY` (JSON only) +* `MAP` (JSON only) + +KSQL adds the implicit columns `ROWTIME` and `ROWKEY` to every stream and table, which represent the +corresponding Kafka message timestamp and message key, respectively. + +The WITH clause supports the following properties: + +| Property | Description | +|-------------------------|--------------------------------------------------------------------------------------------| +| KAFKA_TOPIC (required) | The name of the Kafka topic that backs this table. The topic must already exist in Kafka. | +| VALUE_FORMAT (required) | Specifies the serialization format of the message value in the topic. Supported formats: `JSON`, `DELIMITED` | +| KEY | Associates the message key in the Kafka topic with a column in the KSQL table. | +| TIMESTAMP | Associates the message timestamp in the Kafka topic with a column in the KSQL table. Time-based operations such as windowing will process a record according to this timestamp. | + +Example: + +```sql +CREATE TABLE users (usertimestamp BIGINT, user_id VARCHAR, gender VARCHAR, region_id VARCHAR) + WITH (VALUE_FORMAT = 'JSON', + KAFKA_TOPIC = 'my-users-topic'); +``` + + +### CREATE STREAM AS SELECT + +**Synopsis** + +```sql +CREATE STREAM stream_name + [WITH ( property_name = expression [, ...] )] + AS SELECT select_expr [, ...] + FROM from_item [, ...] + [ WHERE condition ] + [PARTITION BY column_name]; +``` + +**Description** + +Create a new stream along with the corresponding Kafka topic, and continuously write the result of the SELECT query into +the stream and its corresponding topic. + +If the PARTITION BY clause is present, then the resulting stream will have the specified column as its key. + +The WITH clause supports the following properties: + +| Property | Description | +|-------------------------|--------------------------------------------------------------------------------------------| +| KAFKA_TOPIC | The name of the Kafka topic that backs this stream. If this property is not set, then the name of the stream will be used as default. | +| VALUE_FORMAT | Specifies the serialization format of the message value in the topic. Supported formats: `JSON`, `DELIMITED`. If this property is not set, then the format of the input stream/table will be used. | +| PARTITIONS | The number of partitions in the topic. If this property is not set, then the number of partitions of the input stream/table will be used. | +| REPLICATIONS | The replication factor for the topic. If this property is not set, then the number of replicas of the input stream/table will be used. | +| TIMESTAMP | Associates the message timestamp in the Kafka topic with a column in the KSQL stream. Time-based operations such as windowing will process a record according to this timestamp. | + +Note: The `KEY` property is not supported -- use PARTITION BY instead. + + +### CREATE TABLE AS SELECT + +**Synopsis** + +```sql +CREATE TABLE stream_name + [WITH ( property_name = expression [, ...] )] + AS SELECT select_expr [, ...] + FROM from_item [, ...] + [ WINDOW window_expression ] + [ WHERE condition ] + [ GROUP BY grouping_expression ] + [ HAVING having_expression ]; +``` + +**Description** + +Create a new KSQL table along with the corresponding Kafka topic and stream the result of the +SELECT query as a changelog into the topic. + +The WITH clause supports the following properties: + +| Property | Description | +|-------------------------|--------------------------------------------------------------------------------------------| +| KAFKA_TOPIC | The name of the Kafka topic that backs this table. If this property is not set, then the name of the table will be used as default. | +| VALUE_FORMAT | Specifies the serialization format of the message value in the topic. Supported formats: `JSON`, `DELIMITED`. If this property is not set, then the format of the input stream/table will be used. | +| PARTITIONS | The number of partitions in the topic. If this property is not set, then the number of partitions of the input stream/table will be used. | +| REPLICATIONS | The replication factor for the topic. If this property is not set, then the number of replicas of the input stream/table will be used. | +| TIMESTAMP | Associates the message timestamp in the Kafka topic with a column in the KSQL table. Time-based operations such as windowing will process a record according to this timestamp. | + + +### DROP STREAM + +**Synopsis** + +```sql +DROP STREAM stream_name; +``` + +**Description** + +Drops an existing stream. + + +### DROP TABLE + +**Synopsis** + +```sql +DROP TABLE table_name; +``` + +**Description** + +Drops an existing table. + + +### SELECT + +**Synopsis** + +```sql +SELECT select_expr [, ...] + FROM from_item [, ...] + [ WINDOW window_expression ] + [ WHERE condition ] + [ GROUP BY grouping_expression ] + [ HAVING having_expression ]; +``` + +**Description** + +Selects rows from a KSQL stream or table. The result of this statement will not be persisted in a + Kafka topic and will only be printed out in the console. To stop the continuous query in the CLI + press `Ctrl-C`. + +In the above statements from_item is one of the following: + +- `stream_name [ [ AS ] alias]` +- `table_name [ [ AS ] alias]` +- `from_item LEFT JOIN from_item ON join_condition` + +WHERE clause can refer to any column defined for a stream or table, including the two implicit columns `ROWTIME` +and `ROWKEY`. + +Example: + +```sql +SELECT * FROM pageviews + WHERE ROWTIME >= 1510923225000 + AND ROWTIME <= 1510923228000; +``` + +> Tip: If you want to select older data, you can configure KSQL to query the stream from the beginning. You must +> do this configuration before running the query: +> +> ```sql +> SET 'auto.offset.reset' = 'earliest'; +> ``` + +The WINDOW clause lets you control how to *group input records that have the same key* into so-called *windows* for +operations such as aggregations or joins. Windows are tracked per record key. KSQL supports the following WINDOW +types: + +* **TUMBLING**: + Tumbling windows group input records into fixed-sized, non-overlapping windows based on the records' timestamps. + You must specify the *window size* for tumbling windows. Note: Tumbling windows are a special case of hopping windows + where the window size is equal to the advance interval. + + Example: + + ```sql + SELECT item_id, SUM(quantity) + FROM orders + WINDOW TUMBLING (SIZE 20 SECONDS) + GROUP BY item_id; + ``` + +* **HOPPING**: + Hopping windows group input records into fixed-sized, (possibly) overlapping windows based on the records' timestamps. + You must specify the *window size* and the *advance interval* for hopping windows. + + Example: + + ```sql + SELECT item_id, SUM(quantity) + FROM orders + WINDOW HOPPING (SIZE 20 SECONDS, ADVANCE BY 5 SECONDS) + GROUP BY item_id; + ``` + +* **SESSION**: + Session windows group input records into so-called sessions. + You must specify the *session inactivity gap* parameter for session windows. + For example, imagine you set the inactivity gap to 5 minutes. If, for a given record key such as "alice", no new + input data arrives for more than 5 minutes, then the current session for "alice" is closed, and any newly arriving + data for "alice" in the future will mark the beginning of a new session. + + Example: + + ```sql + SELECT item_id, SUM(quantity) + FROM orders + WINDOW SESSION (20 SECONDS) + GROUP BY item_id; + ``` + +#### CAST + +**Synopsis** + +```sql +CAST (expression AS data_type); +``` + +You can cast an expression's type to a new type using CAST. Here is an example of converting a BIGINT into a VARCHAR +type: + +```sql +-- This query converts the numerical count into a suffixed string; e.g., 5 becomes '5_HELLO' +SELECT page_id, CONCAT(CAST(COUNT(*) AS VARCHAR), '_HELLO') + FROM pageviews_enriched + WINDOW TUMBLING (SIZE 20 SECONDS) + GROUP BY page_id; +``` + +#### LIKE + +**Synopsis** + +```sql +column_name LIKE pattern; +``` + +The LIKE operator is used for prefix or suffix matching. Currently KSQL supports `%`, which represents zero or more +characters. + +Example: + +```sql +SELECT user_id + FROM users + WHERE user_id LIKE 'santa%'; +``` + + +### SHOW TOPICS + +**Synopsis** + +```sql +SHOW | LIST TOPICS; +``` + +**Description** + +List the available topics in the Kafka cluster that KSQL is configured to connect to (default setting for +`bootstrap.servers`: `localhost:9092`). + + +### SHOW STREAMS + +**Synopsis** + +```sql +SHOW | LIST STREAMS; +``` + +**Description** + +List the defined streams. + + +### SHOW TABLES + +**Synopsis** + +```sql +SHOW | LIST TABLES; +``` + +**Description** + +List the defined tables. + + +### SHOW QUERIES + +**Synopsis** + +```sql +SHOW QUERIES; +``` + +**Description** + +List the running persistent queries. + + +### SHOW PROPERTIES + +**Synopsis** + +```sql +SHOW PROPERTIES; +``` + +**Description** + +List the [configuration settings](#configuring-ksql) that are currently in effect. + + +### TERMINATE + +**Synopsis** + +```sql +TERMINATE query_id; +``` + +**Description** + +Terminate a persistent query. Persistent queries run continuously until they are explicitly terminated. + +* In standalone mode, exiting the CLI will stop (think: "pause") any persistent queries because exiting the CLI will + also stop the KSQL server. When the CLI is restarted, the server will be restarted, too, and any previously defined + persistent queries will resume processing. +* In client-server mode, exiting the CLI will not stop persistent queries because the KSQL server(s) will continue to + process the queries. + +(To terminate a non-persistent query use `Ctrl-C` in the CLI.) + + +# Scalar functions + +| Function | Example | Description | +|---------------------|---------------------------------------------------------|--------------------------------------| +| ABS | `ABS(col1)` | The absolute value of a value | +| CEIL | `CEIL(col1)` | The ceiling of a value | +| CONCAT | `CONCAT(col1, '_hello')` | Concatenate two strings | +| EXTRACTJSONFIELD | `EXTRACTJSONFIELD(message, '$.log.cloud')` | Given a string column in JSON format, extract the field that matches |the given pattern. +| FLOOR | `FLOOR(col1)` | The floor of a value | +| LCASE | `LCASE(col1)` | Convert a string to lowercase | +| LEN | `LEN(col1)` | The length of a string | +| RANDOM | `RANDOM()` | Return a random DOUBLE value between 0 and 1.0 | +| ROUND | `ROUND(col1)` | Round a value to the nearest BIGINT value | +| STRINGTOTIMESTAMP | `STRINGTOTIMESTAMP(col1, 'yyyy-MM-dd HH:mm:ss.SSS')` | Converts a string value in the given format into the BIGINT value representing the timestamp. | +| SUBSTRING | `SUBSTRING(col1, 2, 5)` | Return the substring with the start and end indices | +| TIMESTAMPTOSTRING | `TIMESTAMPTOSTRING(ROWTIME, 'yyyy-MM-dd HH:mm:ss.SSS')` | Converts a BIGINT timestamp value into the string representation of the timestamp in the given format. | +| TRIM | `TRIM(col1)` | Trim the spaces from the beginning and end of a string | +| UCASE | `UCASE(col1)` | Convert a string to uppercase | + + +# Aggregate functions + +| Function | Example | Description | +|------------|---------------------------|--------------------------------------------------------| +| COUNT | `COUNT(col1)` | Count the number of rows | +| MAX | `MAX(col1)` | Return the maximum value for a given column and window | +| MIN | `MIN(col1)` | Return the minimum value for a given column and window | +| SUM | `SUM(col1)` | Sums the column values | + + +# Configuring KSQL + +You can set configuration properties for KSQL and your queries with the SET statement. This includes +[settings for Kafka's Streams API](https://kafka.apache.org/documentation/#streamsconfigs) +(e.g., `cache.max.bytes.buffering`) as well as +settings for Kafka's [producer client](https://kafka.apache.org/documentation/#producerconfigs) and +[consumer client](https://kafka.apache.org/documentation/#newconsumerconfigs) (e.g., `auto.offset.reset`). + +```sql +SET ''=''; +``` + +Examples: + +``` +ksql> SET 'auto.offset.reset'='earliest'; +ksql> SET 'commit.interval.ms'='5000'; +``` + +Both property name and property value should be enclosed in single quotes. + +> Tip: `SHOW PROPERTIES` shows the current settings. + +Once a property has been set, it will remain in effect for the remainder of the KSQL CLI session until you issue another +SET statement to change it. + +You can also use a *properties file* instead of the SET statement. The syntax of properties files follow Java +conventions, which are slightly different to the syntax of the SET statement above. + +```bash +# Show the example contents of a properties file +$ cat ksql.properties +auto.offset.reset=earliest + +# Start KSQL in standalone mode with the custom properties above +$ ksql-cli local --properties-file ./ksql.properties + +# Start a KSQL server node (for client-server mode) with the custom properties above +$ ksql-server-start ./ksql.properties +``` + +Note: Be careful when you are using KSQL in Docker because the properties file must be available inside the Docker +container. If you don't want to customize your Docker setup so that it contains an appropriate properties file, you +should not use a properties file but the SET statement. diff --git a/docs/syntax-reference.rst b/docs/syntax-reference.rst deleted file mode 100644 index 4a83a44e7e52..000000000000 --- a/docs/syntax-reference.rst +++ /dev/null @@ -1,649 +0,0 @@ -.. _ksql_syntax_reference: - -Syntax Reference -================ - -The KSQL CLI provides a terminal-based interactive shell for running -queries. - -.. contents:: Contents - :local: - :depth: 1 - -===================== -CLI-specific commands -===================== - -Unlike KSQL statements such as ``SELECT``, these commands are for -setting a KSQL configuration, exiting the CLI, etc. Run the CLI with -``--help`` to see the available options. - -**Tip:** You can search and browse your command history in the KSQL CLI -with ``Ctrl-R``. After pressing ``Ctrl-R``, start typing the command or -any part of the command to show an auto-complete of past commands. - -.. code:: bash - - Description: - The KSQL CLI provides a terminal-based interactive shell for running queries. Each command must be on a separate - line. For KSQL command syntax, see the documentation at https://github.com/confluentinc/ksql/docs/. - - help: - Show this message. - - clear: - Clear the current terminal. - - output: - View the current output format. - - output : - Set the output format to (valid formats: 'JSON', 'TABULAR') - For example: "output JSON" - - history: - Show previous lines entered during the current CLI session. You can use up and down arrow keys to navigate to the - previous lines too. - - version: - Get the current KSQL version. - - exit: - Exit the CLI. - - - Default behavior: - - Lines are read one at a time and are sent to the server as KSQL unless one of the following is true: - - 1. The line is empty or entirely whitespace. In this case, no request is made to the server. - - 2. The line ends with backslash (`\`). In this case, lines are continuously read and stripped of their trailing - newline and `\` until one is encountered that does not end with `\`; then, the concatenation of all lines read - during this time is sent to the server as KSQL. - -=============== -KSQL statements -=============== - -.. tip:: - - - KSQL statements must be terminated with a semicolon (``;``). - - Multi-line statements: - - - In the CLI you must use a backslash (``\``) to indicate - continuation of a statement on the next line. - - Do not use ``\`` for multi-line statements in ``.sql`` files. - - -.. contents:: Available KSQL statements: - :local: - :depth: 1 - -DESCRIBE --------- - -**Synopsis** - -.. code:: sql - - DESCRIBE (stream_name|table_name); - -**Description** - -List the columns in a stream or table along with their data type and -other attributes. - -CREATE STREAM -------------- - -**Synopsis** - -.. code:: sql - - CREATE STREAM stream_name ( { column_name data_type } [, ...] ) - WITH ( property_name = expression [, ...] ); - -**Description** - -Create a new stream with the specified columns and properties. - -The supported column data types are: - -- ``BOOLEAN`` -- ``INTEGER`` -- ``BIGINT`` -- ``DOUBLE`` -- ``VARCHAR`` (or ``STRING``) -- ``ARRAY`` (JSON only) -- ``MAP`` (JSON only) - -KSQL adds the implicit columns ``ROWTIME`` and ``ROWKEY`` to every -stream and table, which represent the corresponding Kafka message -timestamp and message key, respectively. - -The WITH clause supports the following properties: - -+--------------+-------------------------------------------------------+ -| Property | Description | -+==============+=======================================================+ -| KAFKA_TOPIC | The name of the Kafka topic that backs this stream. | -| (required) | The topic must already exist in Kafka. | -+--------------+-------------------------------------------------------+ -| VALUE_FORMAT | Specifies the serialization format of the message | -| (required) | value in the topic. Supported formats: ``JSON``, | -| | ``DELIMITED`` | -+--------------+-------------------------------------------------------+ -| KEY | Associates the message key in the Kafka topic with a | -| | column in the KSQL stream. | -+--------------+-------------------------------------------------------+ -| TIMESTAMP | Associates the message timestamp in the Kafka topic | -| | with a column in the KSQL stream. Time-based | -| | operations such as windowing will process a record | -| | according to this timestamp. | -+--------------+-------------------------------------------------------+ - -Example: - -.. code:: sql - - CREATE STREAM pageviews (viewtime BIGINT, user_id VARCHAR, page_id VARCHAR) - WITH (VALUE_FORMAT = 'JSON', - KAFKA_TOPIC = 'my-pageviews-topic'); - -CREATE TABLE ------------- - -**Synopsis** - -.. code:: sql - - CREATE TABLE table_name ( { column_name data_type } [, ...] ) - WITH ( property_name = expression [, ...] ); - -**Description** - -Create a new table with the specified columns and properties. - -The supported column data types are: - -- ``BOOLEAN`` -- ``INTEGER`` -- ``BIGINT`` -- ``DOUBLE`` -- ``VARCHAR`` (or ``STRING``) -- ``ARRAY`` (JSON only) -- ``MAP`` (JSON only) - -KSQL adds the implicit columns ``ROWTIME`` and ``ROWKEY`` to every -stream and table, which represent the corresponding Kafka message -timestamp and message key, respectively. - -The WITH clause supports the following properties: - -+--------------+-------------------------------------------------------+ -| Property | Description | -+==============+=======================================================+ -| KAFKA_TOPIC | The name of the Kafka topic that backs this table. | -| (required) | The topic must already exist in Kafka. | -+--------------+-------------------------------------------------------+ -| VALUE_FORMAT | Specifies the serialization format of the message | -| (required) | value in the topic. Supported formats: ``JSON``, | -| | ``DELIMITED`` | -+--------------+-------------------------------------------------------+ -| KEY | Associates the message key in the Kafka topic with a | -| | column in the KSQL table. | -+--------------+-------------------------------------------------------+ -| TIMESTAMP | Associates the message timestamp in the Kafka topic | -| | with a column in the KSQL table. Time-based | -| | operations such as windowing will process a record | -| | according to this timestamp. | -+--------------+-------------------------------------------------------+ - -Example: - -.. code:: sql - - CREATE TABLE users (usertimestamp BIGINT, user_id VARCHAR, gender VARCHAR, region_id VARCHAR) - WITH (VALUE_FORMAT = 'JSON', - KAFKA_TOPIC = 'my-users-topic'); - -CREATE STREAM AS SELECT ------------------------ - -**Synopsis** - -.. code:: sql - - CREATE STREAM stream_name - [WITH ( property_name = expression [, ...] )] - AS SELECT select_expr [, ...] - FROM from_item [, ...] - [ WHERE condition ] - [PARTITION BY column_name]; - -**Description** - -Create a new stream along with the corresponding Kafka topic, and -continuously write the result of the SELECT query into the stream and -its corresponding topic. - -If the PARTITION BY clause is present, then the resulting stream will -have the specified column as its key. - -The WITH clause supports the following properties: - -+--------------+-------------------------------------------------------+ -| Property | Description | -+==============+=======================================================+ -| KAFKA_TOPIC | The name of the Kafka topic that backs this stream. | -| | If this property is not set, then the name of the | -| | stream will be used as default. | -+--------------+-------------------------------------------------------+ -| VALUE_FORMAT | Specifies the serialization format of the message | -| | value in the topic. Supported formats: ``JSON``, | -| | ``DELIMITED``. If this property is not set, then the | -| | format of the input stream/table will be used. | -+--------------+-------------------------------------------------------+ -| PARTITIONS | The number of partitions in the topic. If this | -| | property is not set, then the number of partitions of | -| | the input stream/table will be used. | -+--------------+-------------------------------------------------------+ -| REPLICATIONS | The replication factor for the topic. If this | -| | property is not set, then the number of replicas of | -| | the input stream/table will be used. | -+--------------+-------------------------------------------------------+ -| TIMESTAMP | Associates the message timestamp in the Kafka topic | -| | with a column in the KSQL stream. Time-based | -| | operations such as windowing will process a record | -| | according to this timestamp. | -+--------------+-------------------------------------------------------+ - -Note: The ``KEY`` property is not supported – use PARTITION BY instead. - -CREATE TABLE AS SELECT ----------------------- - -**Synopsis** - -.. code:: sql - - CREATE TABLE stream_name - [WITH ( property_name = expression [, ...] )] - AS SELECT select_expr [, ...] - FROM from_item [, ...] - [ WINDOW window_expression ] - [ WHERE condition ] - [ GROUP BY grouping_expression ] - [ HAVING having_expression ]; - -**Description** - -Create a new KSQL table along with the corresponding Kafka topic and -stream the result of the SELECT query as a changelog into the topic. - -The WITH clause supports the following properties: - -+--------------+-------------------------------------------------------+ -| Property | Description | -+==============+=======================================================+ -| KAFKA_TOPIC | The name of the Kafka topic that backs this table. If | -| | this property is not set, then the name of the table | -| | will be used as default. | -+--------------+-------------------------------------------------------+ -| VALUE_FORMAT | Specifies the serialization format of the message | -| | value in the topic. Supported formats: ``JSON``, | -| | ``DELIMITED``. If this property is not set, then the | -| | format of the input stream/table will be used. | -+--------------+-------------------------------------------------------+ -| PARTITIONS | The number of partitions in the topic. If this | -| | property is not set, then the number of partitions of | -| | the input stream/table will be used. | -+--------------+-------------------------------------------------------+ -| REPLICATIONS | The replication factor for the topic. If this | -| | property is not set, then the number of replicas of | -| | the input stream/table will be used. | -+--------------+-------------------------------------------------------+ -| TIMESTAMP | Associates the message timestamp in the Kafka topic | -| | with a column in the KSQL table. Time-based | -| | operations such as windowing will process a record | -| | according to this timestamp. | -+--------------+-------------------------------------------------------+ - -DROP STREAM ------------ - -**Synopsis** - -.. code:: sql - - DROP STREAM stream_name; - -**Description** - -Drops an existing stream. - -DROP TABLE ----------- - -**Synopsis** - -.. code:: sql - - DROP TABLE table_name; - -**Description** - -Drops an existing table. - -SELECT ------- - -**Synopsis** - -.. code:: sql - - SELECT select_expr [, ...] - FROM from_item [, ...] - [ WINDOW window_expression ] - [ WHERE condition ] - [ GROUP BY grouping_expression ] - [ HAVING having_expression ]; - -**Description** - -Selects rows from a KSQL stream or table. The result of this statement -will not be persisted in a Kafka topic and will only be printed out in -the console. To stop the continuous query in the CLI press ``Ctrl-C``. - -In the above statements from_item is one of the following: - -- ``stream_name [ [ AS ] alias]`` -- ``table_name [ [ AS ] alias]`` -- ``from_item LEFT JOIN from_item ON join_condition`` - -The WHERE clause can refer to any column defined for a stream or table, including the two implicit columns `ROWTIME` -and `ROWKEY`. - -Example: - -.. code:: sql - - SELECT * FROM pageviews - WHERE ROWTIME >= 1510923225000 - AND ROWTIME <= 1510923228000; - -**Tip:** If you want to select older data, you can configure KSQL to query the stream from the beginning. You must -run this configuration before running the query: - -.. code:: sql - - SET 'auto.offset.reset' = 'earliest'; - -The WINDOW clause lets you control how to *group input records that have -the same key* into so-called *windows* for operations such as -aggregations or joins. Windows are tracked per record key. KSQL supports -the following WINDOW types: - -- **TUMBLING**: Tumbling windows group input records into fixed-sized, - non-overlapping windows based on the records’ timestamps. You must - specify the *window size* for tumbling windows. Note: Tumbling - windows are a special case of hopping windows where the window size - is equal to the advance interval. - - Example: - - .. code:: sql - - SELECT item_id, SUM(quantity) - FROM orders - WINDOW TUMBLING (SIZE 20 SECONDS) - GROUP BY item_id; - -- **HOPPING**: Hopping windows group input records into fixed-sized, - (possibly) overlapping windows based on the records’ timestamps. You - must specify the *window size* and the *advance interval* for hopping - windows. - - Example: - - .. code:: sql - - SELECT item_id, SUM(quantity) - FROM orders - WINDOW HOPPING (SIZE 20 SECONDS, ADVANCE BY 5 SECONDS) - GROUP BY item_id; - -- **SESSION**: Session windows group input records into so-called - sessions. You must specify the *session inactivity gap* parameter for - session windows. For example, imagine you set the inactivity gap to 5 - minutes. If, for a given record key such as “alice”, no new input - data arrives for more than 5 minutes, then the current session for - “alice” is closed, and any newly arriving data for “alice” in the - future will mark the beginning of a new session. - - Example: - - .. code:: sql - - SELECT item_id, SUM(quantity) - FROM orders - WINDOW SESSION (20 SECONDS) - GROUP BY item_id; - -CAST -~~~~ - -**Synopsis** - -.. code:: sql - - CAST (expression AS data_type); - -You can cast an expression’s type to a new type using CAST. Here is an -example of converting a BIGINT into a VARCHAR type: - -.. code:: sql - - -- This query converts the numerical count into a suffixed string; e.g., 5 becomes '5_HELLO' - SELECT page_id, CONCAT(CAST(COUNT(*) AS VARCHAR), '_HELLO') - FROM pageviews_enriched - WINDOW TUMBLING (SIZE 20 SECONDS) - GROUP BY page_id; - -LIKE -~~~~ - -**Synopsis** - -.. code:: sql - - column_name LIKE pattern; - -The LIKE operator is used for prefix or suffix matching. Currently KSQL -supports ``%``, which represents zero or more characters. - -Example: - -.. code:: sql - - SELECT user_id - FROM users - WHERE user_id LIKE 'santa%'; - -SHOW TOPICS ------------ - -**Synopsis** - -.. code:: sql - - SHOW | LIST TOPICS; - -**Description** - -List the available topics in the Kafka cluster that KSQL is configured -to connect to (default setting for ``bootstrap.servers``: -``localhost:9092``). - -SHOW STREAMS ------------- - -**Synopsis** - -.. code:: sql - - SHOW | LIST STREAMS; - -**Description** - -List the defined streams. - -SHOW TABLES ------------ - -**Synopsis** - -.. code:: sql - - SHOW | LIST TABLES; - -**Description** - -List the defined tables. - -SHOW QUERIES ------------- - -**Synopsis** - -.. code:: sql - - SHOW QUERIES; - -**Description** - -List the running persistent queries. - -SHOW PROPERTIES ---------------- - -**Synopsis** - -.. code:: sql - - SHOW PROPERTIES; - -**Description** - -List the :ref:`configuration settings ` that are -currently in effect. - -TERMINATE ---------- - -**Synopsis** - -.. code:: sql - - TERMINATE query_id; - -**Description** - -Terminate a persistent query. Persistent queries run continuously until -they are explicitly terminated. - -- In standalone mode, exiting the CLI will stop (think: “pause”) any - persistent queries because exiting the CLI will also stop the KSQL - server. When the CLI is restarted, the server will be restarted, too, - and any previously defined persistent queries will resume processing. -- In client-server mode, exiting the CLI will not stop persistent - queries because the KSQL server(s) will continue to process the - queries. - -(To terminate a non-persistent query use ``Ctrl-C`` in the CLI.) - -================ -Scalar functions -================ - -+------------+----------------------------------+----------------------+ -| Function | Example | Description | -+============+==================================+======================+ -| ABS | ``ABS(col1)`` | The absolute value | -| | | of a value | -+------------+----------------------------------+----------------------+ -| CEIL | ``CEIL(col1)`` | The ceiling of a | -| | | value | -+------------+----------------------------------+----------------------+ -| CONCAT | ``CONCAT(col1, '_hello')`` | Concatenate two | -| | | strings | -+------------+----------------------------------+----------------------+ -| EXTRACTJSO | ``EXTRACTJSONFIELD(message, '$.l | Given a string | -| NFIELD | og.cloud')`` | column in JSON | -| | | format, extract the | -| | | field that matches | -+------------+----------------------------------+----------------------+ -| FLOOR | ``FLOOR(col1)`` | The floor of a value | -+------------+----------------------------------+----------------------+ -| LCASE | ``LCASE(col1)`` | Convert a string to | -| | | lowercase | -+------------+----------------------------------+----------------------+ -| LEN | ``LEN(col1)`` | The length of a | -| | | string | -+------------+----------------------------------+----------------------+ -| RANDOM | ``RANDOM()`` | Return a random | -| | | DOUBLE value between | -| | | 0 and 1.0 | -+------------+----------------------------------+----------------------+ -| ROUND | ``ROUND(col1)`` | Round a value to the | -| | | nearest BIGINT value | -+------------+----------------------------------+----------------------+ -| STRINGTOTI | ``STRINGTOTIMESTAMP(col1, 'yyyy- | Converts a string | -| MESTAMP | MM-dd HH:mm:ss.SSS')`` | value in the given | -| | | format into the | -| | | BIGINT value | -| | | representing the | -| | | timestamp. | -+------------+----------------------------------+----------------------+ -| SUBSTRING | ``SUBSTRING(col1, 2, 5)`` | Return the substring | -| | | with the start and | -| | | end indices | -+------------+----------------------------------+----------------------+ -| TIMESTAMPT | ``TIMESTAMPTOSTRING(ROWTIME, 'yy | Converts a BIGINT | -| OSTRING | yy-MM-dd HH:mm:ss.SSS')`` | timestamp value into | -| | | the string | -| | | representation of | -| | | the timestamp in the | -| | | given format. | -+------------+----------------------------------+----------------------+ -| TRIM | ``TRIM(col1)`` | Trim the spaces from | -| | | the beginning and | -| | | end of a string | -+------------+----------------------------------+----------------------+ -| UCASE | ``UCASE(col1)`` | Convert a string to | -| | | uppercase | -+------------+----------------------------------+----------------------+ - -=================== -Aggregate functions -=================== - -+-----------------------+-----------------------+-----------------------+ -| Function | Example | Description | -+=======================+=======================+=======================+ -| COUNT | ``COUNT(col1)`` | Count the number of | -| | | rows | -+-----------------------+-----------------------+-----------------------+ -| MAX | ``MAX(col1)`` | Return the maximum | -| | | value for a given | -| | | column and window | -+-----------------------+-----------------------+-----------------------+ -| MIN | ``MIN(col1)`` | Return the minimum | -| | | value for a given | -| | | column and window | -+-----------------------+-----------------------+-----------------------+ -| SUM | ``SUM(col1)`` | Sums the column | -| | | values | -+-----------------------+-----------------------+-----------------------+ -