From ee63ce8c3f8d74fd06f7f38d371f397f976597c7 Mon Sep 17 00:00:00 2001 From: I-am-a-robot Date: Fri, 15 Oct 2021 10:06:27 +0800 Subject: [PATCH] update product docs into website. --- content/en-us/docs/docs/admin/meta-store.md | 2 + .../docs/docs/admin/reliable-execution.md | 3 +- content/en-us/docs/docs/admin/spill.md | 8 +- content/en-us/docs/docs/admin/state-store.md | 2 +- content/en-us/docs/docs/connector/hana.md | 8 +- .../docs/docs/connector/kafka-tutorial.md | 2 +- content/en-us/docs/docs/connector/kylin.md | 43 ++++ content/en-us/docs/docs/connector/memory.md | 136 ++++++++--- .../en-us/docs/docs/connector/opengauss.md | 2 + content/en-us/docs/docs/connector/tpch.md | 2 +- content/en-us/docs/docs/connector/vdm.md | 2 +- content/en-us/docs/docs/develop/connectors.md | 2 +- content/en-us/docs/docs/develop/functions.md | 2 +- .../en-us/docs/docs/develop/star-tree-cube.md | 145 ------------ .../images/cube-logical-plan-optimizer.png | Bin 0 -> 38432 bytes .../docs/images/memory-connector-design.png | Bin 0 -> 109366 bytes .../memory-connector-overall-design.png | Bin 88463 -> 0 bytes content/en-us/docs/docs/indexer/bloom.md | 11 + content/en-us/docs/docs/indexer/btree.md | 6 +- .../docs/docs/indexer/hindex-statements.md | 19 +- content/en-us/docs/docs/indexer/overview.md | 180 ++++++++++---- .../en-us/docs/docs/migration/from-hive.md | 2 +- .../docs/migration/hetu-hive-functions.md | 4 +- .../docs/docs/optimizer/table-pushdown.md | 2 +- content/en-us/docs/docs/preagg/overview.md | 221 ++++++++++++++++++ content/en-us/docs/docs/preagg/statements.md | 175 ++++++++++++++ .../docs/releasenotes/releasenotes-0.1.0.md | 2 +- .../docs/releasenotes/releasenotes-1.0.0.md | 2 +- .../docs/releasenotes/releasenotes-1.0.1.md | 2 +- .../docs/releasenotes/releasenotes-1.1.0.md | 2 +- .../docs/releasenotes/releasenotes-1.2.0.md | 2 +- .../docs/releasenotes/releasenotes-1.3.0.md | 2 +- .../docs/releasenotes/releasenotes-1.4.0.md | 26 +++ content/en-us/docs/docs/sql/create-cube.md | 69 ------ content/en-us/docs/docs/sql/drop-cube.md | 33 --- content/en-us/docs/docs/sql/insert-cube.md | 44 ---- .../docs/docs/sql/insert-overwrite-cube.md | 28 --- content/en-us/docs/docs/sql/show-cubes.md | 35 --- content/en-us/docs/menu/index.md | 25 +- content/zh-cn/docs/docs/admin/meta-store.md | 2 + .../zh-cn/docs/docs/admin/resource-groups.md | 161 ++++++++----- content/zh-cn/docs/docs/connector/Hudi.md | 2 +- content/zh-cn/docs/docs/connector/kylin.md | 36 +++ content/zh-cn/docs/docs/connector/memory.md | 99 ++++++-- content/zh-cn/docs/docs/connector/mongodb.md | 3 +- .../zh-cn/docs/docs/connector/opengauss.md | 2 + .../zh-cn/docs/docs/develop/star-tree-cube.md | 70 ------ content/zh-cn/docs/docs/faq/faq.md | 5 + .../images/cube-logical-plan-optimizer.png | Bin 0 -> 38432 bytes .../docs/images/memory-connector-design.png | Bin 0 -> 109366 bytes .../memory-connector-overall-design.png | Bin 88463 -> 0 bytes content/zh-cn/docs/docs/indexer/bloom.md | 10 + content/zh-cn/docs/docs/indexer/btree.md | 6 +- .../docs/docs/indexer/hindex-statements.md | 18 +- content/zh-cn/docs/docs/indexer/overview.md | 166 ++++++++++--- .../docs/docs/installation/deployment-auto.md | 3 + .../docs/migration/hetu-hive-functions.md | 4 +- content/zh-cn/docs/docs/preagg/overview.md | 221 ++++++++++++++++++ content/zh-cn/docs/docs/preagg/statements.md | 175 ++++++++++++++ .../docs/releasenotes/releasenotes-0.1.0.md | 2 +- .../docs/releasenotes/releasenotes-1.0.0.md | 2 +- .../docs/releasenotes/releasenotes-1.0.1.md | 2 +- .../docs/releasenotes/releasenotes-1.1.0.md | 2 +- .../docs/releasenotes/releasenotes-1.2.0.md | 2 +- .../docs/releasenotes/releasenotes-1.3.0.md | 2 +- .../docs/releasenotes/releasenotes-1.4.0.md | 25 ++ content/zh-cn/docs/docs/sql/create-cube.md | 51 ---- content/zh-cn/docs/docs/sql/drop-cube.md | 27 --- content/zh-cn/docs/docs/sql/insert-cube.md | 55 ----- .../docs/docs/sql/insert-overwrite-cube.md | 22 -- content/zh-cn/docs/docs/sql/show-cubes.md | 29 --- content/zh-cn/docs/menu/index.md | 19 +- 72 files changed, 1620 insertions(+), 854 deletions(-) create mode 100644 content/en-us/docs/docs/connector/kylin.md delete mode 100644 content/en-us/docs/docs/develop/star-tree-cube.md create mode 100644 content/en-us/docs/docs/images/cube-logical-plan-optimizer.png create mode 100644 content/en-us/docs/docs/images/memory-connector-design.png delete mode 100644 content/en-us/docs/docs/images/memory-connector-overall-design.png create mode 100644 content/en-us/docs/docs/preagg/overview.md create mode 100644 content/en-us/docs/docs/preagg/statements.md create mode 100644 content/en-us/docs/docs/releasenotes/releasenotes-1.4.0.md delete mode 100644 content/en-us/docs/docs/sql/create-cube.md delete mode 100644 content/en-us/docs/docs/sql/drop-cube.md delete mode 100644 content/en-us/docs/docs/sql/insert-cube.md delete mode 100644 content/en-us/docs/docs/sql/insert-overwrite-cube.md delete mode 100644 content/en-us/docs/docs/sql/show-cubes.md create mode 100644 content/zh-cn/docs/docs/connector/kylin.md delete mode 100644 content/zh-cn/docs/docs/develop/star-tree-cube.md create mode 100644 content/zh-cn/docs/docs/images/cube-logical-plan-optimizer.png create mode 100644 content/zh-cn/docs/docs/images/memory-connector-design.png delete mode 100644 content/zh-cn/docs/docs/images/memory-connector-overall-design.png create mode 100644 content/zh-cn/docs/docs/preagg/overview.md create mode 100644 content/zh-cn/docs/docs/preagg/statements.md create mode 100644 content/zh-cn/docs/docs/releasenotes/releasenotes-1.4.0.md delete mode 100644 content/zh-cn/docs/docs/sql/create-cube.md delete mode 100644 content/zh-cn/docs/docs/sql/drop-cube.md delete mode 100644 content/zh-cn/docs/docs/sql/insert-cube.md delete mode 100644 content/zh-cn/docs/docs/sql/insert-overwrite-cube.md delete mode 100644 content/zh-cn/docs/docs/sql/show-cubes.md diff --git a/content/en-us/docs/docs/admin/meta-store.md b/content/en-us/docs/docs/admin/meta-store.md index 0aa9b7e..48ed991 100644 --- a/content/en-us/docs/docs/admin/meta-store.md +++ b/content/en-us/docs/docs/admin/meta-store.md @@ -16,6 +16,7 @@ hetu.metastore.type=jdbc hetu.metastore.db.url=jdbc:mysql://.... hetu.metastore.db.user=root hetu.metastore.db.password=123456 +hetu.metastore.cache.type=local ``` The above properties are described below: @@ -24,6 +25,7 @@ The above properties are described below: - `hetu.metastore.db.url`:URL of RDBMS to connect to. - `hetu.metastore.db.user` :User name of RDBMS to connect to. - `hetu.metastore.db.password` :Password of RDBMS to connect to. +- `hetu.metastore.cache.type` : Select the cache model, where local is the local cache and global is the distributed cache. ### HDFS Storage diff --git a/content/en-us/docs/docs/admin/reliable-execution.md b/content/en-us/docs/docs/admin/reliable-execution.md index 7d5aa11..4e506ad 100644 --- a/content/en-us/docs/docs/admin/reliable-execution.md +++ b/content/en-us/docs/docs/admin/reliable-execution.md @@ -19,6 +19,7 @@ Distributed snapshot is most useful for long running queries. It is disabled by To be able to resume execution from a previously saved snapshot, there must be a sufficient number of workers available so that all previous tasks can be restored. To enable distributed snapshot for a query, the following is required: - at least 2 workers +- at least 50% more available cluster-wide memory resources with tolerance for worker node failure. If constrained by memory, not all queries may be able to recover (see [I44RMW](https://e.gitee.com/open_lookeng/issues/list?issue=I44RMW)) - at least 80% (rounded down) of previously available workers still active for the resume to be successful. If not enough workers are available, the query will not be able to resume from any previous snapshot, so the query reruns from the beginning. @@ -46,7 +47,7 @@ Snapshot data is stored in a file system as specified using the `hetu.experiment Snapshot files are stored under `/tmp/hetu/snapshot/` folder of the file system. All workers must be authorized to read and write to this folder. -Snapshots reflect states in query execution, potentially becoming very large in size and varying significantly from query to query. For example, queries that need to buffer large amounts of data (typically involving ordering, window, join, aggregation, etc. operations), may result in snapshots that include data from an entire table. Ensure that the shared file system has sufficient space available to save these snapshots before proceeding. +Snapshots reflect states in query execution, potentially becoming very large in size and varying significantly from query to query. For example, queries that need to buffer large amounts of data (typically involving ordering, window, join, aggregation, etc. operations), may result in snapshots that include data from an entire table. Ensure that the cluster has enough memory to process the snapshots and the shared file system has sufficient disk space available to store these snapshots before proceeding. Each query execution may produce multiple snapshots. Contents of these snapshots may overlap. Currently they are stored as separate files. In the future, "incremental snapshots" feature may be introduced to save storage space. diff --git a/content/en-us/docs/docs/admin/spill.md b/content/en-us/docs/docs/admin/spill.md index d698ec2..4db2f8a 100644 --- a/content/en-us/docs/docs/admin/spill.md +++ b/content/en-us/docs/docs/admin/spill.md @@ -12,7 +12,7 @@ Properties related to spilling are described in `tuning-spilling`. ## Memory Management and Spill -By default, openLooKeng kills queries if the memory requested by the query execution exceeds session properties `query_max_memory` or `query_max_memory_per_node`. This mechanism ensures fairness in allocation of memory to queries and prevents deadlock caused by memory allocation. It is efficient when there is a lot of small queries in the cluster, but leads to killing large queries that don\'t stay within the limits. +By default, openLooKeng kills queries if the memory requested by the query execution exceeds session properties `query_max_memory` or `query_max_memory_per_node`. This mechanism ensures fairness in allocation of memory to queries and prevents deadlock caused by memory allocation. It is efficient when there are lots of small queries in the cluster, but leads to killing large queries that don\'t stay within the limits. To overcome this inefficiency, the concept of revocable memory was introduced. A query can request memory that does not count toward the limits, but this memory can be revoked by the memory manager at any time. When memory is revoked, the query runner spills intermediate data from memory to disk and continues to process it later. @@ -64,15 +64,15 @@ With this mechanism, the peak memory used by the join operator can be decreased ### Aggregations Aggregation functions perform an operation on a group of values and return one value. If the number of groups you\'re aggregating over is large, a significant amount of memory may be needed. When spill-to-disk -is enabled, if there is not enough memory, intermediate cumulated aggregation results are written to disk. They are loaded back and merged with a lower memory footprint. +is enabled, if there is not enough memory, intermediate accumulated aggregation results are written to disk. They are loaded back and merged with a lower memory footprint. ### Order By -If you're trying to sort a larger amount of data, a significant amount of memory may be needed. When spill to disk for order by is enabled, if there is not enough memory, intemediate sorted results are written to disk. They are loaded back and merged with a lower memory footprint. +If you're trying to sort a larger amount of data, a significant amount of memory may be needed. When spill to disk for order by is enabled, if there is not enough memory, intermediate sorted results are written to disk. They are loaded back and merged with a lower memory footprint. ### Window functions -Window Functions perform an operators over a window of rows and return one value for each row. If this window of rows is large, a significant amount of memory may be needed. When spill to disk for window functions is enabled, if there is not enough memory, intemediate sorted results are written to disk. They are loaded back and merged when memory is available. There is a current limitation that spill will not work in all cases such as when a single window is very large. +Window Functions perform an operators over a window of rows and return one value for each row. If this window of rows is large, a significant amount of memory may be needed. When spill to disk for window functions is enabled, if there is not enough memory, intermediate sorted results are written to disk. They are loaded back and merged when memory is available. There is a current limitation that spill will not work in all cases such as when a single window is very large. ### Reuse Exchange diff --git a/content/en-us/docs/docs/admin/state-store.md b/content/en-us/docs/docs/admin/state-store.md index b79cfbf..fcc6f01 100644 --- a/content/en-us/docs/docs/admin/state-store.md +++ b/content/en-us/docs/docs/admin/state-store.md @@ -1,5 +1,5 @@ # State Store -This section describes the openlookeng state store. State store is used to store states that are shared between state store members and state store clients. +This section describes the openLooKeng state store. State store is used to store states that are shared between state store members and state store clients. State store cluster is composed of state store members, and state store clients can do all state store operations without being a member of cluster. diff --git a/content/en-us/docs/docs/connector/hana.md b/content/en-us/docs/docs/connector/hana.md index f102d92..96391af 100644 --- a/content/en-us/docs/docs/connector/hana.md +++ b/content/en-us/docs/docs/connector/hana.md @@ -56,7 +56,7 @@ Please configure another instance of the Hana plugin as a separate catalog if yo Querying Hana through openLooKeng -------------------------- -For there is a SAP HANA connector named hana, each SAP HANA Database\'s user can get its available schemas throught the hana connector by running SHOW SCHEMAS: +For there is a SAP HANA connector named hana, each SAP HANA Database\'s user can get its available schemas through the hana connector by running SHOW SCHEMAS: SHOW SCHEMAS FROM hana; @@ -80,7 +80,7 @@ Mapping Data Types Between openLooKeng and Hana ### Hana-to-openLooKeng Type Mapping -openLooKeng support selecting the following SAP HANA Detabase types. The table shows the mapping from SAP HANA data type. +openLooKeng support selecting the following SAP HANA Database types. The table shows the mapping from SAP HANA data type. Data type projection table: @@ -300,7 +300,7 @@ database,passwd -n ip:34215 -c "SELECT CURRENT_TIME FROM DUMMY" Hana Connector\'s Limitations ----------------------------- -For the differences between hana datatype and openLooKeng datatype, there are some limitations when preject the hana data type to the openLooKeng datatype. +For the differences between hana datatype and openLooKeng datatype, there are some limitations when project the hana data type to the openLooKeng datatype. ### Hana\'s Smalldecimal Data type @@ -309,4 +309,4 @@ precision lose in a special value range. ### Hana\'s tiny int data type -Tiny int in hana is a 8 bits integer without sign bit and will cause some precision lose in a special value range in openLooKeng. \ No newline at end of file +Tiny int in hana is a 8 bits integer without sign bit and will cause some precision lose in a special value range in openLooKeng. diff --git a/content/en-us/docs/docs/connector/kafka-tutorial.md b/content/en-us/docs/docs/connector/kafka-tutorial.md index b01e2c8..bbb61a2 100644 --- a/content/en-us/docs/docs/connector/kafka-tutorial.md +++ b/content/en-us/docs/docs/connector/kafka-tutorial.md @@ -565,4 +565,4 @@ lk:default> SELECT created_at, raw_date FROM ( (5 rows) ``` -The Kafka connector contains converters for ISO 8601, RFC 2822 text formats and for number-based timestamps using seconds or miilliseconds since the epoch. There is also a generic, text-based formatter which uses Joda-Time format strings to parse text columns. +The Kafka connector contains converters for ISO 8601, RFC 2822 text formats and for number-based timestamps using seconds or milliseconds since the epoch. There is also a generic, text-based formatter which uses Joda-Time format strings to parse text columns. diff --git a/content/en-us/docs/docs/connector/kylin.md b/content/en-us/docs/docs/connector/kylin.md new file mode 100644 index 0000000..0c6e1b3 --- /dev/null +++ b/content/en-us/docs/docs/connector/kylin.md @@ -0,0 +1,43 @@ + +Kylin Connector +=============== + +The Kylin connector allows querying tables in an external Kylin database. This can be used to join data between different systems like Kylin and Hive, or between two different Kylin instances. + +Configuration +------------- + +To configure the Kylin connector, create a catalog properties file in`etc/catalog` named, for example, `Kylin.properties`, to mount the Kylin connector as the `Kylin` catalog. Create the file with the following +contents, replacing the connection properties as appropriate for your setup: + +``` properties +connector.name=kylin +connection-url=jdbc:kylin://example.net/project +connection-user=root +connection-password=secret +connector-planoptimizer-rule-blacklist=io.prestosql.sql.planner.iterative.rule.SingleDistinctAggregationToGroupBy +``` + +The connector-planoptimizer-rule-blacklist attribute is specially configured for kylin, and the default value is io.prestosql.sql.planner.iterative.rule.SingleDistinctAggregationToGroupBy + +Multiple Kylin Servers +---------------------- + +You can have as many catalogs as you need, so if you have additional Kylin servers, simply add another properties file to `etc/catalog` with a different name (making sure it ends in `.properties`). For example, if +you name the property file `sales.properties`, openLooKeng will create a catalog named `sales` using the configured connector. + +Querying Kylin +-------------- + +you can access the `clicks` table in the `web` database: + + SELECT * FROM Kylin.web.clicks; + +If you used a different name for your catalog properties file, use that catalog name instead of `Kylin` in the above examples. + +Kylin Connector Limitations +--------------------------- + +The following SQL statements are not yet supported: + +[DELETE](../sql/insert.md)、../sql/update.md)、../sql/delete.html)、[GRANT](../sql/grant.html)、[REVOKE](../sql/revoke.html)、[SHOW GRANTS](../sql/show-grants.html)、[SHOW ROLES](../sql/show-roles.html)、[SHOW ROLE GRANTS](../sql/show-role-grants.html) \ No newline at end of file diff --git a/content/en-us/docs/docs/connector/memory.md b/content/en-us/docs/docs/connector/memory.md index 93452cb..d4e1131 100644 --- a/content/en-us/docs/docs/connector/memory.md +++ b/content/en-us/docs/docs/connector/memory.md @@ -1,21 +1,81 @@ Memory Connector ================ -The Memory Connector stores data and metadata in RAM on workers to allow for fast queries. Data and metadata are also spilled to local disk and automatically reloaded if nodes are restarted. +The Memory Connector stores data and metadata in RAM on workers to allow for fast queries. +Data and metadata are spilled to local disk and automatically reloaded if nodes are restarted. Configuration ------------- ### Memory Connector Configuration -To configure the Memory connector, create a catalog properties file `etc/catalog/memory.properties` with the following contents: +To configure the Memory Connector, create or modify the catalog properties file `etc/catalog/memory.properties` for the Memory Connector. +For example, you can write: ``` properties connector.name=memory -memory.splits-per-node=10 memory.max-data-per-node=200GB memory.spill-path=/opt/hetu/data/spill -``` +``` +#### Other Required Configurations +- This section will cover other configurations required to use Memory Connector. +- Refer to the documentation of [Hetu Metastore](../admin/meta-store.html) and [State Store](../admin/state-store.html) for more information. + + ##### Single Node Setup + - This section will give an example configuration for Memory Connector on a single node cluster. + - Create a file `etc/catalog/memory.properties` with the following information: + ``` properties + connector.name=memory + memory.max-data-per-node=200GB + memory.spill-path=/opt/hetu/data/spill + ``` + - Create the file `etc/hetu-metastore.properties` with these configurations: + ```properties + hetu.metastore.type=hetufilesystem + hetu.metastore.hetufilesystem.profile-name=default + hetu.metastore.hetufilesystem.path=/tmp/hetu/metastore + hetu.metastore.cache.type=local + ``` + ##### Multi-Node Setup + - This section will give an example configuration for Memory Connector an a cluster with more than one node. + - Create a file `etc/catalog/memory.properties` with the following information: + ``` properties + connector.name=memory + memory.max-data-per-node=200GB + memory.spill-path=/opt/hetu/data/spill + ``` + - Add this line in `etc/config.properties` to enable State Store: + - State Store allows Memory Connector to automatically clean up dropped tables, otherwise tables will only be cleaned up when another table is created. + ```properties + hetu.embedded-state-store.enabled=true + ``` + - Create a file called `etc/state-store.properties` with the following contents: + ```properties + state-store.type=hazelcast + state-store.name=test + state-store.cluster=test-cluster + hazelcast.discovery.mode=tcp-ip + hazelcast.discovery.port=7980 + # The ip address and hazelcast discovery ports of each server should be included here + # formatted like `hazelcast.discovery.tcp-ip.seeds=host1:port,host2:port` + hazelcast.discovery.tcp-ip.seeds=host1:7980, host2:7980 + ``` + - Create the file `etc/hetu-metastore.properties` with these configurations: + ```properties + hetu.metastore.type=hetufilesystem + hetu.metastore.hetufilesystem.profile-name=hdfs + hetu.metastore.hetufilesystem.path=/tmp/hetu/metastore + # make sure to use global cache! + hetu.metastore.cache.type=global + ``` + - Create the file `etc/filesystem/hdfs.properties` to direct openLooKeng to your hdfs file system: + ```properties + fs.client.type=hdfs + # Path to hdfs resource files (e.g. core-site.xml, hdfs-site.xml) + hdfs.config.resources=/tmp/hetu/hdfs-site.xml + # hdfs authentication, accepted values: KERBEROS/NONE + hdfs.authentication.type=NONE + ``` **Note:** - `spill-path` should be set to a directory with enough free space to hold @@ -25,22 +85,21 @@ memory.spill-path=/opt/hetu/data/spill - In `etc/config.properties` ensure that `task.writer-count` is set to `>=` number of nodes in the cluster running openLooKeng. This will help distribute the data uniformly between all the workers. -- Hetu Metastore must be configured. Check [Hetu Metastore](../admin/meta-store.html) for more information. Examples -------- -Create a table using the memory connector: +Create a table using the Memory Connector: CREATE TABLE memory.default.nation AS SELECT * from tpch.tiny.nation; -Insert data into a table in the memory connector: +Insert data into a table in the Memory Connector: INSERT INTO memory.default.nation SELECT * FROM tpch.tiny.nation; -Select from the memory connector: +Select from the Memory Connector: SELECT * FROM memory.default.nation; @@ -48,7 +107,7 @@ Drop table: DROP TABLE memory.default.nation; -Create a table using the memory connector with sorting, indices and spill compression: +Create a table using the Memory Connector with sorting, indices and spill compression: CREATE TABLE memory.default.nation WITH ( @@ -58,7 +117,7 @@ Create a table using the memory connector with sorting, indices and spill compre ) AS SELECT * from tpch.tiny.nation; -After table creation completes, the memory connector will start building indices and sorting data in the background. Once the processing is complete any queries using the sort or index columns will be faster and more efficient. +After table creation completes, the Memory Connector will start building indices and sorting data in the background. Once the processing is complete any queries using the sort or index columns will be faster and more efficient. For now, `sorted_by` only accepts a single column. @@ -68,7 +127,6 @@ Configuration Properties | Property Name | Default Value | Required| Description | |---------------------------------------|-----------------|---------|---------------------------| -| `memory.splits-per-node ` | Available processors on the coordinator | No | Number of splits to create per node. Default value is number of available processors on the coordinator. Value is ignored on the workers. In high concurrency, setting this value to a lower number will improve performance.| | `memory.spill-path ` | None | Yes | Directory where memory data will be spilled to. Must have enough free space to store the tables. SSD preferred.| | `memory.max-data-per-node ` | 256MB | Yes | Memory limit for total data stored on this node | | `memory.max-logical-part-size ` | 256MB | No | Memory limit for each LogicalPart. Default value is recommended.| @@ -78,9 +136,9 @@ Configuration Properties Path whitelist:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]` -Additonal WITH properties +Additional WITH properties -------------- -Use these properties when creating a table with the memory connector to make queries faster. +Use these properties when creating a table with the Memory Connector to make queries faster. | Property Name | Argument type | Requirements | Description| |--------------------------|---------------------------|----------------------------------|------------| @@ -105,31 +163,34 @@ Developer Information This section outlines the overall design of the Memory Connector, as shown in the figure below. -![Memory Connector Overall Design](../images/memory-connector-overall-design.png) - -The data is distributed to different workers as splits. Those Splits are further organized into LogicalParts. The LogicalParts contain indexes and data. Table data will be automatically spilled -to disk. If there is not enough memory to hold the entire data the tables can be released from memory. Data is sorted and indexed in a background process allowing faster table creation. The table is still queriable during -processing, queries are just not as efficient. HetuMetastore is used to persist table metadata. +![Memory Connector Overall Design](../images/memory-connector-design.png) -### Splits - -During table creation, pages are distributed to each of the workers. Each of the workers will have the same number of splits. Splits are filled with Pages in a round-robin fashion. -When Tablescan is scheduled, splits will be scheduled. Setting number of splits to a value less than number of cores on the node allows for maximum parallelism. Not all tables will fit into memory, so automatic spill-to-disk management -takes place. The maximum individual table size is the most that can fit into the configured memory connector limit. The table is automatically spilled to disk after creation as -part of a background process. +### Scheduling Process +The data to be processed are stored in pages, which are distributed to different worker nodes in openLooKeng. +In the Memory Connector, each worker has a number of LogicalParts. +During table creation, LogicalParts in the workers are filled with the input pages in a round-robin fashion. +Table data will be automatically spilled to disk as part of a background process as well. +If there is not enough memory to hold the entire data, the tables can be released from memory according to LRU rule. +HetuMetastore is used to persist table metadata. +At query time, when Tablescan operation is scheduled, the LogicalParts will be scheduled. ### LogicalPart - -Each split will be further organized into LogicalParts. LogicalParts have a maximum configurable size (default 256 MB). New LogicalParts are created once the last one is filled. As -part of background processing after table creation, data is sorted and indexed. -Based on the pushed down predicate, entire LogicalParts can be filtered out using the Bloom Filter and MinMax indices. Further Page filtering is done using the Sparse index. - -### Sparse Index - -Pages are first sorted, then optimized and finally a Sparse Index is created. This allows for smaller index sizes since not all unique values need to be stored. The Sparse index -helps reduce input rows but does not perform perfect filtering. Further filtering is done by openLooKeng’s Filter Operator. - -Referring to the Sparse Index example above, this is how the memory connector would filter data for different queries: +As shown in the lower part of the design figure, LogicalPart is the data structure that contains both indexes and data. +The sorting and indexing are handled in a background process allowing faster querying, +but the table is still queriable during processing. +LogicalParts have a maximum configurable size (default 256 MB). +New LogicalParts are created once the previous one is full. + + +### Indices +Bloom filter, sparse index and MinMax index are created in the LogicalPart. +Based on the pushed down predicate, entire LogicalParts can be filtered out using the Bloom Filter and MinMax indices. +Further Page filtering is done using the Sparse index. +Pages are first sorted, then optimized and finally a Sparse Index is created. +This allows for smaller index sizes since not all unique values need to be stored. The Sparse index +helps reduce input rows but does not perform perfect filtering. +Further filtering is done by openLooKeng’s Filter Operator. +Referring to the Sparse Index example above, this is how the Memory Connector would filter data for different queries: ``` For query: column=a. @@ -147,10 +208,9 @@ No pages need to be returned because last value of floor entry of c (Page 2) is For queries containing > >= < <= BETWEEN IN similar logic is applied. ``` -Memory Connector Limitations and known Issues +Limitations and known Issues --------------------------------------------- -- After `DROP TABLE`, memory is not released immediately. It is released on next `CREATE TABLE` operation. - - A simple workaround is to create a small temporary table to trigger a cleanup `CREATE TABLE memory.default.tmp AS SELECT * FROM tpch.tiny.nation;` +- Without State Store and Hetu Metastore with global cache, after `DROP TABLE`, memory is not released immediately on the workers. It is released on the next `CREATE TABLE` operation. - Currently only a single column in ascending order is supported by `sorted_by` - If a CTAS (CREATE TABLE AS) query fails or is cancelled, an invalid table will remain. This table must be dropped manually. \ No newline at end of file diff --git a/content/en-us/docs/docs/connector/opengauss.md b/content/en-us/docs/docs/connector/opengauss.md index 1556b73..e9ea197 100644 --- a/content/en-us/docs/docs/connector/opengauss.md +++ b/content/en-us/docs/docs/connector/opengauss.md @@ -55,6 +55,8 @@ If you used a different name for your catalog properties file, use that catalog > - The `use-connection-pool` configuration is not supported. +> - Setting `opengauss.metadata.speedup=true` in catalog properties file can speed up DatabaseMetaData access, its default value is false. + *If the subsequent version of openGuass supports the above restriction, we will make corresponding adaptation.* openGauss Connector Limitations diff --git a/content/en-us/docs/docs/connector/tpch.md b/content/en-us/docs/docs/connector/tpch.md index f3481a3..ffa627a 100644 --- a/content/en-us/docs/docs/connector/tpch.md +++ b/content/en-us/docs/docs/connector/tpch.md @@ -5,7 +5,7 @@ TPCH Connector The TPCH connector provides a set of schemas to support the TPC Benchmark™ H (TPC-H). TPC-H is a database benchmark used to measure the performance of highly-complex decision support databases. This connector can also be used to test the capabilities and query syntax of openLooKeng without configuring access to an external data source. -When you query a TPCH schema, the connector generates the data on the fly using a deterministic lgorithm. +When you query a TPCH schema, the connector generates the data on the fly using a deterministic algorithm. Configuration ------------- diff --git a/content/en-us/docs/docs/connector/vdm.md b/content/en-us/docs/docs/connector/vdm.md index be36de2..8cacf1b 100644 --- a/content/en-us/docs/docs/connector/vdm.md +++ b/content/en-us/docs/docs/connector/vdm.md @@ -7,7 +7,7 @@ The VDM connector supports to: - Create, update and delete views that combines multiple catalogs - Visit real data through the views -- Manage user previlege through the views +- Manage user privilege through the views - Log the use of VDM views by each user ## Usage diff --git a/content/en-us/docs/docs/develop/connectors.md b/content/en-us/docs/docs/develop/connectors.md index 4f28e4a..be3d4ab 100644 --- a/content/en-us/docs/docs/develop/connectors.md +++ b/content/en-us/docs/docs/develop/connectors.md @@ -24,7 +24,7 @@ the Example HTTP connector does), you may need to get creative about how you map ### ConnectorSplitManger The split manager partitions the data for a table into the individual chunks that openLooKeng will distribute to workers for processing. For example, the Hive connector lists the files for each Hive partition and creates -one or more split per file. For data so urces that don\'t have partitioned data, a good strategy here is to simply return a single split for the entire table. This is the strategy employed by the Example HTTP connector. +one or more split per file. For data sources that don\'t have partitioned data, a good strategy here is to simply return a single split for the entire table. This is the strategy employed by the Example HTTP connector. ### ConnectorRecordSetProvider diff --git a/content/en-us/docs/docs/develop/functions.md b/content/en-us/docs/docs/develop/functions.md index dcc9372..bcd0acb 100644 --- a/content/en-us/docs/docs/develop/functions.md +++ b/content/en-us/docs/docs/develop/functions.md @@ -216,7 +216,7 @@ An in-depth look at the various annotations relevant to writing an aggregation f - `@CombineFunction`: - The `@CombineFunction` annotation declares the function used to ombine two state objects. This function is used to merge all the partial aggregation states. It takes two state objects, and merges + The `@CombineFunction` annotation declares the function used to combine two state objects. This function is used to merge all the partial aggregation states. It takes two state objects, and merges the results into the first one (in the above example, just by adding them together). - `@OutputFunction`: diff --git a/content/en-us/docs/docs/develop/star-tree-cube.md b/content/en-us/docs/docs/develop/star-tree-cube.md deleted file mode 100644 index 90a02c1..0000000 --- a/content/en-us/docs/docs/develop/star-tree-cube.md +++ /dev/null @@ -1,145 +0,0 @@ -# Star-Tree - -Star tree cubing is a pre-aggregation technique to achieve low latency runtime for iceberg queries. An iceberg query computes an aggregate function over -an attribute ( or set of attributes) in order to find aggregate values above a specified threshold. Using this technique, User is provided with an option to -create a cube with necessary aggregations and dimensions. Then, when aggregation queries are executed, the cube is used to executing the query instead of the -original table. The actual performance gain is achieved during the TableScan operation as cubes are pre-computed and pre-aggregated. - -For this reason, the cubing technique is highly effective when the group by cardinality results in lesser rows than the original table. - -## Supported functions - COUNT, COUNT DISTINCT, MIN, MAX, SUM, AVG - -## Enabling and Disabling Star-tree -To enable: -```sql -SET SESSION enable_star_tree_index=true; -``` -To disable: -```sql -SET SESSION enable_star_tree_index=false; -``` - -## Configuration Properties -| Property Name | Default Value | Required| Description| -|---------------------------------------------------|---------------------|---------|--------------| -| optimizer.enable-star-tree-index | false | No | Enables star-tree index| -| cube.metadata-cache-size | 5 | No | The maximum number of metadata for star-trees that could be loaded into cache before eviction happens| -| cube.metadata-cache-ttl | 1h | No | The maximum time to live of star-trees that are be loaded into cache before eviction happens | - -## Examples - -Creating a star-tree cube: -```sql -CREATE CUBE nation_cube -ON nation -WITH (AGGREGATIONS=(count(*), count(distinct regionkey), avg(nationkey), max(regionkey)), -GROUP=(nationkey), -format='orc', partitioned_by=ARRAY['nationkey']); -``` -Next, to add data to the cube: -```sql -INSERT INTO CUBE nation_cube WHERE nationkey > 5; -``` -Creating a star-tree cube with CLI with WHERE clause: -```sql -CREATE CUBE nation_cube -ON nation -WITH (AGGREGATIONS=(count(*), count(distinct regionkey), avg(nationkey), max(regionkey)), -GROUP=(nationkey), -format='orc', partitioned_by=ARRAY['nationkey']) -WHERE nationkey > 4; -``` - -To use the new cube, just query the original table using aggregations that were included in the cube: -```sql -SELECT count(*) FROM nation WHERE nationkey > 5 GROUP BY nationkey; -SELECT nationkey, avg(nationkey), max(regionkey) WHERE nationkey > 5 GROUP BY nationkey; -``` - -## Optimizer Changes - -The star tree aggregation rule is an Iterative optimizer that optimizes the logical plan by replacing the original aggregation sub-tree -and original table scan with pre-aggregation table scan. This optimizer uses the TupleDomain construct to match if predicates provided in the Query can -be supported by the Cubes. The exact rows are not queried to check if Cube is applicable or not. - -## Dependencies - -Star Tree index relies on Hetu metastore to store the cube related metadata. -Please check [Hetu Metastore](../admin/meta-store.html) for more information. - -### Building Cube for Large dataset -One of the limitations with the current implementation is that Cube cannot be built for a larger dataset at once. This is due to the cluster memory limitation. -Processing large number rows requires more memory than cluster is configured with. This results in query failing with message "Query exceeded per-node user memory -limit". To overcome this issue, "Insert into cube" query support was added. The user has ability to build a cube for larger data by executing multiple -insert into cube statements. The insert statement accepts a where clause, and it can be used to limit the number of processed and inserted into cube. - -This section explains the steps to build a cube for larger dataset. - -Let us take an example of TPCDS dataset and `store_sales` table. The table has 10 years worth of data -and user wants to build a cube for year 2001 and due to the cluster memory limit, the entire data set for year 2001 cannot be processed at once. - -```sql - -CREATE CUBE store_sales_cube ON store_sales WITH (AGGREGATIONS = (sum(ss_net_paid), sum(ss_sales_price), sum(ss_quantity)), GROUP = (ss_sold_date_sk, ss_store_sk)); - -SELECT min(d_date_sk) as year_start, max(d_date_sk) as year_end FROM date_dim WHERE d_year = 2001; - year_start | year_end -------------+---------- - 2451911 | 2452275 -(1 row) - -INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2451911 AND 242275; --- This could result in query failure if the number of rows need to be processed is huge and the query memory exceeds the configured limit. - -To overcome this issue, multiple insert statements can be used into process rows and insert into cube and the number of rows canbe controlled by using where clause; - -INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2451911 AND 2452010; -INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk >= 2452011 AND ss_sold_date_sk <= 2452110; -INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2452111 AND 2452210; -INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2452211 AND 2452275; - -Alternative to overcome this issue, use CLI if expression is Between Predicate or Comparison Expression. CLI internally queries multiple insert statements. - -CREATE CUBE store_sales_cube ON store_sales WITH (AGGREGATIONS = (sum(ss_net_paid), sum(ss_sales_price), sum(ss_quantity)), GROUP = (ss_sold_date_sk, ss_store_sk)) WHERE ss_sold_date_sk BETWEEN 2451911 AND 242275; - -Internally the system will rewrite and merge all continuous range predicates into a single predicate; - -SHOW CUBES; - - Cube Name | Table Name | Status | Dimensions | Aggregations | Where Clause ----------------------------------+----------------------------+--------+-----------------------------+-------------------------------------------------------+-------------------------------------------------------+------------------------------ - hive.tpcds_sf1.store_sales_cube | hive.tpcds_sf1.store_sales | Active | ss_sold_date_sk,ss_store_sk | sum(ss_sales_price),sum(ss_net_paid),sum(ss_quantity) | (("ss_sold_date_sk" >= BIGINT '2451911') AND ("ss_sold_date_sk" < BIGINT '2452276')) - -Note: -1. The system will try to rewrite all type of Predicates into a Range to see if they can be merged together. - All continous predicates will be merged into a single range predicate and remainining predicates are untouched. - Only the following types are supported and can be merged together. - Integer, TinyInt, SmallInt, BigInt, Date; - For other types, its difficult to identify if two predicates are continous therefore they cannot be merged together. And because of this issue, there is - possibility that particular cube may not be used during query optimisation even if the cube has all the required data. For example, - - INSERT INTO CUBE store_sales_cube WHERE store_id BETWEEN 'A01' AND 'A10'; - INSERT INTO CUBE store_sales_cube WHERE store_id BETWEEN 'A11' AND 'A20'; - - Here these two predicates cannot be merged into store_id BETWEEN 'A01' AND 'A20'; So the cube won't be used - for queries that are spanning over two the predicates; - - SELECT ss_store_id, sum(ss_sales_price) WHERE ss_store_id BETWEEN 'A05' AND 'A15'; - Cube won't be used for optimizing this query. This is a limitation as of now. - -2. Only Single column predicates can be merged. -``` - -#CLI changes - -The CLI supports the create cube statement with where clause. The where clause used in the create cube statement is the range of data to be inserted into the cube. -Once the user runs create cube statement with where clause then the cli internally runs the insert cube statements. This process improves the user experience and -improves the memory footprint based on the cluster memory limits. As of now, only Between Predicate and Comparison Expressions are supported. We support only Integer and Long Literals. - -## Limitation - -1. Star tree cube is only effective when the group by cardinality is considerably lower than the number of rows in - source table. -2. A significant amount of user effort required in maintaining Cubes for large datasets. -3. Only incremental insert into cube is supported. Cannot delete specific rows from Cube. -4. For the create cube statement in CLI, we only support Between Predicate or Comparison Expression. We support only Integer and Long Literal. \ No newline at end of file diff --git a/content/en-us/docs/docs/images/cube-logical-plan-optimizer.png b/content/en-us/docs/docs/images/cube-logical-plan-optimizer.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad984d519191eb1ffb4132eeb8d838d0961abaa GIT binary patch literal 38432 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

Cfbd=R3x-DB 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 LUM$kS_vHTooxV@* literal 0 HcmV?d00001 diff --git a/content/en-us/docs/docs/images/memory-connector-design.png b/content/en-us/docs/docs/images/memory-connector-design.png new file mode 100644 index 0000000000000000000000000000000000000000..bab4282001e4199c27d8ecf1f4ec3af734834de6 GIT binary patch literal 109366 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 literal 0 HcmV?d00001 diff --git a/content/en-us/docs/docs/images/memory-connector-overall-design.png b/content/en-us/docs/docs/images/memory-connector-overall-design.png deleted file mode 100644 index 7fc1ec3c76f0b793a7f9929a985056f6860849ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88463 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 in most usecases. If the index is too large, this value can be increased > e.g. 0.05. +### `bloom.mmapEnabled` + +> - **Type:** `Boolean` +> - **Default value:** `true` +> +> Control if Memory-Mapped File (mmap) should be used while reading the Bloom Index. +> Enabling this value will cache the Bloom Index to local disk instead of in-memory during reading. +> This will reduce memory consumption but will result in slightly lower performance. + + ## Examples **Creating index:** @@ -56,6 +66,7 @@ create index idx using bloom on hive.hindex.users (id); create index idx using bloom on hive.hindex.users (id) where regionkey=1; create index idx using bloom on hive.hindex.users (id) where regionkey in (3, 1); create index idx using bloom on hive.hindex.users (id) WITH ("bloom.fpp" = '0.001'); +create index idx using bloom on hive.hindex.users (id) WITH ("bloom.mmapEnabled" = false); ``` * assuming users table is partitioned on `regionkey` diff --git a/content/en-us/docs/docs/indexer/btree.md b/content/en-us/docs/docs/indexer/btree.md index ba3cc57..b9e6589 100644 --- a/content/en-us/docs/docs/indexer/btree.md +++ b/content/en-us/docs/docs/indexer/btree.md @@ -53,9 +53,9 @@ When selecting between BTreeIndex and BloomIndex, the following should be consid **Creating index:** ```sql -create index idx using btree on hive.hindex.orders (orderid) with (level=table)'; -create index idx using btree on hive.hindex.orders (orderid) with (level=partition) where orderDate='01-10-2020'; -create index idx using btree on hive.hindex.orders (orderid) with (level=partition) where orderDate in ('01-10-2020', '01-10-2020'); +create index idx using btree on hive.hindex.orders (orderid); +create index idx using btree on hive.hindex.orders (orderid) where orderDate='01-10-2020'; +create index idx using btree on hive.hindex.orders (orderid) where orderDate in ('01-10-2020', '01-10-2020'); ``` * assuming orders table is partitioned on `orderDate` diff --git a/content/en-us/docs/docs/indexer/hindex-statements.md b/content/en-us/docs/docs/indexer/hindex-statements.md index dd2c18f..30b9a28 100644 --- a/content/en-us/docs/docs/indexer/hindex-statements.md +++ b/content/en-us/docs/docs/indexer/hindex-statements.md @@ -11,13 +11,17 @@ To create an index you can run sql statements of the form: CREATE INDEX [ IF NOT EXISTS ] index_name USING [ BITMAP | BLOOM | BTREE | MINMAX ] ON tbl_name (col_name) -WITH ( 'level' = ['STRIPE', 'PARTITION'], "bloom.fpp" = '0.001', [, …] ) +WITH ( 'level' = ['STRIPE', 'PARTITION'], "autoload" = true, "bloom.fpp" = '0.001', "bloom.mmapEnabled" = false, [, …] ) WHERE predicate; ``` - `WHERE` predicate can be used to create index on select partition(s) - `WITH` can be used to specify index properties or index level. See individual index documentation to support properties. - `"level"='STRIPE'` if not specified +- `"autoload"` overrides the default value `hetu.heuristicindex.filter.cache.autoload-default` in config.properties. +After the index is created or updated, whether to automatically load it into cache. +If false, index will be loaded as needed. This means, the first few queries may not benefit from index as it is being loaded into cache. +Setting this to true may result in high memory usage but will give the best results. If the table is partitioned, you can specify a single partition to create an index on, or an in-predicate to specify multiple partitions: @@ -31,13 +35,22 @@ CREATE INDEX index_name USING bloom ON hive.schema.table (column1) WHERE p in (p ## SHOW -To show all indexes or a specific index_name: +To show the information of all the indices or a specific index by index_name. +The information includes index name, user, table name, index columns, index type, index status, etc. ```roomsql SHOW INDEX; SHOW INDEX index_name; ``` +## UPDATE + +Update an existing index if the source table has been modified. You can check the status of the index with ```SHOW INDEX index_name```. + +```roomsql +UPDATE INDEX index_name; +``` + ## DROP To delete an index by name: @@ -54,7 +67,7 @@ DROP INDEX index_name where p=part1; ``` Note: dropped index will be removed from cache after a few seconds, so you may still see the next few queries still using the index. - +The index will be automatically dropped if the source table is dropped. ## Notes on resource usage diff --git a/content/en-us/docs/docs/indexer/overview.md b/content/en-us/docs/docs/indexer/overview.md index 869cef3..b90dbd9 100644 --- a/content/en-us/docs/docs/indexer/overview.md +++ b/content/en-us/docs/docs/indexer/overview.md @@ -58,42 +58,97 @@ memory and cpu usage and result in improved query performance, especially at hig ## Getting started This section gives a short tutorial which introduces the basic usage of Heuristic Index through a sample query. -For a complete list of configuration properties see [Properties](../admin/properties.html). -### 1. Configure indexer settings +### 1. Configurations -Heuristic indexer uses Hetu Metastore to manage its metadata. Hetu Metastore is a shared metadata management +Heuristic Index requires several components to be configured before it can work. +Ensure all nodes in the cluster are configured the same way, i.e. using the same +Hetu Filesystem, Metastore, etc. + +#### a. Hetu Metastore + +Heuristic Index uses Hetu Metastore to manage its metadata. Hetu Metastore is a shared metadata management utility used by multiple openLooKeng features. For more information about how to configure it, please check [Hetu Metastore](../admin/meta-store.html). -Note: Indexer won't work if Hetu Metastore is not properly configured! -In `etc/config.properties`, add these lines: +**Note**: Global cache must be enabled! Heuristic Index won't work if Hetu Metastore is not properly configured. - hetu.heuristicindex.filter.enabled=true - hetu.heuristicindex.filter.cache.max-memory=10GB - hetu.heuristicindex.indexstore.uri=/opt/hetu/indices - hetu.heuristicindex.indexstore.filesystem.profile=index-store-profile +Here is a reference `etc/hetu-metastore.properties`: -Path whitelist:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]` + ```properties + hetu.metastore.type=hetufilesystem + hetu.metastore.hetufilesystem.profile-name=hdfs + # this path is inside hdfs + hetu.metastore.hetufilesystem.path=/tmp/hetu/metastore + # make sure to use global cache! + hetu.metastore.cache.type=global + ``` -**Note**: -- `LOCAL` filesystem type is NOT supported. Local filesystem should NOT be used in Hetu metastore as well. -- `HDFS` filesystem type should be used in production in order for the index to be accessible by all nodes in the cluster. -- All nodes should be configured to use the same filesystem profile. -- Heuristic Index can be disabled while the engine is running by setting: `set session heuristicindex_filter_enabled=false;` + *Path whitelist:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]`* -Filesystem profile file should be placed at `etc/filesystem/index-store-profile.properties`, -where `index-store-profile` is the name referenced above in `config.properties`: +#### b. Hetu Statestore - fs.client.type=hdfs - hdfs.config.resources=/path/to/core-site.xml,/path/to/hdfs-site.xml - hdfs.authentication.type=NONE - fs.hdfs.impl.disable.cache=true - -If the kerberos authentication is enabled, additional configs `hdfs.krb5.conf.path`, -`hdfs.krb5.keytab.path`, and `hdfs.krb5.principal` must be provided. +As mentioned in the Hetu Metastore setup, the global cache must be enabled, this requires the Hetu Statestore +to be configured. For more information about how to configure it, please check [Hetu Statestore](../admin/state-store.html). + +In `etc/config.propertes`: + + ```properties + hetu.embedded-state-store.enabled=true + ``` + +Here is a reference `etc/state-store.properties`: + + ```properties + state-store.type=hazelcast + state-store.name=test + state-store.cluster=test-cluster + hazelcast.discovery.mode=tcp-ip + hazelcast.discovery.port=7980 + # The ip address and hazelcast discovery ports of each server must be included here + hazelcast.discovery.tcp-ip.seeds=host1:7980,host2:7980 + ``` + +#### c. Hetu Filesystem + +Hetu Filesystem is used for storing the index, and in the above example, it was also used +for the the Hetu Metastore. `HDFS` filesystem type must be used in order for +the index to be accessible by all nodes in the cluster. +For more information about how to configure it, please check [Hetu Filesystem](../develop/filesystem.html). + +Here is a reference `etc/filesystem/hdfs.properties`: + + ```properties + fs.client.type=hdfs + # Path to hdfs resource files (e.g. core-site.xml, hdfs-site.xml) on your local machine + hdfs.config.resources=/tmp/hetu/hdfs-site.xml,/tmp/hetu/core-site.xml + hdfs.authentication.type=NONE + fs.hdfs.impl.disable.cache=true + ``` + + *Path whitelist:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]`* + +#### d. Heuristic Index + +Finally, once all the prerequisites are configured, the Heuristic Index can be enabled. + +In `etc/config.properties`, add these lines: + + ```properties + hetu.heuristicindex.filter.enabled=true + hetu.heuristicindex.indexstore.filesystem.profile=hdfs + # this path is inside hdfs + hetu.heuristicindex.indexstore.uri=/tmp/hetu/indexstore + ``` + + *Path whitelist:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]`* + +For a complete list of Heuristic Index configurations see [Configuration Properties](#configuration-properties) below +and [Properties](../admin/properties.html). -With Heuristic Indexer configured, start the engine. +Heuristic Index can be disabled while the engine is running by setting: `set session heuristicindex_filter_enabled=false;`. + +With Heuristic Index configured, start the engine. ### 2. Identify a column to create index on @@ -108,29 +163,68 @@ when scanning table1. To create index run the following statement: - CREATE INDEX index_name USING bloom ON table1 (column); - -**Note:** Index for decimal type columns is not supported currently. For more details follow the [issue](https://gitee.com/openlookeng/hetu-core/issues/I2AMH0?from=project-issue) + CREATE INDEX index_name USING bloom ON table1 (id); + ### 4. Run query -After index is created, run the query; index will start loading in the background. -Subsequent queries will utilize the index to reduce the amount of data read - and query performance will be improved. +After index is created, it will autoload into coordinator cache. +Future queries will utilize the index to reduce the amount of data read +and query performance will be improved. + # running the same query again should now result in fewer splits and improved performance + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; ## Configuration Properties -| Property Name | Default Value | Required| Description| -|---------------------------------------------------|---------------------|---------|--------------| -| hetu.heuristicindex.filter.enabled | false | No | Enables heuristic index| -| hetu.heuristicindex.filter.cache.max-memory | 10GB | No | Caching size of index files| -| hetu.heuristicindex.filter.cache.soft-reference | true | No | Enabling this property allows the GC to remove entries from the cache if memory is running low| -| hetu.heuristicindex.filter.cache.ttl | 24h | No | The time period after which index cache expires| -| hetu.heuristicindex.filter.cache.load-threads | 10 | No | The number of threads used to load indices in parallel| -| hetu.heuristicindex.filter.cache.loading-delay | 10s | No | The delay to wait before async loading task starts to load index cache from indexstore| -| hetu.heuristicindex.indexstore.uri | /opt/hetu/indices/ | No | Directory under which all index files are stored| -| hetu.heuristicindex.indexstore.filesystem.profile | local-config-default| No | This property defines the filesystem profile used to read and write index| -| hetu.heuristicindex.filter.cache.preload-indices | | No | Preload the specified indices (comma-separated) when the server starts. Put `ALL` to load all indices| +| Property Name | Default Value | Required| Description| +|----------------------------------------------------|---------------------|---------|--------------| +| hetu.heuristicindex.filter.enabled | false | No | Enables heuristic index| +| hetu.heuristicindex.filter.cache.max-memory | 10GB | No | Caching size of index files| +| hetu.heuristicindex.filter.cache.soft-reference | true | No | Enabling this property allows the GC to remove entries from the cache if memory is running low| +| hetu.heuristicindex.filter.cache.ttl | 24h | No | The time period after which index cache expires| +| hetu.heuristicindex.filter.cache.load-threads | 10 | No | The number of threads used to load indices in parallel| +| hetu.heuristicindex.filter.cache.loading-delay | 10s | No | The delay to wait before async loading task starts to load index cache from indexstore| +| hetu.heuristicindex.indexstore.uri | /opt/hetu/indices/ | No | Directory under which all index files are stored| +| hetu.heuristicindex.indexstore.filesystem.profile | local-config-default| No | This property defines the filesystem profile used to read and write index| +| hetu.heuristicindex.filter.cache.autoload-default | true | No | The default value for autoloading indices on the coordinator. To change the value for a specific index, set by WITH ("autoload" = true/false) in the create index statement| + +**More details on `hetu.heuristicindex.filter.cache.autoload-default`:** + +Autoloading only effects indexes used on the coordinator, e.g. MinMax, Bloom and BTree Index. +Indexes used on the workers, e.g. Bitmap Index, will be loaded on-demand as queries +are executed. + +It is recommended to keep autoload enabled. + +When the autoload setting is enabled, the index will be loaded into the coordinator +cache after creation (with a delay of ~5 seconds). +As the index is loaded into the coordinator cache, it will be utilized when user +runs queries that can benefit from the index. + +For example: + + CREATE INDEX idx USING bloom ON table1 (id); + # after creation, index will autoload into coordinator cache + + # running this query will utilize the index + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; + +When the autoload setting is disabled, the index will not be loaded into the coordinator +cache automatically after creation. +Instead, it will be loaded on-demand as the user runs queries that can benefit from the index. +Future queries will then utilize the index. + +For example: + + CREATE INDEX idx USING bloom ON table1 (id) WITH ("autoload" = false); + # after creation, index will NOT autoload into coordinator cache + + # running the query once will trigger the index loading + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; + # index will now begin to load in the background + + # running the same query will now utilize the index + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; ## Index Statements @@ -212,4 +306,4 @@ See [Built-in System Access Control](../security/built-in-system-access-control. The machine might not have enough threads to complete the task. Try reducing the task concurrency by setting the session property: `set session task_concurrency=X;`, where X is recommended to be less than or equal to the CPU -cores/threads. For example, if the CPU has 8 threads, 8 can be set. \ No newline at end of file +cores/threads. For example, if the CPU has 8 threads, 8 can be set. diff --git a/content/en-us/docs/docs/migration/from-hive.md b/content/en-us/docs/docs/migration/from-hive.md index 37c6d3c..91fca54 100644 --- a/content/en-us/docs/docs/migration/from-hive.md +++ b/content/en-us/docs/docs/migration/from-hive.md @@ -81,7 +81,7 @@ In particular, use `VARCHAR` instead of `STRING`. ## Use CAST when dividing integers -openLooKeng follows the standard behavior of performing integer division when dividing two integers. For example, dividing `7` by `2` will result in `3`, not `3.5`. To perform floating point division on two integers, cast +openLooKeng follows the standard behaviour of performing integer division when dividing two integers. For example, dividing `7` by `2` will result in `3`, not `3.5`. To perform floating point division on two integers, cast one of them to a double: ```sql diff --git a/content/en-us/docs/docs/migration/hetu-hive-functions.md b/content/en-us/docs/docs/migration/hetu-hive-functions.md index 4a3effc..de0a883 100644 --- a/content/en-us/docs/docs/migration/hetu-hive-functions.md +++ b/content/en-us/docs/docs/migration/hetu-hive-functions.md @@ -12,13 +12,13 @@ In openLooKeng, we support dynamically loading user-defined Hive scalar function byteudf io.hetu.core.hive.dynamicfunctions.examples.udf.ByteUDF intudf io.hetu.core.hive.dynamicfunctions.examples.udf.IntUDF ``` -2. Users should upload Hive functions jars and dependencies onto a separate directory under `${node.data-dir}` which is setting in `node.properties`. The directory is user configurable by setting `external-functions.dir` and the default value is `externalFunctions`. An example configuration in `config.properties` is presented as below: +2. Users should upload Hive functions jars and **dependencies** onto a separate directory under `${node.data-dir}` which is setting in `node.properties`. The directory is user configurable by setting `external-functions.dir` and the default value is `externalFunctions`. An example configuration in `config.properties` is presented as below: ``` external-functions.dir=externalFunctions ``` so by default, user should upload their hive functions to the `externalFunctions` file folder. -3. Users should upload Hive functions configuration files `udf.properties` into `${node.data-dir}`. +3. Users should upload Hive functions configuration files `udf.properties` into `${node.data-dir}/etc`. ### **Asynchronous execution** diff --git a/content/en-us/docs/docs/optimizer/table-pushdown.md b/content/en-us/docs/docs/optimizer/table-pushdown.md index 982c83f..ab1f169 100644 --- a/content/en-us/docs/docs/optimizer/table-pushdown.md +++ b/content/en-us/docs/docs/optimizer/table-pushdown.md @@ -16,7 +16,7 @@ The user may also add a special comment in the following format to leverage the /* #distinct@ table1 = col1, col2, ... #*/ ``` -This hint is optional as openLookeng can identify all distinct columns if the relevant statistics are available for the table. +This hint is optional as openLooKeng can identify all distinct columns if the relevant statistics are available for the table. The following query (modified from Query 17 of TPC-H benchmark) is one such eligible query and pushes the outer table into the subquery and improves overall query latency. diff --git a/content/en-us/docs/docs/preagg/overview.md b/content/en-us/docs/docs/preagg/overview.md new file mode 100644 index 0000000..dab3298 --- /dev/null +++ b/content/en-us/docs/docs/preagg/overview.md @@ -0,0 +1,221 @@ +# StarTree Cube +## Introduction +StarTree Cubes are materialized pre-aggregation results stored as tables. This technique is built to optimize low latency iceberg queries. +Iceberg queries are a special case of SQL queries involving **GROUP BY** and **HAVING** clauses, wherein the answer set is small relative to the data scanned size. +Queries can be characterized by their huge input-small output. + +This technique allows user to build Cubes on an existing table with aggregates and dimensions that are intended to optimize specific queries. +Cubes are rollup pre-aggregations that have fewer dimensions and rows compared to the original table. Smaller number of rows means the time spent +on table scan is significantly reduced which in turn reduces query latency. If a query is a subset of dimensions and measures of the pre-aggregated table, +then Cube can be used to calculate the query without accessing the original table. + +Few of the Cube properties are + - Cubes are stored in tabular format + - Generally speaking, Cubes can be created for any table in any connector and stored in another connector + - Query latency is reduced by rewriting the logical plan to use Cube instead of the original table. + +## Cube Optimizer Rule +As part of logical plan optimization, Cube optimizer rule analyzes and optimizes the aggregation sub-tree of the logical plan with Cubes. +The rule looks for the aggregation sub-tree that typically looks like the following + +``` +AggregationNode +|- ProjectNode[Optional] + |- ProjectNode[Optional] + |- FilterNode[Optional] + |- ProjectNode[Optional] + |- TableScanNode +``` + +The rule parses through the sub-tree and identifies the table name, aggregate functions, where clause, group by clause that is matched with Cube metadata +to identify any Cube that can help optimize the query. In case of multiple match, recently created Cube is selected for optimization. If any match found, entire +aggregation sub-tree is rewritten using the Cube. This optimizer uses the TupleDomain construct to match if predicates provided in the Query can be supported by the +Cubes. + +The following picture depicts the change in the logical plan after the optimization. + +![img](../images/cube-logical-plan-optimizer.png) + +## Recommended Usage +1. Cubes are most useful for iceberg queries that takes huge input and produces small input. +2. Query performance is best when size of the Cube is less that on the actual table on which Cube was built. +3. Cubes need to be rebuilt if the source table is updated. + +**Note:** +If the source table is updated once the Cubes are built, Cube optimizer ignores the set of Cubes created on the table. Reason being, any +operation on the update is considered as a change in the existing data even if only new rows are inserted on the original table. Since inserts and updates +can't be differentiated, Cubes can't be used as it might result in incorrect result. We are working on a solution to overcome this limitation. + +## Supported Connectors +The following are supported Connectors for storing a Cube +1. Hive +2. Memory +3. Clickhouse + +## Future Work +1. Support for more JDBC connectors +2. Simplify Cube management + + 2.1. Overcome the limitation of Creating Cube for larger dataset. + + 2.2. Update Cube if source table has been updated. + +## Enabling and Disabling StarTree Cube +To enable: +```sql +SET SESSION enable_star_tree_index=true; +``` +To disable: +```sql +SET SESSION enable_star_tree_index=false; +``` + +## Configuration Properties +| Property Name | Default Value | Required| Description| +|---------------------------------------------------|---------------------|---------|--------------| +| optimizer.enable-star-tree-index | false | No | Enables StarTree Cube | +| cube.metadata-cache-size | 50 | No | The maximum number of metadata for StarTree Cubes that could be loaded into cache before eviction happens | +| cube.metadata-cache-ttl | 1h | No | The maximum time to live of StarTree Cubes that are be loaded into cache before eviction happens | + +## Dependencies + +StarTree Cube relies on Hetu Metastore to store the Cube related metadata. +Please check [Hetu Metastore](../admin/meta-store.html) for more information. + +## Examples + +Creating a StarTree Cube: +```sql +CREATE CUBE nation_cube +ON nation +WITH (AGGREGATIONS=(count(*), count(distinct regionkey), avg(nationkey), max(regionkey)), +GROUP=(nationkey), +format='orc', partitioned_by=ARRAY['nationkey']); +``` +Next, to add data to the Cube: +```sql +INSERT INTO CUBE nation_cube WHERE nationkey >= 5; +``` +Creating a StarTree Cube with WHERE clause: +Please note that the following query is only supported via the CLI + +```sql +CREATE CUBE nation_cube +ON nation +WITH (AGGREGATIONS=(count(*), count(distinct regionkey), avg(nationkey), max(regionkey)), +GROUP=(nationkey), +format='orc', partitioned_by=ARRAY['nationkey']) +WHERE nationkey >= 5; +``` + +To use the new Cube, just query the original table using aggregations that were included in the Cube: + +```sql +SELECT count(*) FROM nation WHERE nationkey >= 5 GROUP BY nationkey; +SELECT nationkey, avg(nationkey), max(regionkey) FROM nation WHERE nationkey >= 5 GROUP BY nationkey; +``` + +Since the data inserted into the Cube was for `nationkey >= 5`, only queries matching this condition will utilize the Cube. +Queries not matching the condition would continue to work but won't use the Cube. + +## Building Cube for Large Dataset +One of the limitations with the current implementation is that Cube cannot be built for a larger dataset at once. This is due to the cluster memory limitation. +Processing large number of rows requires more memory than cluster is configured with. This results in query failing with message **Query exceeded per-node user memory +limit**. To overcome this issue, **INSERT INTO CUBE** SQL support was added. The user has ability to build a Cube for larger data by executing multiple +insert into Cube statements. The insert statement accepts a where clause, and it can be used to limit the number of processed and inserted into Cube. + +This section explains the steps to build a Cube for larger dataset. + +Let us take an example of TPCDS dataset and `store_sales` table. The table has 10 years worth of data and user wants to build a Cube for year 2001 +and due to the cluster memory limit, the entire data set for year 2001 cannot be processed at once. + +```sql +CREATE CUBE store_sales_cube ON store_sales WITH (AGGREGATIONS = (sum(ss_net_paid), sum(ss_sales_price), sum(ss_quantity)), GROUP = (ss_sold_date_sk, ss_store_sk)); + +SELECT min(d_date_sk) as year_start, max(d_date_sk) as year_end FROM date_dim WHERE d_year = 2001; + year_start | year_end +------------+---------- + 2451911 | 2452275 +(1 row) +``` +The following query could result in a failure if the number of rows need to be processed is huge and the query memory exceeds +the limit configured for the cluster. + +```sql +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2451911 AND 242275; +``` + +### Solution 1) +To overcome this issue, multiple insert statements can be used to process rows and insert into Cube and the number of rows can be limited by using where clause; + +```sql +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2451911 AND 2452010; +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk >= 2452011 AND ss_sold_date_sk <= 2452110; +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2452111 AND 2452210; +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2452211 AND 2452275; +``` + +### Solution 2) +CLI has been modified to support creating Cubes for larger dataset and without need for multiple insert statements. CLI internally handles this process. +Once the user runs create Cube statement with where clause, the CLI takes care of creating the Cube as well as inserting the data into it. This process improves the user experience and +improves the memory footprint based on the cluster memory limits. CLI internally parses the converts the statement into one create Cube statement followed by +one or more insert statements. This change is only works if user executes the command from CLI and not via any other means i.e. JDBC, etc... + +```sql +CREATE CUBE store_sales_cube ON store_sales WITH (AGGREGATIONS = (sum(ss_net_paid), sum(ss_sales_price), sum(ss_quantity)), GROUP = (ss_sold_date_sk, ss_store_sk)) WHERE ss_sold_date_sk BETWEEN 2451911 AND 242275; +``` + +Internally the system will rewrite and merge all continuous range predicates into a single predicate; + +```sql +SHOW CUBES; + + Cube Name | Table Name | Status | Dimensions | Aggregations | Where Clause +---------------------------------+----------------------------+--------+-----------------------------+-------------------------------------------------------+-------------------------------------------------------+------------------------------ + hive.tpcds_sf1.store_sales_cube | hive.tpcds_sf1.store_sales | Active | ss_sold_date_sk,ss_store_sk | sum(ss_sales_price),sum(ss_net_paid),sum(ss_quantity) | (("ss_sold_date_sk" >= BIGINT '2451911') AND ("ss_sold_date_sk" < BIGINT '2452276')) +``` + +**Note:** +1. The system will try to rewrite all type of Predicates into a Range to see if they can be merged together. + All continuous predicates will be merged into a single range predicate and remaining predicates are untouched. + + Only the following types are supported and can be merged together. + `Integer, TinyInt, SmallInt, BigInt, Date` + + For other data types, it is difficult to identify if two predicates are continuous therefore they cannot be merged together. And because of this issue, there is + possibility that particular Cube may not be used during query optimization even if the Cube has all the required data. For example, + +```sql + INSERT INTO CUBE store_sales_cube WHERE store_id BETWEEN 'A01' AND 'A10'; + INSERT INTO CUBE store_sales_cube WHERE store_id BETWEEN 'A11' AND 'A20'; +``` + Here these two predicates cannot be merged into store_id BETWEEN 'A01' AND 'A20'; So the Cube won't be used + for queries that are spanning over two the predicates; + +```sql + SELECT ss_store_id, sum(ss_sales_price) WHERE ss_store_id BETWEEN 'A05' AND 'A15'; - Cube won't be used for optimizing this query. This is a limitation as of now. +``` + Because of the predicate rewrite some of the following queries can't be supported + +```sql + INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk > 2451911; +``` + The predicate is rewritten as ss_sold_date_sk >= 2451912 to be prepare for merging continous predicates. + Since the predicate is rewritten, they query using ss_sold_date_sk > 2451911 predicate will not match with Cube predicate so Cube won't be used to + optimize the query. The same is applicable for predicates with <= operator. ie. ss_sold_date_sk <= 2451911 is rewritten as ss_sold_date_sk < 2451912 + +```sql + SELECT ss_sold_date_sk, .... FROM hive.tpcds_sf1.store_sales WHERE ss_sold_date_sk > 2451911 +``` +3. Only single column predicates can be merged. + +## Open issues and Limitations +1. StarTree Cube is only effective when the group by cardinality is considerably fewer than the number of rows in source table. +2. A significant amount of user effort required in maintaining Cubes for large datasets. +3. Only incremental insert into Cube is supported. Cannot delete specific rows from Cube. +4. Cubes created on a transaction table may expire automatically even if the source table has not been updated. This is due to the compaction policy which + merges delta files into single large ORC file which in turn changes the last modified of time of the table. Cube status is determined by comparing last modified + timestamp of table when Cube was created with the last modified time of the table when queries are executed. +5. OpenLooKeng CLI has been modified to ease the process of creating Cubes for larger datasets. But still there are limitations with this implementation + as the process involves merging multiple Cube predicates into one. Only Cube predicates defined on Integer, Long and Date types can be merged properly. Support for Char, + String types still need to be implemented. \ No newline at end of file diff --git a/content/en-us/docs/docs/preagg/statements.md b/content/en-us/docs/docs/preagg/statements.md new file mode 100644 index 0000000..e071dd7 --- /dev/null +++ b/content/en-us/docs/docs/preagg/statements.md @@ -0,0 +1,175 @@ +# Usage +Cubes can be managed using any of the supported clients, such as hetu-cli located under the `bin` directory in the installation. + +## CREATE CUBE +### Synopsis + +``` sql +CREATE CUBE [ IF NOT EXISTS ] +cube_name ON table_name WITH ( + AGGREGATIONS = ( expression [, ...] ), + GROUP = ( column_name [, ...]) + [, FILTER = (expression)] + [, ( property_name = expression [, ...] ) ] +) +[WHERE predicate] +``` +### Description +Create a new, empty Cube with the specified group and aggregations. Use `INSERT INTO CUBE (see below)` to insert into data. + +The optional `IF NOT EXISTS` clause causes the error to be suppressed if the Cube already exists. +The optional `property_name` section can be used to set properties on the newly created Cube. + +To list all available table properties, run the following query: + + SELECT * FROM system.metadata.table_properties + +**Note:** These properties are limited to the Connector which the Cube is being created for. + +### Examples +Create a new Cube `orders_cube` on `orders`: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), + GROUP = ( orderstatus, orderdate ), + format = 'ORC' + ) + +Create a new partitioned Cube `orders_cube`: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), + GROUP = ( orderstatus, orderdate ), + format = 'ORC', + partitioned_by = ARRAY['orderdate'] + ) + +Create a new Cube `orders_cube` with some source data filter: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), COUNT DISTINCT(orderid) ), + GROUP = ( orderstatus ), + FILTER = (orderdate BETWEEN 2512450 AND 2512460) + ) + +Create a new Cube `orders_cube` with some additional predicate on Cube columns: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), COUNT DISTINCT(orderid) ), + GROUP = ( orderstatus ), + FILTER = (orderdate BETWEEN 2512450 AND 2512460) + ) WHERE orderstatus = 'PENDING'; + +This is same as following: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), COUNT DISTINCT(orderid) ), + GROUP = ( orderstatus ), + FILTER = (orderdate BETWEEN 2512450 AND 2512460) + ); + INSERT INTO CUBE orders_cube WHERE orderstatus = 'PENDING'; + +The `FILTER` property can be used to filter out data from the source table while building the Cube. Cube is built on the data after +applying the `orderdate BETWEEN 2512450 AND 2512460` predicate on the source table. The columns used in the filter predicate must not be part the Cube. + +### Limitations +- Cubes can be created with only following aggregation functions. + In other words, Queries using the following functions can only be optimized using Cubes. + **COUNT, COUNT DISTINCT, MIN, MAX, SUM, AVG** +- Different connector might support different data type, and different table/column properties. + +## INSERT INTO CUBE + +### Synopsis +``` sql +INSERT INTO CUBE cube_name [WHERE condition] +``` + +### Description +`CREATE CUBE` statement creates Cube without any data. To insert data into Cube, use `INSERT INTO CUBE` SQL. +The `WHERE` clause is optional. If predicate is provided, only data matching the given predicate are processed from the source table and inserted into the Cube. +Otherwise, entire data from the source table is processed and inserted into Cube. + +### Examples +Insert data into the `orders_cube` Cube: + + INSERT INTO CUBE orders_cube WHERE orderdate > date '1999-01-01'; + INSERT INTO CUBE order_all_cube; + +### Limitations +1. Subsequent inserts to the same Cube need to use same set of columns + +```sql + CREATE CUBE orders_cube ON orders WITH (AGGREGATIONS = (count(*)), GROUP = (orderdate)); + + INSERT INTO CUBE orders_cube WHERE orderdate BETWEEN date '1999-01-01' AND date '1999-01-05'; + + -- This statement would fail because its possible the Cube already contain rows matching the given predicate. + INSERT INTO CUBE orders_cube WHERE location = 'Canada'; +``` +**Note:** This means that columns used in the first insert must be used in every insert predicate following the first to avoid inserting duplicate data. + +## INSERT OVERWRITE CUBE + +### Synopsis +``` sql +INSERT OVERWRITE CUBE cube_name [WHERE condition] +``` + +### Description +Similar to INSERT INTO CUBE statement but with this statement the existing data is overwritten. Predicates +are optional. + +### Examples +Insert data based on condition into the `orders_cube` Cube: + + INSERT OVERWRITE CUBE orders_cube WHERE orderdate > date '1999-01-01'; + INSERT OVERWRITE CUBE orders_cube; + +## SHOW CUBES + +### Synopsis +```sql +SHOW CUBES [ FOR table_name ]; +``` + +### Description +`SHOW CUBES` lists all Cubes. Adding the optional `table_name` lists only the Cubes for that table. + +### Examples + +Show all Cubes: +```sql + SHOW CUBES; +``` + +Show Cubes for `orders` table: + +```sql + SHOW CUBES FOR orders; +``` + +## DROP CUBE + +### Synopsis + +``` sql +DROP CUBE [ IF EXISTS ] cube_name +``` + +### Description +Drop an existing Cube. + +The optional `IF EXISTS` clause causes the error to be suppressed if the Cube does not exist. + +### Examples + +Drop the Cube `orders_cube`: + + DROP CUBE orders_cube + +Drop the Cube `orders_cube` if it exists: + + DROP CUBE IF EXISTS orders_cube + + diff --git a/content/en-us/docs/docs/releasenotes/releasenotes-0.1.0.md b/content/en-us/docs/docs/releasenotes/releasenotes-0.1.0.md index debcc71..a5445f3 100644 --- a/content/en-us/docs/docs/releasenotes/releasenotes-0.1.0.md +++ b/content/en-us/docs/docs/releasenotes/releasenotes-0.1.0.md @@ -1,5 +1,5 @@ -# Release 0.1.0 +# Release 0.1.0 (30 Jun 2020) ## Key Features diff --git a/content/en-us/docs/docs/releasenotes/releasenotes-1.0.0.md b/content/en-us/docs/docs/releasenotes/releasenotes-1.0.0.md index 3d54587..217472d 100644 --- a/content/en-us/docs/docs/releasenotes/releasenotes-1.0.0.md +++ b/content/en-us/docs/docs/releasenotes/releasenotes-1.0.0.md @@ -1,4 +1,4 @@ -# Release 1.0.0 +# Release 1.0.0 (23 Sep 2020) ## Key Features diff --git a/content/en-us/docs/docs/releasenotes/releasenotes-1.0.1.md b/content/en-us/docs/docs/releasenotes/releasenotes-1.0.1.md index 03feec6..5d9c845 100644 --- a/content/en-us/docs/docs/releasenotes/releasenotes-1.0.1.md +++ b/content/en-us/docs/docs/releasenotes/releasenotes-1.0.1.md @@ -1,4 +1,4 @@ -# Release 1.0.1 +# Release 1.0.1 (30 Sep 2020) ## Key Features diff --git a/content/en-us/docs/docs/releasenotes/releasenotes-1.1.0.md b/content/en-us/docs/docs/releasenotes/releasenotes-1.1.0.md index a4773c2..6dbae39 100644 --- a/content/en-us/docs/docs/releasenotes/releasenotes-1.1.0.md +++ b/content/en-us/docs/docs/releasenotes/releasenotes-1.1.0.md @@ -1,4 +1,4 @@ -# Release 1.1.0 +# Release 1.1.0 (30 Dec 2020) ## Key Features diff --git a/content/en-us/docs/docs/releasenotes/releasenotes-1.2.0.md b/content/en-us/docs/docs/releasenotes/releasenotes-1.2.0.md index ebf7e75..b9e507e 100644 --- a/content/en-us/docs/docs/releasenotes/releasenotes-1.2.0.md +++ b/content/en-us/docs/docs/releasenotes/releasenotes-1.2.0.md @@ -1,4 +1,4 @@ -# Release 1.2.0 +# Release 1.2.0 (31 Mar 2021) ## Key Features diff --git a/content/en-us/docs/docs/releasenotes/releasenotes-1.3.0.md b/content/en-us/docs/docs/releasenotes/releasenotes-1.3.0.md index e9df1a2..8783351 100644 --- a/content/en-us/docs/docs/releasenotes/releasenotes-1.3.0.md +++ b/content/en-us/docs/docs/releasenotes/releasenotes-1.3.0.md @@ -1,4 +1,4 @@ -# Release 1.3.0 +# Release 1.3.0 (30 Jun 2021) ## Key Features diff --git a/content/en-us/docs/docs/releasenotes/releasenotes-1.4.0.md b/content/en-us/docs/docs/releasenotes/releasenotes-1.4.0.md new file mode 100644 index 0000000..3e4d84a --- /dev/null +++ b/content/en-us/docs/docs/releasenotes/releasenotes-1.4.0.md @@ -0,0 +1,26 @@ +# Release 1.4.0 + +## Key Features + +| Area | Feature | +| ---------------- | ------------------------------------------------------------ | +| Star Tree | 1. Update APIs to support creating star tree cube for jdbc connectors
2. Implemented support for Clickhouse connector, support for additional JDBC based connectors will be added in the future
3. Bug fixes | +| Heuristic Index | 1. Added support for UPDATE INDEX (see docs for details)
2. Added index size, memory usage and disk usage info in SHOW INDEX
3. Add mmap cache support for Bloom Index to reduce memory usage (enabled by default, see docs for details)
4. Dropping a table will now also drop any indexes associated with it
5. Index is now automatically load after creation (enabled by default, see docs for details) | +| Memory Connector | Fixed several important bugs to handle large data sets, and address incorrect results that occasionally occur for specific operators. | +| Task Recovery | Fixed several important bugs to address data inconsistency issues that occasionally occur during high concurrency, and during worker failures. | +| OLK-on-Yarn | Support deploying an openLooKeng cluster on yarn. The openLooKeng cluster can be deployed with a single coordinator, and multiple workers. | +| Low Latency | 1. Optimized the Stats calculation for point queries which don't contain join to speed up low latency queries
2. Added adaptive split grouping to enhance high concurrency query throughput
3. Support non-equality dynamic filters to speed up queries having predicates like <, >, <= & >= | +| Kylin Connector | Support read operations to the Kylin datasource | + +## Known Issues + +| Category | Description | Gitee issue | +| ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| Task Recovery | Concurrent CTAS, some SQL statements report the error "HiveSplitSource is already closed." | [144QYL](https://e.gitee.com/open_lookeng/issues/list?issue=I44QYL) | +| | An error occurs when the CTA creates a transaction table and inserts data"Unsuccessful query retry" | [I44RQJ](https://e.gitee.com/open_lookeng/issues/list?issue=I44RQJ) | +| OLK-on-Yarn | Multiple small openLooKeng clusters are started in the Hadoop cluster, but all openLooKeng cluster processes are on the same node. As a result, the openLooKeng cluster fails to be started | [I4BP5A](https://e.gitee.com/open_lookeng/issues/list?issue=I4BP5A) | +| | When multiple openLooKeng clusters are started, an error is reported when access some cluster CLI | [I4BY6Z](https://e.gitee.com/open_lookeng/issues/list?issue=I4BY6Z) | + +## Obtaining the Document + +For details, see [https://gitee.com/openlookeng/hetu-core/tree/1.4.0/hetu-docs/en](https://gitee.com/openlookeng/hetu-core/tree/1.4.0/hetu-docs/en) \ No newline at end of file diff --git a/content/en-us/docs/docs/sql/create-cube.md b/content/en-us/docs/docs/sql/create-cube.md deleted file mode 100644 index f83099e..0000000 --- a/content/en-us/docs/docs/sql/create-cube.md +++ /dev/null @@ -1,69 +0,0 @@ -CREATE CUBE -============ - -Synopsis --------- - -``` sql -CREATE CUBE [ IF NOT EXISTS ] -cube_name ON table_name WITH ( - AGGREGATIONS = ( expression [, ...] ), - GROUP = ( column_name [, ...]) - [, FILTER = (expression)] - [, ( property_name = expression [, ...] ) ] -) -``` - -Description ------------ - -Create a new, empty star-tree cube with the specified group and aggregations. Use `insert-into-cube` to insert data. - -The optional `IF NOT EXISTS` clause causes the error to be suppressed if the table already exists. - -The optional `property_name` section can be used to set properties on the newly created cube. To list all available table properties, run the following query: - - SELECT * FROM system.metadata.table_properties - -Examples --------- - -Create a new cube `orders_cube` on `orders`: - - CREATE CUBE orders_cube ON orders WITH ( - AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), - GROUP = ( orderstatus, orderdate ), - format = 'ORC' - ) - -Create a new partitioned cube `orders_cube`: - - CREATE CUBE orders_cube ON orders WITH ( - AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), - GROUP = ( orderstatus, orderdate ), - format = 'ORC', - partitioned_by = ARRAY['orderdate'] - ) - -Create a new cube 'orders_cube' with some source filter - - CREATE CUBE orders_cube ON orders WITH ( - AGGREGATIONS = ( SUM(totalprice), COUNT DISTINCT(orderid) ), - GROUP = ( orderstatus ), - FILTER = (orderdate BETWEEN 2512450 AND 2512460) - ) - -Filter is additional predicate that applied on the source table when building a cube. The columns used in the filter predicate must not be part the Cube. - -Limitations ------------ - -- Supported aggregate functions: - COUNT, COUNT DISTINCT, MIN, MAX, SUM, AVG -- Only one group supported per Cube. -- Different connector might support different data type, and different table/column properties. -- Can currently only create cubes in Hive connector, but the cubes can be created on a table from another connector. - -See Also --------- -[INSERT INTO CUBE](./insert-cube.html), [SHOW CUBES](./show-cubes.html), [DROP CUBE](./drop-cube.html) \ No newline at end of file diff --git a/content/en-us/docs/docs/sql/drop-cube.md b/content/en-us/docs/docs/sql/drop-cube.md deleted file mode 100644 index 1590a82..0000000 --- a/content/en-us/docs/docs/sql/drop-cube.md +++ /dev/null @@ -1,33 +0,0 @@ - -DROP CUBE -========== - -Synopsis --------- - -``` sql -DROP CUBE [ IF EXISTS ] cube_name -``` - -Description ------------ - -Drop an existing cube. - -The optional `IF EXISTS` clause causes the error to be suppressed if the cube does not exist. - -Examples --------- - -Drop the cube `orders_cube`: - - DROP CUBE orders_cube - -Drop the cube `orders_cube` if it exists: - - DROP CUBE IF EXISTS orders_cube - -See Also --------- - -[CREATE CUBE](./create-cube.html), [SHOW CUBES](./show-cubes.html), [INSERT INTO CUBE](./insert-cube.html) diff --git a/content/en-us/docs/docs/sql/insert-cube.md b/content/en-us/docs/docs/sql/insert-cube.md deleted file mode 100644 index c8dc0e1..0000000 --- a/content/en-us/docs/docs/sql/insert-cube.md +++ /dev/null @@ -1,44 +0,0 @@ -INSERT INTO CUBE -====== - -Synopsis --------- - -``` sql -INSERT INTO CUBE cube_name [WHERE condition] -``` - -Description ------------ - -Insert data into a star-tree cube. Predicate information is optional. If predicate provided, only data matching -the given predicate are processed from the source table and inserted into the cube. Otherwise, entire -data from the source table is processed and inserted into Cube. - -Examples --------- - -Insert data based on condition into the `orders_cube` cube: - - INSERT INTO CUBE orders_cube WHERE orderdate > date '1999-01-01'; - INSERT INTO CUBE order_all_cube; - -See Also --------- - -[INSERT OVERWRITE CUBE](./insert-overwrite-cube.html), [CREATE CUBE](./create-cube.html), [SHOW CUBES](./show-cubes.html), [DROP CUBE](./drop-cube.html) - - -Limitations ----------- -1. Insert statement does not allow different columns to be used in the where clause for successive inserts. - -```sql - CREATE CUBE orders_cube ON orders WITH (AGGREGATIONS = (count(*)), GROUP = (orderdate)); - - INSERT INTO CUBE orders_cube WHERE orderdate BETWEEN date '1999-01-01' AND date '1999-01-05'; - - -- This statement would fail because its possible the Cube already contain rows matching the given predicate. - INSERT INTO CUBE orders_cube WHERE location = 'Canada'; -``` -Note: this means that columns used in the first insert must be used in every insert predicate following the first to avoid inserting duplicate data. diff --git a/content/en-us/docs/docs/sql/insert-overwrite-cube.md b/content/en-us/docs/docs/sql/insert-overwrite-cube.md deleted file mode 100644 index f30d948..0000000 --- a/content/en-us/docs/docs/sql/insert-overwrite-cube.md +++ /dev/null @@ -1,28 +0,0 @@ -INSERT INTO CUBE -====== - -Synopsis --------- - -``` sql -INSERT OVERWRITE CUBE cube_name [WHERE condition] -``` - -Description ------------ - -Similar to INSERT INTO CUBE statement but with this statement the existing data is overwritten. Predicates -are optional. - -Examples --------- - -Insert data based on condition into the `orders_cube` cube: - - INSERT OVERWRITE CUBE orders_cube WHERE orderdate > date '1999-01-01'; - INSERT OVERWRITE CUBE orders_cube; - -See Also --------- - -[INSERT INTO CUBE](./insert-cube.html), [CREATE CUBE](./create-cube.html), [SHOW CUBES](./show-cubes.html), [DROP CUBE](./drop-cube.html) diff --git a/content/en-us/docs/docs/sql/show-cubes.md b/content/en-us/docs/docs/sql/show-cubes.md deleted file mode 100644 index 4bbc495..0000000 --- a/content/en-us/docs/docs/sql/show-cubes.md +++ /dev/null @@ -1,35 +0,0 @@ - -SHOW CUBES -========== - -Synopsis --------- - -``` sql -SHOW CUBES [ FOR table_name ]; -``` - -Description ------------ - -`SHOW CUBES` lists all cubes. Adding the optional `table_name` lists only the cubes for that table. - -Examples --------- - -Show all cubes: - -```sql - SHOW CUBES; -``` - -Show cubes for `orders` table: - -```sql - SHOW CUBES FOR orders; -``` - -See Also --------- - -[CREATE CUBE](./create-cube.html), [DROP CUBE](./drop-cube.html), [INSERT INTO CUBE](./insert-cube.html) diff --git a/content/en-us/docs/menu/index.md b/content/en-us/docs/menu/index.md index cb64a47..a8d01d4 100644 --- a/content/en-us/docs/menu/index.md +++ b/content/en-us/docs/menu/index.md @@ -62,7 +62,11 @@ headless: true - [BTree Index]({{< relref "./docs/indexer/btree.md" >}}) - [HIndex Statements]({{< relref "./docs/indexer/hindex-statements.md" >}}) - [New Index]({{< relref "./docs/indexer/new-index.md" >}}) - + +- [Star Tree Cubes](#) + - [Overview] ({{< relref "./docs/preagg/overview.md" >}}>) + - [Statements] ({{< relref "./docs/preagg/statements.md" >}}) + - [Connectors]({{< relref "./docs/connector/_index.md" >}}) - [Carbondata]({{< relref "./docs/connector/carbondata.md" >}}) - [ClickHouse]({{< relref "./docs/connector/clickhouse.md" >}}) @@ -91,6 +95,7 @@ headless: true - [TPCDS]({{< relref "./docs/connector/tpcds.md" >}}) - [TPCH]({{< relref "./docs/connector/tpch.md" >}}) - [VDM]({{< relref "./docs/connector/vdm.md" >}}) + - [Kylin]({{< relref "./docs/connector/kylin.md" >}}) - [Functions and Operators]("#") - [Logical Operators]({{< relref "./docs/functions/logical.md" >}}) @@ -131,7 +136,6 @@ headless: true - [CALL]({{< relref "./docs/sql/call.md" >}}) - [COMMENT]({{< relref "./docs/sql/comment.md" >}}) - [COMMIT]({{< relref "./docs/sql/commit.md" >}}) - - [CREATE CUBE]({{< relref "./docs/sql/create-cube.md" >}}) - [CREATE ROLE]({{< relref "./docs/sql/create-role.md" >}}) - [CREATE SCHEMA]({{< relref "./docs/sql/create-schema.md" >}}) - [CREATE TABLE]({{< relref "./docs/sql/create-table.md" >}}) @@ -143,7 +147,6 @@ headless: true - [DESCRIBE INPUT]({{< relref "./docs/sql/describe-input.md" >}}) - [DESCRIBE OUTPUT]({{< relref "./docs/sql/describe-output.md" >}}) - [DROP CACHE]({{< relref "./docs/sql/drop-cache.md" >}}) - - [DROP CUBE]({{< relref "./docs/sql/drop-cube.md" >}}) - [DROP ROLE]({{< relref "./docs/sql/drop-role.md" >}}) - [DROP SCHEMA]({{< relref "./docs/sql/drop-schema.md" >}}) - [DROP TABLE]({{< relref "./docs/sql/drop-table.md" >}}) @@ -155,8 +158,6 @@ headless: true - [GRANT ROLES]({{< relref "./docs/sql/grant-roles.md" >}}) - [INSERT]({{< relref "./docs/sql/insert.md" >}}) - [INSERT OVERWRITE]({{< relref "./docs/sql/insert-overwrite.md" >}}) - - [INSERT CUBE]({{< relref "./docs/sql/insert-cube.md" >}}) - - [INSERT OVERWRITE CUBE]({{< relref "./docs/sql/insert-overwrite-cube.md" >}}) - [JMX]({{< relref "./docs/sql/jmx.md" >}}) - [PREPARE]({{< relref "./docs/sql/prepare.md" >}}) - [RESET SESSION]({{< relref "./docs/sql/reset-session.md" >}}) @@ -171,7 +172,6 @@ headless: true - [SHOW COLUMNS]({{< relref "./docs/sql/show-columns.md" >}}) - [SHOW CREATE TABLE]({{< relref "./docs/sql/show-create-table.md" >}}) - [SHOW CREATE VIEW]({{< relref "./docs/sql/show-create-view.md" >}}) - - [SHOW CUBES]({{< relref "./docs/sql/show-cubes.md" >}}) - [SHOW FUNCTIONS]({{< relref "./docs/sql/show-functions.md" >}}) - [SHOW EXTERNAL FUNCTION]({{< relref "./docs/sql/show-external-function.md" >}}) - [SHOW GRANTS]({{< relref "./docs/sql/show-grants.md" >}}) @@ -205,7 +205,6 @@ headless: true - [Filesystem Access Utilities]({{< relref "./docs/develop/filesystem.md" >}}) - [Hive ORC Cache]({{< relref "./docs/develop/hive-orc-cache.md" >}}) - [External Function Registration and Push Down]({{< relref "./docs/develop/externalfunction-registration-pushdown.md" >}}) - - [Star Tree Cube]({{< relref "./docs/develop/star-tree-cube.md" >}}) - [openLooKeng REST API]({{< relref "./docs/rest/_index.md" >}}) - [Node Resource]({{< relref "./docs/rest/node.md" >}}) @@ -215,11 +214,11 @@ headless: true - [Task Resource]({{< relref "./docs/rest/task.md" >}}) - [Release Notes]("#") - - [1.3.0]({{< relref "./docs/releasenotes/releasenotes-1.3.0.md" >}}) - - [1.2.0]({{< relref "./docs/releasenotes/releasenotes-1.2.0.md" >}}) - - [1.1.0]({{< relref "./docs/releasenotes/releasenotes-1.1.0.md" >}}) - - [1.0.1]({{< relref "./docs/releasenotes/releasenotes-1.0.1.md" >}}) - - [1.0.0]({{< relref "./docs/releasenotes/releasenotes-1.0.0.md" >}}) - - [0.1.0]({{< relref "./docs/releasenotes/releasenotes-0.1.0.md" >}}) + - [1.3.0 (30 Jun 2021)]({{< relref "./docs/releasenotes/releasenotes-1.3.0.md" >}}) + - [1.2.0 (31 Mar 2021)]({{< relref "./docs/releasenotes/releasenotes-1.2.0.md" >}}) + - [1.1.0 (30 Dec 2020)]({{< relref "./docs/releasenotes/releasenotes-1.1.0.md" >}}) + - [1.0.1 (30 Sep 2020)]({{< relref "./docs/releasenotes/releasenotes-1.0.1.md" >}}) + - [1.0.0 (23 Sep 2020)]({{< relref "./docs/releasenotes/releasenotes-1.0.0.md" >}}) + - [0.1.0 (30 Jun 2020)]({{< relref "./docs/releasenotes/releasenotes-0.1.0.md" >}}) - [FAQ]({{< relref "./docs/faq/faq.md" >}}) diff --git a/content/zh-cn/docs/docs/admin/meta-store.md b/content/zh-cn/docs/docs/admin/meta-store.md index fbd0715..a8352df 100644 --- a/content/zh-cn/docs/docs/admin/meta-store.md +++ b/content/zh-cn/docs/docs/admin/meta-store.md @@ -14,6 +14,7 @@ hetu.metastore.type=jdbc hetu.metastore.db.url=jdbc:mysql://.... hetu.metastore.db.user=root hetu.metastore.db.password=123456 +hetu.metastore.cache.type=local ``` 上述属性说明如下: @@ -22,6 +23,7 @@ hetu.metastore.db.password=123456 - `hetu.metastore.db.url`:连接RDBMS的URL。 - `hetu.metastore.db.user` :连接RDBMS的用户名。 - `hetu.metastore.db.password` :连接RDBMS的密码。 +- `hetu.metastore.cache.type` :选择缓存模型,其中local为本地缓存,global为分布式缓存。 ### 使用HDFS存储 diff --git a/content/zh-cn/docs/docs/admin/resource-groups.md b/content/zh-cn/docs/docs/admin/resource-groups.md index c730624..4a5c262 100644 --- a/content/zh-cn/docs/docs/admin/resource-groups.md +++ b/content/zh-cn/docs/docs/admin/resource-groups.md @@ -1,88 +1,145 @@ # 资源组 -资源组限制资源使用,并且可以对在资源组内运行的查询执行队列策略,或者在子组之间划分资源。一个查询属于单个资源组,并消耗该组(及其祖先)的资源。除了对排队查询的限制之外,当资源组耗尽资源时不会导致正在运行的查询失败。相反,新的查询会进入排队状态。资源组可以有子组,也可以接受查询,但不能两者都进行。 +资源组限制资源使用,并可以对在其内部运行的查询执行排队策略,或在子组之间划分资源。一个查询属于单个资源组,并使用该组(及其祖先)的资源。除了对排队查询进行限制外,资源组耗尽资源时不会导致正在运行的查询失败;相反,新的查询将进入排队状态。资源组可以有子组,也可以接受查询,但不能同时执行两者。 -资源组和关联的选择规则由可插拔的管理器配置。添加具有如下内容的`etc/resource-groups.properties`文件使内置管理器可以读取JSON配置文件: +资源组和关联的选择规则由可插拔的管理器配置。添加包含以下内容的`etc/resource-groups.properties`文件,使内置管理器能够读取JSON配置文件: ``` properties resource-groups.configuration-manager=file resource-groups.config-file=etc/resource-groups.json ``` -将`resource-groups.config-file`的值修改为指向一个json配置文件,可以是绝对路径,也可以是相对于openLooKeng数据目录的相对路径。 +将`resource-groups.config-file`的值修改为指向一个JSON配置文件,可以是绝对路径,也可以是相对于openLooKeng数据目录的路径。 + +### 其他配置 + +除了`etc/resource-groups.properties`中的上述属性外,还可以配置以下两个属性,这些属性与kill策略一起使用(详细信息与kill策略的部分相同) + +`resource-groups.memory-margin-percent`(可选)-这是两个被认为相同的查询之间所允许的内存变化百分比。在此情况下,查询不会根据内存使用情况进行排序,而是根据查询执行进度进行排序,前提是查询进度差异大于配置差异。默认值为10%。 + +`resource-groups.query-progress-margin-percent`(可选)-这是两个被认为相同的查询之间所允许的查询执行进度百分比。在此情况下,查询不会根据执行进度进行排序。默认值为5%。 ## 资源组属性 + - `name`(必填):群组名称。可以是模板(见下文)。 -- `maxQueued`(必填):最大排队查询数。一旦达到此限制,新的查询将被拒绝。 -- `hardConcurrencyLimit`(必填):最大运行查询数。 -- `softMemoryLimit`(必填):新查询进入队列之前,该组可以使用的最大分布式内存量。可指明为集群内存的绝对值(即`1GB`)或百分比(即`10%`)。 -- `softCpuLimit`(可选):在对最大运行查询数进行惩罚之前的时间内(参见`cpuQuotaPeriod`)该组可能使用的最大CPU时间。必须还指定`hardCpuLimit`。 -- `hardCpuLimit`(可选):该组在一段时间内可能使用的最大CPU时间。 -- `schedulingPolicy`(可选):指定如何选择排队的查询来运行,以及子组如何成为符合条件的查询。可以配置以下的策略。注意:当集群开启高可用模式时(多个coordinator),当前只支持`fair`策略: - - `fair`(默认):排队的查询将按先进先出的顺序处理,子组必须轮流启动新的查询(如果它们有排队的话)。 - - `weighted_fair`:根据子组的`schedulingWeight`和子组的并发数选择子组。子组正在运行的查询的预期份额基于当前所有符合条件的子组的权重计算。选择与其份额相比并发度最小的子组开始下一次查询。 - - `weighted`:按其优先级(通过`query_priority`[会话属性](../sql/set-session.html)指定)的比例随机选择排队的查询。选择子组以按其`schedulingWeight`的比例启动新查询。 - - `query_priority`:所有子组都必须配置`query_priority`。排队的查询将严格按照其优先级进行选择。 -- `schedulingWeight`(可选):该子组的权重。参见上文。默认为`1`。 -- `jmxExport`(可选):如果为true,则导出群组统计信息到JMX进行监控。默认为`false`。 -- `subGroups`(可选):子群组列表。 + +- `maxQueued`(必填):最大排队查询数。一旦达到此限制,新的查询将被拒绝。 +- `hardConcuritiesLimit`(必填):最大运行查询数。 +- `softMemoryLimit`(必填):新查询进入队列之前,该组可以使用的最大分布式内存量。可指定为集群内存的绝对值(如`1GB`)或百分比(如`10%`)。 +- `softCpuLimit`(可选):在对最大运行查询数进行惩罚之前的时间内(参见`cpuQuotaPeriod`),该组可能使用的最大CPU时间。同时必须指定`hardCpuLimit`。 +- `hardCpuLimit`(可选):该组在一段时间内可能使用的最大CPU时间。 +- `schedulingPolicy`(可选):指定如何选择运行排队的查询,以及子组如何成为符合条件的查询。可以配置为以下三种策略之一。当集群开启高可用模式(多个coordinator)时,仅支持`fair`调度策略: + - `fair`(默认):排队的查询按先进先出的顺序处理,子组必须轮流启动新查询(如果它们有排队的话)。 + - `weighted_fair`:根据子组的`schedulingWeight`和子网并发的查询数量选择子组。子组正在运行的查询预期份额基于当前所有符合条件的子组权重计算。选择与其份额相比并发数最小的子组开始下一次查询。 + - `weighted`:按照优先级(通过`query_priority`[会话属性](../sql/set-session.html)指定)的随机选择排队的查询。按照`schedulingWeight`的比例选择子组以启动新查询。 + - `query_priority`:所有子组都必须配置`query_priority`。排队的查询将严格按照其优先级进行选择。 +- `schedulingWeight`(可选):该子组的权重。参见上文。默认为`1`。 +- `jmxExport`(可选):如果为true,则导出群组统计信息到JMX进行监控。默认为`false`。 +- `subGroups`(可选):子组列表。 +- `killPolicy`(可选):当查询提交给worker后,如果总内存使用量超过**softMemoryLimit**,选择其中一种策略终止正在运行的查询。 + + - `no_kill`(默认值):不终止查询。 + - `recent_queries`:根据执行顺序的倒序进行查询终止。 + - `oldest_queries`:根据执行顺序进行查询终止。 + - `high_memory_queries`:根据内存使用量进行查询终止。具有较高内存使用量的查询将首先被终止,以便在查询终止次数最少的情况下,释放更多内存。 + 作为此策略的一部分,我们尝试平衡内存使用量和完成百分比。因此,如果两个查询的内存使用量都在限制的10%以内(可通过resource-groups.memory-margin-percent配置),则进度慢(执行的百分比)的查询被终止。如果这两个查询在完成百分比方面的差异在5%以内(可通过resource-groups.query-progress-margin-percent配置),则内存使用量大的查询被终止。 + + - `finish_percentage_queries`:根据查询执行百分比进行查询终止。执行百分比最小的查询将首先被终止。 + ## 选择器规则 -- `user`(可选):用于匹配用户名的正则表达式。 -- `source`(可选):用于匹配源字符串的正则表达式。 -- `queryType`(可选):用于匹配提交的查询类型的字符串: -- `DATA_DEFINITION`:更改/创建/删除模式/表/视图的元数据,以及管理预备语句、权限、会话和事务的查询。 - - `DELETE`:`DELETE`查询。 +- `user`(可选):用于匹配用户名的正则表达式。 +- `source`(可选):用于匹配源字符串的正则表达式。 +- `queryType`(可选):用于匹配提交的查询类型的字符串。 +- `DATA_DEFINITION`:修改/创建/删除模式/表/视图的元数据,以及管理预备语句、权限、会话和事务的查询。 +- `DELETE`:`DELETE`查询。 - `DESCRIBE`:`DESCRIBE`、`DESCRIBE INPUT`、`DESCRIBE OUTPUT`以及`SHOW`查询。 - - `EXPLAIN`:`EXPLAIN`查询。 - - `INSERT`:`INSERT`和`CREATE TABLE AS`查询。 - - `SELECT`:`SELECT`查询。 -- `clientTags`(可选):标签列表。要匹配,此列表中的每个标记都必须在客户端提供的与查询关联的标记列表中。 -- `group`(required):这些查询将运行在哪个组中。 + - `EXPLAIN`:`EXPLAIN`查询。 + - `INSERT`:`INSERT`和`CREATE TABLE AS`查询。 + - `SELECT`:`SELECT`查询。 +- `clientTags`(可选):标签列表。为了能成功匹配,此列表中的每个标签都必须在客户端提供的与查询关联的标签列表中。 +- `group`(必填):这些查询将运行的组。 选择器按顺序处理,并将使用第一个匹配的选择器。 ## 全局属性 -- `cpuQuotaPeriod`(可选):CPU配额的执行周期。 + +- `cpuQuotaPeriod`(可选):CPU配额的执行周期。 ## 提供选择器属性 源名称的设置方式如下: - CLI:使用`--source`选项。 -- JDBC:在`Connection`实例上设置 `ApplicationName`客户端信息属性。 +- JDBC:在`Connection`实例上设置`ApplicationName`客户端信息属性。 客户端标签的设置方式如下: - CLI:使用`--client-tags`选项。 -- JDBC:在`Connection`实例上设置 `ClientTags`客户端信息属性。 +- JDBC:在`Connection`实例上设置`ClientTags`客户端信息属性。 + +## 限制和终止查询 + +查询提交给worker后,可能超出内存限制,需要使用以下机制处理正在运行的查询: + +- 限制查询 +- 终止查询 + +### 限制查询 + +对新的split schedule进行限制,避免worker内存占用进一步增加。如果当前查询资源组的内存使用量已超过**softReservedMemory**,将不会计划进行新的拆分,除非内存使用量低于**softReservedMemory***。 + +建议配置**softReservedMemory**小于**softMemoryLimit**。 + +用户还可以选择省略**softReservedMemory**配置 从而禁用限制查询。 + +### 终止查询 + +如果查询无法被限制,并且内存使用量超过softMemoryLimit,则将根据配置的终止策略终止查询(使查询失败)。只有子组运行的查询才会被终止。 ## 示例 -- 在下面的配置示例中,有几个资源组,其中部分是模板。模板允许管理员动态构建资源组树。例如,在`pipeline_${USER}`组中,`${USER}`将展开为提交查询的用户的名称。同样支持`${SOURCE}`,其将展开为提交查询的源。你也可以在`source`和`user`正则表达式中使用自定义命名变量。 - - 有四个选择器定义哪些查询在哪个资源组中运行: - - > - 第一个选择器将匹配来自`bob`的查询并将其置于管理组中。 - > - 第二个选择器匹配来自包括`pipeline`的源名称的所有数据定义(DDL)查询并将其放入`global.data_definition`组中。这可以帮助减少此类查询的排队时间,因为它们本应很快。 - > - 第三个选择器将匹配来自包含`pipeline`的源名称的查询,并将它们放在`global.pipeline`组下动态创建的每个用户管道组中。 - > - 第四个选择器匹配来自BI工具的查询,BI工具有一个匹配正则表达式`jdbc#(?.*)`的源,并且客户端提供的标记是`hi-pri`的超集。这些查询被放置在`global.pipeline.tools`组下的动态创建的子组中。动态子组将基于命名变量`toolname`创建,该命名变量从源的正则表达式的中提取。考虑源为`jdbc#powerfulbi`、用户为`kayla`、客户端标记为`hipri`和`fast`的查询。此查询将被路由到`global.pipeline.bi-powerfulbi.kayla`资源组。 - > - 最后一个选择器是一个回收器,将所有尚未匹配的查询放入到每个用户特定的组中。 - - 这些选择器共同执行以下策略: - - - 用户`bob`是管理员用户,可以运行最多50个并发查询。查询将根据用户提供的优先级运行。 - - 对于其余用户: - - - 同时运行的查询总数不能超过100个。 - - 最多可以运行5个源为`pipeline`的并发DDL查询。查询按先进先出顺序运行。 - - 非DDL查询将在`global.pipeline`组下运行,总并发量为45,每用户并发量为5。查询按先进先出顺序运行。 - - 对于BI工具,每个工具最多可以运行10个并发查询,每个用户最多可以运行3个并发查询。如果总需求超过10的限制,那么运行查询最少的用户将获得下一个并发槽位。这种策略在争用时保证公平。 - - 所有其余的查询都放在`global.adhoc.other`下行为类似的每个用户组中。 - -[resource-groups-example.json](resource-groups-example.json) \ No newline at end of file + +- 在以下示例配置中,部分资源组是模板。模板允许管理员动态构建资源组树。例如,在`pipeline_${USER}`组中,`${USER}`将被拓展为提交查询的用户的名称。同时支持`${SOURCE}`拓展为提交查询的源。还可以在`source`和`user`正则表达式中使用自定义命名变量。 + + + + 以下四个选择器可以用来定义哪些查询在哪个资源组中运行: + + + + > - 第一个选择器匹配来自`bob`的查询,并将其放置在管理组中。 + > - 第二个选择器匹配源名称中包括`pipeline`的所有数据定义(DDL)查询,并将其放置在`global.data_definition`组中,以减少此类查询的排队时间,因为它们会被快速执行。 + > - 第三个选择器匹配源名称中包括`pipeline`的查询,并将其放置在`global.pipeline`组下动态创建的每个用户管道组中。 + > - 第四个选择器匹配来自BI工具的查询,BI工具有一个源与正则表达式`jdbc#(?.*)`匹配,并且客户端提供的标签是`hi-pri`的超集。这些查询被放置在`global.pipeline.tools`组下动态创建的子组中。动态子组将基于命名变量`toolname`创建,该命名变量从源的正则表达式中提取。假设有一个源为`jdbc#powerfulbi`,用户为`kayla`,客户端标签为`hipri`和`fast`的查询。此查询将被路由到`global.pipeline.bi-powerfulbi.kayla`资源组。 + > - 最后一个选择器是一个回收器,将所有尚未匹配的查询放入每个用户的临时组中。 + + + + + + 这些选择器共同执行以下策略: + + + + - 用户`bob`是管理员,最多可以运行50个并发查询。查询将根据用户提供的优先级运行。 + + + + 对于其余用户: + + + + - 并发运行的查询总数不得超过100个。 + - 最多可以运行5个源为`pipeline`的并发DDL查询。查询按先进先出顺序运行。 + - 非DDL查询将在`global.Peline`组下运行,总并发量为45,每个用户并发量为5。查询按先进先出顺序运行。 + - 对于BI工具,每个工具最多可以运行10个并发查询,每个用户最多可以运行3个并发查询。如果总需求超过10的限制,那么运行查询最少的用户将获得下一个并发槽位。这种策略在争用时保证公平。 + - 其余的查询都放在`global.adhoc.other`下的每个用户组中,每个用户组的行为类似。 + + +[resource-groups-example.json](resource-groups-example.json) + diff --git a/content/zh-cn/docs/docs/connector/Hudi.md b/content/zh-cn/docs/docs/connector/Hudi.md index 29e73d4..87d8b24 100644 --- a/content/zh-cn/docs/docs/connector/Hudi.md +++ b/content/zh-cn/docs/docs/connector/Hudi.md @@ -4,7 +4,7 @@ Apache Hudi是一个快速迭代的数据湖存储系统,可以帮助企业构建和管理PB级数据湖。它提供在DFS上存储超大规模数据集,同时使得流式处理如果批处理一样,该实现主要是通过如下两个原语实现。 -- **Update/Delete记录**: Hudi支持更新/删除记录,使用文件/记录级别索引,同时对写操作提供事务保证。查询可获取最新提交的快照来产生结果。 +- **Update/Delete记录**: Hudi支持更新/删除记录,使用文件/记录级别索引,同时对写操作提供事务保证。查询可获取最新提交的快照来产生结果。(在文件中随机存取记录,记录的地址即为文件/记录索引) - **Change Streams**: Hudi也支持增量获取表中所有更新/插入/删除的记录,从指定时间点开始进行增量查询。 ### 支持的表格类型和查询类型 diff --git a/content/zh-cn/docs/docs/connector/kylin.md b/content/zh-cn/docs/docs/connector/kylin.md new file mode 100644 index 0000000..b1dde36 --- /dev/null +++ b/content/zh-cn/docs/docs/connector/kylin.md @@ -0,0 +1,36 @@ + +# Kylin连接器 + +Kylin连接器允许在外部Kylin数据库中查询表。这可用于在Kylin和Hive等不同系统之间或在两个不同的Kylin实例之间联接数据。 + +## 配置 + +要配置Kylin连接器,在`etc/catalog`中创建一个目录属性文件,例如`Kylin.properties`,将Kylin连接器挂载为`kylin`目录。使用以下内容创建文件,并根据设置替换连接属性: + +``` properties +connector.name=kylin +connection-url=jdbc:kylin://example.net/project +connection-user=root +connection-password=secret +connector-planoptimizer-rule-blacklist=io.prestosql.sql.planner.iterative.rule.SingleDistinctAggregationToGroupBy +``` + +其中connector-planoptimizer-rule-blacklist属性是对kylin特殊配置的,默认值就为io.prestosql.sql.planner.iterative.rule.SingleDistinctAggregationToGroupBy + +### 多个Kylin服务器 + +可以根据需要创建任意多的目录,因此,如果有额外的Kylin服务器,只需添加另一个不同名称的属性文件到`etc/catalog`中(确保它以`.properties`结尾)。例如,如果将属性文件命名为`sales.properties`,openLooKeng将使用配置的连接器创建一个名为`sales`的目录。 + +## 查询Kylin + +可以访问`web`数据库中`clicks`的表: + + SELECT * FROM kylin.web.clicks; + +如果对目录属性文件使用不同的名称,请使用该目录名称,而不要使用上述示例中的`kylin`。 + +## Kylin连接器限制 + +暂不支持以下SQL语句: + +[DELETE](../sql/insert.md)、../sql/update.md)、../sql/delete.html)、[GRANT](../sql/grant.html)、[REVOKE](../sql/revoke.html)、[SHOW GRANTS](../sql/show-grants.html)、[SHOW ROLES](../sql/show-roles.html)、[SHOW ROLE GRANTS](../sql/show-role-grants.html) \ No newline at end of file diff --git a/content/zh-cn/docs/docs/connector/memory.md b/content/zh-cn/docs/docs/connector/memory.md index 6fe0808..1958f03 100644 --- a/content/zh-cn/docs/docs/connector/memory.md +++ b/content/zh-cn/docs/docs/connector/memory.md @@ -1,27 +1,84 @@ # 内存连接器 -内存连接器将所有数据和元数据存储在工作节点上的内存中来获得更好性能。同时元数据和数据也被后台写入磁盘并在需要时自动读取。 +内存连接器将所有数据和元数据存储在工作节点上的内存中来获得更好的性能。 +同时元数据和数据也被后台写入磁盘并在需要时自动读取。 ## 配置 ### 内存连接器配置 -要配置内存连接器,创建一个具有以下内容的目录属性文件`etc/catalog/memory.properties`: +配置内存连接器时,创建或修改具有以下内容的目录属性文件`etc/catalog/memory.properties`: ``` properties connector.name=memory -memory.splits-per-node=10 memory.max-data-per-node=200GB memory.spill-path=/opt/hetu/data/spill ``` +#### 其他必要的配置 +- 本节将介绍使用内存连接器所需的其他配置。 +- 更多信息请参考[Hetu Metastore](../admin/meta-store.html)和[State Store](../admin/state-store.html)的文档。 + ##### 单个节点设置 + - 本节将给出单节点集群上内存连接器的示例配置。 + - 创建文件 `etc/catalog/memory.properties`并填入以下配置: + ``` properties + connector.name=memory + memory.max-data-per-node=200GB + memory.spill-path=/opt/hetu/data/spill + ``` + - 创建文件 `etc/hetu-metastore.properties` 并填入以下配置: + ```properties + hetu.metastore.type=hetufilesystem + hetu.metastore.hetufilesystem.profile-name=default + hetu.metastore.hetufilesystem.path=/tmp/hetu/metastore + hetu.metastore.cache.type=local + ``` + ##### 多节点设置 + - 本节将为具有多个节点的集群提供内存连接器的示例配置。 + - 创建文件 `etc/catalog/memory.properties` 并填入以下配置: + ``` properties + connector.name=memory + memory.max-data-per-node=200GB + memory.spill-path=/opt/hetu/data/spill + ``` + - 在 `etc/config.properties` 文件中加入以下代码来启用 State Store: + - State Store 允许 Memory Connector 自动清理删除的表,否则只有在创建另一个表时才会清理表。 + ```properties + hetu.embedded-state-store.enabled=true + ``` + - 创建文件 `etc/state-store.properties` 并填入以下配置: + ```properties + state-store.type=hazelcast + state-store.name=test + state-store.cluster=test-cluster + hazelcast.discovery.mode=tcp-ip + hazelcast.discovery.port=7980 + # 每个服务器的ip地址和hazelcast端口应该被声明在这里。 + # 格式:`hazelcast.discovery.tcp-ip.seeds=host1:port,host2:port` + hazelcast.discovery.tcp-ip.seeds=host1:7980, host2:7980 + ``` + - 创建文件 `etc/hetu-metastore.properties` 并填入以下配置: + ```properties + hetu.metastore.type=hetufilesystem + hetu.metastore.hetufilesystem.profile-name=hdfs + hetu.metastore.hetufilesystem.path=/tmp/hetu/metastore + # 确认使用全局缓存! + hetu.metastore.cache.type=global + ``` + - 创建文件 `etc/filesystem/hdfs.properties` 使openLooKeng使用相应的文件系统: + ```properties + fs.client.type=hdfs + # Path to hdfs resource files (e.g. core-site.xml, hdfs-site.xml) + hdfs.config.resources=/tmp/hetu/hdfs-site.xml + # hdfs authentication, accepted values: KERBEROS/NONE + hdfs.authentication.type=NONE + ``` + **提示:** - `spill-path`必须设置为一个有充足存储空间的路径。推荐使用SSD以获得更好性能。 可以依照需求自定义。 - 关于更多详细信息与其他可选配置项,请参见**配置属性** 章节。 - 在`etc/config.properties`中,请确保`task.writer-count`的数字不小于配置的openLooKeng集群的节点个数。这会帮助把所有数据更均匀地分配到各个节点上。 -- Hetu Metastore必须被妥善配置来保证内存连接器的正常功能。请参阅[Hetu Metastore](../admin/meta-store.html)。 - ## 示例 使用内存连接器创建表: @@ -60,7 +117,6 @@ memory.spill-path=/opt/hetu/data/spill | 属性名称 | 默认值 | 是否必要 | 描述 | |---------------------------------------|-----------------|---------|---------------------------| -| `memory.splits-per-node ` | coordinator上可用的处理器数 | No | 每个节点上的分片(Split)数量。默认值为coordinator上可用的处理器数。在worker上的设置该值会被忽略。当并发度高时,将该值调低可以提高性能。 | | `memory.spill-path ` | None | Yes | 在磁盘上持久化数据的位置。优先使用位于SSD的路径 | | `memory.max-data-per-node ` | 256MB | Yes | 每个节点的内存大小使用限制 | | `memory.max-logical-part-size ` | 256MB | No | 每个逻辑分片(LogicalPart)的大小限制 | @@ -93,23 +149,35 @@ memory.spill-path=/opt/hetu/data/spill 下图展示了内存连接器的总体设计: -![Memory Connector Overall Design](../images/memory-connector-overall-design.png) +![Memory Connector Overall Design](../images/memory-connector-design.png) -数据被切分为分片(Split)分布到各个worker节点上。这些分片又被组合为逻辑分片(LogicalPart)。每个逻辑分片包含索引和数据。表数据会自动写入到磁盘。如果没有足够的内存来保存整个表是,则可以从内存中释放表。数据在额外的后台进程中进行排序和索引,从而可以更快地创建表。该表在此期间仍可查询处理,但查询效率不高(索引尚未启用)。Hetu Metastore用于持久化表元数据。 -### 分片(Split) +### 调度流程 -在表创建期间,page被分发给每个worker。每个worker将有相同数量的分片。分片以循环方式填充page。当调度Table Scan时,将在每一个分片上调度查询。将拆分数设置为小于节点上内核数的值可实现最大并行度。并非所有表都能完整放在内存中,因此在内存限制被达到时引擎会依据LRU规则自动释放最近不使用的表。最大单个表大小是内存连接器限制的最大内存大小。表在创建后会在后台进程中自动持久化到磁盘。 +要处理的数据存储在page中,这些page被分发到openLooKeng中的不同工作节点(worker)。 +在内存连接器中,每个worker都有若干个LogicalParts。 +在表创建期间,worker中的LogicalParts以循环方式根据page内容被填充。 +数据内容也将作为后台进程的一部分自动持久化到磁盘。 +如果没有足够的内存来保存整个数据,则依据LRU规则从内存中释放最近不使用的表。 +HetuMetastore用于持久化表元数据。在查询时,当调度Tablescan操作时,将调度查询LogicalParts。 ### 逻辑分片(LogicalPart) -多个分片被进一步组织成逻辑分片。逻辑分片有一个可配置的最大容量(默认为 256 MB)。一旦最后一个可用的逻辑分片被填满,就会创建新的逻辑分片。作为表创建后的后台处理的一部分,数据在每一个逻辑分片中被排序和创建索引。基于下推的谓词,可以使用布隆过滤器和 MinMax 索引过滤掉不需要的逻辑分片。同时稀疏索引(Sparse Index)可以提供逻辑分片内部的更细致的过滤。 +如设计图的下半部分所示,LogicalPart是包含索引和原始数据内容的数据结构。 +作为表创建后的后台处理的一部分,数据在每一个逻辑分片中被排序和创建索引,以实现更快的查询,但在处理过程中已插入的数据仍然是可查询的。 +LogicalParts 具有最大可配置大小(默认为 256 MB)。一旦前一个逻辑部分已满,就会创建新的逻辑部分。 -### 稀疏索引 (Sparse Index) +### 索引 -首先对页面进行排序,最后创建一个稀疏索引。稀疏索引不会记录所有的数据值而只会间隔抽取一些。这使得索引更小。稀疏索引有助于减少输入行,但不能执行完美的过滤。进一步的过滤会由 openLooKeng的Filter Operator完成。 +LogicalPart 中创建了布隆过滤器、稀疏索引和 MinMax 索引。 +基于下推的predicate,可以使用布隆过滤器和 MinMax 索引过滤掉整个 LogicalParts。 +进一步的页面过滤是使用稀疏索引完成的。 +首先对页面进行排序,然后进行优化,最后创建一个稀疏索引。 +稀疏索引不会记录所有的数据值而只会间隔抽取一些。这使得索引更小。 +稀疏索引有助于减少输入行,但不能执行完美的过滤。 +进一步的过滤是由 openLooKeng 的 Filter Operator 完成的。 +参考上面的稀疏索引示例,这是内存连接器为不同查询过滤数据的方式: -参考图中的稀疏索引示例,这是内存连接器为不同查询过滤数据的方式: ``` 查询: column=a. @@ -129,8 +197,7 @@ memory.spill-path=/opt/hetu/data/spill ## 内存连接器限制和已知问题 -- `DROP TABLE`之后,worker上的内存没有立即释放。内存在下一次对内存连接器进行创建操作后释放。 - - 可以通过创建一个临时的表来在worker上强制清理,如`CREATE TABLE memory.default.tmp AS SELECT * FROM tpch.tiny.nation;` +- 如果没有 State Store 和带有全局缓存的 Hetu Metastore,在 `DROP TABLE` 之后,内存不会立即释放到 worker 上。它将在下一个“CREATE TABLE”操作时被释放。 - 当前`sorted_by`只支持按一个列排序。 - 如果一个CTAS (CREATE TABLE AS)查询失败或被取消,一个无效的表的记录会留在系统中。该表将需要被手动删除。 diff --git a/content/zh-cn/docs/docs/connector/mongodb.md b/content/zh-cn/docs/docs/connector/mongodb.md index 1ea38dc..9a69338 100644 --- a/content/zh-cn/docs/docs/connector/mongodb.md +++ b/content/zh-cn/docs/docs/connector/mongodb.md @@ -153,7 +153,8 @@ MongoDB在`mongodb.schema-collection`指定的配置特殊集合上维护表格 **注意** 插件无法检测到集合被删除。 - 需要在Mongo shell中通过db.getCollection("_schema").remove({ table: delete_table_name })删除集合。 + 需要在Mongo shell中通过以下命令删除集合。 + db.getCollection("_schema").remove({ table: delete_table_name }) 或者通过使用openLooKeng运行DROP TABLE table_name来删除集合。 schema中的集合由表的MongoDB文档组成。 diff --git a/content/zh-cn/docs/docs/connector/opengauss.md b/content/zh-cn/docs/docs/connector/opengauss.md index e6af0d5..d91fbb1 100644 --- a/content/zh-cn/docs/docs/connector/opengauss.md +++ b/content/zh-cn/docs/docs/connector/opengauss.md @@ -51,6 +51,8 @@ openGauss连接器为每个openGauss模式提供一个模式。可通过执行`S > - 不支持配置`use-connection-pool`。 +> - 在目录属性文件设置`opengauss.metadata.speedup=true`可以用于加速DatabaseMetaData查询(缺省值为false)。 + *openGauss后续版本如果支持上述限制,我们会进行相应的适配。* ## openGauss连接器限制 diff --git a/content/zh-cn/docs/docs/develop/star-tree-cube.md b/content/zh-cn/docs/docs/develop/star-tree-cube.md deleted file mode 100644 index d6a2c85..0000000 --- a/content/zh-cn/docs/docs/develop/star-tree-cube.md +++ /dev/null @@ -1,70 +0,0 @@ -# Star-Tree - -Star-tree多维数据集是一种预聚合技术,用于实现低延迟冰山查询。冰山查询用于计算属性(或属性集)的聚合函数,以便查找高于指定阈值的聚合值。通过该技术,用户能够创建具有必要聚合和维度的多维数据集。然后,当执行聚合查询时,多维数据集用于执行查询而非原始表。实际性能提升是在TableScan操作期间实现的,因为多维数据集是预计算和预聚合的。 - -因此,当group by基数产生的行少于原始表时,多维数据集技术非常有效。 - -## 支持功能 - - COUNT, COUNT DISTINCT, MIN, MAX, SUM, AVG - -## 启用和禁用star-tree - -启用star-tree: - -```sql -SET SESSION enable_star_tree_index=true; -``` - -禁用star-tree: - -```sql -SET SESSION enable_star_tree_index=false; -``` - -## 配置属性 - -| 属性名称| 默认值| 是否必填| 说明| -|----------|----------|----------|----------| -| optimizer.enable-star-tree-index| false| 否| 启用star-tree索引| -| cube.metadata-cache-size| 5| 否| 在缓存清空前可以加载到缓存中的star-tree元数据的最大数量| -| cube.metadata-cache-ttl| 1h| 否| 在缓存清空前加载到缓存中的star-tree的最长保留时间| - -## 示例 - -创建star-tree多维数据集: - -```sql -CREATE CUBE nation_cube -ON nation -WITH (AGGREGATIONS=(count(*), count(distinct regionkey), avg(nationkey), max(regionkey)), -GROUP=(nationkey), -format='orc', partitioned_by=ARRAY['nationkey']); -``` - -向多维数据集添加数据: - -```sql -INSERT INTO CUBE nation_cube WHERE nationkey > 5; -``` - -要使用新多维数据集,只需使用多维数据集中包含的聚合来查询原始表: - -```sql -SELECT count(*) FROM nation WHERE nationkey > 5 GROUP BY nationkey; -SELECT nationkey, avg(nationkey), max(regionkey) WHERE nationkey > 5 GROUP BY nationkey; -``` - -## 优化器变更 - -Star-tree聚合规则为迭代优化器,通过将原始聚合子树和原始表扫描替换为预聚合表扫描来优化逻辑计划。 - -## 依赖 - -Star-tree索引依赖于Hetu元存储来存储多维数据集相关的元数据。有关更多信息,请查看[Hetu元存储](../admin/meta-store.html)。 - -## 限制 - -1. Star-tree多维数据集仅在group by基数远低于源表中的行数时有效。 -2. 维护大型数据集的多维数据集需要大量的用户人力。 -3. 仅支持增量插入多维数据集。无法从多维数据集删除特定行。 \ No newline at end of file diff --git a/content/zh-cn/docs/docs/faq/faq.md b/content/zh-cn/docs/docs/faq/faq.md index 36ed2ee..2bf5da8 100644 --- a/content/zh-cn/docs/docs/faq/faq.md +++ b/content/zh-cn/docs/docs/faq/faq.md @@ -148,6 +148,11 @@ > 当前只有hive connector的orc数据格式,才支持创建索引。 +11. 使用JDBC发送SQL时,遇到问题Request header fields too large 或 Response header too large,怎么解决? + > 在config.properties 配置文件中增加如下参数,并配置为较大的值,例如: + > http-server.max-request-header-size=64KB + > http-server.max-response-header-size=64KB + ## 数据源 1. openLooKeng的SQL是否是大小写敏感的?如果数据源是大小写敏感的,openLooKeng如何处理? diff --git a/content/zh-cn/docs/docs/images/cube-logical-plan-optimizer.png b/content/zh-cn/docs/docs/images/cube-logical-plan-optimizer.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad984d519191eb1ffb4132eeb8d838d0961abaa GIT binary patch literal 38432 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

Cfbd=R3x-DB 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 LUM$kS_vHTooxV@* literal 0 HcmV?d00001 diff --git a/content/zh-cn/docs/docs/images/memory-connector-design.png b/content/zh-cn/docs/docs/images/memory-connector-design.png new file mode 100644 index 0000000000000000000000000000000000000000..bab4282001e4199c27d8ecf1f4ec3af734834de6 GIT binary patch literal 109366 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 literal 0 HcmV?d00001 diff --git a/content/zh-cn/docs/docs/images/memory-connector-overall-design.png b/content/zh-cn/docs/docs/images/memory-connector-overall-design.png deleted file mode 100644 index 7fc1ec3c76f0b793a7f9929a985056f6860849ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88463 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 更小的FPP会提高索引的过滤能力,但是会增加索引的体积。在大多数情况下默认值就足以够用。 > 如果创建的索引太大,可以考虑增加这个值(例如,至0.05)。 +### `bloom.mmapEnabled` + +> - **类型:** `Boolean` +> - **默认值:** `true` +> +> 控制在读取布隆索引时是否应使用内存映射文件 (mmap)。 +> 启用此值将在读取期间将 Bloom 索引缓存到本地磁盘而不是内存中。 +> 这将减少内存消耗,但会导致性能略有下降。 + ## 用例 **创建索引:** @@ -51,6 +60,7 @@ create index idx using bloom on hive.hindex.users (id); create index idx using bloom on hive.hindex.users (id) where regionkey=1; create index idx using bloom on hive.hindex.users (id) where regionkey in (3, 1); create index idx using bloom on hive.hindex.users (id) WITH ("bloom.fpp" = '0.001'); +create index idx using bloom on hive.hindex.users (id) WITH ("bloom.mmapEnabled" = false); ``` * 假设表已按照`regionkey`列分区 diff --git a/content/zh-cn/docs/docs/indexer/btree.md b/content/zh-cn/docs/docs/indexer/btree.md index 3bf49b6..0c1d4ed 100644 --- a/content/zh-cn/docs/docs/indexer/btree.md +++ b/content/zh-cn/docs/docs/indexer/btree.md @@ -53,9 +53,9 @@ BTreeIndex用于调度时的分片(Split)过滤,被coordinator节点使用。 **创建索引:** ```sql -create index idx using btree on hive.hindex.orders (orderid) with (level=table)'; -create index idx using btree on hive.hindex.orders (orderid) with (level=partition) where orderDate='01-10-2020'; -create index idx using btree on hive.hindex.orders (orderid) with (level=partition) where orderDate in ('01-10-2020', '01-10-2020'); +create index idx using btree on hive.hindex.orders (orderid); +create index idx using btree on hive.hindex.orders (orderid) where orderDate='01-10-2020'; +create index idx using btree on hive.hindex.orders (orderid) where orderDate in ('01-10-2020', '01-10-2020'); ``` * 假设表已按照`orderDate`列分区 diff --git a/content/zh-cn/docs/docs/indexer/hindex-statements.md b/content/zh-cn/docs/docs/indexer/hindex-statements.md index 87d2ccc..47e4c39 100644 --- a/content/zh-cn/docs/docs/indexer/hindex-statements.md +++ b/content/zh-cn/docs/docs/indexer/hindex-statements.md @@ -10,13 +10,17 @@ CREATE INDEX [ IF NOT EXISTS ] index_name USING [ BITMAP | BLOOM | BTREE | MINMAX ] ON tbl_name (col_name) -WITH ( 'level' = ['STRIPE', 'PARTITION'], "bloom.fpp" = '0.001', [, …] ) +WITH ( 'level' = ['STRIPE', 'PARTITION'], "autoload" = true, "bloom.fpp" = '0.001', "bloom.mmapEnabled" = false, [, …] ) WHERE predicate; ``` - `WHERE` 用于选择部分分区创建索引 - `WITH` 用于设置索引属性。参见各个索引的文档来查看支持的配置 - `"level"='STRIPE'` 如缺省,默认创建级别是STRIPE +- `"autoload"` 覆盖 config.properties 中的默认值 `hetu.heuristicindex.filter.cache.autoload-default`。 +索引创建或更新后,是否自动加载到缓存中。 +如果为 false,将根据需要加载索引。这意味着,前几个查询可能不会使用索引,因为它正在加载到缓存中。 +将此设置为 true 可能会导致高内存使用率,但会提供最佳结果。 如果表是分区的,可以用一个等于表达式来指定一个创建的分区,或使用IN来指定多个。 @@ -30,13 +34,22 @@ CREATE INDEX index_name USING bloom ON hive.schema.table (column1) WHERE p in (p ## SHOW -显示所有索引或只根据名字显示一个索引: +显示所有索引或根据名字显示特定索引的信息。 +信息包括索引名、用户、表名、索引列、索引类型、索引状态等。 ```roomsql SHOW INDEX; SHOW INDEX index_name; ``` +## UPDATE + +如果源表已被修改,则更新现有索引。你可以用```SHOW INDEX index_name```检查索引的状态。 + +```roomsql +UPDATE INDEX index_name; +``` + ## DROP 根据名字删除一条索引: @@ -52,6 +65,7 @@ DROP INDEX index_name where p=part1; ``` 删除的索引不会立即被从服务器的缓存中清除,直到下一次刷新缓存。刷新时间与设置的缓存加载延迟有关,通常在几秒钟左右。 +如果删除源表,索引将自动删除。 ## 资源使用说明 diff --git a/content/zh-cn/docs/docs/indexer/overview.md b/content/zh-cn/docs/docs/indexer/overview.md index 2bfa4fb..47d37f8 100644 --- a/content/zh-cn/docs/docs/indexer/overview.md +++ b/content/zh-cn/docs/docs/indexer/overview.md @@ -48,22 +48,33 @@ ## 示例教程 -这一教程将通过一个示例查询语句来展示索引的用法。完整的配置请参见[Properties](../admin/properties.html)。 +这一教程将通过一个示例查询语句来展示索引的用法。 ### 1. 配置索引 -索引功能现使用Hetu Metastore管理元数据。Hetu Metastore是一个被整个OLK集群多个功能共用的元数据管理器, -请参阅 [Hetu Metastore](../admin/meta-store.html) 获取关于如何配置的更多信息。 -注意:必须先配置好Hetu Metastore,启发式索引才能正常运行! +启发式索引需要配置几个组件才能工作。 +确保集群中的所有节点都以相同的方式配置,使用相同的hetu文件系统和Metastore等. -在 `etc/config.properties` 中加入这些行: +#### a. Hetu Metastore - hetu.heuristicindex.filter.enabled=true - hetu.heuristicindex.filter.cache.max-memory=10GB - hetu.heuristicindex.indexstore.uri=/opt/hetu/indices - hetu.heuristicindex.indexstore.filesystem.profile=index-store-profile +Heuristic Index 使用 Hetu Metastore 来管理其元数据。 +Hetu Metastore 是一个共享元数据管理实用程序,多个 openLooKeng 功能使用它。 +有关如何配置它的更多信息, 请参考 [Hetu Metastore](../admin/meta-store.html). -路径配置白名单:["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", 工作目录] +**注意**: 必须启用全局缓存! 如果Hetu Metastore 配置不正确,启发式索引将不起作用。 + +以下是参考`etc/hetu-metastore.properties`: + +```properties + hetu.metastore.type=hetufilesystem + hetu.metastore.hetufilesystem.profile-name=hdfs + # 此路径在 hdfs 内 + hetu.metastore.hetufilesystem.path=/tmp/hetu/metastore + # 使用全局缓存! + hetu.metastore.cache.type=global +``` + +*路径白名单:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]`* 避免选择根目录;路径不能包含../;如果配置了node.data_dir,那么当前工作目录为node.data_dir的父目录;如果没有配置,那么当前工作目录为openlookeng server的目录 @@ -73,14 +84,68 @@ - 所有节点必须有相同的文件系统配置。 - 在服务器运行中可以通过`set session heuristicindex_filter_enabled=false;`关闭启发式索引。 -然后在`etc/filesystem/index-store-profile.properties`中创建一个HDFS描述文件, 其中`index-store-profile`是上面使用的名字: +#### b. Hetu Statestore - fs.client.type=hdfs - hdfs.config.resources=/path/to/core-site.xml,/path/to/hdfs-site.xml - hdfs.authentication.type=NONE - fs.hdfs.impl.disable.cache=true - -如果HDFS集群开启了KERBEROS验证,还需要配置`hdfs.krb5.conf.path, hdfs.krb5.keytab.path, hdfs.krb5.principal`. +如Hetu Metastore 设置中提到的,必须启用全局缓存,这需要配置Hetu Statestore。 +更多配置方法请查看[Hetu Statestore](../admin/state-store.html). + +在`etc/config.propertes`中配置: + +```properties + hetu.embedded-state-store.enabled=true +``` + +以下是参考`etc/state-store.properties`: + +```properties + state-store.type=hazelcast + state-store.name=test + state-store.cluster=test-cluster + hazelcast.discovery.mode=tcp-ip + hazelcast.discovery.port=7980 + # 这里必须包含每台服务器的ip地址和hazelcast发现端口 + hazelcast.discovery.tcp-ip.seeds=host1:7980,host2:7980 +``` + +#### c. Hetu Filesystem + +Hetu Filesystem 用于存储索引,在上面的例子Hetu Metastore中也使用了Hetu Filesystem。 +必须使用 `HDFS` 文件系统类型以便集群中所有节点都可以访问索引。 +更多配置方法请查看 [Hetu Filesystem](../develop/filesystem.html). + +以下是参考`etc/filesystem/hdfs.properties`: + +```properties + fs.client.type=hdfs + # 本地计算机上的 hdfs 资源文件(例如 core-site.xml、hdfs-site.xml)的路径 + hdfs.config.resources=/tmp/hetu/hdfs-site.xml,/tmp/hetu/core-site.xml + hdfs.authentication.type=NONE + fs.hdfs.impl.disable.cache=true +``` + +*路径白名单:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]`* + +#### d. Heuristic Index + +最后,一旦配置了所有先决条件,就可以启用Heuristic Index。 + +在 `etc/config.properties` 中,添加以下几行: + + ```properties + hetu.heuristicindex.filter.enabled=true + hetu.heuristicindex.indexstore.filesystem.profile=hdfs + # 此路径在 hdfs 内 + hetu.heuristicindex.indexstore.uri=/tmp/hetu/indexstore + ``` + +*路径白名单:`["/tmp", "/opt/hetu", "/opt/openlookeng", "/etc/hetu", "/etc/openlookeng", current workspace]`* + +有关Heuristic Index的完整配置列表,请参阅 [Configuration Properties](#configuration-properties) below +and [Properties](../admin/properties.html). + +可以通过设置`set session heuristicindex_filter_enabled=false;`在引擎运行时禁用启发式索引。 + +配置启发式索引后,启动引擎。 ### 2. 确定索引建立的列 @@ -96,25 +161,64 @@ 要创建索引, 在命令行中输入: - CREATE INDEX index_name USING bloom ON table1 (column); - + CREATE INDEX index_name USING bloom ON table1 (id); + ### 4. 运行语句 -完成上面的操作后,再次在Hetu服务器运行这个语句,服务器将在后台自动加载索引。接下来的语句将会从中获得性能提升。 +创建索引后,它将自动加载到Coordinator缓存中。 +未来的查询将利用索引来减少读取的数据量并且查询性能将得到提高。 + + # 再次运行相同的查询现在应该会导致更少的拆分和改进的性能 + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; ## 索引配置属性 -| 属性名称 | 默认值 | 是否必填| 说明| -|---------------------------------------------------|---------------------|-------|----------| -| hetu.heuristicindex.filter.enabled | false | 否 | 启用启发式索引| -| hetu.heuristicindex.filter.cache.max-memory | 10GB | 否 | 索引缓存大小| -| hetu.heuristicindex.filter.cache.soft-reference | true | 否 | 允许GC在内存不足时从缓存中清除内容来释放内存| -| hetu.heuristicindex.filter.cache.ttl | 24h | 否 | 索引缓存的有效时间| -| hetu.heuristicindex.filter.cache.load-threads | 10 | 否 | 从存储文件系统并行加载索引文件使用的线程数| -| hetu.heuristicindex.filter.cache.loading-delay | 10s | 否 | 在异步加载索引到缓存前等待的时长| -| hetu.heuristicindex.indexstore.uri | /opt/hetu/indices/ | 否 | 所有索引文件存储的目录| -| hetu.heuristicindex.indexstore.filesystem.profile | local-config-default| 否 | 用于存储索引文件的文件系统属性描述文件名称| -| hetu.heuristicindex.filter.cache.preload-indices | | 否 | 在服务器启动时预加载指定名称的索引(用逗号分隔), 当值为`ALL`时将预载入全部索引| +| 属性名称 | 默认值 | 是否必填| 说明| +|-----------------------------------------------------|---------------------|-------|----------| +| hetu.heuristicindex.filter.enabled | false | 否 | 启用启发式索引| +| hetu.heuristicindex.filter.cache.max-memory | 10GB | 否 | 索引缓存大小| +| hetu.heuristicindex.filter.cache.soft-reference | true | 否 | 允许GC在内存不足时从缓存中清除内容来释放内存| +| hetu.heuristicindex.filter.cache.ttl | 24h | 否 | 索引缓存的有效时间| +| hetu.heuristicindex.filter.cache.load-threads | 10 | 否 | 从存储文件系统并行加载索引文件使用的线程数| +| hetu.heuristicindex.filter.cache.loading-delay | 10s | 否 | 在异步加载索引到缓存前等待的时长| +| hetu.heuristicindex.indexstore.uri | /opt/hetu/indices/ | 否 | 所有索引文件存储的目录| +| hetu.heuristicindex.indexstore.filesystem.profile | local-config-default| 否 | 用于存储索引文件的文件系统属性描述文件名称| +| hetu.heuristicindex.filter.cache.preload-indices | | 否 | 在服务器启动时预加载指定名称的索引(用逗号分隔), 当值为`ALL`时将预载入全部索引| +| hetu.heuristicindex.filter.cache.autoload-default | true | 否 | Coordinator上自动加载索引的默认值。要更改特定索引的值,请通过在 create index 语句 WITH ("autoload" = true/false) 设置| + +**关于`hetu.heuristicindex.filter.cache.autoload-default`的更多细节:** + +自动加载仅影响Coordinator上使用的索引,例如 MinMax、Bloom 和 BTree 索引。 +Worker上使用的索引,例如 Bitmap索引,将在查询被执行时按需加载。 + +建议保持启用自动加载。 + +启用自动加载设置后,索引将在创建后(延迟约 5 秒)加载到Coordinator缓存中 。 +当索引加载到Coordinator缓存中时,它将在用户运行查询时被使用。 + +例如: + + CREATE INDEX idx USING bloom ON table1 (id); + # 创建后,索引将自动加载到coordinator缓存中 + + # 运行此查询将利用索引 + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; + +禁用自动加载设置时,索引创建后不会自动加载到Coordinator缓存中。 +相反,它将在用户运行查询时按需加载。 +以后的查询将使用该索引。 + +例如: + + CREATE INDEX idx USING bloom ON table1 (id) WITH ("autoload" = false); + # 创建后,索引不会自动加载到coordinator缓存中 + + # 运行一次查询将触发索引加载 + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; + # 索引将开始在后台加载 + + # 现在运行相同的查询将使用索引 + SELECT * FROM hive.schema.table1 WHERE id="abcd1234"; ## 索引语句 diff --git a/content/zh-cn/docs/docs/installation/deployment-auto.md b/content/zh-cn/docs/docs/installation/deployment-auto.md index 122b54e..4525533 100644 --- a/content/zh-cn/docs/docs/installation/deployment-auto.md +++ b/content/zh-cn/docs/docs/installation/deployment-auto.md @@ -4,6 +4,9 @@ 除了手动部署openLooKeng服务器外,还可以按照以下指导更快、更容易地完成部署。这个脚本对大多数Linux操作系统都很友好。但是,对于Ubuntu,需要手动安装以下依赖项。 > sshpass1.06及以上版本 +~~~shell +yum install sshpass +~~~ ## 在单个节点上部署openLooKeng diff --git a/content/zh-cn/docs/docs/migration/hetu-hive-functions.md b/content/zh-cn/docs/docs/migration/hetu-hive-functions.md index 481bceb..e293cdc 100644 --- a/content/zh-cn/docs/docs/migration/hetu-hive-functions.md +++ b/content/zh-cn/docs/docs/migration/hetu-hive-functions.md @@ -13,13 +13,13 @@ byteudf io.hetu.core.hive.dynamicfunctions.examples.udf.ByteUDF intudf io.hetu.core.hive.dynamicfunctions.examples.udf.IntUDF ``` -2. 用户应将Hive function函数的jar包和依赖项上传到`${node.data-dir}`,这个配置在`node.properties`中。用户可以通过在`config.properties`中设置`external-functions.dir`来自定义上传的路径,默认路径是“externalFunctions”。一个示例配置如下: +2. 用户应将Hive function函数的jar包和**依赖包**上传到`${node.data-dir}`,这个配置在`node.properties`中。用户可以通过在`config.properties`中设置`external-functions.dir`来自定义上传的路径,默认路径是“externalFunctions”。一个示例配置如下: ``` external-functions.dir=externalFunctions ``` 因此,默认情况下,用户应该将其Hive function上传到`${node.data-dir}`的`externalFunctions`文件夹。 -3. 用户应将Hive function的配置文件`udf.properties`上传到`${node.data-dir}`目录下。 +3. 用户应将Hive function的配置文件`udf.properties`上传到`${node.data-dir}/etc`目录下。 diff --git a/content/zh-cn/docs/docs/preagg/overview.md b/content/zh-cn/docs/docs/preagg/overview.md new file mode 100644 index 0000000..4e858c6 --- /dev/null +++ b/content/zh-cn/docs/docs/preagg/overview.md @@ -0,0 +1,221 @@ +# StarTree多维数据集 +## 介绍 +StarTree Cube,作为多维数据集,是存储为表格的物化预聚合结果。该技术旨在优化低延迟冰山查询。 +冰山查询是涉及**GROUP BY**和**HAVING**子句的SQL查询的一种特殊情况,其中答案集相对于扫描的数据大小而言较小。 +查询的特点是输入量大,输出量小。 + +此技术允许用户在现有表上构建Cubes,其中包含旨在优化特定查询的聚合和维度。 +Cubes是汇总预聚合,与原始表相比,其维度和行数更少。 +较少的行数意味着花费在表扫描上的时间显着减少,从而减少查询延迟。 +如果查询是预聚合表的维度和度量的子集, +那么Cube可以用来计算查询,而无需访问原始表。 + +Cube有以下几个属性 + - Cubes以表格格式存储 + - 一般来说,可以为任何连接器中的任何表创建Cubes并存储在另一个连接器中 + - 通过重写逻辑计划以使用Cube而不是原始表来减少查询延迟。 + +## Cube的多维数据集优化器规则 +作为逻辑计划优化的一部分,Cube优化器规则使用Cubes分析和优化逻辑计划的聚合子树。 +该规则查找通常如下所示的聚合子树 + +``` +AggregationNode +|- ProjectNode[Optional] + |- ProjectNode[Optional] + |- FilterNode[Optional] + |- ProjectNode[Optional] + |- TableScanNode +``` + +规则通过子树解析,识别出与Cube元数据匹配的表名、聚合函数、where子句、group by子句 +识别任何可以帮助优化查询的Cube。在多个匹配的情况下,选择最近创建的Cube进行优化。如果找到任何匹配项,则整个 +使用Cube重写聚合子树。此优化器使用TupleDomain构造来匹配查询中提供的谓词是否可以被 +立方体。 + +下图描绘了优化后逻辑计划的变化。 + +![img](../images/cube-logical-plan-optimizer.png) + +## 推荐用法 +1. Cubes对于需要大量输入并产生少量输入的冰山查询最有用。 +2. 当Cube的大小小于构建Cube的实际表上的大小时,查询性能最佳。 +3. 如果源表更新,则需要重建Cubes。 + +**注意:** +如果在构建Cubes后更新源表,Cube优化器将忽略在表上创建的Cubes。原因是,任何 +即使在原始表中只插入了新行,对更新的操作也被视为对现有数据的更改。由于插入和更新 +不能区分,不能使用Cubes,因为它可能会导致不正确的结果。我们正在研究解决此限制的解决方案。 + +## 支持的连接器 +以下是用于存储Cube的支持的连接器 +1. Hive +2. Memory +3. Clickhouse + +## 未来的工作 +1. 支持更多JDBC连接器 +2. 简化Cube管理 + + 2.1. 克服为更大的数据集创建Cube的限制。 + + 2.2. 如果源表已更新,则更新Cube。 + +## 启用和禁用StarTree Cube +启用: +```sql +SET SESSION enable_star_tree_index=true; +``` +禁用: +```sql +SET SESSION enable_star_tree_index=false; +``` + +## 配置属性 +| 属性名称 | 默认值 | 是否必要 | 描述 | +|---------------------------------------------------|---------------------|---------|--------------| +| optimizer.enable-star-tree-index | false | 否 | 启动StarTree Cube | +| cube.metadata-cache-size | 50 | 否 | 在驱逐发生之前可以加载到缓存中的 StarTree Cube 的最大元数据数 | +| cube.metadata-cache-ttl | 1h | 否 | 在驱逐发生之前加载到缓存中的 StarTree Cube 的最大生存时间 | + +## 依赖关系 + +StarTree Cube依赖于Hetu Metastore来存储Cube相关的元数据。 +请查看[Hetu Metastore](../admin/meta-store.html)以获取更多信息。 + +## 例子 + +创建StarTree Cube: +```sql +CREATE CUBE nation_cube +ON nation +WITH (AGGREGATIONS=(count(*), count(distinct regionkey), avg(nationkey), max(regionkey)), +GROUP=(nationkey), +format='orc', partitioned_by=ARRAY['nationkey']); +``` +接下来,将数据添加到Cube: +```sql +INSERT INTO CUBE nation_cube WHERE nationkey >= 5; +``` +使用WHERE子句创建StarTree Cube: +请注意,以下查询仅通过CLI支持 + +```sql +CREATE CUBE nation_cube +ON nation +WITH (AGGREGATIONS=(count(*), count(distinct regionkey), avg(nationkey), max(regionkey)), +GROUP=(nationkey), +format='orc', partitioned_by=ARRAY['nationkey']) +WHERE nationkey >= 5; +``` + +当需要使用新的Cube时,只需使用包含在Cube中的聚合查询原始表: + +```sql +SELECT count(*) FROM nation WHERE nationkey >= 5 GROUP BY nationkey; +SELECT nationkey, avg(nationkey), max(regionkey) FROM nation WHERE nationkey >= 5 GROUP BY nationkey; +``` + +由于插入Cube的数据是为`nationkey >= 5`,只有匹配此条件的查询才会使用Cube。 +不符合条件的查询将继续工作,但不会使用Cube。 + +## 为大型数据集构建Cube +当前实现的限制之一是不能一次为更大的数据集构建Cube。这是由于集群内存限制。 +处理大量行需要比集群配置更多的内存。这会导致查询失败并显示消息**Query exceeded per-node user memory limit**,也就是警告查询超出每节点用户内存限制。为了克服这个问题,**INSERT INTO CUBE** SQL支持被添加了。 +用户可以通过执行多个操作来为更大的数据构建一个Cube插入到Cube语句中。insert语句接受一个where子句,它可以用来限制处理和插入到Cube中的数量。 + +本节介绍为更大的数据集构建Cube的步骤。 + +让我们以TPCDS数据集和`store_sales`表为例。该表有10年的数据, +用户想要构建2001年的Cube,由于集群内存限制,无法一次处理2001年的整个数据集。 + +```sql +CREATE CUBE store_sales_cube ON store_sales WITH (AGGREGATIONS = (sum(ss_net_paid), sum(ss_sales_price), sum(ss_quantity)), GROUP = (ss_sold_date_sk, ss_store_sk)); + +SELECT min(d_date_sk) as year_start, max(d_date_sk) as year_end FROM date_dim WHERE d_year = 2001; + year_start | year_end +------------+---------- + 2451911 | 2452275 +(1 row) +``` +如果需要处理的行数很大并且查询内存超过为集群配置的限制, +则以下查询可能会导致失败。 + +```sql +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2451911 AND 242275; +``` + +### 解决方案1) +为了克服这个问题,可以使用多个insert语句来处理行并插入cube中,并且可以使用where子句来限制行数; + +```sql +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2451911 AND 2452010; +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk >= 2452011 AND ss_sold_date_sk <= 2452110; +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2452111 AND 2452210; +INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk BETWEEN 2452211 AND 2452275; +``` + +### 解决方案2) +CLI已被修改以支持为更大的数据集创建Cubes,而不需要多个插入语句。CLI在内部处理这个过程。 +一旦用户运行带有where子句的create cube语句,CLI就会负责创建Cube并将数据插入其中。 +此过程改善了用户体验并改善了基于集群内存限制的内存占用。CLI在内部将转换语句解析为一个create Cube语句,然后是一个或多个insert语句。 +此更改仅在用户从CLI而非通过任何其他方式(例如JDBC等)执行命令时才有效。 + +```sql +CREATE CUBE store_sales_cube ON store_sales WITH (AGGREGATIONS = (sum(ss_net_paid), sum(ss_sales_price), sum(ss_quantity)), GROUP = (ss_sold_date_sk, ss_store_sk)) WHERE ss_sold_date_sk BETWEEN 2451911 AND 242275; +``` + +系统内部会重写所有连续的范围谓词并将其合并为单个谓词; + +```sql +SHOW CUBES; + + Cube Name | Table Name | Status | Dimensions | Aggregations | Where Clause +---------------------------------+----------------------------+--------+-----------------------------+-------------------------------------------------------+-------------------------------------------------------+------------------------------ + hive.tpcds_sf1.store_sales_cube | hive.tpcds_sf1.store_sales | Active | ss_sold_date_sk,ss_store_sk | sum(ss_sales_price),sum(ss_net_paid),sum(ss_quantity) | (("ss_sold_date_sk" >= BIGINT '2451911') AND ("ss_sold_date_sk" < BIGINT '2452276')) +``` + +**注意:** +1. 系统将尝试将所有类型的Predicates重写为Range以查看它们是否可以合并在一起。 + 所有连续谓词将合并为单个范围谓词,其余谓词保持不变。 + + 仅支持以下类型并且可以合并在一起。 + `Integer, TinyInt, SmallInt, BigInt, Date` + + 对于其他数据类型,很难确定两个谓词是否连续,因此它们不能合并在一起。 + 由于这个问题,即使Cube具有所有必需的数据,在查询优化期间也可能不会使用特定Cube。例如, + +```sql + INSERT INTO CUBE store_sales_cube WHERE store_id BETWEEN 'A01' AND 'A10'; + INSERT INTO CUBE store_sales_cube WHERE store_id BETWEEN 'A11' AND 'A20'; +``` + 这里这两个谓词不能合并到store_id BETWEEN 'A01' AND 'A20'; + 因此,Cube不会用于跨越两个谓词的查询; + +```sql + SELECT ss_store_id, sum(ss_sales_price) WHERE ss_store_id BETWEEN 'A05' AND 'A15'; - Cube won't be used for optimizing this query. This is a limitation as of now. +``` + 由于谓词重写,无法支持以下某些查询 + +```sql + INSERT INTO CUBE store_sales_cube WHERE ss_sold_date_sk > 2451911; +``` + 谓词重写为ss_sold_date_sk >= 2451912为合并连续谓词做准备。 + 由于谓词被重写,他们使用ss_sold_date_sk > 2451911谓词查询将与Cube谓词不匹配,因此不会使用Cube来优化查询。 + 这同样适用于带有<=运算符的谓词,例如,ss_sold_date_sk <= 2451911改写为ss_sold_date_sk < 2451912。 + +```sql + SELECT ss_sold_date_sk, .... FROM hive.tpcds_sf1.store_sales WHERE ss_sold_date_sk > 2451911 +``` +3. 只能合并单列谓词。 + +## 未解决的问题和限制 +1. StarTree Cube仅在按基数分组的数量远小于源表中的行数时有效。 +2. 维护大型数据集的Cubes需要大量的用户工作。 +3. 仅支持增量插入Cube。无法从Cube中删除特定行。 +4. 即使源表尚未更新,在事务表上创建的Cubes也可能会自动过期。 + 这是由于压缩策略将delta文件合并为单个大型ORC文件,这反过来又更改了表的最后修改时间。 + Cube状态是通过比较创建Cube时表的最后修改时间戳与执行查询时表的最后修改时间来确定的。 +5. OpenLooKeng CLI已经过修改,以简化为更大的数据集创建Cubes的过程。 + 但是这种实现仍然存在局限性,因为该过程涉及将多个Cube谓词合并为一个。 + 只有定义在Integer、Long和Date类型上的Cube谓词才能正确合并。 对Char、String类型的支持仍需实现。 \ No newline at end of file diff --git a/content/zh-cn/docs/docs/preagg/statements.md b/content/zh-cn/docs/docs/preagg/statements.md new file mode 100644 index 0000000..96c1347 --- /dev/null +++ b/content/zh-cn/docs/docs/preagg/statements.md @@ -0,0 +1,175 @@ +# 用法 +可以使用任何受支持的客户端管理Cubes,例如位于安装中`bin`目录下的hetu-cli。 + +## CREATE CUBE +### 概要 + +``` sql +CREATE CUBE [ IF NOT EXISTS ] +cube_name ON table_name WITH ( + AGGREGATIONS = ( expression [, ...] ), + GROUP = ( column_name [, ...]) + [, FILTER = (expression)] + [, ( property_name = expression [, ...] ) ] +) +[WHERE predicate] +``` +### 描述 +使用指定的组和聚合创建一个新的空Cube。使用`INSERT INTO CUBE (see below)`来插入数据。 + +如果Cube已经存在,可选的`IF NOT EXISTS`子句会导致错误被抑制。 +可选的`property_name`部分可用于在新创建的Cube上设置属性。 + +要列出所有可用的表属性,请运行以下查询: + + SELECT * FROM system.metadata.table_properties + +**注意:** 这些属性仅限于为其创建Cube的连接器。 + +### 例子 +在`orders`上创建一个新的Cube`orders_cube`: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), + GROUP = ( orderstatus, orderdate ), + format = 'ORC' + ) + +创建一个新的分区Cube`orders_cube`: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), + GROUP = ( orderstatus, orderdate ), + format = 'ORC', + partitioned_by = ARRAY['orderdate'] + ) + +使用一些源数据过滤器创建一个新的Cube`orders_cube`: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), COUNT DISTINCT(orderid) ), + GROUP = ( orderstatus ), + FILTER = (orderdate BETWEEN 2512450 AND 2512460) + ) + +创建一个新的Cube`orders_cube`,并在Cube列上添加一些额外的谓词: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), COUNT DISTINCT(orderid) ), + GROUP = ( orderstatus ), + FILTER = (orderdate BETWEEN 2512450 AND 2512460) + ) WHERE orderstatus = 'PENDING'; + +这与以下内容相同: + + CREATE CUBE orders_cube ON orders WITH ( + AGGREGATIONS = ( SUM(totalprice), COUNT DISTINCT(orderid) ), + GROUP = ( orderstatus ), + FILTER = (orderdate BETWEEN 2512450 AND 2512460) + ); + INSERT INTO CUBE orders_cube WHERE orderstatus = 'PENDING'; + +`FILTER`属性可用于在构建Cube时从源表中过滤掉数据。 +在对源表应用`orderdate BETWEEN 2512450 AND 2512460`谓词后,Cube建立在数据上。过滤谓词中使用的列不得属于Cube。 + +### 限制 +- 可以仅使用以下聚合函数创建Cubes。 + 换句话说,使用以下函数的查询只能使用Cubes进行优化。 + **COUNT, COUNT DISTINCT, MIN, MAX, SUM, AVG** +- 不同的连接器可能支持不同的数据类型和不同的表/列属性。 + +## INSERT INTO CUBE + +### 概要 +``` sql +INSERT INTO CUBE cube_name [WHERE condition] +``` + +### 描述 +`CREATE CUBE`语句创建没有任何数据的Cube。要将数据插入Cube,请使用`INSERT INTO CUBE`SQL。 +`WHERE`子句是可选的。如果提供了谓词,则只有与给定谓词匹配的数据才会从源表中处理并插入到Cube中。 +否则,源表中的整个数据将被处理并插入到Cube中。 + +### 例子 +将数据插入`orders_cube`Cube: + + INSERT INTO CUBE orders_cube WHERE orderdate > date '1999-01-01'; + INSERT INTO CUBE order_all_cube; + +### 限制 +1. 对同一个Cube的后续插入需要使用相同的列集 + +```sql + CREATE CUBE orders_cube ON orders WITH (AGGREGATIONS = (count(*)), GROUP = (orderdate)); + + INSERT INTO CUBE orders_cube WHERE orderdate BETWEEN date '1999-01-01' AND date '1999-01-05'; + + -- This statement would fail because its possible the Cube already contain rows matching the given predicate. + INSERT INTO CUBE orders_cube WHERE location = 'Canada'; +``` +**注意:** 这意味着在第一个插入中使用的列必须在第一个插入后的每个插入谓词中使用,以避免插入重复数据。 + +## INSERT OVERWRITE CUBE + +### 概要 +``` sql +INSERT OVERWRITE CUBE cube_name [WHERE condition] +``` + +### 描述 +类似于INSERT INTO CUBE语句,但使用此语句覆盖现有数据。 +谓词是可选的。 + +### 例子 +根据条件插入数据到`orders_cube`Cube: + + INSERT OVERWRITE CUBE orders_cube WHERE orderdate > date '1999-01-01'; + INSERT OVERWRITE CUBE orders_cube; + +## SHOW CUBES + +### 概要 +```sql +SHOW CUBES [ FOR table_name ]; +``` + +### 描述 +`SHOW CUBES`列出所有立方体。添加可选的`table_name`仅列出该表的Cubes。 + +### 例子 + +显示所有Cubes: +```sql + SHOW CUBES; +``` + +显示`orders`表的Cubes: + +```sql + SHOW CUBES FOR orders; +``` + +## DROP CUBE + +### 概要 + +``` sql +DROP CUBE [ IF EXISTS ] cube_name +``` + +### 描述 +删除存在的Cube. + +如果Cube不存在,可选的`IF EXISTS`子句会抑制报错。 + +### 例子 + +删除Cube`orders_cube`: + + DROP CUBE orders_cube + +如果存在,则删除Cube`orders_cube`: + + DROP CUBE IF EXISTS orders_cube + + diff --git a/content/zh-cn/docs/docs/releasenotes/releasenotes-0.1.0.md b/content/zh-cn/docs/docs/releasenotes/releasenotes-0.1.0.md index 98dcfe6..1d3f885 100644 --- a/content/zh-cn/docs/docs/releasenotes/releasenotes-0.1.0.md +++ b/content/zh-cn/docs/docs/releasenotes/releasenotes-0.1.0.md @@ -1,5 +1,5 @@ -# Release 0.1.0 +# Release 0.1.0 (2020年6月30日) ## 关键特性 diff --git a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.0.md b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.0.md index c841d3c..b0c1c89 100644 --- a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.0.md +++ b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.0.md @@ -1,4 +1,4 @@ -# Release 1.0.0 +# Release 1.0.0 (2020年9月23日) ## 关键特性 diff --git a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.1.md b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.1.md index e9177fe..2394646 100644 --- a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.1.md +++ b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.0.1.md @@ -1,4 +1,4 @@ -# Release 1.0.1 +# Release 1.0.1 (2020年9月30日) ## 关键特性 diff --git a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.1.0.md b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.1.0.md index ec24ef8..0e7ce5a 100644 --- a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.1.0.md +++ b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.1.0.md @@ -1,4 +1,4 @@ -# Release 1.1.0 +# Release 1.1.0 (2020年12月30日) ## 关键特性 diff --git a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.2.0.md b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.2.0.md index 4dce97a..c37c310 100644 --- a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.2.0.md +++ b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.2.0.md @@ -1,4 +1,4 @@ -# Release 1.2.0 +# Release 1.2.0 (2021年3月31日) ## 关键特性 diff --git a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.3.0.md b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.3.0.md index b72fdb5..d1015c6 100644 --- a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.3.0.md +++ b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.3.0.md @@ -1,4 +1,4 @@ -# Release 1.3.0 +# Release 1.3.0 (2021年6月30日) ## 关键特性 diff --git a/content/zh-cn/docs/docs/releasenotes/releasenotes-1.4.0.md b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.4.0.md new file mode 100644 index 0000000..eff88a2 --- /dev/null +++ b/content/zh-cn/docs/docs/releasenotes/releasenotes-1.4.0.md @@ -0,0 +1,25 @@ +# Release 1.4.0 + +## 关键特性 + +| 分类 | 描述 | +| --------------------- | ------------------------------------------------------------ | +| Star Tree | 1. 更新APIs支持jdbc 连接器使用cube
2. 支持Clickhouse连接器使用cube,其它jdbc connector在将来支持
3. 问题修复 | +| 启发式索引 | 1. 支持UPDATE INDEX(详细见文档)
2. SHOW INDEX中增加index大小,内存和磁盘占用信息
3. Bloom index增加nmap cache来减少内存使用(默认打开,详细见文档)
4. 支持DROP TABLE同时删除index
5. 支持创建index后自动加载index(默认打开,详细见文档) | +| Memory 连接器 | 修复了几个重要的错误,以解决大型数据集和特定运算符偶尔发生的错误结果 | +| Task Recovery | 修复了几个重要的错误,以解决高并发和worker节点故障期间偶尔发生的数据不一致问题 | +| Yarn上部署openLooKeng | 支持Yarn上部署openLooKeng集群。当前支持部署单coordinator和多worker节点部署 | +| 低时延 | 1. 优化不包含join的点查sql的stats计算,加快低时延查询的速度
2. 新增自适应分片分组,提升高并发查询吞吐量
3. 支持非等式动态筛选器,以加快具有<、>、<= & >=等谓词的查询速度 | +| Kylin 连接器 | 支持对kylin数据源的读操作 | +## 已知问题 + +| 分类 | 描述 | Gitee问题 | +| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| Task Recovery | 并发CTAS,部分sql报错:“HiveSplitSource is already closed” | [144QYL](https://e.gitee.com/open_lookeng/issues/list?issue=I44QYL) | +| | CTA创建事务表,插入数据报错“Unsuccessful query retry” | [I44RQJ](https://e.gitee.com/open_lookeng/issues/list?issue=I44RQJ) | +| Yarn上部署openLooKeng | 启动多个openLooKeng小集群,containers会在相同的节点上启动,导致此节点资源会用完,新启openLooKeng集群失败(实际其它节点还有资源) | [I4BP5A](https://e.gitee.com/open_lookeng/issues/list?issue=I4BP5A) | +| | 启动多个openLooKeng集群,部分集群进CLI报错 | [I4BY6Z](https://e.gitee.com/open_lookeng/issues/list?issue=I4BY6Z) | + +## 获取文档 + +请参考: [https://gitee.com/openlookeng/hetu-core/tree/1.4.0/hetu-docs/zh](https://gitee.com/openlookeng/hetu-core/tree/1.4.0/hetu-docs/zh) \ No newline at end of file diff --git a/content/zh-cn/docs/docs/sql/create-cube.md b/content/zh-cn/docs/docs/sql/create-cube.md deleted file mode 100644 index 3a250b8..0000000 --- a/content/zh-cn/docs/docs/sql/create-cube.md +++ /dev/null @@ -1,51 +0,0 @@ -# CREATE CUBE - -## 使用方式 - -```sql -CREATE CUBE [ IF NOT EXISTS ] -cube_name ON table_name WITH ( - AGGREGATIONS = ( expression [, ...] ), GROUP = ( column_name [, ...] ) - [, ( property_name = expression [, ...] ) ] -) -``` - -## 介绍 - -使用指定的组和聚合创建新的star-tree多维数据集。使用`insert-into-cube`插入数据。 - -如果表已存在,可选的`IF NOT EXISTS`子句将导致错误被隐藏。 - -可以使用可选的`property_name`标签来设置创建的多维数据集的属性。要列出所有可用的表属性,请运行以下查询: - - SELECT * FROM system.metadata.table_properties - -## 示例 - -在`orders`上创建新多维数据集`orders_cube`: - - CREATE CUBE orders_cube ON orders WITH ( - AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), - GROUP = ( orderstatus, orderdate ), - format = 'ORC' - ) - -创建新的分区多维数据集`orders_cube`: - - CREATE CUBE orders_cube ON orders WITH ( - AGGREGATIONS = ( SUM(totalprice), AVG(totalprice) ), - GROUP = ( orderstatus, orderdate ), - format = 'ORC', - partitioned_by = ARRAY['orderdate'] - ) - -## 限制 - -- 支持的聚合函数:COUNT、COUNT DISTINCT、MIN、MAX、SUM、AVG -- 每个多维数据集仅支持一个组。 -- 不同的连接器可能支持不同的数据类型和不同的表/列属性。 -- 当前只能在Hive连接器中创建多维数据集,但可以从另一个连接器在表中创建多维数据集。 - -## 另请参见 - -[INSERT INTO CUBE](./insert-cube.html)、[SHOW CUBES](./show-cubes.html)、[DROP CUBE](./drop-cube.html) \ No newline at end of file diff --git a/content/zh-cn/docs/docs/sql/drop-cube.md b/content/zh-cn/docs/docs/sql/drop-cube.md deleted file mode 100644 index 6a0cd3f..0000000 --- a/content/zh-cn/docs/docs/sql/drop-cube.md +++ /dev/null @@ -1,27 +0,0 @@ -# DROP CUBE - -## 使用方式 - -```sql -DROP CUBE [ IF EXISTS ] cube_name -``` - -## 说明 - -删除已存在的多维数据集。 - -如果多维数据集不存在,可选子句`IF EXISTS`将导致错误被隐藏。 - -## 示例 - -删除多维数据集`orders_cube`: - - DROP CUBE orders_cube - -如果多维数据集`orders_cube`存在,则将其删除: - - DROP CUBE IF EXISTS orders_cube - -## 另请参见 - -[CREATE CUBE](./create-cube.html)、[SHOW CUBES](./show-cubes.html)、[INSERT INTO CUBE](./insert-cube.html) \ No newline at end of file diff --git a/content/zh-cn/docs/docs/sql/insert-cube.md b/content/zh-cn/docs/docs/sql/insert-cube.md deleted file mode 100644 index 0e4e4b8..0000000 --- a/content/zh-cn/docs/docs/sql/insert-cube.md +++ /dev/null @@ -1,55 +0,0 @@ -# INSERT INTO CUBE - -## 使用方式 - -```sql -INSERT INTO CUBE cube_name [WHERE condition] -``` - -## 介绍 - -将数据插入star-tree多维数据集。谓词信息为可选项。如果提供了谓词,则仅从源表处理与给定谓词匹配的数据并将其插入多维数据集。否则,将处理源表中的全部数据并将其插入多维数据集。 - -## 示例 - -根据条件将数据插入`orders_cube`多维数据集中: - - INSERT INTO CUBE orders_cube WHERE orderdate > date '1999-01-01'; - INSERT INTO CUBE order_all_cube; - -## 另请参见 - -[INSERT OVERWRITE CUBE](./insert-overwrite-cube.html)、[CREATE CUBE](./create-cube.html)、[SHOW CUBES](./show-cubes.html)、[DROP CUBE](./drop-cube.html) - -## 限制 - -1. 如果在where子句谓词中使用两个不同的列,则insert语句将无法正常运行。 - -```sql - CREATE CUBE orders_cube ON orders WITH (AGGREGATIONS = (count(*)), GROUP = (orderdate)); - - INSERT INTO CUBE orders_cube WHERE orderdate BETWEEN date '1999-01-01' AND date '1999-01-05'; - - -- This statement would fail because its possible the Cube already contain rows matching the given predicate. - INSERT INTO CUBE orders_cube WHERE location = 'Canada'; -``` - -2. 范围谓词问题。 - -```sql - CREATE CUBE orders_cube ON orders WITH (AGGREGATIONS = (count(*)), GROUP = (orderdate)); - - INSERT INTO CUBE orders_cube WHERE orderdate BETWEEN date '1999-01-01' AND date '1999-01-05'; - INSERT INTO CUBE orders_cube WHERE orderdate BETWEEN date '1999-01-06' AND date '1999-01-10'; - - SET SESSION enable_star_tree_index=true; - - -- This statement uses orders_cube -- - SELECT count(*) FROM orders WHERE orderdate BETWEEN date '1999-01-03' AND date '1999-01-04'; - -- This statement uses orders_cube -- - SELECT count(*) FROM orders WHERE orderdate BETWEEN date '1999-01-07' AND date '1999-01-09'; - -- This statement does not user orders_cube because the two predicates used in the INSERT statement cannot be merged - -- and the TupleDomain evaluation to check cubePredicate.contains(statementPredicate) evaluates to false - - SELECT count(*) FROM orders WHERE orderdate BETWEEN date '1999-01-04' AND date '1999-01-07'; -``` \ No newline at end of file diff --git a/content/zh-cn/docs/docs/sql/insert-overwrite-cube.md b/content/zh-cn/docs/docs/sql/insert-overwrite-cube.md deleted file mode 100644 index 5625766..0000000 --- a/content/zh-cn/docs/docs/sql/insert-overwrite-cube.md +++ /dev/null @@ -1,22 +0,0 @@ -# INSERT INTO CUBE - -## 使用方式 - -```sql -INSERT OVERWRITE CUBE cube_name [WHERE condition] -``` - -## 介绍 - -类似于INSERT INTO CUBE语句,但使用此语句将覆盖现有数据。谓词为可选项。 - -## 示例 - -根据条件将数据插入`orders_cube`多维数据集中: - - INSERT OVERWRITE CUBE orders_cube WHERE orderdate > date '1999-01-01'; - INSERT OVERWRITE CUBE orders_cube; - -## 另请参见 - -[INSERT INTO CUBE](./insert-cube.html)、[CREATE CUBE](./create-cube.html)、[SHOW CUBES](./show-cubes.html)、[DROP CUBE](./drop-cube.html) \ No newline at end of file diff --git a/content/zh-cn/docs/docs/sql/show-cubes.md b/content/zh-cn/docs/docs/sql/show-cubes.md deleted file mode 100644 index 4a91742..0000000 --- a/content/zh-cn/docs/docs/sql/show-cubes.md +++ /dev/null @@ -1,29 +0,0 @@ -# SHOW CUBES - -## 使用方式 - -```sql -SHOW CUBES [ FOR table_name ]; -``` - -## 说明 - -`SHOW CUBES`列举所有多维数据集。添加选项`table_name`仅列出该表的多维数据集。 - -## 示例 - -显示所有多维数据集: - -```sql - SHOW CUBES; -``` - -显示`orders`表的多维数据集: - -```sql - SHOW CUBES FOR orders; -``` - -## 另请参见 - -[CREATE CUBE](./create-cube.html)、[DROP CUBE](./drop-cube.html)、[INSERT INTO CUBE](./insert-cube.html) \ No newline at end of file diff --git a/content/zh-cn/docs/menu/index.md b/content/zh-cn/docs/menu/index.md index 91b793b..170efd9 100644 --- a/content/zh-cn/docs/menu/index.md +++ b/content/zh-cn/docs/menu/index.md @@ -62,6 +62,10 @@ headless: true - [HIndex语句]({{< relref "./docs/indexer/hindex-statements.md" >}}) - [new-index]({{< relref "./docs/indexer/new-index.md" >}}) +- [Star Tree多维数据集](#) + - [概述] ({{< relref "./docs/preagg/overview.md" >}}>) + - [语句] ({{< relref "./docs/preagg/statements.md" >}}) + - [连接器]({{< relref "./docs/connector/_index.md" >}}) - [CarbonData]({{< relref "./docs/connector/carbondata.md" >}}) - [ClickHouse]({{< relref "./docs/connector/clickhouse.md" >}}) @@ -90,6 +94,7 @@ headless: true - [TPCDS]({{< relref "./docs/connector/tpcds.md" >}}) - [TPCH]({{< relref "./docs/connector/tpch.md" >}}) - [VDM]({{< relref "./docs/connector/vdm.md" >}}) + - [Kylin]({{< relref "./docs/connector/kylin.md" >}}) - [函数和运算符]("#") - [逻辑运算符]({{< relref "./docs/functions/logical.md" >}}) @@ -199,7 +204,7 @@ headless: true - [文件系统访问实用程序]({{< relref "./docs/develop/filesystem.md" >}}) - [Hive ORC Cache]({{< relref "./docs/develop/hive-orc-cache.md" >}}) - [外部函数注册和下推]({{< relref "./docs/develop/externalfunction-registration-pushdown.md" >}}) - - [Star-tree多维数据集]({{< relref "./docs/develop/star-tree-cube.md" >}}) + - [openLooKeng REST接口说明]({{< relref "./docs/rest/_index.md" >}}) - [节点资源]({{< relref "./docs/rest/node.md" >}}) - [查询资源]({{< relref "./docs/rest/query.md" >}}) @@ -208,11 +213,11 @@ headless: true - [任务资源]({{< relref "./docs/rest/task.md" >}}) - [发行说明]("#") - - [1.3.0]({{< relref "./docs/releasenotes/releasenotes-1.3.0.md" >}}) - - [1.2.0]({{< relref "./docs/releasenotes/releasenotes-1.2.0.md" >}}) - - [1.1.0]({{< relref "./docs/releasenotes/releasenotes-1.1.0.md" >}}) - - [1.0.1]({{< relref "./docs/releasenotes/releasenotes-1.0.1.md" >}}) - - [1.0.0]({{< relref "./docs/releasenotes/releasenotes-1.0.0.md" >}}) - - [0.1.0]({{< relref "./docs/releasenotes/releasenotes-0.1.0.md" >}}) + - [1.3.0 (2021年6月30日)]({{< relref "./docs/releasenotes/releasenotes-1.3.0.md" >}}) + - [1.2.0 (2021年3月31日)]({{< relref "./docs/releasenotes/releasenotes-1.2.0.md" >}}) + - [1.1.0 (2020年12月30日)]({{< relref "./docs/releasenotes/releasenotes-1.1.0.md" >}}) + - [1.0.1 (2020年9月30日)]({{< relref "./docs/releasenotes/releasenotes-1.0.1.md" >}}) + - [1.0.0 (2020年9月23日)]({{< relref "./docs/releasenotes/releasenotes-1.0.0.md" >}}) + - [0.1.0 (2020年6月30日)]({{< relref "./docs/releasenotes/releasenotes-0.1.0.md" >}}) - [FAQ]({{< relref "./docs/faq/faq.md" >}}) -- Gitee