diff --git a/docs/deployment/deploy-quick.md b/docs/deployment/deploy-quick.md index 93d959146f8..71ebace6f7c 100644 --- a/docs/deployment/deploy-quick.md +++ b/docs/deployment/deploy-quick.md @@ -1,30 +1,30 @@ --- -title: Quick Deployment +title: Stand-alone deployment sidebar_position: 1 --- -## 1. Preparing for the first installation +## 1. First-time installation preparations -### 1.1 Linux Server +### 1.1 Linux server -**Hardware requirements** -Install nearly 10 linkis microservices with at least 3G memory. The size of the jvm -Xmx memory started by the default configuration of each microservice is 512M (if the memory is not enough, you can try to reduce it to 256/128M, and you can also increase it if the memory is sufficient) +**Hardware Requirements** +Install nearly 6 linkis microservices, at least 3G memory. The default jvm -Xmx memory size of each microservice is 512M (if the memory is not enough, you can try to reduce it to 256/128M, and you can also increase it if the memory is enough). ### 1.2 Add deployment user ->Deployment user: the startup user of the linkis core process, and this user will be the administrator privilege by default. The corresponding administrator login password will be generated during the deployment process, located in `conf/linkis-mg-gateway .properties` file -Linkis supports specifying the user who submits and executes. The linkis main process service will switch to the corresponding user through `sudo -u ${linkis-user}`, and then execute the corresponding engine start command, so the user to which the engine `linkis-engine` process belongs is the executor of the task (so the deployment The user needs to have sudo permissions, and it is password-free) +>Deployment user: The starting user of the linkis core process, and this user will be the administrator by default. The corresponding administrator login password will be generated during the deployment process, located in `conf/linkis-mg-gateway .properties`file +Linkis supports specifying users for submission and execution. The linkis main process service will switch to the corresponding user through `sudo -u ${linkis-user}`, and then execute the corresponding engine start command, so the user of the engine `linkis-engine` process is the executor of the task (so the deployment The user needs to have sudo authority, and it is password-free). -Take hadoop user as an example: +Take hadoop users as an example (Many configuration users in linkis use hadoop users by default. It is recommended that first-time installers use hadoop users, otherwise many unexpected errors may be encountered during the installation process): -First check whether there is already a hadoop user in the system. If it already exists, you can directly authorize it, if not, create a user first, and then authorize. +First check whether there is already a hadoop user in the system, if it already exists, just authorize it directly, if not, create a user first, and then authorize. -Check if a hadoop user already exists +Check if hadoop user already exists ```shell script $ id hadoop uid=2001(hadoop) gid=2001(hadoop) groups=2001(hadoop) -```` +``` If it does not exist, you need to create a hadoop user and join the hadoop user group ```shell script @@ -32,7 +32,7 @@ $ sudo useradd hadoop -g hadoop $ vi /etc/sudoers #Secret-free configuration hadoop ALL=(ALL) NOPASSWD: NOPASSWD: ALL -```` +``` The following operations are performed under the hadoop user @@ -42,55 +42,55 @@ hadoop ALL=(ALL) NOPASSWD: NOPASSWD: ALL ### 2.1 Installation package preparation -- Method 1: From the official website [download address](https://linkis.apache.org/download/main): https://linkis.apache.org/download/main -, download the corresponding The installation package (project installation package and management console installation package) -- Method 2: Compile the project installation package and management console according to [Linkis Compile and Package](../development/build) and [Front-end Management Console Compile](../development/build-console) Installation package +- Method 1: From the official website [download address] (https://linkis.apache.org/zh-CN/download/main): https://linkis.apache.org/zh-CN/download/main +, download the corresponding installation package (project installation package and management console installation package). +- Method 2: Compile the project installation package and console installation package according to [Linkis Compilation and Packaging](../development/build) and [Front-end Console Compilation](../development/build-console). -After uploading the installation package `apache-linkis-x.x.x-bin.tar.gz`, decompress the installation package +After uploading the installation package `apache-linkis-xxx-bin.tar.gz`, decompress the installation package ```shell script -$ tar -xvf apache-linkis-x.x.x-bin.tar.gz -```` +$ tar -xvf apache-linkis-xxx-bin.tar.gz +``` -The unzipped directory structure is as follows +The directory structure after decompression is as follows ```shell script --rw-r--r-- 1 hadoop hadoop 518192043 Jun 20 09:50 apache-linkis-1.3.1-bin.tar.gz -drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 bin //Script to perform environment check and install -drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 deploy-config // Environment configuration information such as DB that depends on deployment -drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 docker -drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 helm --rwxrwxr-x 1 hadoop hadoop 84732 Jan 22 2020 LICENSE -drwxr-xr-x 2 hadoop hadoop 20480 Jun 20 09:56 licenses -drwxrwxr-x 7 hadoop hadoop 4096 Jun 20 09:56 linkis-package // The actual package, including lib/service startup script tool/db initialization script/microservice configuration file, etc. --rwxrwxr-x 1 hadoop hadoop 119503 Jan 22 2020 NOTICE --rw-r--r-- 1 hadoop hadoop 11959 Jan 22 2020 README_CN.md --rw-r--r-- 1 hadoop hadoop 12587 Jan 22 2020 README.md - -```` - -### 2.2 Configure database +-rw-r--r-- 1 hadoop hadoop 518192043 Jun 20 09:50 apache-linkis-xxx-bin.tar.gz +drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 bin //execute environment check and install script +drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 deploy-config // Deployment dependent DB and other environment configuration information +drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 docker +drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 helm +-rwxrwxr-x 1 hadoop hadoop 84732 Jan 22 2020 LICENSE +drwxr-xr-x 2 hadoop hadoop 20480 Jun 20 09:56 licenses +drwxrwxr-x 7 hadoop hadoop 4096 Jun 20 09:56 linkis-package // actual software package, including lib/service startup script tool/db initialization script/microservice configuration file, etc. +-rwxrwxr-x 1 hadoop hadoop 119503 Jan 22 2020 NOTICE +-rw-r--r-- 1 hadoop hadoop 11959 Jan 22 2020 README_CN.md +-rw-r--r-- 1 hadoop hadoop 12587 Jan 22 2020 README.md + +``` + +### 2.2 Configure database information `vim deploy-config/linkis-env.sh` ```shell script -# Select the type of Linkis business database, default is mysql. -# If using PostgreSQL, please change it to postgresql. -# Note: The configuration is only applicable to Linkis version 1.4.0 or higher. +# Select linkis business database type, default mysql +# If using postgresql, please change to postgresql +# Note: The current configuration only applies to linkis>=1.4.0 dbType=mysql ``` `vim deploy-config/db.sh` ```shell script -# Database information of Linkis' own business - mysql +# Linkis's own business database information - mysql MYSQL_HOST=xx.xx.xx.xx MYSQL_PORT=3306 MYSQL_DB=linkis_test MYSQL_USER=test MYSQL_PASSWORD=xxxxx -# Database information of Linkis' own business - postgresql -# Note: The configurations is only applicable to Linkis version 1.4.0 or higher. +# Linkis's own business database information - postgresql +# Note: The following configuration is only applicable to linkis>=1.4.0 PG_HOST=xx.xx.xx.xx PG_PORT=5432 PG_DB=linkis_test @@ -98,68 +98,68 @@ PG_SCHEMA=linkis_test PG_USER=test PG_PASSWORD=123456 -# Provide the DB information of the Hive metadata database. If the hive engine is not involved (or just a simple trial), you can not configure it -#Mainly used with scripts, if not configured, it will try to obtain it through the configuration file in $HIVE_CONF_DIR by default -HIVE_META_URL="jdbc:mysql://10.10.10.10:3306/hive_meta_demo?useUnicode=true&characterEncoding=UTF-8" -HIVE_META_USER=demo # User of HiveMeta Metabase -HIVE_META_PASSWORD=demo123 # HiveMeta metabase password -```` +# Provide the DB information of the Hive metadata database. If the hive engine is not involved (or just a simple trial), it is not necessary to configure +#Mainly used together with scriptis, if not configured, it will try to get it through the configuration file in $HIVE_CONF_DIR by default +HIVE_META_URL="jdbc:mysql://10.10.10.10:3306/hive_meta_demo?useUnicode=true&characterEncoding=UTF-8" +HIVE_META_USER=demo # User of the HiveMeta metabase +HIVE_META_PASSWORD=demo123 # Password of the HiveMeta metabase +``` ### 2.3 Configure basic variables -The file is located at `deploy-config/linkis-env.sh` +The file is located at `deploy-config/linkis-env.sh`. -#### deploy user +#### Deploy User ```shell script deployUser=hadoop #The user who executes the deployment is the user created in step 1.2 -```` +``` -#### base directory configuration (optional) -:::caution note -Determine whether you need to adjust according to the actual situation, you can choose to use the default value +#### Basic directory configuration (optional) +:::caution Caution +Determine whether it needs to be adjusted according to the actual situation, and you can choose to use the default value ::: ```shell script -# Specify the directory path used by the user, which is generally used to store the user's script files and log files, and is the user's workspace. The corresponding configuration file configuration item is wds.linkis.filesystem.root.path(linkis.properties) +# Specify the directory path used by the user, which is generally used to store the user's script files and log files, etc., and is the user's workspace. The corresponding configuration file configuration item is wds.linkis.filesystem.root.path(linkis.properties) WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis -# File paths such as result set logs, used to store the result set files of the Job wds.linkis.resultSet.store.path(linkis-cg-entrance.properties) //If not configured, use the configuration of HDFS_USER_ROOT_PATH +# The result set log and other file paths are used to store the result set file of the Job wds.linkis.resultSet.store.path(linkis-cg-entrance.properties) //If the configuration of HDFS_USER_ROOT_PATH is not configured RESULT_SET_ROOT_PATH=file:///tmp/linkis -# File path such as result set log, used to store the result set file of Job wds.linkis.filesystem.hdfs.root.path(linkis.properties) +# Result set log and other file paths, used to store the result set file of Job wds.linkis.filesystem.hdfs.root.path(linkis.properties) HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis -# Store the working path of the execution engine. You need to deploy a local directory with write permissions for the user wds.linkis.engineconn.root.dir(linkis-cg-engineconnmanager.properties) +# To store the working path of the execution engine, a local directory wds.linkis.engineconn.root.dir(linkis-cg-engineconnmanager.properties) where the deployment user has write permissions is required ENGINECONN_ROOT_PATH=/appcom/tmp -```` +``` #### Yarn's ResourceManager address -:::caution note +:::caution Caution If you need to use the Spark engine, you need to configure ::: ```shell script -#You can confirm whether it can be accessed normally by visiting the http://xx.xx.xx.xx:8088/ws/v1/cluster/scheduler interface +#You can check whether it can be accessed normally by visiting http://xx.xx.xx.xx:8088/ws/v1/cluster/scheduler interface YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088 -```` -When executing spark tasks, you need to use the ResourceManager of yarn. By default, linkis does not enable permission verification. If the ResourceManager has password permission verification enabled, please install and deploy it. -Modify the database table `linkis_cg_rm_external_resource_provider` to insert yarn data information. For details, please refer to [Check whether the yarn address is configured correctly] (#811-Check whether the yarn address is configured correctly) +``` +When executing the spark task, you need to use the ResourceManager of yarn. Linkis defaults that permission verification is not enabled. If the ResourceManager has enabled password permission verification, please install and deploy. +Modify the database table `linkis_cg_rm_external_resource_provider` to insert yarn data information, for details, please refer to [Check whether the yarn address is configured correctly] (#811-Check whether the yarn address is configured correctly) #### Basic component environment information -:::caution note -It can be configured through the user's system environment variables. If configured through the system environment variables, the deploy-config/linkis-env.sh configuration file can be directly commented out without configuration. +:::caution Caution +It can be configured through the user's system environment variables. If it is configured through the system environment variables, it can be commented out directly without configuration in the deploy-config/linkis-env.sh configuration file. ::: ```shell script ##If you do not use Hive, Spark and other engines and do not rely on Hadoop, you do not need to configure the following environment variables -#HADOOP +#HADOOP HADOOP_HOME=/appcom/Install/hadoop HADOOP_CONF_DIR=/appcom/config/hadoop-config @@ -170,45 +170,45 @@ HIVE_CONF_DIR=/appcom/config/hive-config #Spark SPARK_HOME=/appcom/Install/spark SPARK_CONF_DIR=/appcom/config/spark-config -```` +``` #### LDAP login configuration (optional) -:::caution note -The default is to use a static user and password. The static user is the deployment user. The static password will generate a random password string during deployment and store it in `${LINKIS_HOME}/conf/linkis-mg-gateway.properties`(>=1.0.3 Version) +:::caution Caution +The default is to use a static user and password. The static user is the deployment user. The static password will randomly generate a password string during deployment and store it in `${LINKIS_HOME}/conf/linkis-mg-gateway.properties`(>=1.0. 3 version). ::: ```shell script -#LDAP configuration, Linkis only supports deployment user login by default. If you need to support multi-user login, you can use LDAP. You need to configure the following parameters: +#LDAP configuration, by default Linkis only supports deployment user login, if you need to support multi-user login, you can use LDAP, you need to configure the following parameters: #LDAP_URL=ldap://localhost:1389/ #LDAP_BASEDN=dc=webank,dc=com -```` +``` #### JVM memory configuration (optional) ->The microservice starts the jvm memory configuration, which can be adjusted according to the actual situation of the machine. If the machine memory resources are few, you can try to adjust it to 256/128M +>Microservice starts jvm memory configuration, which can be adjusted according to the actual situation of the machine. If the machine has less memory resources, you can try to reduce it to 256/128M ```shell script ## java application default jvm memory export SERVER_HEAP_SIZE="512M" -```` +``` #### Installation directory configuration (optional) -> Linkis will eventually be installed in this directory. If it is not configured, it will be in the same level directory as the current installation package by default. +> Linkis will eventually be installed in this directory, if not configured, it will be in the same directory as the current installation package by default ```shell script ##The decompression directory and the installation directory need to be inconsistent LINKIS_HOME=/appcom/Install/LinkisInstall -```` +``` -#### No HDFS mode deployment (optional >1.1.2 version support hold) +#### No HDFS mode deployment (optional >1.1.2 version support) -> Deploy Linkis services in an environment without HDFS to facilitate more lightweight learning and debugging. Deploying in HDFS mode does not support tasks such as hive/spark/flink engines +> Deploy the Linkis service in an environment without HDFS to facilitate lighter learning, use and debugging. Deploying in HDFS mode does not support tasks such as hive/spark/flink engines -Modify the `linkis-env.sh` file and modify the following +Modify `linkis-env.sh` file, modify the following content ```bash -#Use the [file://] path pattern instead of the [hdfs://] pattern +#Use [file://] path pattern instead of [hdfs://] pattern WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis/ HDFS_USER_ROOT_PATH=file:///tmp/linkis RESULT_SET_ROOT_PATH=file:///tmp/linkis @@ -220,17 +220,27 @@ export ENABLE_SPARK=false #### kerberos authentication (optional) -> By default, kerberos authentication is disabled on Linkis. If kerberos authentication is enabled in the hive cluster, you need to set the following parameters: - -Modify the `linkis-env.sh` file and modify the following +> Linkis does not enable kerberos authentication by default. If the hive cluster used enables kerberos authentication, the following parameters need to be configured. +Modify the `linkis-env.sh` file, the modified content is as follows ```bash #HADOOP HADOOP_KERBEROS_ENABLE=true HADOOP_KEYTAB_PATH=/appcom/keytab/ ``` -#### Notice +### 2.4 Configure Token +The file is located in `bin/install.sh` + +Linkis 1.3.2 version has changed the Token value to 32-bit random generation to ensure system security. For details, please refer to [Token Change Description](https://linkis.apache.org/zh-CN/docs/1.3.2/ feature/update-token/). + +Using randomly generated Token, you will encounter a lot of Token verification failure problems when connecting with [WDS other components](https://github.com/WeDataSphere/DataSphereStudio/blob/master/README-ZH.md) for the first time. It is recommended to install it for the first time When not using random generated Token, modify the following configuration to true. + +``` +DEBUG_MODE=true +``` + +### 2.5 Precautions **Full installation** @@ -240,9 +250,20 @@ For the full installation of the new version of Linkis, the install.sh script wi When the version is upgraded, the database Token is not modified, so there is no need to modify the configuration file and application Token. -**Token expiration problem** +**Token expiration issue** + +When the Token token is invalid or has expired, you can check whether the Token is configured correctly. You can query the Token through the management console ==> Basic Data Management ==> Token Management. -There is problem of token is not valid or stale, you can check whether the Token is configured correctly, and you can query the Token through the management console. +**Python version issue** +After Linkis is upgraded to 1.4.0, the default Spark version is upgraded to 3.x, which is not compatible with python2. Therefore, if you need to use the pyspark function, you need to make the following modifications. +1. Map python2 commands to python3 +``` +sudo ln -snf /usr/bin/python3 /usr/bin/python2 +``` +2. Spark engine connector configuration $LINKIS_HOME/lib/linkis-engineconn-plugins/spark/dist/3.2.1/conf/linkis-engineconn.properties Add the following configuration to specify the python installation path +``` +pyspark.python3.path=/usr/bin/python3 +``` ## 3. Install and start @@ -250,78 +271,67 @@ There is problem of token is not valid or stale, you can check whether the Token ```bash sh bin/install.sh -```` +``` -The install.sh script will ask you if you need to initialize the database and import metadata. If you choose to initialize, the table data in the database will be emptied and reinitialized. +The install.sh script will ask you if you want to initialize the database and import metadata. If you choose to initialize, the table data in the database will be cleared and reinitialized. -**Empty database must be selected for the first installation** +**You must choose to clear the database for the first installation** -:::tip Note -- If an error occurs, and it is unclear what command to execute to report the error, you can add the -x parameter `sh -x bin/install.sh` to print out the shell script execution process log, which is convenient for locating the problem -- Permission problem: `mkdir: cannot create directory 'xxxx': Permission denied`, please confirm whether the deployment user has read and write permissions for the path +:::tip note +- If an error occurs, and it is not clear what command to execute to report the error, you can add the -x parameter `sh -x bin/install.sh` to print out the log of the shell script execution process, which is convenient for locating the problem. +- Permission problem: `mkdir: cannot create directory 'xxxx': Permission denied`, please confirm whether the deployment user has read and write permissions for this path. ::: The prompt for successful execution is as follows: ```shell script -`Congratulations! You have installed Linkis 1.0.3 successfully, please use sh /data/Install/linkis/sbin/linkis-start-all.sh to start it! +`Congratulations! You have installed Linkis xxx successfully, please use sh /data/Install/linkis/sbin/linkis-start-all.sh to start it! Your default account password is [hadoop/5e8e312b4]` -```` +``` ### 3.2 Add mysql driver package -:::caution note -Because the mysql-connector-java driver is under the GPL2.0 protocol, it does not meet the license policy of the Apache open source protocol. Therefore, starting from version 1.0.3, the official deployment package of the Apache version provided by default is no mysql-connector-java-x.x.x.jar (**If it is installed through the integrated family bucket material package, you do not need to add it manually**), you need to add dependencies to the corresponding lib package by yourself during installation and deployment. You can check whether it exists in the corresponding directory, if not, you need to add +:::caution Caution +Because the mysql-connector-java driver is under the GPL2.0 agreement, it does not meet the license policy of the Apache open source agreement. Therefore, starting from version 1.0.3, the official deployment package of the Apache version provided does not have mysql-connector-java-xxxjar by default. Dependency package (**If you install it through the integrated family bucket material package, you don’t need to add it manually**), you need to add dependencies to the corresponding lib package yourself when installing and deploying. You can check whether it exists in the corresponding directory. If it does not exist, you need to add it. ::: -To download the mysql driver, take version 8.0.28 as an example: [download link](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar) +Download mysql driver Take version 8.0.28 as an example: [Download link](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28. jar) Copy the mysql driver package to the lib package -```` +``` cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ -```` - -### 3.3 Add postgresql driver package (Optional) - -If you choose to use postgresql as the business database, you need to manually add the postgresql driver. - -To download the postgresql driver, take version 42.5.4 as an example: [download link](https://repo1.maven.org/maven2/org/postgresql/postgresql/42.5.4/postgresql-42.5.4.jar) - +``` +### 3.3 Add postgresql driver package (optional) +If you choose to use postgresql as the business database, you need to manually add the postgresql driver +Download postgresql driver Take version 42.5.4 as an example: [Download link](https://repo1.maven.org/maven2/org/postgresql/postgresql/42.5.4/postgresql-42.5.4.jar) Copy the postgresql driver package to the lib package -```` +``` cp postgresql-42.5.4.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ cp postgresql-42.5.4.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ -```` - -### 3.4 Configuration Adjustment (Optional) +``` +### 3.4 Configuration adjustment (optional) > The following operations are related to the dependent environment. According to the actual situation, determine whether the operation is required -#### 3.4.1 kerberos authentication -If the hive cluster used has kerberos mode authentication enabled, modify the configuration `${LINKIS_HOME}/conf/linkis.properties` (<=1.1.3) file -```shell script -#Append the following configuration -echo "wds.linkis.keytab.enable=true" >> linkis.properties -```` -#### 3.4.2 Yarn Authentication +#### 3.4.1 Yarn authentication -When executing spark tasks, you need to use the ResourceManager of yarn, which is controlled by the configuration item `YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088 `. -During installation and deployment, the `YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088` information will be updated to the database table `linkis_cg_rm_external_resource_provider`. By default, access to yarn resources does not require permission verification. -If password authentication is enabled in yarn's ResourceManager, please modify the yarn data information generated in the database table `linkis_cg_rm_external_resource_provider` after installation and deployment. -For details, please refer to [Check whether the yarn address is configured correctly] (#811-Check whether the yarn address is configured correctly) +When executing spark tasks, you need to use the ResourceManager of yarn, which is controlled by the configuration item `YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088`. +When performing installation and deployment, the `YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088` information will be updated to `linkis_cg_rm_external_resource_provider` in the database table. By default, access to yarn resources does not require authorization verification. +If the resourcemanager of yarn has enabled the password authentication, please modify the yarn data information generated in the database table `linkis_cg_rm_external_resource_provider` after installation and deployment, +For details, please refer to [Check whether the yarn address is configured correctly] (#811-Check whether the yarn address is configured correctly). #### 3.4.2 session -If you are upgrading to Linkis. Deploy DSS or other projects at the same time, but the dependent linkis version introduced in other software is <1.1.1 (mainly in the lib package, the linkis-module-x.x.x.jar package of the dependent Linkis is <1.1.1), you need to modify the linkis located in ` ${LINKIS_HOME}/conf/linkis.properties` file +If you are an upgrade to Linkis. Deploy DSS or other projects at the same time, but the version of linkis introduced in other software is <1.1.1 (mainly in the lib package, the linkis-module-xxxjar package of Linkis that depends on it <1.1.1), you need to modify the `$ {LINKIS_HOME}/conf/linkis.properties` file. ```shell echo "wds.linkis.session.ticket.key=bdp-user-ticket-id" >> linkis.properties -```` +``` -#### S3 mode (optional) -> Currently, it is possible to store engine execution logs and results to S3 in Linkis. +#### 3.4.3 S3 mode +> Currently supports storing engine execution logs and results to the S3 file system > -> Note: Linkis has not adapted permissions for S3, so it is not possible to grant authorization for it. +> Note: linkis does not adapt permissions to S3, so it cannot perform authorization operations on it -`vim linkis.properties` +`vim $LINKIS_HOME/conf/linkis.properties` ```shell script # s3 file system linkis.storage.s3.access.key=xxx @@ -331,7 +341,7 @@ linkis.storage.s3.region=xxx linkis.storage.s3.bucket=xxx ``` -`vim linkis-cg-entrance.properties` +`vim $LINKIS_HOME/conf/linkis-cg-entrance.properties` ```shell script wds.linkis.entrance.config.log.path=s3:///linkis/logs wds.linkis.resultSet.store.path=s3:///linkis/results @@ -340,34 +350,33 @@ wds.linkis.resultSet.store.path=s3:///linkis/results ### 3.5 Start the service ```shell script sh sbin/linkis-start-all.sh -```` +``` -### 3.6 Modification of post-installation configuration -After the installation is complete, if you need to modify the configuration (because of port conflicts or some configuration problems, you need to adjust the configuration), you can re-execute the installation, or modify the configuration `${LINKIS_HOME}/conf/*properties` file of the corresponding service, Restart the corresponding service, such as: `sh sbin/linkis-daemon.sh start ps-publicservice` +### 3.6 Modification of configuration after installation +After the installation is complete, if you need to modify the configuration (the configuration needs to be adjusted due to port conflicts or some configuration problems), you can re-execute the installation, or modify the configuration `${LINKIS_HOME}/conf/*properties` file of the corresponding service, Restart the corresponding service, such as: `sh sbin/linkis-daemon.sh start ps-publicservice`. ### 3.7 Check whether the service starts normally Visit the eureka service page (http://eurekaip:20303), -The Linkis will start 6 microservices by default, and the linkis-cg-engineconn service in the figure below will be started only for running tasks +By default, 6 Linkis microservices will be started, and the linkis-cg-engineconn service in the figure below will only be started for running tasks. ![Linkis1.0_Eureka](./images/eureka.png) ```shell script -LINKIS-CG-ENGINECONNMANAGER Engine Management Services -LINKIS-CG-ENTRANCE Computing Governance Entry Service -LINKIS-CG-LINKISMANAGER Computing Governance Management Service -LINKIS-MG-EUREKA Microservice registry service -LINKIS-MG-GATEWAY gateway service +LINKIS-CG-ENGINECONNMANAGER Engine Management Service +LINKIS-CG-ENTRANCE computing governance entry service +LINKIS-CG-LINKISMANAGER Computing Governance Management Service +LINKIS-MG-EUREKA Microservice Registry Service +LINKIS-MG-GATEWAY Gateway Service LINKIS-PS-PUBLICSERVICE Public Service -```` - -Note: LINKIS-PS-CS, LINKIS-PS-DATA-SOURCE-MANAGER、LINKIS-PS-METADATAMANAGER services have been merged into LINKIS-PS-PUBLICSERVICE in Linkis 1.3.1 and merge LINKIS-CG-ENGINEPLUGIN services into LINKIS-CG-LINKISMANAGER. +``` -If any services are not started, you can view detailed exception logs in the corresponding log/${service name}.log file. +Note: In Linkis 1.3.1, LINKIS-PS-CS, LINKIS-PS-DATA-SOURCE-MANAGER, LINKIS-PS-METADATAMANAGER services have been merged into LINKIS-PS-PUBLICSERVICE, and LINKIS-CG-ENGINEPLUGIN services have been merged into LINKIS -CG-LINKISMANAGER. +If any service is not started, you can check the detailed exception log in the corresponding log/${service name}.log file. ### 3.8 Configure Token -The original default Token of Linkis is fixed and the length is too short, which has security risks. Therefore, Linkis 1.3.2 changes the original fixed Token to random generation and increases the Token length. +Linkis's original default Token is fixed and the length is too short, posing security risks. Therefore, Linkis 1.3.2 changes the original fixed Token to random generation, and increases the length of the Token. New Token format: application abbreviation - 32-bit random number, such as BML-928a721518014ba4a28735ec2a0da799. @@ -387,7 +396,7 @@ Log in to the management console -> basic data management -> token management When the Linkis service itself uses Token, the Token in the configuration file must be consistent with the Token in the database. Match by applying the short name prefix. -$LINKIS_HOME/conf/linkis.properites file Token configuration +$LINKIS_HOME/conf/linkis.properties file Token configuration ``` linkis.configuration.linkisclient.auth.token.value=BML-928a721518014ba4a28735ec2a0da799 @@ -411,37 +420,37 @@ wds.linkis.client.common.tokenValue=BML-928a721518014ba4a28735ec2a0da799 When other applications use Token, they need to modify their Token configuration to be consistent with the Token in the database. -## 4. Install the web frontend +## 4. Install the web front end The web side uses nginx as the static resource server, and the access request process is: -`Linkis console request->nginx ip:port->linkis-gateway ip:port->other services` +`Linkis management console request->nginx ip:port->linkis-gateway ip:port->other services` -### 4.1 Download the front-end installation package and unzip it +### 4.1 Download the front-end installation package and decompress it ```shell script -tar -xvf apache-linkis-x.x.x-incubating-web-bin.tar.gz -```` +tar -xvf apache-linkis-xxx-web-bin.tar.gz +``` -### 4.2 Modify the configuration config.sh +### 4.2 Modify configuration config.sh ```shell script -#Access the port of the console +#Access the port of the management console linkis_port="8188" -#linkis-mg-gatewayService Address +#linkis-mg-gateway service address linkis_url="http://localhost:9020" -```` +``` ### 4.3 Execute the deployment script ```shell script -# nginx requires sudo privileges to install +# nginx needs sudo permission to install sudo sh install.sh -```` -After installation, linkis' nginx configuration file is by default in `/etc/nginx/conf.d/linkis.conf` -nginx log files are in `/var/log/nginx/access.log` and `/var/log/nginx/error.log` -An example of the nginx configuration file of the generated linkis console is as follows: -````nginx +``` +After installation, the nginx configuration file of linkis is in `/etc/nginx/conf.d/linkis.conf` by default +The log files of nginx are in `/var/log/nginx/access.log` and `/var/log/nginx/error.log` +An example of the generated nginx configuration file of the linkis management console is as follows: +```nginx server { - listen 8188;# access port If the port is occupied, it needs to be modified + listen 8188;# If the access port is occupied, it needs to be modified server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; @@ -450,14 +459,14 @@ An example of the nginx configuration file of the generated linkis console is as index index.html index.html; } location /ws { - proxy_pass http://localhost:9020;#Address of backend Linkis + proxy_pass http://localhost:9020;#The address of the backend Linkis proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } location /api { - proxy_pass http://localhost:9020; #Address of backend Linkis + proxy_pass http://localhost:9020; #The address of the backend Linkis proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header x_real_ipP $remote_addr; @@ -479,32 +488,32 @@ An example of the nginx configuration file of the generated linkis console is as root /usr/share/nginx/html; } } -```` +``` If you need to modify the port or static resource directory, etc., please modify the `/etc/nginx/conf.d/linkis.conf` file and execute the `sudo nginx -s reload` command -:::caution note -- At present, the visualis function is not integrated. During the installation process, if you are prompted that the installation of linkis/visualis fails, you can ignore it -- Check whether nginx starts normally: check whether the nginx process exists `ps -ef |grep nginx` -- Check if nginx is configured correctly `sudo nginx -T` -- If the port is occupied, you can modify the service port `/etc/nginx/conf.d/linkis.conf`listen port value started by nginx, save it and restart it -- If interface 502 appears in the access management console, or `Unexpected token < in JSON at position 0` is abnormal, please confirm whether linkis-mg-gateway starts normally. If it starts normally, check the linkis-mg-gateway configured in the nginx configuration file Is the service address correct? +:::caution Caution +- At present, the visualis function is not integrated. During the installation process, if you are prompted to fail to install linkis/visualis, you can ignore it. +- Check whether nginx starts normally: check whether the nginx process exists `ps -ef |grep nginx`. +- Check whether the configuration of nginx is correct `sudo nginx -T`. +- If the port is occupied, you can modify the service port `/etc/nginx/conf.d/linkis.conf`listen port value started by nginx, save and restart. +- If there is an interface 502 when accessing the management console, or `Unexpected token < in JSON at position 0` is abnormal, please confirm whether the linkis-mg-gateway is started normally. If it is started normally, check the linkis-mg-gateway configured in the nginx configuration file Whether the service address is correct. ::: -### 4.4 Login to the console +### 4.4 Log in to the management console Browser login `http://xx.xx.xx.xx:8188/#/login` -Username/password can be found in `${LINKIS_HOME}/conf/linkis-mg-gateway.properties` +Username/password can be checked in `{LINKIS_HOME}/conf/linkis-mg-gateway.properties`. ```shell script -wds.linkis.admin.user= #User -wds.linkis.admin.password= #Password +wds.linkis.admin.user= #user +wds.linkis.admin.password= #password -```` +``` -## 5. Verify basic functionality ->Verify the corresponding engine tasks according to actual needs +## 5. Verify basic functions +> Verify the corresponding engine tasks according to actual needs -```` -#The version number of the engineType of the engine must match the actual version. The following example is the default version number +``` +#The version number of the engineType stitching of the engine must match the actual one. The following example is the default version number #shell engine tasks sh bin/linkis-cli -submitUser hadoop -engineType shell-1 -codeType shell -code "whoami" @@ -514,44 +523,49 @@ sh bin/linkis-cli -submitUser hadoop -engineType hive-3.1.3 -codeType hql -code #spark engine tasks sh bin/linkis-cli -submitUser hadoop -engineType spark-3.2.1 -codeType sql -code "show tables" -#python engine task +#python engine tasks sh bin/linkis-cli -submitUser hadoop -engineType python-python2 -codeType python -code 'print("hello, world!")' -```` -If the verification fails, please refer to [Step 8] for troubleshooting +``` +If the verification fails, please refer to [Step 8] for troubleshooting. -## 6 Installation of development tool IDE (Scriptis) (optional) -After installing the Scripti tool, it can support writing SQL, Pyspark, HiveQL and other scripts online on the web page,For detailed instructions, see [Installation and Deployment of Tool Scriptis](integrated/install-scriptis) +## 6. Installation of development tool IDE (Scriptis) (optional) +After installing the Scripti tool, you can write SQL, Pyspark, HiveQL and other scripts online on the web page. For detailed instructions, see [Tool Scriptis Installation and Deployment] (integrated/install-scriptis). -## 7. Supported Engines +## 7. Supported engines -### 7.1 Engine Adaptation List +### 7.1 Engine adaptation list -Please note: The separate installation package of Linkis only contains four engines by default: Python/Shell/Hive/Spark. If there are other engines (such as jdbc/flink/sqoop and other engines) usage scenarios, you can install them manually. For details, please refer to [ EngineConnPlugin Engine Plugin Installation Documentation](install-engineconn). +Please note: the separate installation package of Linkis only includes Python, Shell, Hive, and Spark by default. If there are other engine usage scenarios (such as jdbc/flink/sqoop, etc.), you can install them manually. For details, please refer to [EngineConnPlugin Engine Plugin installation documentation](install-engineconn). -The list of supported engines that have been adapted in this version is as follows: +The list of supported engines adapted to this version is as follows: -| Engine type | Adaptation | Does the official installation package contain | +| Engine type| Adaptation situation| Whether the official installation package contains | |---------------|-------------------|------| -| Python | >=1.0.0 Adapted | Included | -| Shell | >=1.0.0 Adapted | Included | -| Hive | >=1.0.0 Adapted | Included | -| Spark | >=1.0.0 Adapted | Included | -| Pipeline | >=1.0.0 Adapted | **Excludes** | -| JDBC | >=1.0.0 Adapted | **Excludes** | -| Flink | >=1.0.0 already adapted | **Not included** | -| OpenLooKeng | >=1.1.1 has been adapted | **Not included** | -| Sqoop | >=1.1.2 Adapted | **Excludes** | +| Python | >=1.0.0 Adapted | Contains | +| Shell | >=1.0.0 adapted | contains | +| Hive | >=1.0.0 adapted | contains | +| Spark | >=1.0.0 adapted | contains | +| Pipeline | >=1.0.0 Adapted | **Not Included** | +| JDBC | >=1.0.0 Adapted | **Not Included** | +| Flink | >=1.0.0 Adapted | **Excludes** | +| openLooKeng | >=1.1.1 Adapted | **Not Included** | +| Sqoop | >=1.1.2 Adapted | **Not Included** | +| Trino | >=1.3.2 Adapted | **Excluded** | +| Presto | >=1.3.2 Adapted | **Excluded** | +| Elasticsearch | >=1.3.2 Adapted | **Excludes** | +| Seatunnel | >=1.3.2 Adapted | **Not Included** | +| Impala | >=1.4.0 Adapted | **Excludes** | -### 7.2 View the deployed engine +### 7.2 View deployed engines #### Method 1: View the engine lib package directory -```` +``` $ tree linkis-package/lib/linkis-engineconn-plugins/ -L 3 linkis-package/lib/linkis-engineconn-plugins/ -├── hive +├──hive │ ├── dist │ │ └── 3.1.3 #version is 3.1.3 engineType is hive-3.1.3 │ └── plugin @@ -571,27 +585,28 @@ linkis-package/lib/linkis-engineconn-plugins/ │ └── 3.2.1 └── plugin └── 3.2.1 -```` +``` #### Method 2: View the database table of linkis ```shell script select * from linkis_cg_engine_conn_plugin_bml_resources -```` +``` + +## 8. Troubleshooting guidelines for common abnormal problems +### 8.1. Yarn queue check -## 8. Troubleshooting Guidelines for Common Abnormal Problems -### 8.1. Yarn Queue Check +>If you need to use the spark/hive/flink engine ->If you need to use spark/hive/flink engine +After logging in, check whether the yarn queue resources can be displayed normally (click the button in the lower right corner of the page) (you need to install the front end first). -After logging in, check whether the yarn queue resources can be displayed normally (click the button in the lower right corner of the page) (the front end needs to be installed first) -Normally as shown below: +Normal as shown in the figure below: ![yarn-normal](images/yarn-normal.png) If it cannot be displayed: You can adjust it according to the following guidelines #### 8.1.1 Check whether the yarn address is configured correctly -Database table `linkis_cg_rm_external_resource_provider` ` +Database table `linkis_cg_rm_external_resource_provider`` Insert yarn data information ```sql INSERT INTO `linkis_cg_rm_external_resource_provider` @@ -600,167 +615,172 @@ INSERT INTO `linkis_cg_rm_external_resource_provider` '{\r\n"rmWebAddress": "http://xx.xx.xx.xx:8088",\r\n"hadoopVersion": "3.3.4",\r\n"authorEnable":false, \r\n"user":"hadoop",\r\n"pwd":"123456"\r\n}' ); -config field properties +config field attribute -"rmWebAddress": "http://xx.xx.xx.xx:8088", #need to bring http and port +"rmWebAddress": "http://xx.xx.xx.xx:8088", #Need to bring http and port "hadoopVersion": "3.3.4", "authorEnable":true, //Whether authentication is required You can verify the username and password by visiting http://xx.xx.xx.xx:8088 in the browser -"user":"user",//username -"pwd":"pwd"//Password +"user": "user", //username +"pwd": "pwd"//password -```` -After the update, because the cache is used in the program, if you want to take effect immediately, you need to restart the linkis-cg-linkismanager service +``` +After the update, because the cache is used in the program, if you want to take effect immediately, you need to restart the linkis-cg-linkismanager service. ```shell script sh sbin/linkis-daemon.sh restart cg-linkismanager -```` +``` #### 8.1.2 Check whether the yarn queue exists -Exception information: `desc: queue ide is not exists in YARN.` indicates that the configured yarn queue does not exist and needs to be adjusted +Exception information: `desc: queue ide is not exists in YARN.` indicates that the configured yarn queue does not exist and needs to be adjusted. -Modification method: `linkis management console/parameter configuration> global settings>yarn queue name [wds.linkis.rm.yarnqueue]`, modify a yarn queue that can be used, and the yarn queue to be used can be found at `rmWebAddress:http:// xx.xx.xx.xx:8088/cluster/scheduler` +Modification method: `linkis management console/parameter configuration>global settings>yarn queue name [wds.linkis.rm.yarnqueue]`, modify a yarn queue that can be used, and the yarn queue to be used can be found at `rmWebAddress:http:// xx.xx.xx.xx:8088/cluster/scheduler`. View available yarn queues - View yarn queue address: http://ip:8888/cluster/scheduler -### 8.2 Check whether the engine material resource is uploaded successfully +### 8.2 Check whether the engine material resources are uploaded successfully ```sql -#Login to the linkis database +#Log in to the linkis database select * from linkis_cg_engine_conn_plugin_bml_resources -```` +``` -The normal is as follows: +Normally as follows: ![bml](images/bml.png) -Check whether the material record of the engine exists (if there is an update, check whether the update time is correct). +Check whether the material record of the engine exists (if there is an update, check whether the update time is correct) -- If it does not exist or is not updated, first try to manually refresh the material resource (for details, see [Engine Material Resource Refresh](install-engineconn#23-Engine Refresh)). -- Check the specific reasons for material failure through `log/linkis-cg-engineplugin.log` log. In many cases, it may be caused by the lack of permissions in the hdfs directory -- Check whether the gateway address configuration is correct. The configuration item `wds.linkis.gateway.url` of `conf/linkis.properties` +- If it does not exist or is not updated, first try to manually refresh the material resource (see [Engine Material Resource Refresh](install-engineconn#23-engine refresh) for details). +- Use `log/linkis-cg-linkismanager.log` to check the specific reason for the failure of the material. In many cases, it may be caused by the lack of permission in the hdfs directory. +- Check whether the gateway address configuration is correct. The configuration item `wds.linkis.gateway.url` in `conf/linkis.properties`. -The material resources of the engine are uploaded to the hdfs directory by default as `/apps-data/${deployUser}/bml` +The material resources of the engine are uploaded to the hdfs directory by default as `/apps-data/${deployUser}/bml`. ```shell script hdfs dfs -ls /apps-data/hadoop/bml #If there is no such directory, please manually create the directory and grant ${deployUser} read and write permissions hdfs dfs -mkdir /apps-data -hdfs dfs -chown hadoop:hadoop/apps-data -```` +hdfs dfs -chown hadoop:hadoop /apps-data +``` ### 8.3 Login password problem -By default, linkis uses a static user and password. The static user is the deployment user. The static password will randomly generate a password string during deployment and store it in -`${LINKIS_HOME}/conf/linkis-mg-gateway.properties` (>=1.0.3 version) +Linkis uses static users and passwords by default. Static users are deployment users. Static passwords will randomly generate a password string during deployment and store it in + +`${LINKIS_HOME}/conf/linkis-mg-gateway.properties` (>=version 1.0.3). ### 8.4 version compatibility issues -The engine supported by linkis by default, the compatibility with dss can be viewed [this document](https://github.com/apache/linkis/blob/master/README.md) +The engine supported by linkis by default, and the compatibility relationship with dss can be viewed in [this document](https://github.com/apache/linkis/blob/master/README.md). -### 8.5 How to locate the server exception log +### 8.5 How to locate server-side exception logs -Linkis has many microservices. If you are unfamiliar with the system, sometimes you cannot locate the specific module that has an exception. You can search through the global log. +Linkis has many microservices. If you are not familiar with the system, sometimes you cannot locate the specific module that has an exception. You can search through the global log. ```shell script -tail -f log/* |grep -5n exception (or tail -f log/* |grep -5n ERROR) -less log/* |grep -5n exception (or less log/* |grep -5n ERROR) -```` +tail -f log/* |grep -5n exception (or tail -f log/* |grep -5n ERROR) +less log/* |grep -5n exception (or less log/* |grep -5n ERROR) +``` -### 8.6 Exception troubleshooting of execution engine tasks +### 8.6 Execution engine task exception troubleshooting -** step1: Find the startup deployment directory of the engine ** +** step1: Find the startup deployment directory of the engine** -- Method 1: If it is displayed in the execution log, you can view it on the management console as shown below: - ![engine-log](images/engine-log.png) -- Method 2: If it is not found in method 1, you can find the parameter `wds.linkis.engineconn.root.dir` configured in `conf/linkis-cg-engineconnmanager.properties`, which is the directory where the engine is started and deployed. Subdirectories are segregated by the user executing the engine +- Method 1: If it is displayed in the execution log, you can view it on the management console as shown below: +![engine-log](images/engine-log.png) +- Method 2: If not found in method 1, you can find the `wds.linkis.engineconn.root.dir` parameter configured in `conf/linkis-cg-engineconnmanager.properties`, and this value is the directory where the engine starts and deploys. Subdirectories are segregated by user of the execution engine ```shell script -# If you don't know the taskid, you can select it after sorting by time ll -rt /appcom/tmp/${executed user}/${date}/${engine}/ -cd /appcom/tmp/${executed user}/${date}/${engine}/${taskId} -```` +# If you don't know the taskid, you can sort by time and choose ll -rt /appcom/tmp/${executed user}/${date}/${engine}/ +cd /appcom/tmp/${user executed}/${date}/${engine}/${taskId} +``` The directory is roughly as follows ```shell script -conf -> /appcom/tmp/engineConnPublickDir/6a09d5fb-81dd-41af-a58b-9cb5d5d81b5a/v000002/conf #engine configuration file -engineConnExec.sh #Generated engine startup script -lib -> /appcom/tmp/engineConnPublickDir/45bf0e6b-0fa5-47da-9532-c2a9f3ec764d/v000003/lib #Engine dependent packages -logs #Engine startup and execution related logs -```` +conf -> /appcom/tmp/engineConnPublicDir/6a09d5fb-81dd-41af-a58b-9cb5d5d81b5a/v000002/conf #engine configuration file +engineConnExec.sh #generated engine startup script +lib -> /appcom/tmp/engineConnPublicDir/45bf0e6b-0fa5-47da-9532-c2a9f3ec764d/v000003/lib #engine-dependent packages +logs #Related logs of engine startup execution +``` -** step2: View the log of the engine ** +**step2: Check the log of the engine** ```shell script -less logs/stdout -```` - -**step3: try to execute the script manually (if needed)** -Debugging can be done by trying to execute the script manually -```` -sh -x engineConnExec.sh -```` - -### 8.7 How to modify the port of the registry eureka -Sometimes when the eureka port is occupied by other services and the default eureka port cannot be used, the eureka port needs to be modified. Here, the modification of the eureka port is divided into two situations: before the installation is performed and after the installation is performed. -1. Modify the eureka port of the registry before performing the installation -```` -1. Enter the decompression directory of apache-linkis-x.x.x-incubating-bin.tar.gz +less logs/stdout +``` + +**step3: Try to execute the script manually (if needed)** +You can debug by trying to execute the script manually +``` +sh -x engineConnExec.sh +``` + +### 8.7 How to modify the port of the registration center eureka +Sometimes when the eureka port is occupied by other services and the default eureka port cannot be used, it is necessary to modify the eureka port. Here, the modification of the eureka port is divided into two cases: before the installation and after the installation. + +1. Modify the eureka port of the registration center before performing the installation +``` +1. Enter the decompression directory of apache-linkis-xxx-bin.tar.gz 2. Execute vi deploy-config/linkis-env.sh 3. Modify EUREKA_PORT=20303 to EUREKA_PORT=port number -```` -2. Modify the eureka port of the registry after the installation is performed -```` -1. Go to the ${LINKIS_HOME}/conf directory +``` +2. Modify the registry eureka port after installation +``` +1. Enter the ${LINKIS_HOME}/conf directory -2. Execute grep -r 20303 ./* , the query result is as follows: +2. Execute grep -r 20303 ./* , the query results are as follows: ./application-eureka.yml: port: 20303 ./application-eureka.yml: defaultZone: http://ip:20303/eureka/ ./application-linkis.yml: defaultZone: http://ip:20303/eureka/ ./linkis-env.sh:EUREKA_PORT=20303 ./linkis.properties:wds.linkis.eureka.defaultZone=http://ip:20303/eureka/ -3. Change the port in the corresponding location to the new port, and restart all services sh restart sbin/linkis-start-all.sh -```` +3. Change the port at the corresponding location to a new port, and restart all services sh restart sbin/linkis-start-all.sh +``` -### 8.8 Notes on CDH adaptation version +### 8.8 Notes for CDH adaptation version -CDH itself is not the official standard hive/spark package used. When adapting, it is best to modify the hive/spark version dependencies in the source code of linkis to recompile and deploy. -For details, please refer to the CDH adaptation blog post -[[Linkis1.0 - Installation and Stepping in the CDH5 Environment]](https://mp.weixin.qq.com/s/__QxC1NoLQFwme1yljy-Nw) -[[DSS1.0.0+Linkis1.0.2——Trial record in CDH5 environment]](https://mp.weixin.qq.com/s/9Pl9P0hizDWbbTBf1yzGJA) -[[DSS1.0.0 and Linkis1.0.2——Summary of JDBC engine related issues]](https://mp.weixin.qq.com/s/vcFge4BNiEuW-7OC3P-yaw) -[[DSS1.0.0 and Linkis1.0.2——Summary of Flink engine related issues]](https://mp.weixin.qq.com/s/VxZ16IPMd1CvcrvHFuU4RQ) +CDH itself is not an official standard hive/spark package. When adapting, it is best to modify the hive/spark version dependencies in the linkis source code and recompile and deploy. +For details, please refer to the CDH adaptation blog post +[[Linkis1.0——Installation and stepping in the CDH5 environment]](https://mp.weixin.qq.com/s/__QxC1NoLQFwme1yljy-Nw) +[[DSS1.0.0+Linkis1.0.2——Trial record in CDH5 environment]](https://mp.weixin.qq.com/s/9Pl9P0hizDWbbTBf1yzGJA) +[[DSS1.0.0 and Linkis1.0.2 - Summary of JDBC engine-related issues]](https://mp.weixin.qq.com/s/vcFge4BNiEuW-7OC3P-yaw) +[[DSS1.0.0 and Linkis1.0.2——Summary of issues related to Flink engine]](https://mp.weixin.qq.com/s/VxZ16IPMd1CvcrvHFuU4RQ) ### 8.9 Debugging of Http interface -- Method 1 can enable [Login-Free Mode Guide] (/docs/latest/api/login-api/#2 Login-Free Configuration) -- In method 2 postman, the request header brings the cookie value of the successful login +- Method 1 can enable [Guide to Free Login Mode](/docs/latest/api/login-api/#2 Login-free configuration) +- In method 2 postman, the cookie value of successful login on the request header The cookie value can be obtained after successful login on the browser side ![bml](images/bml-cookie.png) ```shell script Cookie: bdp-user-ticket-id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -```` -- Method 3 Add a static Token to the http request header +``` +- Method 3 http request header to add a static Token token Token is configured in conf/linkis.properties Such as: TEST-AUTH=hadoop,root,user01 ```shell script Token-Code: TEST-AUTH -Token-User:hadoop -```` +Token-User: hadoop +``` ### 8.10 Troubleshooting process for abnormal problems -First, follow the above steps to check whether the service/environment, etc. are all started normally -Troubleshoot basic problems according to some of the scenarios listed above -[QA documentation](https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq) Find out if there is a solution, link: https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq -See if you can find a solution by searching the content in the issue -![issues](images/issues.png) -Through the official website document search, for some problems, you can search for keywords through the official website, such as searching for "deployment". (If 404 appears, please refresh your browser) +First, check whether the service/environment is started normally according to the above steps, and then check the basic problems according to some scenarios listed above. + +[QA document](https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq) Find out if there is a solution, link: https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq +See if you can find a solution by searching the contents of the issue. +![issues](images/issues.png) +Through the official website document search, for some questions, you can search keywords on the official website, such as searching for "deployment". (If 404 appears, please refresh the browser) ![search](images/search.png) + ## 9. How to obtain relevant information -Linkis official website documents are constantly improving, you can view/keyword search related documents on this official website. -Related blog post links -- Linkis technical blog collection https://github.com/apache/linkis/issues/1233 -- Technical blog post on the official account https://mp.weixin.qq.com/mp/homepage?__biz=MzI4MDkxNzUxMg==&hid=1&sn=088cbf2bbed1c80d003c5865bc92ace8&scene=18 -- Official website documentation https://linkis.apache.org/docs/latest/about/introduction -- bili technology sharing video https://space.bilibili.com/598542776?spm_id_from=333.788.b_765f7570696e666f.2 +Linkis official website documents are constantly being improved, and you can view related documents on this official website. + +Related blog posts are linked below. +- Linkis' technical blog collection https://github.com/apache/linkis/issues/1233 +- Public account technical blog post https://mp.weixin.qq.com/mp/homepage?__biz=MzI4MDkxNzUxMg==&hid=1&sn=088cbf2bbed1c80d003c5865bc92ace8&scene=18 +- Official website documentation https://linkis.apache.org/zh-CN/docs/latest/about/introduction +- bili technology sharing video https://space.bilibili.com/598542776?spm_id_from=333.788.b_765f7570696e666f.2 + diff --git a/docs/feature/other.md b/docs/feature/other.md index 293c79620cc..aeb42806873 100644 --- a/docs/feature/other.md +++ b/docs/feature/other.md @@ -3,28 +3,26 @@ title: Description of other features sidebar_position: 0.6 --- -## 1. Linkis 1.4.0 other feature upgrade instructions - -### 1.1 Do not kill EC when ECM restarts +## 1. Do not kill EC when ECM restarts When the ECM restarts, there is an option not to kill the engine, but to take over the existing surviving engine. Makes the Engine Connection Manager (ECM) service stateless. -### 1.2 Remove json4s dependency +## 2. Remove json4s dependency Different versions of spark depend on different json4s versions, which is not conducive to the support of multiple versions of spark. We need to reduce this json4s dependency and remove json4s from linkis. For example: spark2.4 needs json4s v3.5.3, spark3.2 needs json4s v3.7.0-M11. -### 1.3 EngineConn module definition depends on engine version -The version definition of the engine is in `EngineConn` by default. Once the relevant version changes, it needs to be modified in many places. We can put the relevant version definition in the top-level pom file. When compiling a specified engine module, it needs to be compiled in the project root directory, and use `-pl` to compile the specific engine module, for example: +## 3. EngineConn module definition depends on engine version +The version definition of the engine is in `EngineConn` by default. Once the relevant version is changed, it needs to be modified in many places. We can put the relevant version definition in the top-level pom file. When compiling a specified engine module, it needs to be compiled in the project root directory, and use `-pl` to compile the specific engine module, for example: ``` mvn install package -pl linkis-engineconn-plugins/spark -Dspark.version=3.2.1 ``` The version of the engine can be specified by the -D parameter of mvn compilation, such as -Dspark.version=xxx, -Dpresto.version=0.235 -At present, all underlying engine versions have been moved to the top-level pom file. When compiling a specified engine module, it needs to be compiled in the project root directory, and `-pl` is used to compile the specific engine module. +At present, all the underlying engine versions have been moved to the top-level pom file. When compiling the specified engine module, it needs to be compiled in the project root directory, and `-pl` is used to compile the specific engine module. -### 1.4 Linkis Main Version Number Modification Instructions +## 4. Linkis main version number modification instructions Linkis will no longer be upgraded by minor version after version 1.3.2. The next version will be 1.4.0, and the version number will be 1.5.0, 1.6.0 and so on. When encountering a major defect in a released version that needs to be fixed, it will pull a minor version to fix the defect, such as 1.4.1. -## 1.5 LInkis code submission main branch description +## 5. LInkis code submission main branch instructions The modified code of Linkis 1.3.2 and earlier versions is merged into the dev branch by default. In fact, the development community of Apache Linkis is very active, and new development requirements or repair functions will be submitted to the dev branch, but when users visit the Linkis code base, the master branch is displayed by default. Since we only release a new version every quarter, it seems that the community is not very active from the perspective of the master branch. Therefore, we decided to merge the code submitted by developers into the master branch by default starting from version 1.4.0. diff --git a/docs/feature/overview.md b/docs/feature/overview.md index e7a06984fd0..34160261e3a 100644 --- a/docs/feature/overview.md +++ b/docs/feature/overview.md @@ -5,12 +5,12 @@ sidebar_position: 0.1 - [Base engine dependencies, compatibility, default version optimization](./base-engine-compatibilty.md) - [Hive engine connector supports concurrent tasks](./hive-engine-support-concurrent.md) -- [Support more data sources](./spark-etl.md) -- [linkis-storage supports S3 file systems (Experimental version)](../deployment/deploy-quick#s3-mode-optional) -- [Add postgresql database support (Experimental version)](../deployment/deploy-quick#22-configure-database) -- [Add impala engine support(Experimental version)](../engine-usage/impala.md) +- [Support more datasources](../user-guide/datasource-manual#31-jdbc-datasource) - [Spark ETL enhancements](./spark-etl.md) - [Generate SQL from data source](./datasource-generate-sql.md) +- [linkis-storage supports S3 file system (experimental version)](../deployment/deploy-quick#343-s3-mode) +- [add postgresql database support (experimental version)](../deployment/deploy-quick#22-configuration database information) +- [Add impala engine support (experimental version)](../engine-usage/impala.md) - [Other feature description](./other.md) - [version of Release-Notes](/download/release-notes-1.4.0) @@ -25,7 +25,8 @@ sidebar_position: 0.1 | mg-eureka | new | eureka.instance.lease-expiration-duration-in-seconds | 12 | eureka waits for the next heartbeat timeout (seconds)| | EC-shell | Modify | wds.linkis.engineconn.support.parallelism | true | Whether to enable parallel execution of shell tasks | | EC-shell | Modify | linkis.engineconn.shell.concurrent.limit | 15 | Concurrent number of shell tasks | -| Entrance | Modify | linkis.entrance.auto.clean.dirty.data.enable | true | Whether to clean dirty data during startup | +| Entrance | Modify | linkis.entrance.auto.clean.dirty.data.enable | true | Whether to clean dirty data at startup | + ## Database table changes diff --git a/docs/feature/spark-etl.md b/docs/feature/spark-etl.md index 965f0509752..2151cb74cf9 100644 --- a/docs/feature/spark-etl.md +++ b/docs/feature/spark-etl.md @@ -61,7 +61,7 @@ sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType data_calc -code "{\"plugin ``` ### 4.3 Synchronization json script description of each data source -### 4.3.1 jdbc +#### 4.3.1 jdbc Configuration instructions ```text @@ -127,7 +127,7 @@ kingbase8-8.6.0.jar postgresql-42.3.8.jar ``` -### 4.3.2 file +#### 4.3.2 file Configuration instructions @@ -173,7 +173,7 @@ Need to add new jar spark-excel-2.12.17-3.2.2_2.12-3.2.2_0.18.1.jar ``` -### 4.3.3 redis +#### 4.3.3 redis ```text sourceTable: source table, @@ -225,7 +225,7 @@ commons-pool2-2.8.1.jar spark-redis_2.12-2.6.0.jar ``` -### 4.3.4 kafka +#### 4.3.4 kafka Configuration instructions ```text @@ -302,7 +302,7 @@ spark-sql-kafka-0-10_2.12-3.2.1.jar spark-token-provider-kafka-0-10_2.12-3.2.1.jar ``` -###elasticsearch +#### 4.3.5 elasticsearch Configuration instructions ```text @@ -380,7 +380,7 @@ Need to add new jar elasticsearch-spark-30_2.12-7.17.7.jar ``` -###mongo +#### 4.3.6 mongo Configuration instructions ```text @@ -461,7 +461,7 @@ mongodb-driver-core-3.12.8.jar mongodb-driver-sync-3.12.8.jar ``` -###delta +#### 4.3.7 delta Configuration instructions ```text @@ -539,7 +539,7 @@ delta-core_2.12-2.0.2.jar delta-storage-2.0.2.jar ``` -###hudi +#### 4.3.8 hudi Configuration instructions ```text diff --git a/docusaurus.config.js b/docusaurus.config.js index 2d8a79bb029..75df9a84662 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -41,10 +41,10 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); editUrl: 'https://github.com/apache/linkis-website/edit/dev/', versions: { current: { - path: '1.4.0', - label: 'Next(1.4.0)' + path: '1.5.0', + label: 'Next(1.5.0)' }, - '1.3.2': { + '1.4.0': { path: 'latest', }, } @@ -161,12 +161,13 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); label: 'Doc', position: 'right', items: [ - {label: '1.3.2', to: '/docs/latest/about/introduction'}, + {label: '1.4.0', to: '/docs/latest/about/introduction'}, + {label: '1.3.2', to: '/docs/1.3.2/about/introduction'}, {label: '1.3.1', to: '/docs/1.3.1/about/introduction'}, {label: '1.3.0', to: '/docs/1.3.0/introduction'}, {label: '1.2.0', to: '/docs/1.2.0/introduction'}, {label: '1.1.1', to: '/docs/1.1.1/introduction'}, - {label: 'Next(1.4.0)', to: '/docs/1.4.0/about/introduction'}, + {label: 'Next(1.5.0)', to: '/docs/1.5.0/about/introduction'}, {label: 'All Version', to: '/versions'} ] }, @@ -356,7 +357,7 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); createRedirects(existingPath) { if (existingPath.includes('/latest')) { return [ - existingPath.replace('/latest', '/1.3.2'), + existingPath.replace('/latest', '/1.4.0'), ]; } return undefined; // Return a false value: no redirect created diff --git a/download/main.md b/download/main.md index 9bef235afc9..9ad742cdd0f 100644 --- a/download/main.md +++ b/download/main.md @@ -9,6 +9,7 @@ Use the links below to download the Apache Linkis Releases, the latest release i | Version | Release Date | Source | Binary | Web Binary | Release Notes | |----------------------------------------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------| +| 1.4.0 | 2023-08-05 | [[Source](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-web-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.4.0.md) | | 1.3.2 | 2023-04-03 | [[Source](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-web-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.3.2.md) | | 1.3.1 | 2023-01-18 | [[Source](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-web-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.3.1.md) | | 1.3.0 | 2022-10-25 | [[Source](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-bin.tar.gz.asc) ][[SHA512](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-web-bin.tar.gz.asc )] [[SHA512](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.3.0.md) | diff --git a/download/release-notes-1.4.0.md b/download/release-notes-1.4.0.md index dbfe015fcc9..f8f945a4229 100644 --- a/download/release-notes-1.4.0.md +++ b/download/release-notes-1.4.0.md @@ -3,9 +3,9 @@ title: Release Notes 1.4.0 sidebar_position: 0.14 --- -Apache Linkis 1.4.0 includes all [Project Linkis-1.3.4](https://github.com/apache/linkis/projects/26) +Apache Linkis 1.4.0 includes all [Project Linkis-1.4.0](https://github.com/apache/linkis/projects/26) -Linkis version 1.4.0 mainly adds the following functions: upgrade the default versions of hadoop, spark, and hive to 3.x; reduce the compatibility issues of different versions of the basic engine; Hive EC supports concurrent submission of tasks; ECM service does not kill EC when restarting; linkis-storage supports S3 and OSS file systems; supports more data sources, such as: tidb, starrocks, Gaussdb, etc.; increases postgresql database support; and enhances Spark ETL functions, supports Excel, Redis, Mongo, Elasticsearch, etc.; The version number upgrade rules and the code submission default merge branch have been modified. +Linkis 1.4.0 version, the main new features are as follows: Adapted Hadoop, Hive, Spark The default version is upgraded to 3.x (Hadoop2.7.2-3.3.4, Hive2.3.3-3.1.3, spark2.4.3-3.2 .1 Supplement the specific version information), and support compilation parameters to control the version, so as to reduce the difficulty of transforming and adapting to the non-default base engine version; Hive EC supports running tasks in concurrent mode, which can greatly reduce the use of machine resources and improve the concurrency of hive tasks; ECM service does not kill EC when restarting, providing support for graceful restart; storage of task log result sets, new support for S3 and OSS file system modes; new support for data source services, such as: tidb, starrocks, Gaussdb, etc. ; Service support adapts to postgresql database mode deployment (experimental); Added Impala engine support (experimental); and enhanced Spark ETL functions, supporting Excel, Redis, Mongo, Elasticsearch, etc.; The main functions are as follows: @@ -14,9 +14,11 @@ The main functions are as follows: - Reduce the compatibility issues of different versions of the base engine - Support Hive EC to execute tasks concurrently - Support not kill EC when restarting ECM service -- linkis-storage supports S3 and OSS file systems + - Support more data sources, such as: tidb, starrocks, Gaussdb, etc. -- Add postgresql database support +- Add postgresql database support (experimental) +- linkis-storage supports S3 and OSS filesystems (experimental) +- Added Impala engine connector support (experimental) - Enhancements to Spark ETL - Version number upgrade rules and submitted code default merge branch modification @@ -24,18 +26,18 @@ abbreviation: - ORCHESTRATOR: Linkis Orchestrator - COMMON: Linkis Common - ENTRANCE: Linkis Entrance --EC: Engineconn +- EC: Engineconn - ECM: EngineConnManager - ECP: EngineConnPlugin - DMS: Data Source Manager Service - MDS: MetaData Manager Service -- LM: Linkis Manager -- PS: Linkis Public Service -- PE: Linkis Public Enhancement +- LM: Links Manager +- PS: Link Public Service +- PE: Link Public Enhancement - RPC: Linkis Common RPC - CG: Linkis Computation Governance - DEPLOY: Linkis Deployment -- WEB: Linkis Web +- WEB: Linked Web - GATEWAY: Linkis Gateway - EP: Engine Plugin @@ -43,24 +45,16 @@ abbreviation: ## new features - \[EC][LINKIS-4263](https://github.com/apache/linkis/pull/4263) upgrade the default version of Hadoop, Spark, Hive to 3.x - \[EC-Hive][LINKIS-4359](https://github.com/apache/linkis/pull/4359) Hive EC supports concurrent tasks -- \[COMMON][LINKIS-4424](https://github.com/apache/linkis/pull/4424) linkis-storage supports OSS file system - \[COMMON][LINKIS-4435](https://github.com/apache/linkis/pull/4435) linkis-storage supports S3 file system -- \[EC-Impala][LINKIS-4458](https://github.com/apache/linkis/pull/4458) Add Impala EC plugin support -- \[ECM][LINKIS-4452](https://github.com/apache/linkis/pull/4452) Do not kill EC when ECM restarts -- \[EC][LINKIS-4460](https://github.com/apache/linkis/pull/4460) Linkis supports multiple clusters +- \[ECM][LINKIS-4452](https://github.com/apache/linkis/pull/4452) ECM 无电影化,reboot when not kill EC - \[COMMON][LINKIS-4524](https://github.com/apache/linkis/pull/4524) supports postgresql database -- \[DMS][LINKIS-4486](https://github.com/apache/linkis/pull/4486) data source model supports Tidb data source -- \[DMS][LINKIS-4496](https://github.com/apache/linkis/pull/4496) data source module supports Starrocks data source -- \[DMS][LINKIS-4513](https://github.com/apache/linkis/pull/4513) data source model supports Gaussdb data source -- \[DMS][LINKIS-](https://github.com/apache/linkis/pull/4581) data source model supports OceanBase data source -- \[EC-Spark][LINKIS-4568](https://github.com/apache/linkis/pull/4568) Spark JDBC supports dm and kingbase databases +- \[DMS][LINKIS-4486](https://github.com/apache/linkis/pull/4486) supports Tidb data source +- \[EC-Spark][LINKIS-4568](https://github.com/apache/linkis/pull/4568) Spark JDBC supports dm database - \[EC-Spark][LINKIS-4539](https://github.com/apache/linkis/pull/4539) Spark etl supports excel - \[EC-Spark][LINKIS-4534](https://github.com/apache/linkis/pull/4534) Spark etl supports redis -- \[EC-Spark][LINKIS-4564](https://github.com/apache/linkis/pull/4564) Spark etl supports RocketMQ - \[EC-Spark][LINKIS-4560](https://github.com/apache/linkis/pull/4560) Spark etl supports mongo and es -- \[EC-Spark][LINKIS-4569](https://github.com/apache/linkis/pull/4569) Spark etl supports solr - \[EC-Spark][LINKIS-4563](https://github.com/apache/linkis/pull/4563) Spark etl supports kafka -- \[EC-Spark][LINKIS-4538](https://github.com/apache/linkis/pull/4538) Spark etl supports data lake +- \[EC-Spark][LINKIS-4538](https://github.com/apache/linkis/pull/4538) Spark etl supports data lake (hudi, delta) ## Enhancement points @@ -68,6 +62,8 @@ abbreviation: - \[COMMON][LINKIS-4425](https://github.com/apache/linkis/pull/4425) code optimization, delete useless code - \[COMMON][LINKIS-4368](https://github.com/apache/linkis/pull/4368) code optimization, remove json4s dependency - \[COMMON][LINKIS-4357](https://github.com/apache/linkis/pull/4357) file upload interface optimization +- \[COMMON][LINKIS-4678](https://github.com/apache/linkis/pull/4678) Linkis JDBC Driver optimization supports docking different types of engines and tasks +- \[COMMON][LINKIS-4554](https://github.com/apache/linkis/pull/4554) Add task link tracking log to facilitate locating problems through unique task ID - \[ECM][LINKIS-4449](https://github.com/apache/linkis/pull/4449) ECM code optimization - \[EC][LINKIS-4341](https://github.com/apache/linkis/pull/4341) Optimize the code logic of CustomerDelimitedJSONSerDe - \[EC-Openlookeng][LINKIS-](https://github.com/apache/linkis/pull/4474) Openlookeng EC code conversion to Java @@ -89,15 +85,14 @@ abbreviation: ## Repair function - \[EC-Hive][LINKIS-4246](https://github.com/apache/linkis/pull/4246) The Hive engine version number supports hyphens, such as hive3.1.2-cdh5.12.0 - \[COMMON][LINKIS-4438](https://github.com/apache/linkis/pull/4438) fixed nohup startup error -- \[EC][LINKIS-4429](https://github.com/apache/linkis/pull/4429) fix CPU average load calculation bug +- \[EC][LINKIS-4429](https://github.com/apache/linkis/pull/4429) Fix CPU average load calculation bug - \[PE][LINKIS-4457](https://github.com/apache/linkis/pull/4457) fix parameter validation issue configured by admin console - \[DMS][LINKIS-4500](https://github.com/apache/linkis/pull/4500) Fixed type conversion failure between client and data source - \[COMMON][LINKIS-4480](https://github.com/apache/linkis/pull/4480) fixed build default configuration file with jdk17 - \[CG][LINKIS-4663](https://github.com/apache/linkis/pull/4663) Fix the problem that engine reuse may throw NPE -- \[LM][LINKIS-4652](https://github.com/apache/linkis/pull/4652) fixed the problem of creating engine node throwing NPE -- \[][LINKIS-](https://github.com/apache/linkis/pull/) -- \[][LINKIS-](https://github.com/apache/linkis/pull/) +- \[LM][LINKIS-4652](https://github.com/apache/linkis/pull/4652) fixed the problem that creating engine node throws NPE ## Acknowledgments -The release of Apache Linkis 1.4.0 is inseparable from the contributors of the Linkis community, thanks to all community contributors, casionone,MrFengqin,zhangwejun,Zhao,ahaoyao,duhanmin,guoshupei,shixiutao,CharlieYan24,peacewong,GuoPhilipse,aiceflower,waynecookie,jacktao007,chenghuichen,ws00428637,ChengJie1053,dependabot,jackxu2011,sjgllgh,rarexixi,pjfanning,v-kkhuang,binbinCheng,stdnt-xiao,mayinrain. \ No newline at end of file +The release of Apache Linkis 1.4.0 is inseparable from the contributors of the Linkis community. Thanks to all community contributors, including but not limited to the following Contributors (in no particular order): +casionone,MrFengqin,zhangwejun,Zhao,ahaoyao,duhanmin,guoshupei,shixiutao,CharlieYan24,peacewong,GuoPhilipse,aiceflower,waynecookie,jacktao007,chenghuichen,ws00428637,ChengJie1053,dependabot,jackxu2011,s jgllgh,rarexixi,pjfanning,v-kkhuang,binbinCheng, stdnt-xiao, mayinrain. \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/main.md b/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/main.md index 464b9135930..33723259de4 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/main.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/main.md @@ -8,6 +8,7 @@ sidebar_position: 0 | 版本 | 发布时间 | 源码 | 项目安装包 | 管理台安装包 | Release Notes | |----------------------------------------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------| +| 1.4.0 | 2023-08-05 | [[Source](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-web-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.4.0/apache-linkis-1.4.0-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.4.0.md) | | 1.3.2 | 2023-04-03 | [[Source](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-web-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/1.3.2/apache-linkis-1.3.2-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.3.2.md) | | 1.3.1 | 2023-01-18 | [[Source](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-web-bin.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/linkis/release-1.3.1/apache-linkis-1.3.1-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.3.1.md) | | 1.3.0 | 2022-10-25 | [[Source](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-src.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-src.tar.gz.asc)] [[SHA512](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-src.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-bin.tar.gz.asc) ][[SHA512](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-bin.tar.gz.sha512)] | [[Binary](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-web-bin.tar.gz)] [[Sign](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-web-bin.tar.gz.asc )] [[SHA512](https://www.apache.org/dyn/closer.lua/incubator/linkis/release-1.3.0/apache-linkis-1.3.0-incubating-web-bin.tar.gz.sha512)] | [Release-Notes](release-notes-1.3.0.md) | diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/release-notes-1.4.0.md b/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/release-notes-1.4.0.md index 8711b0ec906..d96ee0bb71a 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/release-notes-1.4.0.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs-download/current/release-notes-1.4.0.md @@ -5,7 +5,7 @@ sidebar_position: 0.14 Apache Linkis 1.4.0 包括所有 [Project Linkis-1.4.0](https://github.com/apache/linkis/projects/26) -Linkis 1.4.0 版本,主要增加了如下功能:将 hadoop、spark、hive 默认版本升级为3.x;减少基础引擎不同版本兼容性问题;Hive EC 支持并发提交任务;ECM 服务重启时不 kill EC;linkis-storage 支持 S3 和 OSS 文件系统;支持更多的数据源,如:tidb、starrocks、Gaussdb等;增加 postgresql 数据库支持;以及对Spark ETL 功能增强,支持 Excel、Redis、Mongo、Elasticsearch等;同时对版本号升级规则及代码提交默认合并分支做了修改。 +Linkis 1.4.0 版本,主要新增如下特性功能:适配的 Hadoop、Hive、Spark 默认版本升级为3.x (Hadoop2.7.2-3.3.4, Hive2.3.3-3.1.3,spark2.4.3-3.2.1 补充下具体的版本信息), 并支持编译参数控制版本,以降低改造适配非默认基础引擎版本的难度;Hive EC 支持并发模式运行任务,可大幅降低机器资源使用,提高hive任务并发;ECM 服务重启时不 kill EC,为优雅重启提供支持;任务日志结果集的存储,新增对S3 和 OSS 文件系统模式的支持;数据源服务新增对,如:tidb、starrocks、Gaussdb等的支持;服务支持适配postgresql 数据库模式部署(实验性);新增Impala引擎支持(实验性);以及对Spark ETL 功能增强,支持 Excel、Redis、Mongo、Elasticsearch等; 主要功能如下: @@ -14,9 +14,11 @@ Linkis 1.4.0 版本,主要增加了如下功能:将 hadoop、spark、hive - 减少基础引擎不同版本兼容性问题 - 支持 Hive EC 并发执行任务 - 支持 ECM 服务重启时不 kill EC -- linkis-storage 支持 S3 和 OSS 文件系统 + - 支持更多的数据源,如:tidb、starrocks、Gaussdb等 -- 增加 postgresql 数据库支持 +- 增加 postgresql 数据库支持(实验性) +- linkis-storage 支持 S3 和 OSS 文件系统(实验性) +- 新增 Impala 引擎连接器支持(实验性) - 对Spark ETL 功能增强 - 版本号升级规则及提交代码默认合并分支修改 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current.json b/i18n/zh-CN/docusaurus-plugin-content-docs/current.json index 86fa068d54f..f715ad86bcf 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current.json +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current.json @@ -1,6 +1,6 @@ { "version.label": { - "message": "Next(1.4.0)", + "message": "Next(1.5.0)", "description": "The label for version current" }, diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/deployment/deploy-quick.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/deployment/deploy-quick.md index 328c4429d25..35489d955c4 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/deployment/deploy-quick.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/deployment/deploy-quick.md @@ -8,7 +8,7 @@ sidebar_position: 1 ### 1.1 Linux服务器 **硬件要求** -安装linkis 微服务近10个,至少3G内存。每个微服务默认配置启动的jvm -Xmx 内存大小为 512M(内存不够的情况下,可以尝试调小至256/128M,内存足够情况下也可以调大)。 +安装linkis 微服务近6个,至少3G内存。每个微服务默认配置启动的jvm -Xmx 内存大小为 512M(内存不够的情况下,可以尝试调小至256/128M,内存足够情况下也可以调大)。 ### 1.2 添加部署用户 @@ -16,7 +16,7 @@ sidebar_position: 1 >部署用户: linkis核心进程的启动用户,同时此用户会默认作为管理员权限,部署过程中会生成对应的管理员登录密码,位于`conf/linkis-mg-gateway.properties`文件中 Linkis支持指定提交、执行的用户。linkis主要进程服务会通过`sudo -u ${linkis-user}` 切换到对应用户下,然后执行对应的引擎启动命令,所以引擎`linkis-engine`进程归属的用户是任务的执行者(因此部署用户需要有sudo权限,而且是免密的)。 -以hadoop用户为例: +以hadoop用户为例(linkis中很多配置用户默认都使用hadoop用户,建议初次安装者使用hadoop用户,否则在安装过程中可能会遇到很多意想不到的错误): 先查看系统中是否已经有 hadoop 用户,若已经存在,则直接授权即可,若不存在,先创建用户,再授权。 @@ -54,7 +54,7 @@ $ tar -xvf apache-linkis-x.x.x-bin.tar.gz 解压后的目录结构如下 ```shell script --rw-r--r-- 1 hadoop hadoop 518192043 Jun 20 09:50 apache-linkis-1.3.1-bin.tar.gz +-rw-r--r-- 1 hadoop hadoop 518192043 Jun 20 09:50 apache-linkis-x.x.x-bin.tar.gz drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 bin //执行环境检查和安装的脚本 drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 deploy-config // 部署时依赖的DB等环境配置信息 drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 docker @@ -229,7 +229,18 @@ HADOOP_KERBEROS_ENABLE=true HADOOP_KEYTAB_PATH=/appcom/keytab/ ``` -#### 注意事项 +### 2.4 配置 Token +文件位于 `bin/install.sh` + +Linkis 1.3.2 版本为保证系统安全性已将 Token 值改为32位随机生成,具体可查看[Token变更说明](https://linkis.apache.org/zh-CN/docs/1.3.2/feature/update-token/)。 + +使用随机生成Token,初次与[WDS其它组件](https://github.com/WeDataSphere/DataSphereStudio/blob/master/README-ZH.md)对接时会遇到很多 Token 验证失败的问题,建议初次安装时不使用随机生成Token,修改如下配置为 true 即可。 + +``` +DEBUG_MODE=true +``` + +### 2.5 注意事项 **全量安装** @@ -241,7 +252,7 @@ HADOOP_KEYTAB_PATH=/appcom/keytab/ **Token 过期问题** -当遇到 Token 令牌无效或已过期问题时可以检查 Token 是否配置正确,可通过管理台查询 Token。 +当遇到 Token 令牌无效或已过期问题时可以检查 Token 是否配置正确,可通过管理台 ==> 基础数据管理 ==> 令牌管理,查询 Token。 **Python 版本问题** Linkis 升级为 1.4.0 后默认 Spark 版本升级为 3.x,无法兼容 python2。因此如果需要使用 pyspark 功能需要做如下修改。 @@ -273,7 +284,7 @@ install.sh脚本会询问您是否需要初始化数据库并导入元数据。 执行成功提示如下: ```shell script -`Congratulations! You have installed Linkis 1.0.3 successfully, please use sh /data/Install/linkis/sbin/linkis-start-all.sh to start it! +`Congratulations! You have installed Linkis x.x.x successfully, please use sh /data/Install/linkis/sbin/linkis-start-all.sh to start it! Your default account password is [hadoop/5e8e312b4]` ``` @@ -539,6 +550,11 @@ sh bin/linkis-cli -submitUser hadoop -engineType python-python2 -codeType pyth | Flink | >=1.0.0 已适配 | **不包含** | | openLooKeng | >=1.1.1 已适配 | **不包含** | | Sqoop | >=1.1.2 已适配 | **不包含** | +| Trino | >=1.3.2 已适配 | **不包含** | +| Presto | >=1.3.2 已适配 | **不包含** | +| Elasticsearch | >=1.3.2 已适配 | **不包含** | +| Seatunnel | >=1.3.2 已适配 | **不包含** | +| Impala | >=1.4.0 已适配 | **不包含** | diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/other.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/other.md index 9dafd70c4f1..db4ddc1c284 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/other.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/other.md @@ -3,16 +3,14 @@ title: 其它特性说明 sidebar_position: 0.6 --- -## 1. Linkis 1.4.0 其它特性升级说明 - -### 1.1 ECM 重启时不 kill EC +## 1. ECM 重启时不 kill EC 当ECM重新启动时,可以选择不杀死引擎,而是可以接管现有的存活引擎。使引擎连接管理器 (ECM) 服务无状态。 -### 1.2 移除 json4s 依赖 +## 2. 移除 json4s 依赖 spark 不同版本依赖不同的json4s版本,不利于spark多版本的支持,我们需要减少这个json4s依赖,从linkis中移除了json4s. 比如: spark2.4 需要json4s v3.5.3, spark3.2需要json4s v3.7.0-M11。 -### 1.3 EngineConn模块定义依赖引擎版本 +## 3. EngineConn模块定义依赖引擎版本 引擎的版本定义默认在 `EngineConn`中,一旦相关版本变更,需要修改多处,我们可以把相关的版本定义统一放到顶层pom文件中。编译指定引擎模块时,需要在项目根目录编译,并使用`-pl`来编译具体的引擎模块,比如: ``` mvn install package -pl linkis-engineconn-plugins/spark -Dspark.version=3.2.1 @@ -20,12 +18,12 @@ mvn install package -pl linkis-engineconn-plugins/spark -Dspark.version=3.2.1 引擎的版本可以通过mvn编译-D参数来指定,比如 -Dspark.version=xxx 、 -Dpresto.version=0.235 目前所有的底层引擎版本新都已经移到顶层pom文件中,编译指定引擎模块时,需要在项目根目录编译,并使用`-pl`来编译具体的引擎模块。 -### 1.4 Linkis 主版本号修改说明 +## 4. Linkis 主版本号修改说明 Linkis 从 1.3.2 版本后将不再按小版本升级,下一个版本为 1.4.0,再往后升级时版本号为1.5.0,1.6.0 以此类推。当遇到某个发布版本有重大缺陷需要修复时会拉取小版本修复缺陷,如 1.4.1 。 -## 1.5 LInkis 代码提交主分支说明 +## 5. LInkis 代码提交主分支说明 Linkis 1.3.2 及之前版本修改代码默认是合并到 dev 分支。实际上 Apache Linkis 的开发社区很活跃,对于新开发的需求或修复功能都会提交到 dev 分支,但是用户访问 Linkis 代码库的时候默认显示的是 master 分支。由于我们一个季度才会发布一个新版本,从 master 分支来看显得社区活跃的不高。因此我们决定从 1.4.0 版本开始,将开发者提交的代码默认合并到 master 分支。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/overview.md index b2ad3c08c61..2755345ad75 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/overview.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/overview.md @@ -5,12 +5,12 @@ sidebar_position: 0.1 - [基础引擎依赖性、兼容性、默认版本优化](./base-engine-compatibilty.md) - [Hive 引擎连接器支持并发任务](./hive-engine-support-concurrent.md) -- [支持更多的数据源](./spark-etl.md) +- [支持更多的数据源](../user-guide/datasource-manual#31-jdbc-数据源) +- [Spark ETL 功能增强](./spark-etl.md) +- [根据数据源生成SQL](./datasource-generate-sql.md) - [linkis-storage 支持 S3 文件系统(实验版本)](../deployment/deploy-quick#343-s3-模式) - [增加 postgresql 数据库支持(实验版本)](../deployment/deploy-quick#22-配置数据库信息) - [增加 impala 引擎支持(实验版本)](../engine-usage/impala.md) -- [Spark ETL 功能增强](./spark-etl.md) -- [根据数据源生成SQL](./datasource-generate-sql.md) - [其它特性说明](./other.md) - [版本的 Release-Notes](/download/release-notes-1.4.0) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/spark-etl.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/spark-etl.md index 40c2a646851..6f486f4515a 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/spark-etl.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/feature/spark-etl.md @@ -61,7 +61,7 @@ sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType data_calc -code "{\"plugi ``` ### 4.3 各数据源同步 json 脚本说明 -### 4.3.1 jdbc +#### 4.3.1 jdbc 配置说明 ```text @@ -127,7 +127,7 @@ kingbase8-8.6.0.jar postgresql-42.3.8.jar ``` -### 4.3.2 file +#### 4.3.2 file 配置说明 @@ -173,7 +173,7 @@ json code spark-excel-2.12.17-3.2.2_2.12-3.2.2_0.18.1.jar ``` -### 4.3.3 redis +#### 4.3.3 redis ```text sourceTable: 源表, @@ -225,7 +225,7 @@ commons-pool2-2.8.1.jar spark-redis_2.12-2.6.0.jar ``` -### 4.3.4 kafka +#### 4.3.4 kafka 配置说明 ```text @@ -302,7 +302,7 @@ spark-sql-kafka-0-10_2.12-3.2.1.jar spark-token-provider-kafka-0-10_2.12-3.2.1.jar ``` -### elasticsearch +#### 4.3.5 elasticsearch 配置说明 ```text @@ -380,7 +380,7 @@ index: elasticsearch索引名称 elasticsearch-spark-30_2.12-7.17.7.jar ``` -### mongo +#### 4.3.6 mongo 配置说明 ```text @@ -461,7 +461,7 @@ mongodb-driver-core-3.12.8.jar mongodb-driver-sync-3.12.8.jar ``` -### delta +#### 4.3.7 delta 配置说明 ```text @@ -539,7 +539,7 @@ delta-core_2.12-2.0.2.jar delta-storage-2.0.2.jar ``` -### hudi +#### 4.3.8 hudi 配置说明 ```text diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0.json new file mode 100644 index 00000000000..658c5831f83 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0.json @@ -0,0 +1,163 @@ +{ + "version.label": { + "message": "1.4.0", + "description": "The label for version current" + }, + + "sidebar.tutorialSidebar.category.About Linkis": { + "message": "关于 Linkis" + }, + + "sidebar.tutorialSidebar.category.Quick Experience": { + "message": "快速体验", + "description": "The label for category Quick in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Deployment": { + "message": "部署指南", + "description": "The label for category advanced Deployment in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.User Guide": { + "message": "使用指南", + "description": "The label for category User Guide in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Engine Usage": { + "message": "引擎使用", + "description": "The label for category Engine Usage in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Tuning And Troubleshooting": { + "message": "调优排障", + "description": "The label for category Tuning And Troubleshooting in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Error Guide": { + "message": "错误码", + "description": "The label for category Error Guide in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.API Docs": { + "message": "API文档", + "description": "The label for category API Docs in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Table Structure": { + "message": "表结构", + "description": "The label for category Table Structure in sidebar tutorialSidebar" + }, + + "sidebar.tutorialSidebar.category.Architecture": { + "message": "架构设计", + "description": "The label for category Architecture in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Commons": { + "message": "公共依赖模块", + "description": "The label for category Commons in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Computation Governance Services": { + "message": "计算治理模块", + "description": "The label for category Computation Governance Services in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Engine": { + "message": "引擎服务", + "description": "The label for category Engine Services in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Linkis Manager": { + "message": "Manager架构", + "description": "The label for category Linkis Manager in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Public Enhancement Services": { + "message": "公共增强模块", + "description": "The label for category Public Enhancement Services in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Context Service": { + "message": "上下文服务", + "description": "The label for category Public Enhancement Services in sidebar tutorialSidebar" + }, + + "sidebar.tutorialSidebar.category.Microservice Governance Services": { + "message": "微服务实例模块", + "description": "The label for category Microservice Governance Services in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Orchestrator": { + "message": "编排器架构", + "description": "The label for category Orchestrator Services in sidebar tutorialSidebar" + }, + + "sidebar.tutorialSidebar.category.Upgrade Guide": { + "message": "升级指南", + "description": "The label for category Upgrade Guide in sidebar tutorialSidebar" + }, + + "sidebar.tutorialSidebar.category.Development": { + "message": "开发指南", + "description": "The label for category Development Doc in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Development Specification": { + "message": "开发规范", + "description": "The label for category Development Specification in sidebar tutorialSidebar" + }, + + "sidebar.tutorialSidebar.category.Components": { + "message": "组件介绍", + "description": "The label for category Components in sidebar tutorialSidebar" + }, + + "sidebar.tutorialSidebar.category.Engine Plugin Management Service": { + "message": "引擎插件管理服务", + "description": "Engine Plugin Management Service" + }, + "sidebar.tutorialSidebar.category.Computing Governance Portal Service": { + "message": "计算治理入口服务", + "description": "Computing Governance Portal Service" + }, + "sidebar.tutorialSidebar.category.Computing Governance Management Services": { + "message": "计算治理管理服务", + "description": "Computing Governance Management Services" + }, + "sidebar.tutorialSidebar.category.Public Service": { + "message": "公共服务", + "description": "Public Service" + }, + "sidebar.tutorialSidebar.category.Quick Start": { + "message": "快速上手", + "description": "quick start" + }, + "sidebar.tutorialSidebar.category.Integrated": { + "message": "集成", + "description": "integrated" + }, + "sidebar.tutorialSidebar.category.Console Manual": { + "message": "管理台的使用", + "description": "console manual" + }, + "sidebar.tutorialSidebar.category.Security Authentication": { + "message": "安全认证" + }, + "sidebar.tutorialSidebar.category.Service Architecture": { + "message": "微服务架构", + "description": "linkis service architecture" + }, + "sidebar.tutorialSidebar.category.Feature": { + "message": "关键特性架构", + "description": "key feature architechture" + }, + "sidebar.tutorialSidebar.category.Control Panel": { + "message": "管理台的使用", + "description": "control panel usage" + }, + "sidebar.tutorialSidebar.category.Advice Configuration": { + "message": "建议配置", + "description": "Linkis advice configuration" + }, + "sidebar.tutorialSidebar.category.LinkisManger Services": { + "message": "LinkisManger 服务", + "description": "LinkisManger Services" + }, + "sidebar.tutorialSidebar.category.Entrance Services": { + "message": "Entrance 服务", + "description": "Entrance Services" + }, + "sidebar.tutorialSidebar.category.Version Feature": { + "message": "版本特性", + "description": "Version Feature" + } + + + +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/_category_.json new file mode 100644 index 00000000000..2c333deaa77 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "关于 Linkis", + "position": 1.0 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/configuration.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/configuration.md new file mode 100644 index 00000000000..fa6358f012b --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/configuration.md @@ -0,0 +1,179 @@ +--- +title: 建议配置 +sidebar_position: 0.2 +--- + +## 1 软硬件环境建议配置 + +Linkis 在上层应用程序和底层引擎之间构建了一层计算中间件。 作为一款开源分布式计算中间件,可以很好地部署和运行在 Intel 架构服务器及主流虚拟化环境下,并支持主流的Linux操作系统环境 + +### 1.1 Linux 操作系统版本要求 + +| 操作系统 | 版本 | +| --- | --- | +| Red Hat Enterprise Linux | 7.0 及以上 | +| CentOS | 7.0 及以上 | +| Oracle Enterprise Linux | 7.0 及以上 | +| Ubuntu LTS | 16.04 及以上 | + +> **注意:** 以上 Linux 操作系统可运行在物理服务器以及 VMware、KVM、XEN 主流虚拟化环境上 + +### 1.2 服务器建议配置 + +Linkis 支持运行在 Intel x86-64 架构的 64 位通用硬件服务器平台。对生产环境的服务器硬件配置有以下建议: + +#### 生产环境 + +| **CPU** | **内存** | **硬盘类型** | **网络** | **实例数量** | +| --- | --- | --- | --- | --- | +| 16核+ | 32GB+ | SAS | 千兆网卡 | 1+ | + +> **注意:** +> +> - 以上建议配置为部署 Linkis的最低配置,生产环境强烈推荐使用更高的配置 +> - 硬盘大小配置建议 50GB+ ,系统盘和数据盘分开 + +### 1.3 软件要求 + +Linkis二进制包基于以下软件版本进行编译: + +| 组件 | 版本 | 说明 | +| --- | --- | --- | +| Hadoop | 3.3.4 | | +| Hive | 3.1.3 | | +| Spark | 3.2.1 | | +| Flink | 1.12.2 | | +| openLooKeng | 1.5.0 | | +| Sqoop | 1.4.6 | | +| ElasticSearch | 7.6.2 | | +| Presto | 0.234 | | +| Python | Python2 | | + +> **注意:** +> 如果本地安装组件版本与上述不一致,需要进行修改对应组件版本,自行编译二进制包进行安装。 + +### 1.4 客户端 Web 浏览器要求 + +Linkis推荐 Chrome 73版本进行前端访问 + + +## 2 常用场景 + +### 2.1 开启测试模式 +开发过程需要免密接口,可在`linkis.properties`替换或追加此配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.test.mode | false | 是否打开调试模式,如果设置为 true,所有微服务都支持免密登录,且所有EngineConn打开远程调试端口 | +| wds.linkis.test.user | hadoop | 当wds.linkis.test.mode=true时,免密登录的默认登录用户 | + +![](./images/test-mode.png) + + +### 2.2 登录用户设置 +Apache Linkis 默认使用配置文件来管理admin用户,可以在`linkis-mg-gateway.properties`替换或追加此配置。如需多用户可接入LDAP实现。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.admin.user | hadoop | 管理员用户名 | +| wds.linkis.admin.password | 123456 | 管理员用户密码 | + +![](./images/login-user.png) + + +### 2.3 LDAP设置 +Apache Linkis 可以通过参数接入LDAP实现多用户管理,可以在`linkis-mg-gateway.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.ldap.proxy.url | 无 | LDAP URL地址 | +| wds.linkis.ldap.proxy.baseDN | 无 | LDAP baseDN地址 | +| wds.linkis.ldap.proxy.userNameFormat | 无 | | + +![](./images/ldap.png) + +### 2.4 关闭资源检查 +Apache Linkis 提交任务时有时会调试异常,如:资源不足;可以在`linkis-cg-linkismanager.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.manager.rm.request.enable | true | 资源检查 | + +![](./images/resource-enable.png) + +### 2.5 开启引擎调试 +Apache Linkis EC可以开启调试模式,可以在`linkis-cg-linkismanager.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.engineconn.debug.enable | true | 是否开启引擎调试 | + +![](./images/engine-debug.png) + +### 2.6 Hive元数据配置 +Apache Linkis 的public-service服务需要读取hive的元数据;可以在`linkis-ps-publicservice.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| hive.meta.url | 无 | HiveMetaStore数据库的URL。 | +| hive.meta.user | 无 | HiveMetaStore数据库的user | +| hive.meta.password | 无 | HiveMetaStore数据库的password | + +![](./images/hive-meta.png) + +### 2.7 Linkis 数据库配置 +Apache Linkis 访问默认使用Mysql作为数据存储,可以在`linkis.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.server.mybatis.datasource.url | 无 | 数据库连接字符串,例如:jdbc:mysql://127.0.0.1:3306/dss?characterEncoding=UTF-8 | +| wds.linkis.server.mybatis.datasource.username | 无 | 数据库用户名,例如:root | +| wds.linkis.server.mybatis.datasource.password | 无 | 数据库密码,例如:root | + +![](./images/linkis-db.png) + +### 2.8 Linkis Session 缓存配置 +Apache Linkis 支持使用redis进行session的共享;可以在`linkis.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| linkis.session.redis.cache.enabled | None | 是否开启 | +| linkis.session.redis.host | 127.0.0.1 | 主机名 | +| linkis.session.redis.port | 6379 | 端口,例如 | +| linkis.session.redis.password | None | 密码 | + +![](./images/redis.png) + +### 2.9 Linkis 模块开发配置 +Apache Linkis 开发时可通过此参数,自定义加载模块的数据库、Rest接口、实体对象;可以在`linkis-ps-publicservice.properties`进行修改,多个模块之间使用逗号分割。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.server.restful.scan.packages | 无 | restful 扫描包,例如:org.apache.linkis.basedatamanager.server.restful | +| wds.linkis.server.mybatis.mapperLocations | 无 | mybatis mapper文件路径,例如: classpath*:org/apache/linkis/basedatamanager/server/dao/mapper/*.xml| +| wds.linkis.server.mybatis.typeAliasesPackage | 无 | 实体别名扫描包,例如:org.apache.linkis.basedatamanager.server.domain | +| wds.linkis.server.mybatis.BasePackage | 无 | 数据库dao层扫描,例如:org.apache.linkis.basedatamanager.server.dao | + +![](./images/deverlop-conf.png) + +### 2.10 Linkis 模块开发配置 +Apache Linkis 开发时可通过此参数,自定义加载模块的路由;可以在`linkis.properties`进行修改,多个模块之间使用逗号分割。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.gateway.conf.publicservice.list | cs,contextservice,data-source-manager,metadataQuery,metadatamanager,query,jobhistory,application,configuration,filesystem,udf,variable,microservice,errorcode,bml,datasource,basedata-manager | publicservice服务支持路由的模块 | + +![](./images/list-conf.png) + +### 2.11 Linkis 文件系统及物料存放路径 +Apache Linkis 开发时可通过此参数,自定义加载模块的路由;可以在`linkis.properties`进行修改,多个模块之间使用逗号分割。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.filesystem.root.path | file:///tmp/linkis/ | 本地用户目录,需在该目录下建立以用户名为名称的文件夹 | +| wds.linkis.filesystem.hdfs.root.path | hdfs:///tmp/ | HDFS用户目录 | +| wds.linkis.bml.is.hdfs | true | 是否启用hdfs | +| wds.linkis.bml.hdfs.prefix | /apps-data | hdfs路径 | +| wds.linkis.bml.local.prefix | /apps-data | 本地路径 | + +![](./images/fs-conf.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/glossary.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/glossary.md new file mode 100644 index 00000000000..76ed35f4abc --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/glossary.md @@ -0,0 +1,105 @@ +--- +title: 名词解释和服务介绍 +sidebar_position: 0.3 +--- + +## 1.名词解释 + +Linkis 基于微服务架构开发,其服务可以分为3类服务群(组):计算治理服务组、公共增强服务组和微服务治理服务组。 +- 计算治理服务组(Computation Governance Services):处理任务的核心服务,支持计算任务/请求处理流程的4个主要阶段(提交->准备->执行->结果); +- 公共增强服务组(Public Enhancement Services):提供基础的支撑服务,包括上下文服务、引擎/udf物料的管理服务、历史任务等公共服务及数据源的管理服务等; +- 微服务治理服务组(Microservice Governance Services):定制化的Spring Cloud Gateway、Eureka。提供微服务的基础底座 + +下面将对这三组服务的关键名词和服务进行介绍: + +### 1.1 关键模块名词 + +首先我们了解下关键模块的名词 + +| 简称 | 全称 | 主要功能 | +|-------- |------------------------- |---------------------| +| MG/mg | Microservice Governance | 微服务治理 | +| CG/cg | Computation Governance | 计算治理 | +| EC/ec | EngineConn | 引擎连接器 | +| - | Engine | 底层计算存储引擎,如spark、hive、shell | +| ECM/ecm | EngineConnManager | 引擎连接器的管理 | +| ECP/ecp | EngineConnPlugin | 引擎连接器插件 | +| RM/rm | ResourceManager | 资源管理器,用于管控任务资源和用户资源使用和控制 | +| AM/am | AppManager | 应用管理器,用于管控EngineConn和ECM服务 | +| LM/lm | LinkisManager | Linkis管理器服务,包含了:RM、AM、LabelManager等模块 | +| PES/pes | Public Enhancement Services | 公共增强服务 | +| - | Orchestrator | 编排器,用于Linkis任务编排,任务多活、混算、AB等策略支持 | +| UJES | Unified Job Execute Service | 统一作业执行服务 | +| DDL/ddl | Data Definition Language | 数据库定义语言 | +| DML/dml | Data Manipulation Language | 数据操纵语言 | + +### 1.2 任务关键名词 + +- JobRequest: 任务请求,对应Client提交给Linkis的任务,包含任务的执行内容、用户、标签等信息 +- RuntimeMap: 任务运行时参数,任务的运行时参数,任务级别生效,如放置多数据源的数据源信息 +- StartupMap: 引擎连接器启动参数,用于EngineConn连机器启动的参数,EngineConn进程生效,如设置spark.executor.memory=4G +- UserCreator: 任务创建者信息:包含用户信息User和Client提交的应用信息Creator,用于任务和资源的租户隔离 +- submitUser: 任务提交用户 +- executeUser: 任务真实执行用户 +- JobSource: 任务来源信息,记录任务的IP或者脚本地址 +- errorCode: 错误码,任务错误码信息 +- JobHistory: 任务历史持久化模块,提供任务的历史信息查询 +- ResultSet: 结果集,任务对应的结果集,默认以.dolphin文件后缀进行保存 +- JobInfo: 任务运行时信息,如日志、进度、资源信息等 +- Resource: 资源信息,每个任务都会消耗资源 +- RequestTask: EngineConn的最小执行单元,传输给EngineConn执行的任务单元 + + + +## 2. 服务介绍 + +本节主要对Linkis的服务进行介绍,了解Linkis启动后会有哪些服务,以及服务的作用。 + +### 2.1 服务列表 + +Linkis启动后各个服务群(组)下包括的微服务如下: + +| 归属的微服务群(组) | 服务名 | 主要功能 | +| ---- | ---- | ---- | +| MGS | linkis-mg-eureka | 负责服务注册与发现,上游其他组件也会复用linkis的注册中心,如dss| +| MGS | linkis-mg-gateway | 作为Linkis的网关入口,主要承担了请求转发、用户访问认证 | +| CGS | linkis-cg-entrance | 任务提交入口是用来负责计算任务的接收、调度、转发执行请求、生命周期管理的服务,并且能把计算结果、日志、进度返回给调用方 | +| CGS | linkis-cg-linkismanager|提供了AppManager(应用管理)、ResourceManager(资源管理)、LabelManager(标签管理)、引擎连接器插件管理的能力 | +| CGS | linkis-cg-engineconnmanager | EngineConn的管理器,提供引擎的生命周期管理 | +| CGS | linkis-cg-engineconn| 引擎连接器服务,是与底层计算存储引擎(Hive/Spark)的实际连接的服务,包含了与实际引擎的会话信息。对于底层计算存储引擎来说 它充当了一个客户端的角色,由任务触发启动| +| PES | linkis-ps-publicservice|公共增强服务组模块服务,为其他微服务模块提供统一配置管理、上下文服务、BML物料库、数据源管理、微服务管理和历史任务查询等功能 | + +启动后开源看到的所有服务如下图: +![Linkis_Eureka](/Images/deployment/Linkis_combined_eureka.png) + +### 2.1 公共增强服务详解 +公共增强服务组(PES)在1.3.1版本后默认将相关模块服务合并为一个服务linkis-ps-publicservice提供相关功能,当然如果你希望分开部署也支持的。您只需要将对应模块的服务打包部署即可。 +合并后的公共增强服务,主要包含了以下功能: + +| 简称 | 全称 | 主要功能 | +|-------- |------------------------- |---------------------| +| CS/cs | Context Service | 上下文服务,用于任务间传递结果集、变量、文件等 | +| UDF/udf | UDF | UDF管理模块,提供UDF和函数的管理功能,支持共享和版本控制 | +| variable | Variable | 全局自定义模块,提供全局自定变量的管理功能 | +| script | Script-dev | 脚本文件操作服务,提供脚本编辑保存、脚本目录管理功能 | +| jobHistory | JobHistory | 任务历史持久化模块,提供任务的历史信息查询 | +| BML/bml | BigData Material library | 大数据物料库 | +| - | Configuration | 配置管理,提供配置参数的管理和查看的功能 | +| - | instance-label | 微服务管理服务,提供微服务和路由标签的映射管理功能 | +| - | error-code | 错误码管理,提供通过错误码管理的功能 | +| DMS/dms | Data Source Manager Service | 数据源管理服务 | +| MDS/mds | MetaData Manager Service | 元数据管理服务 | +| - | linkis-metadata | 提供Hive元数据信息查看功能,后续将会合并到到MDS | +| - | basedata-manager | 基础数据管理,用于管理Linkis自身的基础元数据信息 | + +## 3 模块介绍 +本节主要对Linkis的大模块和功能进行主要介绍 + +- linkis-commons: linkis的公共模块,包含了公共的工具类模块、RPC模块、微服务基础等模块 +- linkis-computation-governance: 计算治理模块,包含了计算治理多个服务的模块:Entrance、LinkisManager、EngineConnManager、EngineConn等 +- linkis-engineconn-plugins: 引擎连接器插件模块,包含了所有的引擎连接器插件实现 +- linkis-extensions: Linkis的扩展增强模块,不是必要功能模块,现在主要包含了文件代理操作的IO模块 +- linkis-orchestrator: 编排模块,用于Linkis任务编排,任务多活、混算、AB等高级策略支持 +- linkis-public-enhancements: 公共增强模块,包含了所有的公共服务用于给到linkis内部和上层应用组件进行调用 +- linkis-spring-cloud-services: spring cloud相关的服务模块,包含了gateway、注册中心等 +- linkis-web: 前端模块 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/deverlop-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/deverlop-conf.png new file mode 100644 index 00000000000..3d5fc8af601 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/deverlop-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/engine-debug.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/engine-debug.png new file mode 100644 index 00000000000..788bd2b58f0 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/engine-debug.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/fs-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/fs-conf.png new file mode 100644 index 00000000000..85c4234a9b4 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/fs-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/hive-meta.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/hive-meta.png new file mode 100644 index 00000000000..50c02906a77 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/hive-meta.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/ldap.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/ldap.png new file mode 100644 index 00000000000..9625ae20be0 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/ldap.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/linkis-db.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/linkis-db.png new file mode 100644 index 00000000000..35f7f5573df Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/linkis-db.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/list-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/list-conf.png new file mode 100644 index 00000000000..d19c194a023 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/list-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/login-user.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/login-user.png new file mode 100644 index 00000000000..477c634f1d4 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/login-user.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/redis.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/redis.png new file mode 100644 index 00000000000..3a064640613 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/redis.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/resource-enable.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/resource-enable.png new file mode 100644 index 00000000000..973fcee8409 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/resource-enable.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/test-mode.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/test-mode.png new file mode 100644 index 00000000000..3466b1b8857 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/images/test-mode.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/introduction.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/introduction.md new file mode 100644 index 00000000000..d28a99ba891 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/about/introduction.md @@ -0,0 +1,115 @@ +--- +title: 简述 +sidebar_position: 0 +--- +## 关于 Linkis + +Linkis 在上层应用程序和底层引擎之间构建了一层计算中间件。通过使用Linkis 提供的REST/WebSocket/JDBC 等标准接口,上层应用可以方便地连接访问MySQL/Spark/Hive/Presto/Flink 等底层引擎,同时实现统一变量、脚本、用户定义函数和资源文件等用户资源的跨上层应用互通,以及通过REST标准接口提供了数据源管理和数据源对应的元数据查询服务。 +作为计算中间件,Linkis 提供了强大的连通、复用、编排、扩展和治理管控能力。通过将应用层和引擎层解耦,简化了复杂的网络调用关系,降低了整体复杂度,同时节约了整体开发和维护成本。 +Linkis 自2019年开源发布以来,已累计积累了700多家试用企业和1000多位沙盒试验用户,涉及金融、电信、制造、互联网等多个行业。许多公司已经将Linkis 作为大数据平台底层计算存储引擎的统一入口,和计算请求/任务的治理管控利器。 + +![没有Linkis 之前](/Images-zh/before_linkis_cn.png) + +![有了Linkis 之后](/Images-zh/after_linkis_cn.png) + +## 核心特点 +- **丰富的底层计算存储引擎支持**:Spark、Hive、Python、Shell、Flink、JDBC、Pipeline、Sqoop、OpenLooKeng、Presto、ElasticSearch、Trino、SeaTunnel 等; +- **丰富的语言支持**:SparkSQL、HiveSQL、Python、Shell、Pyspark、Scala、JSON 和 Java 等; +- **强大的计算治理能力**: 能够提供基于多级标签的任务路由、负载均衡、多租户、流量控制、资源控制等能力; +- **全栈计算存储引擎架构支持**: 能够接收、执行和管理针对各种计算存储引擎的任务和请求,包括离线批量任务、交互式查询任务、实时流式任务和数据湖任务; +- **统一上下文服务**:支持跨用户、系统、计算引擎去关联管理用户和系统的资源文件(JAR、ZIP、Properties 等),结果集、参数变量、函数、UDF等,一处设置,处处自动引用; +- **统一物料**: 提供了系统和用户级物料管理,可分享和流转,跨用户、跨系统共享物料; +- **统一数据源管理**: 提供了Hive、ElasticSearch、Mysql、Kafka、MongoDB 等类型数据源信息的增删查改、版本控制、连接测试和对应数据源的元数据信息查询能力; +- **错误码能力**:提供了任务常见错误的错误码和解决方案,方便用户自助定位问题; + +## 支持的引擎类型 +| **引擎名** | **支持底层组件版本
(默认依赖版本)** | **Linkis 1.X 版本要求** | **是否默认包含在发布包中** | **说明** | +|:---- |:---- |:---- |:---- |:---- | +|Spark|Apache 2.0.0~2.4.7,
CDH >= 5.4.0,
(默认Apache Spark 2.4.3)|\>=1.0.0_rc1|是|Spark EngineConn, 支持SQL, Scala, Pyspark 和R 代码。| +|Hive|Apache >= 1.0.0,
CDH >= 5.4.0,
(默认Apache Hive 2.3.3)|\>=1.0.0_rc1|是|Hive EngineConn, 支持HiveQL 代码。| +|Python|Python >= 2.6,
(默认Python2*)|\>=1.0.0_rc1|是|Python EngineConn, 支持python 代码。| +|Shell|Bash >= 2.0|\>=1.0.0_rc1|是|Shell EngineConn, 支持Bash shell 代码。| +|JDBC|MySQL >= 5.0, Hive >=1.2.1,
(默认Hive-jdbc 2.3.4)|\>=1.0.0_rc1|否|JDBC EngineConn, 已支持Mysql,Oracle,KingBase,PostgreSQL,SqlServer,DB2,Greenplum,DM,Doris,ClickHouse,TiDB,Starrocks,GaussDB和OceanBase, 可快速扩展支持其他有JDBC Driver 包的引擎, 如SQLite| +|Flink |Flink >= 1.12.2,
(默认Apache Flink 1.12.2)|\>=1.0.2|否|Flink EngineConn, 支持FlinkSQL 代码,也支持以Flink Jar 形式启动一个新的Yarn 应用程序。| +|Pipeline|-|\>=1.0.2|否|Pipeline EngineConn, 支持文件的导入和导出。| +|openLooKeng|openLooKeng >= 1.5.0,
(默认openLookEng 1.5.0)|\>=1.1.1|否|openLooKeng EngineConn, 支持用Sql查询数据虚拟化引擎openLooKeng。| +|Sqoop| Sqoop >= 1.4.6,
(默认Apache Sqoop 1.4.6)|\>=1.1.2|否|Sqoop EngineConn, 支持 数据迁移工具 Sqoop 引擎。| +|Presto|Presto >= 0.180|\>=1.2.0|否|Presto EngineConn, 支持Presto SQL 代码。| +|ElasticSearch|ElasticSearch >=6.0|\>=1.2.0|否|ElasticSearch EngineConn, 支持SQL 和DSL 代码。| +|Trino | Trino >=371 | >=1.3.1 | 否 | Trino EngineConn, 支持Trino SQL 代码 | +|Seatunnel | Seatunnel >=2.1.2 | >=1.3.1 | 否 | Seatunnel EngineConn, 支持Seatunnel SQL 代码 | + + + +## 下载 +请前往[Linkis releases 页面](https://linkis.apache.org/zh-CN/download/main) 下载Linkis 已编译的部署安装包或源码包。 + +## 安装部署 + +请参考[编译指南](../development/build.md)来编译Linkis源代码。 +请参考[安装部署文档](../deployment/deploy-quick.md) 来部署Linkis 。 + +## 示例和使用指引 +- [各引擎使用指引](../engine-usage/overview.md) +- [API 文档](../api/overview.md) + +## 文档 +完整的Linkis文档代码存放在[linkis-website仓库中](https://github.com/apache/linkis-website) + +## 架构概要 +Linkis 基于微服务架构开发,其服务可以分为3类:计算治理服务、公共增强服务和微服务治理服务。 +- 计算治理服务,支持计算任务/请求处理流程的3个主要阶段:提交->准备->执行。 +- 公共增强服务,包括上下文服务、物料管理服务及数据源服务等。 +- 微服务治理服务,包括定制化的Spring Cloud Gateway、Eureka、Open Feign。 + +下面是Linkis的架构概要图,更多详细架构文档请见 [Linkis/Architecture](../architecture/overview.md)。 +![architecture](/Images/Linkis_1.0_architecture.png) + +基于Linkis 计算中间件,我们在大数据平台套件[WeDataSphere](https://github.com/WeBankFinTech/WeDataSphere) 中构建了许多应用和工具系统,下面是目前可用的开源项目。 + +![wedatasphere_stack_Linkis](/Images/wedatasphere_stack_Linkis.png) + +- [**DataSphere Studio** - 数据应用集成开发框架](https://github.com/WeBankFinTech/DataSphereStudio) + +- [**Scriptis** - 数据研发IDE工具](https://github.com/WeBankFinTech/Scriptis) + +- [**Visualis** - 数据可视化工具](https://github.com/WeBankFinTech/Visualis) + +- [**Schedulis** - 工作流调度工具](https://github.com/WeBankFinTech/Schedulis) + +- [**Qualitis** - 数据质量工具](https://github.com/WeBankFinTech/Qualitis) + +- [**MLLabis** - 容器化机器学习notebook 开发环境](https://github.com/WeBankFinTech/prophecis) + +更多项目开源准备中,敬请期待。 + +## 贡献 +我们非常欢迎和期待更多的贡献者参与共建Linkis, 不论是代码、文档或是其他能够帮助到社区的贡献形式。 + +代码和文档相关的贡献请参照[贡献指引](/community/how-to-contribute)。 + + +## 联系我们 + +**方式1 邮件列表** + +|名称|描述|订阅|取消订阅|存档| +|:-----|:--------|:-----|:------|:-----| +| [dev@linkis.apache.org](mailto:dev@linkis.apache.org) | 社区活动信息 | [订阅](mailto:dev-subscribe@linkis.apache.org) | [取消订阅](mailto:dev-unsubscribe@linkis.apache.org) | [存档](http://mail-archives.apache.org/mod_mbox/linkis-dev) | + +**方式2 Issue** + +通过github提交[issue](https://github.com/apache/linkis/issues/new/choose),以便跟踪处理和经验沉淀共享 + +**方式2 微信助手** + +|微信小助手|微信公众号| +|:---|---| +||| + + +Meetup 视频 [Bilibili](https://space.bilibili.com/598542776?from=search&seid=14344213924133040656)。 + +## 谁在使用 Linkis +我们创建了[一个 issue](https://github.com/apache/linkis/issues/23) 以便用户反馈和记录谁在使用Linkis。 +Linkis 自2019年开源发布以来,累计已有700多家试验企业和1000+沙盒试验用户,涉及金融、电信、制造、互联网等多个行业。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/_category_.json new file mode 100644 index 00000000000..02d23f945ae --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "API 文档", + "position": 7 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/_category_.json new file mode 100644 index 00000000000..803138a2024 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Http API", + "position": 6 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/_category_.json new file mode 100644 index 00000000000..8f625f20e9e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "引擎插件管理服务", + "position": 4 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engine-plugin-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engine-plugin-api.md new file mode 100644 index 00000000000..1c83e70e2a6 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engine-plugin-api.md @@ -0,0 +1,576 @@ +--- +title: 引擎插件API +sidebar_position: 3 +--- + +** EnginePluginRestful 类 ** + +## 刷新 + + +**接口地址**:`/api/rest_j/v1/engineplugin/refresh` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

刷新单个资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ecType|类型|query|false|string| +|version|版本|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 刷新所有 + + +**接口地址**:`/api/rest_j/v1/engineplugin/refreshAll` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

刷新所有ec resource

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 回滚 + +**接口地址**:`/api/rest_j/v1/engineplugin/rollBack` + +**请求方式**:`POST` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +回滚当前引擎插件的物料版本 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| --------------------- | ------------------------- | -------- | -------- | --------------------- | ------ | +| engineConnBmlResource | EngineConnBmlResource实体 | body | true | EngineConnBmlResource | | + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": {} +} +``` + +## 获取引擎在物料中的所有版本 + +**接口地址**:/api/rest_j/v1/engineplugin/getVersionList + +**请求方式**:GET + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +获取引擎插件在物料管理系统中的所有版本 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| ------------- | ---------------- | -------- | -------- | --------------------- | ------ | +| bmlResourceId | 引擎的物料资源id | body | true | EngineConnBmlResource | | +| ecType | 引擎名称 | body | false | String | | +| version | 引擎版本 | body | false | String | | + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": {} +} +``` + + + +## 获取所有引擎名称 + +**接口地址**:/api/rest_j/v1/engineplugin/getTypeList + +**请求方式**:GET + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +获取所有类型的引擎名称 + +**请求参数** + + + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "typeList": [ + "hive", + "io_file", + "jdbc", + "openlookeng", + "python", + "shell", + "spark" + ] + } +} +``` + + + +## 获取引擎的所有版本 + +**接口地址**:/api/rest_j/v1/engineplugin/getTypeVersionList/{type} + +**请求方式**:GET + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +获取所有类型的引擎名称 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------------- | -------- | -------- | -------- | ------ | +| type | 引擎的类型名称 | path | true | String | | + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "queryList": [ + "v4" + ] + } +} +``` + + + +## 更新引擎插件 + +**接口地址**:/api/rest_j/v1/engineplugin/updateEnginePluginBML + +**请求方式**:POST + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +更新指定引擎插件 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | ------------ | -------- | -------- | ------------- | ------ | +| file | 引擎物料文件 | body | true | MultipartFile | | +| ecType | 引擎类型名称 | body | true | String | | +| version | 引擎版本 | body | true | String | | + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "mes": "upload file success" + } +} +``` + + + +## 引擎插件 + +**接口地址**:/api/rest_j/v1/engineplugin/list + +**请求方式**:GET + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +请求所有引擎插件信息 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| ----------- | ------------ | -------- | -------- | -------------- | ------ | +| currentPage | 当前页面 | qurey | true | integer(int32) | | +| ecType | 引擎类型名称 | qurey | false | String | | +| version | 引擎版本 | qurey | false | String | | +| pageSize | 页面大小 | qurey | true | integer(int32) | | + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "totalPage": 17, + "queryList": [ + { + "id": 239, + "engineConnType": "python", + "version": "python2", + "fileName": "lib.zip", + "lastModified": 1661950452000, + "fileSize": 6093507, + "bmlResourceId": "8edb8e88-fc75-4ce3-a330-3ece9ec533cb", + "bmlResourceVersion": "v000001", + "createTime": "2022-08-31 20:56:59", + "lastUpdateTime": "2022-08-31 20:56:59" + }, + { + "id": 238, + "engineConnType": "python", + "version": "python2", + "fileName": "conf.zip", + "lastModified": 1661950450000, + "fileSize": 43841, + "bmlResourceId": "a46beb9b-7368-4900-a2a6-241f1ec49002", + "bmlResourceVersion": "v000001", + "createTime": "2022-08-31 20:56:54", + "lastUpdateTime": "2022-08-31 20:56:54" + } + ] + } +} +``` + + + +## 新增引擎插件 + +**接口地址**:/api/rest_j/v1/engineplugin/uploadEnginePluginBML + +**请求方式**:POST + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +上传新增一个引擎插件 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | ------------------ | -------- | -------- | ------------- | ------ | +| file | 引擎物料文件压缩包 | body | true | MultipartFile | | + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "mes": "upload file success" + } +} +``` + + + +## 删除引擎插件 + +**接口地址**:/api/rest_j/v1/engineplugin/deleteEnginePluginBML + +**请求方式**:GET + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`*/*` + +**接口描述**: + +删除指定引擎插件 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | ------------ | -------- | -------- | -------- | ------ | +| ecType | 引擎类型名称 | qurey | true | String | | +| version | 引擎版本 | qurey | false | String | | + +**响应状态**: + +| 状态码 | 说明 | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | -------------- | -------------- | +| data | 数据集 | object | | +| message | 描述 | string | | +| method | 请求url | string | | +| status | 状态 | integer(int32) | integer(int32) | + +**响应示例**: + +``` +{"method":null,"status":0,"message":"OK","data":{"msg":"delete successfully"}} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md new file mode 100644 index 00000000000..ad77d066d23 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md @@ -0,0 +1,108 @@ +--- +title: 引擎物料刷新API +sidebar_position: 2 +--- +>主要用于引擎的物料资源({LINKIS_INSTALL_HOME}/lib/linkis-engineconn-plugin 下,引擎的jar包/配置文件 )更新至BML中。 + +## refresh + +**接口地址**:`/api/rest_j/v1/engineplugin/refresh` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:更新指定引擎的物料资源 + + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ecType|引擎类型|query|true|string|| +|version|版本 可以为空或则*|query|false|string|| + +**请求示例**: +``` +#url +http://ip:port/api/rest_j/v1/engineplugin/refresh?ecType=hive&version=2.3.3 + +#请求头部 +Content-Type:application/json +Token-Code:BML-AUTH +Token-User:hadoop +``` + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "msg": "Refresh successfully" + } +} +``` + + +## refreshAll + + +**接口地址**:`/api/rest_j/v1/engineplugin/refreshAll` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:更新所有引擎的物料资源 + + +**请求参数**: +无 + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "msg": "Refresh successfully" + } +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/_category_.json new file mode 100644 index 00000000000..2efa3b26626 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Entrnace 服务", + "position": 5 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-management-api.md new file mode 100644 index 00000000000..acb362e570d --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-management-api.md @@ -0,0 +1,129 @@ +--- +title: 任务管理 +sidebar_position: 2 +--- +** EntranceMetricRestfulApi 类 ** + + +# 任务管理 + + +## 启动任务 + + +**接口地址**:`/api/rest_j/v1/entrance/api/metrics/runningtask` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

启动任务

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 任务信息 + + +**接口地址**:`/api/rest_j/v1/entrance/api/metrics/taskinfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

任务信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|创建者|query|false|string| +|engineTypeLabel|引擎类型标签|query|false|string| +|user|user|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-operation-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-operation-api.md new file mode 100644 index 00000000000..11064238525 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-operation-api.md @@ -0,0 +1,569 @@ +--- +title: 任务操作 +sidebar_position: 1 +--- +** EntranceRestfulApi 类 ** + + +## 处理任务请求 + + +**接口地址**:`/api/rest_j/v1/entrance/execute` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

execute函数处理的是用户提交执行任务的请求

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|json|json|body|true|object| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 提交execute函数 + + +**接口地址**:`/api/rest_j/v1/entrance/submit` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

提交execute函数

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|Submit|json|body|true|Submit|Submit| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 结束任务 + + +**接口地址**:`/api/rest_j/v1/entrance/{id}/kill` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

kill任务

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|ID|path|false|string| +|taskID|任务ID|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 结束Jobs + + +**接口地址**:`/api/rest_j/v1/entrance/{id}/killJobs` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

结束Jobs

+ +**请求示例**: +```javascript +{ + "taskIDList": [], + "idList": [] +} +``` + + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id请求路径生成|path|true|string| +|taskIDList|任务ID集合|false|String|String| +|idList|ID集合|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/entrance/#id/killJobs", + "status": 0, + "message": "success", + "data": { + "messages": [{ + "method": "", + "status": 0, + "message": "", + "data": { + "execID": "" + } + }] + } +} +``` + + +## 任务日志 + + +**接口地址**:`/api/rest_j/v1/entrance/{id}/log` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取任务日志

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|任务ID|path|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 暂停任务 + + +**接口地址**:`/api/rest_j/v1/entrance/{id}/pause` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

暂停任务

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|任务ID|path|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 任务进展 + + +**接口地址**:`/api/rest_j/v1/entrance/{id}/progress` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

任务进展

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|任务ID|path|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 资源进展 + + +**接口地址**:`/api/rest_j/v1/entrance/{id}/progressWithResource` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

资源进展

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|ID|path|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 任务状态 + + +**接口地址**:`/api/rest_j/v1/entrance/{id}/status` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

任务状态

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|ID|path|false|string| +|taskID|任务ID|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/_category_.json new file mode 100644 index 00000000000..ad07bddc12e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "LinkisManager 服务", + "position": 2 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ec-resource-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ec-resource-management-api.md new file mode 100644 index 00000000000..c10e93d3f03 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ec-resource-management-api.md @@ -0,0 +1,291 @@ +--- +title: EC资源信息管理 +sidebar_position: 4 +--- +** ECResourceInfoRestfulApi 类 ** + + + + +## 删除EC信息 + + +**接口地址**:`/api/rest_j/v1/linkisManager/ecinfo/delete/{ticketid}}` + + +**请求方式**:`DELETE` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/json` + + +**接口描述**:

删除EC信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketid|ticketid|path|true|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|204|No Content| +|401|Unauthorized| +|403|Forbidden| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取EC信息 + + +**接口地址**:`/api/rest_j/v1/linkisManager/ecinfo/get` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/json` + + +**接口描述**:

获取EC信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketid|ticketid|query|true|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + +## 搜索历史EC信息 + + +**接口地址**:`/api/rest_j/v1/linkisManager/ecinfo/ecrHistoryList` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/json` + + +**接口描述**:

获取EC信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|instance|instance|query|false|string| +|creator|creator|query|false|string| +|startDate|startDate|query|false|string| +|endDate|endDate|query|false|string| +|engineType|engineType|query|false|string| +|pageNow|pageNow|query|false|Int| +|pageSize|pageSize|query|false|Int| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + { + "message": "", + "status": 0, + "data": { + "engineList": [ + { + "id": -94209540.07806732, + "requestResource": "consectetur dolor eiusmod ipsum", + "releasedResource": "est in id Ut", + "usedTimes": -51038117.02855969, + "ticketId": "adipisicing in nostrud do", + "ecmInstance": "id magna Lorem eiusmod", + "engineType": "dolor", + "usedTime": -38764910.74278392, + "logDirSuffix": "sunt eiusmod aute et", + "releaseTime": -33417043.232267484, + "usedResource": "in amet veniam velit", + "requestTimes": -15643696.319572791, + "labelValue": "veniam incididunt magna", + "releaseTimes": 96384811.3484546, + "createTime": 38434279.49900183, + "serviceInstance": "consequat aliqua in enim", + "createUser": "Lorem Ut occaecat amet" + }, + { + "labelValue": "adipisicing deserunt do", + "usedTimes": 49828407.223826766, + "usedResource": "mollit laboris cupidatat enim", + "releaseTimes": -73400915.22672182, + "releasedResource": "est qui id ipsum mollit", + "requestResource": "deserunt reprehenderit ut", + "serviceInstance": "do laborum", + "requestTimes": -33074164.700212136, + "ecmInstance": "dolore", + "logDirSuffix": "ea incididunt", + "createUser": "Ut exercitation officia dolore ipsum", + "usedTime": 25412456.522457644, + "createTime": -93227549.70578489, + "id": -84032815.0589972, + "ticketId": "eu in mollit do", + "engineType": "non Ut eu", + "releaseTime": 34923394.9602966 + }, + { + "releaseTime": -91057731.93164417, + "usedTime": 99226623.97199354, + "id": 59680041.603043556, + "requestResource": "officia Ut enim nulla", + "usedTimes": -14680356.219609797, + "logDirSuffix": "proident amet reprehenderit tempor", + "ticketId": "minim esse", + "releaseTimes": 37270921.94107443, + "serviceInstance": "enim adipisicing cupidatat", + "createUser": "culpa", + "requestTimes": -33504917.797325186, + "releasedResource": "et dolore quis", + "ecmInstance": "elit dolor adipisicing id", + "createTime": -38827280.78902944, + "engineType": "ullamco in eiusmod reprehenderit aute", + "labelValue": "dolore qui labore nulla laboris", + "usedResource": "irure sint nostrud Excepteur sunt" + }, + { + "requestResource": "deserunt incididunt enim", + "releaseTimes": -16708903.732444778, + "id": 80588551.12419662, + "ecmInstance": "et veniam", + "releaseTime": -50240956.63233949, + "usedTimes": -5348294.728038415, + "labelValue": "incididunt tempor reprehenderit quis eu", + "createUser": "in in", + "serviceInstance": "minim sit", + "ticketId": "in dolore", + "usedTime": -30138563.761232898, + "logDirSuffix": "quis laborum ea", + "createTime": 65920455.93896958, + "requestTimes": 38810152.0160971, + "engineType": "est in Ut proident", + "usedResource": "nulla laboris Ut", + "releasedResource": "cupidatat irure" + }, + { + "usedResource": "Lorem adipisicing dolor", + "createTime": -11906770.11266476, + "labelValue": "et id magna", + "releaseTimes": 32546901.20497243, + "id": -90442428.4679744, + "logDirSuffix": "aute ut eu commodo", + "ticketId": "cillum sint non deserunt", + "requestResource": "non velit sunt consequat culpa", + "requestTimes": -75282512.0022062, + "usedTime": 6378131.554130778, + "releasedResource": "Duis in", + "serviceInstance": "dolore ut officia", + "usedTimes": 70810503.51038182, + "createUser": "voluptate sed", + "ecmInstance": "laboris do sit dolore ipsum", + "engineType": "id", + "releaseTime": 37544575.30154848 + } + ] + } + } +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ecm-resource-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ecm-resource-management-api.md new file mode 100644 index 00000000000..0acd06d3b4f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ecm-resource-management-api.md @@ -0,0 +1,462 @@ +--- +title: ECM资源管理 +sidebar_position: 3 +--- +** EMRestfulApi 类 ** + + + +## 执行ECM操作 + + +**接口地址**:`/api/rest_j/v1/linkisManager/executeECMOperation` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 执行ECM操作开始 + + +**接口地址**:`/api/rest_j/v1/linkisManager/executeECMOperationByEC` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**: + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## ECM管理中状态列表 + + +**接口地址**:`/api/rest_j/v1/linkisManager/listAllECMHealthyStatus` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/json` + + +**接口描述**:

获取状态列表清单

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|onlyEditable|是否仅可编辑|query|false|boolean| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/linkisManager/listAllECMHealthyStatus", + "status": 0, + "message": "OK", + "data": { + "nodeHealthy": [] + } +} +``` + + +## ECM资源清单 + + +**接口地址**:`/api/rest_j/v1/linkisManager/listAllEMs` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/json` + + +**接口描述**:

获取所有ECM资源详细清单列表可根据条件查询,默认查询所有

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|instance|实例名称|query|false|string| +|nodeHealthy|状态,状态有以下枚举类型 ‘Healthy‘, ‘UnHealthy‘, ‘WARN‘, ’StockAvailable’, ‘StockUnavailable’|query|false|string| +|owner|创建者|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/linkisManager/listAllEMs", + "status": 0, + "message": "OK", + "data": { + "EMs": [{ + "labels": [{ + "stringValue": "", + "labelKey": "", + "feature": "", + "instance": "", + "serviceInstance": { + "instance": "", + "applicationName": "" + }, + "serviceName": "", + "featureKey": "", + "empty": + }], + "applicationName": "", + "instance": ":", + "resourceType": "", + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": , + "instance": + }, + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": 0, + "cores": 0, + "instance": 0 + }, + "expectedResource": { + "memory": 0, + "cores": 0, + "instance": 0 + }, + "leftResource": { + "memory": , + "cores": , + "instance": + }, + "owner": "", + "runningTasks": null, + "pendingTasks": null, + "succeedTasks": null, + "failedTasks": null, + "maxMemory": , + "usedMemory": , + "systemCPUUsed": null, + "systemLeftMemory": , + "nodeHealthy": "", + "msg": "", + "startTime": + }] + } +} +``` + + +## 编辑EMC实例 + + +**接口地址**:`/api/rest_j/v1/linkisManager/modifyEMInfo` + + +**请求方式**:`PUT` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

编辑或修改下编辑EMC管理下的实例

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|引擎标签|false|String|String| +|emStatus|实例状态,状态有以下枚举类型 ‘Healthy‘, ‘UnHealthy‘, ‘WARN‘, ’StockAvailable’, ‘StockUnavailable’|false|String|String| +|instance|引擎实例名称|false|String|String| +|labelKey|添加内容里面的标签,属于labels集合 内 map里的key|false|String|String| +|labels|引擎实例更新参数内容,集合存放的是map类型的|false|List|List| +|stringValue|添加内容里面的标签对于的值,属于labels集合 内 map里的value|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/linkisManager/modifyEMInfo", + "status": 0, + "message": "success", + "data": {} +} +``` + + +## 打开引擎日志 + + +**接口地址**:`/api/rest_j/v1/linkisManager/openEngineLog` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

打开引擎日志,默认打开stdout类型的引擎日志

+ +**请求示例**: +```javascript +{ + applicationName: "" + emInstance: "" + instance: "" + parameters: { + pageSize: , + fromLine: , + logType: "" + } +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|引擎标签|String|false|String| +|emInstance|实例名称|String|false|String| +|fromLine|来自线路|String|false|String| +|instance|引擎实例名称|String|false|String| +|logType|日志类型,默认stdout类型,属于parameters|String|false|String| +|pageSize|页面大小|String|false|String| +|parameters|分页信息|Map|false|Map| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/linkisManager/openEngineLog", + "status": 0, + "message": "OK", + "data": { + "result": { + "logPath": "", + "logs": [""], + "endLine": , + "rows": + }, + "isError": false, + "errorMsg": "" + } +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/engine-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/engine-management-api.md new file mode 100644 index 00000000000..405cebd174f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/engine-management-api.md @@ -0,0 +1,585 @@ +--- +title: 引擎管理 +sidebar_position: 2 +--- +** EngineRestfulApi 类 ** + + + + +## 创建引擎连接 + + +**接口地址**:`/api/rest_j/v1/linkisManager/createEngineConn` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

创建引擎连接

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 执行引擎连接操作 + + +**接口地址**:`/api/rest_j/v1/linkisManager/executeEngineConnOperation` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

执行引擎连接操作

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取引擎连接 + + +**接口地址**:`/api/rest_j/v1/linkisManager/getEngineConn` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

获取引擎连接

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## kill引擎连接 + + +**接口地址**:`/api/rest_j/v1/linkisManager/killEngineConn` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

kill引擎连接

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 所有节点状态 + + +**接口地址**:`/api/rest_j/v1/linkisManager/listAllNodeHealthyStatus` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/json` + + +**接口描述**:

所有节点状态

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|onlyEditable|onlyEditable|query|false|boolean| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/linkisManager/listAllNodeHealthyStatus", + "status": 0, + "message": "OK", + "data": { + "nodeStatus": [] + } +} +``` + + +## 列表引擎 + + +**接口地址**:`/api/rest_j/v1/linkisManager/listEMEngines` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

列表引擎

+ +**请求示例**: +```javascript +{ + em: { + serviceInstance: { + applicationName: "linkis-cg-engineconnmanager", + instance: "localhost110003:9102" + } + } +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|引擎标签名称,属于serviceInstance中的值|String|false|String| +|em|入参最外层|Map|false|Map| +|emInstance|引擎实例名称跟‘em’一个级别属于最外层|String|false|String| +|engineType|引擎类型跟‘em’一个级别属于最外层|String|false|String| +|instance|实例名称|String|false|String| +|nodeStatus|状态跟‘em’一个级别属于最外层,状态有以下枚举类型 ‘Healthy‘, ‘UnHealthy‘, ‘WARN‘, ’StockAvailable’, ‘StockUnavailable’|String|false|String| +|owner|创建者跟‘em’一个级别属于最外层|String|false|String| +|serviceInstance|入参属于‘’em|Map|false|Map| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/linkisManager/listEMEngines", + "status": 0, + "message": "OK", + "data": { + "engines": [] + } +} +``` + + +## 引擎用户集合 + + +**接口地址**:`/api/rest_j/v1/linkisManager/listUserEngines` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`application/json` + + +**接口描述**:

引擎用户集合

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 编辑引擎实例 + + +**接口地址**:`/api/rest_j/v1/linkisManager/modifyEngineInfo` + + +**请求方式**:`PUT` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

编辑引擎实例内容

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|引擎标签|false|String|String| +|emStatus|运行状态|false|String|String| +|instance|引擎实例名称|false|String|String| +|labelKey|添加内容里面的标签,属于labels集合 内 map里的key|false|String|String| +|labels|引擎实例更新参数内容,集合存放的是map类型的|false|List|List| +|stringValue|添加内容里面的标签对于的值,属于labels集合 内 map里的value|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## kill引擎 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/enginekill` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`application/json` + + +**接口描述**:

关闭引擎,可关闭一个也可关闭多个

+ + +**请求示例**: +```javascript + [ + { + engineInstance: "", + applicationName:"" + } + ] + +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|应用名称,最外层是个数组和engineInstance参数是一个级别|false|String|String| +|engineInstance|引擎实例名称,最外层是个数组和applicationName参数是一个级别|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/resource-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/resource-management-api.md new file mode 100644 index 00000000000..660b769e06f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/resource-management-api.md @@ -0,0 +1,612 @@ +--- +title: 资源管理 +sidebar_position: 1 +--- +** RMMonitorRest 类 ** + + + + +## 所有用户资源 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/allUserResource` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

所有用户资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|creator|query|false|string| +|engineType|engineType|query|false|string| +|page|page|query|false|integer(int32)| +|size|size|query|false|integer(int32)| +|username|username|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "total": 34, + "resources": [{ + "id": , + "username": "", + "creator": "", + "engineTypeWithVersion": "", + "resourceType": "", + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": + "instance": 0 + }, + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": 0, + "cores": 0, + "instance": 0 + }, + "expectedResource": null, + "leftResource": { + "memory": , + "cores": , + "instance": + }, + "createTime": , + "updateTime": , + "loadResourceStatus": "", + "queueResourceStatus": + }] + } +} +``` + + +## 应用列表 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/applicationlist` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取资源管理中的应用引擎列表清单

+ +**请求示例**: +```javascript +{ + userCreator: "" +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|userCreator|userCreator|query|true|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": , + "status": , + "message": "", + "data": { + "applications": [{ + "creator": "", + "applicationList": { + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": , + "instance": + }, + "engineInstances": [{ + "resource": { + "resourceType": "", + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": , + "instance": + }, + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": , + "cores": , + "instance": + }, + "expectedResource": null, + "leftResource": { + "memory": , + "cores": , + "instance": + } + }, + "engineType": "", + "owner": "", + "instance": "", + "creator": "", + "startTime": "", + "status": "", + "label": "" + }] + } + }] + } +} +``` + + +## 引擎类型 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/engineType` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

引擎类型

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 引擎管理器 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/engines` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

引擎管理器

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|false|object| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 队列管理器 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/queueresources` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

队列管理器

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|true|object| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 队列 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/queues` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

队列

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|false|object| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 重置资源 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/resetResource` + + +**请求方式**:`DELETE` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

重置资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|resourceId|query|false|integer(int32)| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|204|No Content| +|401|Unauthorized| +|403|Forbidden| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 资源信息 + + +**接口地址**:`/api/rest_j/v1/linkisManager/rm/userresources` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

查询资源列表清单及资源详细数据如使用百分比

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|false|object| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "userResources": [{ + "userCreator": "", + "engineTypes": [{ + "engineType": "", + "percent": "" + }], + "percent": "" + }] + } +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/_category_.json new file mode 100644 index 00000000000..59702fc1d1a --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "上下文服务", + "position": 3 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-history-service-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-history-service-api.md new file mode 100644 index 00000000000..2abed90e746 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-history-service-api.md @@ -0,0 +1,317 @@ +--- +title: 上下文历史记录服务 +sidebar_position: 14 +--- +** ContextHistoryRestfulApi 类 ** + + + +## 创建历史记录 + + +**接口地址**:`/api/rest_j/v1/contextservice/createHistory` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

创建历史记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextHistory|历史上下文|false|String|String| +|contextID|上下文id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取多个历史记录 + + +**接口地址**:`/api/rest_j/v1/contextservice/getHistories` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取多个历史记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文id|String|false|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取历史记录 + + +**接口地址**:`/api/rest_j/v1/contextservice/getHistory` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取历史记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文Id|false|String|String| +|source|上下文源|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除历史记录 + + +**接口地址**:`/api/rest_j/v1/contextservice/removeHistory` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除历史记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextHistory|历史上下文|false|String|String| +|contextID|上下文id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 搜索历史记录 + + +**接口地址**:`/api/rest_j/v1/contextservice/searchHistory` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

搜索历史记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文Id|false|String|String| +|keywords|关键词|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-listening-service-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-listening-service-api.md new file mode 100644 index 00000000000..aa8cd645fe1 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-listening-service-api.md @@ -0,0 +1,189 @@ +--- +title: 上下文监听服务 +sidebar_position: 16 +--- +** ContextListenerRestfulApi 类 ** + + +# 上下文监听服务 + + +## heartbeat + + +**接口地址**:`/api/rest_j/v1/contextservice/heartbeat` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## onBindIDListener + + +**接口地址**:`/api/rest_j/v1/contextservice/onBindIDListener` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## onBindKeyListener + + +**接口地址**:`/api/rest_j/v1/contextservice/onBindKeyListener` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**: + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-logging-service-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-logging-service-api.md new file mode 100644 index 00000000000..ef207bc1cfd --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-logging-service-api.md @@ -0,0 +1,380 @@ +--- +title: 上下文记录服务 +sidebar_position: 17 +--- +** ContextIDRestfulApi 类 ** + + +## 创建文本记录 + + +**接口地址**:`/api/rest_j/v1/contextservice/createContextID` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

创建文本记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文Id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取文本ID + + +**接口地址**:`/api/rest_j/v1/contextservice/getContextID` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取文本ID

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextId|上下文Id|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除文本ID + + +**接口地址**:`/api/rest_j/v1/contextservice/removeContextID` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除文本ID

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextId|上下文Id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 重置文本ID + + +**接口地址**:`/api/rest_j/v1/contextservice/resetContextID` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

重置文本ID

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextId|上下文Id|String|false|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 搜索文本Id执行时间 + + +**接口地址**:`/api/rest_j/v1/contextservice/searchContextIDByTime` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

搜索文本Id执行时间

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessTimeEnd|访问结束时间|query|false|string| +|accessTimeStart|访问开始时间|query|false|string| +|createTimeEnd|创建结束时间|query|false|string| +|createTimeStart|创建时间|query|false|string| +|pageNow|页码|query|false|string| +|pageSize|页面大小|query|false|string| +|updateTimeEnd|更新结束时间|query|false|string| +|updateTimeStart|更新时间|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 修改文本ID + + +**接口地址**:`/api/rest_j/v1/contextservice/updateContextID` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

修改文本ID

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextId|上下文Id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-service-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-service-api.md new file mode 100644 index 00000000000..9ee466ecaef --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-cs-api/context-service-api.md @@ -0,0 +1,692 @@ +--- +title: 上下文API +sidebar_position: 15 +--- +** ContextRestfulApi 类 ** + + + +## 通过ID清除所以上下文 + + +**接口地址**:`/api/rest_j/v1/contextservice/clearAllContextByID` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过ID清除所以上下文

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|idList|上下文id集合|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 通过时间清除所以上下文 + + +**接口地址**:`/api/rest_j/v1/contextservice/clearAllContextByTime` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过时间清除所以上下文

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessTimeEnd|访问时间结束|false|String|String| +|accessTimeStart|访问时间开始|false|String|String| +|createTimeEnd|创建时间结束|false|String|String| +|createTimeStart|创建时间|false|String|String| +|updateTimeStart|更新开始时间|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取上下文内容 + + +**接口地址**:`/api/rest_j/v1/contextservice/getContextValue` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取上下文内容

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除所有value + + +**接口地址**:`/api/rest_j/v1/contextservice/removeAllValue` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除所有value

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 通过value前缀删除所有值 + + +**接口地址**:`/api/rest_j/v1/contextservice/removeAllValueByKeyPrefix` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过前缀和上下文类型删除所有值

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|contextID|false|String|String| +|keyPrefix|keyPrefix|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 通过key前缀和上下文类型删除所有值 + + +**接口地址**:`/api/rest_j/v1/contextservice/removeAllValueByKeyPrefixAndContextType` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过前缀和上下文类型删除所有值

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextKeyType|contextKeyType|false|String|String| +|keyPrefix|keyPrefix|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除value + + +**接口地址**:`/api/rest_j/v1/contextservice/removeValue` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除value

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 重置value + + +**接口地址**:`/api/rest_j/v1/contextservice/resetValue` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

重置value

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 搜索上下文内容 + + +**接口地址**:`/api/rest_j/v1/contextservice/searchContextValue` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

搜索上下文内容

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|condition|condition|false|String|String| +|contextID|上下文id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 设置value + + +**接口地址**:`/api/rest_j/v1/contextservice/setValue` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

设置value

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文id|false|String|String| +|contextKeyValue|contextKeyValue|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 设置key + + +**接口地址**:`/api/rest_j/v1/contextservice/setValueByKey` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

给value设置key

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextID|上下文id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/_category_.json new file mode 100644 index 00000000000..f6d702cc1dc --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "公共服务", + "position": 1 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bm-operation-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bm-operation-management-api.md new file mode 100644 index 00000000000..7e2ec8ce12d --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bm-operation-management-api.md @@ -0,0 +1,449 @@ +--- +title: BM项目操作管理 +sidebar_position: 15 +--- +** BmlProjectRestful 类 ** + + + + +## 附件资源项目 + + +**接口地址**:`/api/rest_j/v1/bml/attachResourceAndProject` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

附件资源项目

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|projectName|项目名称|false|String|String| +|resourceId|资源名称|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 创建Bml项目 + + +**接口地址**:`/api/rest_j/v1/bml/createBmlProject` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

创建Bml项目

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| +|accessUsers|访问用户|false|String|String| +|editUsers|编辑用户|false|String|String| +|projectName|项目名称|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 下载共享资源 + + +**接口地址**:`/api/rest_j/v1/bml/downloadShareResource` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

下载共享资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|资源ID|query|false|string| +|version|版本|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 项目信息 + + +**接口地址**:`/api/rest_j/v1/bml/getProjectInfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取项目信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|projectName|项目名称|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 更新项目用户 + + +**接口地址**:`/api/rest_j/v1/bml/updateProjectUsers` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

更新项目用户

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| +|accessUsers|访问用户|false|String|String| +|editUsers|编辑用户|false|String|String| +|projectName|项目名称|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 更新共享资源 + + +**接口地址**:`/api/rest_j/v1/bml/updateShareResource` + + +**请求方式**:`POST` + + +**请求数据类型**:`multipart/form-data` + + +**响应数据类型**:`*/*` + + +**接口描述**:

更新共享资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|file|文件|formData|false|ref| +|resourceId|资源ID|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 上载共享资源 + + +**接口地址**:`/api/rest_j/v1/bml/uploadShareResource` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

上载共享资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|expireTime|失效时间|query|false|string| +|expireType|失效类型|query|false|string| +|file|文件集合|formData|false|ref| +|isExpire|是否失效|query|false|string| +|maxVersion|mav版本|query|false|ref| +|projectName|项目名称|query|false|string| +|resourceHeader|资源标头|query|false|string| +|system|系统|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bml-resource-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bml-resource-management-api.md new file mode 100644 index 00000000000..7e857c0253b --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bml-resource-management-api.md @@ -0,0 +1,812 @@ +--- +title: BML资源管理 +sidebar_position: 14 +--- +** BmlRestfulApi 类 ** + + + +## 更新owner + + +**接口地址**:`/api/rest_j/v1/bml/changeOwner` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

更新owner

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|newOwner|旧Owner|false|String|String| +|oldOwner|新Owner|false|String|String| +|resourceId|资源Id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 复制资源到其他用户 + + +**接口地址**:`/api/rest_j/v1/bml/copyResourceToAnotherUser` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

复制资源到指定用户

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|anotherUser|指定用户|false|String|String| +|resourceId|资源Id|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除资源 + + +**接口地址**:`/api/rest_j/v1/bml/deleteResource` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除版本

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|资源Id|true|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除多个资源 + + +**接口地址**:`/api/rest_j/v1/bml/deleteResources` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除多个资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceIds|资源Id集合,删除多个资源|true|List|List| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除版本 + + +**接口地址**:`/api/rest_j/v1/bml/deleteVersion` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除版本

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|资源Id|true|String|String| +|version|版本|true|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 下载资源 + + +**接口地址**:`/api/rest_j/v1/bml/download` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

通过resourceId 和 version两个参数获取下载对应的资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|资源Id|query|false|string| +|version|资源版本,如果不指定,默认为最新|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取Basic + + +**接口地址**:`/api/rest_j/v1/bml/getBasic` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取Basic

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|资源Id|query|true|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取资源信息 + + +**接口地址**:`/api/rest_j/v1/bml/getResourceInfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取资源信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|资源Id|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取资源信息 + + +**接口地址**:`/api/rest_j/v1/bml/getResources` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取资源信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|页码|query|false|string| +|pageSize|页面大小|query|false|string| +|system|系统|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取版本信息 + + +**接口地址**:`/api/rest_j/v1/bml/getVersions` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取bml版本信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|页码|query|false|string| +|pageSize|页面大小|query|false|string| +|resourceId|资源ID|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 回滚版本 + + +**接口地址**:`/api/rest_j/v1/bml/rollbackVersion` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

回滚版本

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|资源Id|false|String|String| +|version|回滚版本|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 更新资源 + + +**接口地址**:`/api/rest_j/v1/bml/updateVersion` + + +**请求方式**:`POST` + + +**请求数据类型**:`multipart/form-data` + + +**响应数据类型**:`*/*` + + +**接口描述**:

用户通过http的方式更新资源文件

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|file|file文件|formData|true|ref| +|resourceId|用户希望更新资源的resourceId|query|true|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 上传资源 + + +**接口地址**:`/api/rest_j/v1/bml/upload` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

上传资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|file|file|formData|true|array|file| +|expireTime|expireTime|query|false|string| +|expireType|expireType|query|false|string| +|isExpire|isExpire|query|false|string| +|maxVersion|maxVersion|query|false|integer(int32)| +|resourceHeader|resourceHeader|query|false|string| +|system|system|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bmlfs-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bmlfs-management-api.md new file mode 100644 index 00000000000..46172201166 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bmlfs-management-api.md @@ -0,0 +1,201 @@ +--- +title: BMLFS管理 +sidebar_position: 13 +--- +** BMLFsRestfulApi 类 ** + + + +## 打开ScriptFromBML + + +**接口地址**:`/api/rest_j/v1/filesystem/openScriptFromBML` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

openScriptFromBML

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|fileName|文件名称|query|true|string| +|creator|创建者|query|false|string| +|projectName|项目名称|query|false|string| +|resourceId|资源Id|query|false|string| +|version|版本|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 打开来自BML的script + + +**接口地址**:`/api/rest_j/v1/filesystem/product/openScriptFromBML` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

/product/openScriptFromBML

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|fileName|文件名称|query|true|string| +|creator|创建者|query|false|string| +|resourceId|资源Id|query|false|string| +|version|版本|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 保存来自BML的script + + +**接口地址**:`/api/rest_j/v1/filesystem/saveScriptToBML` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

保存来自BML的script

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|创建者|true|String|String| +|fileName|文件名称|true|String|String| +|metadata|元数据|true|String|String| +|projectName|项目名称|true|String|String| +|resourceId|资源ID|true|String|String| +|scriptContent|内容|true|String|String| +|SaveScriptToBML|json|body|true|SaveScriptToBML|SaveScriptToBML| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/currency-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/currency-api.md new file mode 100644 index 00000000000..799e15cf3f5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/currency-api.md @@ -0,0 +1,62 @@ +--- +title: 通用API +sidebar_position: 12 +--- +** CommonRestfulApi 类 ** + +## 下线某个服务 + + +**接口地址**:`/api/rest_j/v1/offline` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

下线某个服务

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/data-source-manager-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/data-source-manager-api.md new file mode 100644 index 00000000000..a59787377f8 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/data-source-manager-api.md @@ -0,0 +1,1500 @@ +--- +title: 数据源API +sidebar_position: 11 +--- + + +** DataSourceAdminRestfulApi 类 ** + +## queryDataSourceEnv +**接口地址**:`/api/rest_j/v1/data-source-manager/env` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: 查询数据源配置的集群环境信息列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|currentPage|query|false|integer(int32)| +|name|name|query|false|string| +|pageSize|pageSize|query|false|integer(int32)| +|typeId|typeId|query|false|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/env", + "status": 0, + "message": "OK", + "data": { + "queryList": [ + { + "id": 2, + "envName": "测试环境UAT", + "envDesc": "测试环境UAT", + "dataSourceTypeId": 4, + "connectParams": { + "hadoopConf": { + "hive.metastore.execute.setugi": "true" + }, + "uris": "thrift://localhost:9083" + }, + "createTime": 1647249913000, + "modifyTime": 1647249913000 + }, + { + "id": 3, + "envName": "开源测试环境", + "envDesc": "开源测试环境", + "dataSourceTypeId": 4, + "connectParams": { + "keytab": "4dd408ad-a2f9-4501-83b3-139290977ca2", + "uris": "thrift://bdpclustername:9083", + "principle": "hadoop@WEBANK.COM" + }, + "createTime": 1647249913000, + "modifyTime": 1647249913000 + } + ] + } +} +``` +## getAllEnvListByDataSourceType +**接口地址**:`/api/rest_j/v1/data-source-manager/env-list/all/type/{typeId}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: 查询某种数据源配置的集群信息列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|typeId|typeId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/env-list/all/type/4", + "status": 0, + "message": "OK", + "data": { + "envList": [ + { + "id": 1, + "envName": "测试环境SIT" + }, + { + "id": 2, + "envName": "测试环境UAT" + }, + { + "id": 3, + "envName": "开源测试环境" + } + ] + } +} +``` +## insertJsonEnv +**接口地址**:`/api/rest_j/v1/data-source-manager/env/json` + +**请求方式**:`POST` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求示例**: +```javascript +{ + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" +} +``` + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceEnv|dataSourceEnv|body|true|DataSourceEnv|DataSourceEnv| +|  connectParams||false|object| +|  createTime||false|string(date-time)| +|  createUser||false|string| +|  dataSourceType||false|DataSourceType|DataSourceType| +|    classifier||false|string| +|    description||false|string| +|    icon||false|string| +|    id||false|string| +|    layers||false|integer| +|    name||false|string| +|    option||false|string| +|  dataSourceTypeId||false|integer(int64)| +|  envDesc||false|string| +|  envName||false|string| +|  id||false|integer(int64)| +|  modifyTime||false|string(date-time)| +|  modifyUser||false|string| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` +## getEnvEntityById +**接口地址**:`/api/rest_j/v1/data-source-manager/env/{envId}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:查询某环境详细信息 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|envId|envId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/env/1", + "status": 0, + "message": "OK", + "data": { + "env": { + "id": 1, + "envName": "测试环境SIT", + "envDesc": "测试环境SIT", + "connectParams": { + "hadoopConf": { + "hive.metastore.execute.setugi": "true" + }, + "uris": "thrift://localhost:9083" + }, + "createTime": 1647249913000, + "modifyTime": 1647249913000 + } + } +} +``` +## removeEnvEntity +**接口地址**:`/api/rest_j/v1/data-source-manager/env/{envId}` + +**请求方式**:`DELETE` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|envId|envId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` +## updateJsonEnv +**接口地址**:`/api/rest_j/v1/data-source-manager/env/{envId}/json` + +**请求方式**:`PUT` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求示例**: +```javascript +{ + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" +} +``` + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceEnv|dataSourceEnv|body|true|DataSourceEnv|DataSourceEnv| +|  connectParams||false|object| +|  createTime||false|string(date-time)| +|  createUser||false|string| +|  dataSourceType||false|DataSourceType|DataSourceType| +|    classifier||false|string| +|    description||false|string| +|    icon||false|string| +|    id||false|string| +|    layers||false|integer| +|    name||false|string| +|    option||false|string| +|  dataSourceTypeId||false|integer(int64)| +|  envDesc||false|string| +|  envName||false|string| +|  id||false|integer(int64)| +|  modifyTime||false|string(date-time)| +|  modifyUser||false|string| +|envId|envId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + +------ +** DataSourceCoreRestfulApi类** + +## queryDataSource +**接口地址**:`/api/rest_j/v1/data-source-manager/info` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:查询数据源具体信息 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|currentPage|query|false|integer(int32)| +|identifies|identifies|query|false|string| +|name|name|query|false|string| +|pageSize|pageSize|query|false|integer(int32)| +|system|system|query|false|string| +|typeId|typeId|query|false|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/info", + "status": 0, + "message": "OK", + "data": { + "totalPage": 12, + "queryList": [ + { + "id": 11, + "dataSourceName": "test1256", + "dataSourceTypeId": 4, + "createSystem": "Linkis", + "createTime": 1647909291000, + "createUser": "hadoop", + "versionId": 1, + "expire": false, + "dataSourceType": { + "id": "11", + "name": "hive", + "layers": 0 + } + }, + { + "id": 10, + "dataSourceName": "hive-test", + "dataSourceDesc": "hive test", + "dataSourceTypeId": 4, + "createSystem": "Linkis", + "createTime": 1647862455000, + "modifyTime": 1647930476000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 3, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "id": "10", + "name": "hive", + "layers": 0 + } + } + + ] + } +} +``` +## removeDataSource +**接口地址**:`/api/rest_j/v1/data-source-manager/info/delete/{dataSourceId}` + +**请求方式**:`DELETE` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:删除某条数据源数据 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/info/delete/1", + "status": 0, + "message": "OK", + "data": { + "removeId": 1 + } +} +``` +## insertJsonInfo +**接口地址**:`/api/rest_j/v1/data-source-manager/info/json` + +**请求方式**:`POST` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求示例**: +```javascript +{ + "connectParams": {}, + "createIdentify": "", + "createSystem": "", + "createTime": "", + "createUser": "", + "dataSourceDesc": "", + "dataSourceEnv": { + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" + }, + "dataSourceEnvId": 0, + "dataSourceName": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "expire": true, + "id": 0, + "labels": "", + "modifyTime": "", + "modifyUser": "", + "publishedVersionId": 0, + "versionId": 0, + "versions": [ + { + "comment": "", + "connectParams": {}, + "createTime": "", + "createUser": "", + "datasourceId": 0, + "parameter": "", + "versionId": 0 + } + ] +} +``` + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSource|dataSource|body|true|DataSource|DataSource| +|  connectParams||false|object| +|  createIdentify||false|string| +|  createSystem||false|string| +|  createTime||false|string(date-time)| +|  createUser||false|string| +|  dataSourceDesc||false|string| +|  dataSourceEnv||false|DataSourceEnv|DataSourceEnv| +|    connectParams||false|object| +|    createTime||false|string| +|    createUser||false|string| +|    dataSourceType||false|DataSourceType|DataSourceType| +|      classifier||false|string| +|      description||false|string| +|      icon||false|string| +|      id||false|string| +|      layers||false|integer| +|      name||false|string| +|      option||false|string| +|    dataSourceTypeId||false|integer| +|    envDesc||false|string| +|    envName||false|string| +|    id||false|integer| +|    modifyTime||false|string| +|    modifyUser||false|string| +|  dataSourceEnvId||false|integer(int64)| +|  dataSourceName||false|string| +|  dataSourceType||false|DataSourceType|DataSourceType| +|    classifier||false|string| +|    description||false|string| +|    icon||false|string| +|    id||false|string| +|    layers||false|integer| +|    name||false|string| +|    option||false|string| +|  dataSourceTypeId||false|integer(int64)| +|  expire||false|boolean| +|  id||false|integer(int64)| +|  labels||false|string| +|  modifyTime||false|string(date-time)| +|  modifyUser||false|string| +|  publishedVersionId||false|integer(int64)| +|  versionId||false|integer(int64)| +|  versions||false|array|DatasourceVersion| +|    comment||false|string| +|    connectParams||false|object| +|    createTime||false|string| +|    createUser||false|string| +|    datasourceId||false|integer| +|    parameter||false|string| +|    versionId||false|integer| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` +## getInfoByDataSourceName +**接口地址**:`/api/rest_j/v1/data-source-manager/info/name/{dataSourceName}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:通过datsourceName查询数据源信息 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/info/name/hive-test", + "status": 0, + "message": "OK", + "data": { + "info": { + "id": 10, + "dataSourceName": "hive-test", + "dataSourceDesc": "hive test", + "dataSourceTypeId": 4, + "createSystem": "Linkis", + "connectParams": { + "envId": "3" + }, + "createTime": 1647862455000, + "modifyTime": 1647930476000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 3, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "name": "hive", + "layers": 0 + } + } + } +} +``` +## getInfoByDataSourceId +**接口地址**:`/api/rest_j/v1/data-source-manager/info/{dataSourceId}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/info/1", + "status": 0, + "message": "OK", + "data": { + "info": { + "id": 1, + "dataSourceName": "开源共建环境", + "dataSourceDesc": "123", + "dataSourceTypeId": 1, + "createSystem": "Linkis", + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + }, + "createTime": 1647258360000, + "modifyTime": 1647437692000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 1, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "name": "mysql", + "icon": "https://uat.dongcha.weoa.com/static/img/logo.770c1525.png", + "layers": 0 + } + } + } +} +``` +## expireDataSource +**接口地址**:`/api/rest_j/v1/data-source-manager/info/{dataSourceId}/expire` + +**请求方式**:`PUT` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/info/1/expire", + "status": 0, + "message": "OK", + "data": { + "expireId": 1 + } +} +``` +## updateDataSourceInJson +**接口地址**:`/api/rest_j/v1/data-source-manager/info/{dataSourceId}/json` + +**请求方式**:`PUT` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求示例**: +```javascript +{ + "connectParams": {}, + "createIdentify": "", + "createSystem": "", + "createTime": "", + "createUser": "", + "dataSourceDesc": "", + "dataSourceEnv": { + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" + }, + "dataSourceEnvId": 0, + "dataSourceName": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "expire": true, + "id": 0, + "labels": "", + "modifyTime": "", + "modifyUser": "", + "publishedVersionId": 0, + "versionId": 0, + "versions": [ + { + "comment": "", + "connectParams": {}, + "createTime": "", + "createUser": "", + "datasourceId": 0, + "parameter": "", + "versionId": 0 + } + ] +} +``` + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSource|dataSource|body|true|DataSource|DataSource| +|  connectParams||false|object| +|  createIdentify||false|string| +|  createSystem||false|string| +|  createTime||false|string(date-time)| +|  createUser||false|string| +|  dataSourceDesc||false|string| +|  dataSourceEnv||false|DataSourceEnv|DataSourceEnv| +|    connectParams||false|object| +|    createTime||false|string| +|    createUser||false|string| +|    dataSourceType||false|DataSourceType|DataSourceType| +|      classifier||false|string| +|      description||false|string| +|      icon||false|string| +|      id||false|string| +|      layers||false|integer| +|      name||false|string| +|      option||false|string| +|    dataSourceTypeId||false|integer| +|    envDesc||false|string| +|    envName||false|string| +|    id||false|integer| +|    modifyTime||false|string| +|    modifyUser||false|string| +|  dataSourceEnvId||false|integer(int64)| +|  dataSourceName||false|string| +|  dataSourceType||false|DataSourceType|DataSourceType| +|    classifier||false|string| +|    description||false|string| +|    icon||false|string| +|    id||false|string| +|    layers||false|integer| +|    name||false|string| +|    option||false|string| +|  dataSourceTypeId||false|integer(int64)| +|  expire||false|boolean| +|  id||false|integer(int64)| +|  labels||false|string| +|  modifyTime||false|string(date-time)| +|  modifyUser||false|string| +|  publishedVersionId||false|integer(int64)| +|  versionId||false|integer(int64)| +|  versions||false|array|DatasourceVersion| +|    comment||false|string| +|    connectParams||false|object| +|    createTime||false|string| +|    createUser||false|string| +|    datasourceId||false|integer| +|    parameter||false|string| +|    versionId||false|integer| +|dataSourceId|dataSourceId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` +## getInfoByDataSourceIdAndVersion +**接口地址**:`/api/rest_j/v1/data-source-manager/info/{dataSourceId}/{version}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| +|version|version|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/info/1/1", + "status": 0, + "message": "OK", + "data": { + "info": { + "id": 1, + "dataSourceName": "开源共建环境", + "dataSourceDesc": "123", + "dataSourceTypeId": 1, + "createSystem": "Linkis", + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + }, + "createTime": 1647258360000, + "modifyTime": 1647437692000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 1, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "name": "mysql", + "icon": "https://uat.dongcha.weoa.com/static/img/logo.770c1525.png", + "layers": 0 + } + } + } +} +``` +## getKeyDefinitionsByType +**接口地址**:`/api/rest_j/v1/data-source-manager/key-define/type/{typeId}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|typeId|typeId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/key-define/type/4", + "status": 0, + "message": "OK", + "data": { + "keyDefine": [ + { + "id": 6, + "key": "envId", + "description": "集群环境", + "name": "集群环境", + "valueType": "SELECT", + "require": true, + "dataSource": "/data-source-manager/env-list/all/type/4" + }, + { + "id": 7, + "key": "keyTabFile", + "description": "KeyTab文件", + "name": "keyTab文件", + "valueType": "FILE", + "require": false, + "dataSource": "http://127.0.0.1:9001/api/rest_j/v1/bml/upload" + } + ] + } +} +``` +## getConnectParams +**接口地址**:`/api/rest_j/v1/data-source-manager/name/{dataSourceName}/connect-params` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/name/linkis_test256/connect-params", + "status": 0, + "message": "OK", + "data": { + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + } + } +} +``` +## insertJsonParameter +**接口地址**:`/api/rest_j/v1/data-source-manager/parameter/{dataSourceId}/json` + +**请求方式**:`POST` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| +|params|params|body|true|object| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` +## publishByDataSourceId +**接口地址**:`/api/rest_j/v1/data-source-manager/publish/{dataSourceId}/{versionId}` + +**请求方式**:`POST` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| +|versionId|versionId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/publish/3/2", + "status": 0, + "message": "OK", + "data": {} +} +``` +## getAllDataSourceTypes +**接口地址**:`/api/rest_j/v1/data-source-manager/type/all` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: +暂无 +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/type/all", + "status": 0, + "message": "OK", + "data": { + "typeList": [ + { + "id": "1", + "name": "mysql", + "description": "mysql数据库", + "option": "mysql数据库", + "classifier": "关系型数据库", + "icon": "https://uat.dongcha.weoa.com/static/img/logo.770c1525.png", + "layers": 3 + }, + + { + "id": "4", + "name": "hive", + "description": "hive数据库", + "option": "hive", + "classifier": "大数据存储", + "layers": 3 + } + + ] + } +} +``` +## getConnectParams +**接口地址**:`/api/rest_j/v1/data-source-manager/{dataSourceId}/connect-params` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/3/connect-params", + "status": 0, + "message": "OK", + "data": { + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + } + } +} +``` +## getVersionList +**接口地址**:`/api/rest_j/v1/data-source-manager/{dataSourceId}/versions` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/1/versions", + "status": 0, + "message": "OK", + "data": { + "versions": [ + { + "versionId": 1, + "datasourceId": 1, + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + }, + "parameter": "{\"host\":\"127.0.0.1\",\"port\":\"9600\",\"username\":\"linkis\",\"password\":\"rO0ABXQACUFiY2RAMjAyMg==\"}", + "comment": "初始化版本", + "createUser": "hadoop" + } + ] + } +} +``` +## connectDataSource +**接口地址**:`/api/rest_j/v1/data-source-manager/{dataSourceId}/{version}/op/connect` + +**请求方式**:`PUT` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)| +|version|version|path|true|integer(int64)| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "method": "/api/data-source-manager/1/1/op/connect", + "status": 0, + "message": "OK", + "data": { + "ok": true + } +} +``` + +----- +** DataSourceOperateRestfulApi类 ** + +## connect +**接口地址**:`/api/rest_j/v1/data-source-manager/op/connect/json` + +**请求方式**:`POST` + +**请求数据类型**:`application/json` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求示例**: +```javascript +{ + "connectParams": {}, + "createIdentify": "", + "createSystem": "", + "createTime": "", + "createUser": "", + "dataSourceDesc": "", + "dataSourceEnv": { + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" + }, + "dataSourceEnvId": 0, + "dataSourceName": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "expire": true, + "id": 0, + "labels": "", + "modifyTime": "", + "modifyUser": "", + "publishedVersionId": 0, + "versionId": 0, + "versions": [ + { + "comment": "", + "connectParams": {}, + "createTime": "", + "createUser": "", + "datasourceId": 0, + "parameter": "", + "versionId": 0 + } + ] +} +``` + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSource|dataSource|body|true|DataSource|DataSource| +|  connectParams||false|object| +|  createIdentify||false|string| +|  createSystem||false|string| +|  createTime||false|string(date-time)| +|  createUser||false|string| +|  dataSourceDesc||false|string| +|  dataSourceEnv||false|DataSourceEnv|DataSourceEnv| +|    connectParams||false|object| +|    createTime||false|string| +|    createUser||false|string| +|    dataSourceType||false|DataSourceType|DataSourceType| +|      classifier||false|string| +|      description||false|string| +|      icon||false|string| +|      id||false|string| +|      layers||false|integer| +|      name||false|string| +|      option||false|string| +|    dataSourceTypeId||false|integer| +|    envDesc||false|string| +|    envName||false|string| +|    id||false|integer| +|    modifyTime||false|string| +|    modifyUser||false|string| +|  dataSourceEnvId||false|integer(int64)| +|  dataSourceName||false|string| +|  dataSourceType||false|DataSourceType|DataSourceType| +|    classifier||false|string| +|    description||false|string| +|    icon||false|string| +|    id||false|string| +|    layers||false|integer| +|    name||false|string| +|    option||false|string| +|  dataSourceTypeId||false|integer(int64)| +|  expire||false|boolean| +|  id||false|integer(int64)| +|  labels||false|string| +|  modifyTime||false|string(date-time)| +|  modifyUser||false|string| +|  publishedVersionId||false|integer(int64)| +|  versionId||false|integer(int64)| +|  versions||false|array|DatasourceVersion| +|    comment||false|string| +|    connectParams||false|object| +|    createTime||false|string| +|    createUser||false|string| +|    datasourceId||false|integer| +|    parameter||false|string| +|    versionId||false|integer| + +**响应参数**: + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|object| +|message|string| +|method|string| +|status|integer(int32)|integer(int32)| + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/file-system-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/file-system-api.md new file mode 100644 index 00000000000..34e3a4b71e8 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/file-system-api.md @@ -0,0 +1,1041 @@ +--- +title: 文件系统 +sidebar_position: 10 +--- +** FsRestfulApi 类 ** + + + + + +## 创建新的Dir + + +**接口地址**:`/api/rest_j/v1/filesystem/createNewDir` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

创建新的Dir

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|路径|true|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 创建新的文件 + + +**接口地址**:`/api/rest_j/v1/filesystem/createNewFile` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

创建新的文件

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|路径|true|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除dir文件或者文件 + + +**接口地址**:`/api/rest_j/v1/filesystem/deleteDirOrFile` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除dir文件或者文件

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|地址|true|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 下载 + + +**接口地址**:`/api/rest_j/v1/filesystem/download` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

下载

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|charset|字符集|true|String|String| +|path|地址|true|String|String| +|json|json|body|true|| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 文件信息 + + +**接口地址**:`/api/rest_j/v1/filesystem/fileInfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

文件信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|地址|query|true|string| +|pageSize|页面大小|query|false|ref| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## formate + + +**接口地址**:`/api/rest_j/v1/filesystem/formate` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

resultsets转换成Excel

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|encoding|编码|query|true|string| +|escapeQuotes|escapeQuotes|query|true|string| +|fieldDelimiter|字段分隔符|query|true|string| +|hasHeader|哈希值|query|true|boolean| +|quote|引用|query|true|string| +|path|地址|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 函数列表 + + +**接口地址**:`/api/rest_j/v1/filesystem/getDirFileTrees` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取udf函数列表

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|请求路径|query|true|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/filesystem/getDirFileTrees", + "status": 0, + "message": "OK", + "data": { + "dirFileTrees": { + "name": "", + "path": "", + "properties": null, + "children": [{ + "name": "", + "path": "", + "properties": { + "size": "", + "modifytime": "" + }, + "children": , + "isLeaf": , + "parentPath": "" + }], + "isLeaf": , + "parentPath": + } + } +} +``` + + +## 根路径 + + +**接口地址**:`/api/rest_j/v1/filesystem/getUserRootPath` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取根路径

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|pathType|文件类型|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 是否存在 + + +**接口地址**:`/api/rest_j/v1/filesystem/isExist` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

是否存在

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|地址|query|true|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 打开文件 + + +**接口地址**:`/api/rest_j/v1/filesystem/openFile` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

打开文件

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|地址|query|true|string| +|charset|字符集|query|false|string| +|page|页码|query|false|ref| +|pageSize|页面大小|query|false|ref| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/filesystem/openFile", + "status": 0, + "message": "OK", + "data": { + "metadata": [{ + "columnName": "_c0", + "comment": "NULL", + "dataType": "" + }], + "totalPage": , + "totalLine": , + "page": , + "type": "", + "fileContent": [ + [""] + ] + } +} +``` + + +## 打开日志记录 + + +**接口地址**:`/api/rest_j/v1/filesystem/openLog` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

打开日志记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|地址|query|false|string| +|proxyUser|代理用户|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/filesystem/openLog", + "status": 0, + "message": "OK", + "data": { + "log": ["", ""] + } +} +``` + + +## 重新命名 + + +**接口地址**:`/api/rest_j/v1/filesystem/rename` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

重新给文件命名

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|newDest|新名称|false|String|String| +|oldDest|旧名称|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 结果集转换成Excel + + +**接口地址**:`/api/rest_j/v1/filesystem/resultsetToExcel` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

结果集转换成Excel

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|autoFormat|是否自动|query|false|boolean| +|charset|结果集|query|false|string| +|csvSeperator|csv分隔栏|query|false|string| +|limit|限度|query|false|ref| +|nullValue|空值|query|false|string| +|outputFileName|输出文件名称|query|false|string| +|outputFileType|输出文件类型|query|false|string| +|path|地址|query|false|string| +|quoteRetouchEnable|是否引用修饰|query|false|boolean| +|sheetName|sheet名称|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## resultsets转换成Excel + + +**接口地址**:`/api/rest_j/v1/filesystem/resultsetsToExcel` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

resultsets转换成Excel

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|autoFormat|是否自动|query|true|boolean| +|limit|限度|query|true|ref| +|nullValue|空值|query|true|string| +|outputFileName|输出文件名称|query|true|string| +|path|地址|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 保存脚本 + + +**接口地址**:`/api/rest_j/v1/filesystem/saveScript` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

保存脚本

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|地址|true|String|String| +|SaveScript|json|body|true|SaveScript|SaveScript| +|charset|字符集|false|String|String| +|params|页面大小|false|Object|Object| +|scriptContent|页码|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 上传 + + +**接口地址**:`/api/rest_j/v1/filesystem/upload` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

上传文件,可传多个文件

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|file|文件|formData|false|ref| +|path|地址|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/global-variable-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/global-variable-api.md new file mode 100644 index 00000000000..00a153ce779 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/global-variable-api.md @@ -0,0 +1,137 @@ +--- +title: 添加全局变量 +sidebar_position: 8 +--- +** VariableRestfulApi 类 ** + + +## 全局变量列表 + + +**接口地址**:`/api/rest_j/v1/variable/listGlobalVariable` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取全局变量清单

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object|| +|message|描述|string|| +|method|请求url|string|| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 添加全局变量 + + +**接口地址**:`/api/rest_j/v1/variable/saveGlobalVariable` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

添加全局变量

+ +**请求示例**: +```javascript +{ + globalVariables: [{ + keyID: , + key: "", + valueID: , + value: "" + }] +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|globalVariables|新增参数数据一对多key:globalVariables,value:List||Map|true|Map| +|key|参数名称,属于globalVariables||String|true|String| +|value|变量值,跟key属于键值对 属于被globalVariables包含||List|true|List| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object|| +|message|描述|string|| +|method|请求url|string|| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/variable/saveGlobalVariable", + "status": 0, + "message": "OK", + "data": {} +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/homepage-function-interface-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/homepage-function-interface-api.md new file mode 100644 index 00000000000..eac4f43bded --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/homepage-function-interface-api.md @@ -0,0 +1,327 @@ +--- +title: 管理台首页API +sidebar_position: 7 +--- +** QueryRestfulApi 类 ** + + +## 管理员验证 + + +**接口地址**:`/api/rest_j/v1/jobhistory/governanceStationAdmin` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

用来验证是否为管理员,如果是则返回true不是则false

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + data: {solution: null, admin: true} + message: "OK" + method: "/api/jobhistory/governanceStationAdmin" + status: 0 +} +``` + + +## 全局历史 + + +**接口地址**:`/api/rest_j/v1/jobhistory/list` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

根据条件获取全局历史数据列表默认获取全部

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|创建者|query|false|string| +|endDate|结束时间|query|false|integer(int64)| +|executeApplicationName|操作人|query|false|string| +|isAdminView|是否为管理员模式或者普通模式|query|false|boolean| +|pageSize|页面数量|query|false|ref| +|proxyUser|代理用户|query|false|string| +|startDate|开始时间|query|false|integer(int64)| +|status|结束时间|query|false|string| +|taskID|ID|query|false|integer(int64)| +|tpageNow|页码|query|false|ref| +|pageNow|pageNow|query|false|integer(int32)| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + { + "method": "/api/jobhistory/list", + "status": 0, + "message": "OK", + "data": { + "solution": null, + "totalPage": 90, + "tasks": [{ + "taskID": , + "instance": ", + "execId": "", + "umUser": "", + "engineInstance": null, + "executionCode": "", + "progress": "", + "logPath": "", + "resultLocation": "", + "status": "", + "createdTime": , + "updatedTime": , + "engineType": "", + "errCode": 0, + "errDesc": "", + "executeApplicationName": "", + "requestApplicationName": "", + "runType": "datachecker", + "paramsJson": "", + "costTime": 1000, + "strongerExecId": "", + "sourceJson": "", + "sourceTailor": "", + "engineStartTime": null, + "labels": [], + "canRetry": , + "subJobs": + }] + } +} +} +``` + + +## 获取未完成任务列表 + + +**接口地址**:`/api/rest_j/v1/jobhistory/listundone` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取未完成任务列表

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|creator|query|false|string| +|endDate|结束时间|query|false|integer(int64)| +|engineType|engineType|query|false|string| +|pageNow|pageNow|query|false|ref| +|pageSize|pageSize|query|false|ref| +|startDate|开始时间|query|false|ref| +|startTaskID|startTaskID|query|false|integer(int64)| +|status|status|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## job任务详细记录 + + +**接口地址**:`/api/rest_j/v1/jobhistory/{id}/get` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

job任务详细记录

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|历史记录Id|query|false|integer(int64)| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/jobhistory/1928730/get", + "status": 0, + "message": "OK", + "data": { + "task": { + "taskID": , + "instance": "", + "execId": "", + "umUser": "", + "engineInstance": "", + "executionCode": "", + "progress": "", + "logPath": "", + "resultLocation": "", + "status": "", + "createdTime":, + "updatedTime": , + "engineType": "", + "errCode": , + "errDesc": "", + "executeApplicationName": "", + "requestApplicationName": "", + "runType": "hql", + "paramsJson": "", + "costTime": , + "strongerExecId": "", + "sourceJson": "", + "sourceTailor": "", + "engineStartTime": null, + "labels": [""], + "canRetry": false, + "subJobs": null + } + } +} +``` + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/instance-management-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/instance-management-api.md new file mode 100644 index 00000000000..20db12d0883 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/instance-management-api.md @@ -0,0 +1,288 @@ +--- +title: 实例管理 +sidebar_position: 6 +--- +** InstanceRestful 类 ** + + + + +## 微服务实例列表 + + +**接口地址**:`/api/rest_j/v1/microservice/allInstance` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取微服务管理模块实例列表可获取单个或多个默认全部

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "instances": [{ + "id": , + "updateTime": , + "createTime": , + "applicationName": ", + "instance": "", + "labels": [{ + "stringValue": "", + "labelKey": "", + "feature": "", + "id": 5, + "labelValueSize": 0, + "modifiable": true, + "updateTime": , + "createTime": , + "featureKey": "", + "empty": + }] + }] + } +} +``` + + +## 获取eurekaURL + + +**接口地址**:`/api/rest_j/v1/microservice/eurekaURL` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

返回eurekaURL

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "url": "" + } +} +``` + + +## 编辑微服务实例 + + +**接口地址**:`/api/rest_j/v1/microservice/instanceLabel` + + +**请求方式**:`PUT` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

编辑或修改下微服务管理中的实例

+ +**请求示例**: +```javascript +{ + applicationName: "linkis-ps-cs" + instance: "localhost110004:9108" + labels: [{ + labelKey: "route", + stringValue: "cs_2_dev" +}]} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|引擎标签|String|false|String| +|instance|引擎实例名称|String|String|String| +|labelKey|添加内容里面的标签,属于labels集合 内 map里的key|String|String|String| +|labels|引擎实例更新参数内容,集合存放的是map类型的|List|String|List| +|stringValue|添加内容里面的标签对于的值,属于labels集合 内 map里的value|String|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "success", + "data": { + "labels": [{ + "stringValue": "", + "labelKey": "", + "feature": null, + "modifiable": , + "featureKey": "", + "empty": + }] + } +} +``` + + +## 可以修改的label 类型 + + +**接口地址**:`/api/rest_j/v1/microservice/modifiableLabelKey` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取可以修改的label类型列表,列表数据如‘userCreator,route’

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "keyList": [] + } +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/jobhistory-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/jobhistory-api.md new file mode 100644 index 00000000000..e74ae07e3ce --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/jobhistory-api.md @@ -0,0 +1,251 @@ +--- +title: 历史作业API +sidebar_position: 1 +--- + +** QueryRestfulApi 类 ** + +## 判断用户是否是管理员 +**接口地址**:`/api/rest_j/v1/jobhistory/governanceStationAdmin` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: 判断用户是否是管理员 + +**请求参数**: +无 + +**响应示例**: + +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "admin": true + } +} +``` + + +## 获取数据源的数据库名称列表 +**接口地址**:`/api/rest_j/v1/jobhistory/{id}/get` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:获取数据源的数据库名称列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "task": { + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + } + } +} +``` + +## 历史任务列表 +**接口地址**:`/api/rest_j/v1/jobhistory/list` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:历史任务列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|startDate|startDate|path|false|Long|| +|endDate|endDate|path|false|Long|| +|status|status|path|false|string|| +|pageNow|pageNow|path|false|Integer|| +|pageSize|pageSize|path|false|Integer|| +|taskID|taskID|path|false|Long|| +|executeApplicationName|executeApplicationName|path|false|string|| +|creator|creator|path|false|string|| +|proxyUser|proxyUser|path|false|string|| +|isAdminView|isAdminView|path|false|Boolean|| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "tasks": [{ + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }, + { + "taskID": 2, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }], + "totalPage": 1 + } +} +``` + +## 未完成的历史任务列表 +**接口地址**:`/api/rest_j/v1/jobhistory/listundone` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:未完成的历史任务列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|startDate|startDate|path|false|Long|| +|endDate|endDate|path|false|Long|| +|status|status|path|false|string|| +|pageNow|pageNow|path|false|Integer|| +|pageSize|pageSize|path|false|Integer|| +|startTaskID|startTaskID|path|false|Long|| +|engineType|engineType|path|false|string|| +|creator|creator|path|false|string|| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "tasks": [{ + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "Running", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }, + { + "taskID": 2, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "Running", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }], + "totalPage": 1 + } +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/link-error-code.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/link-error-code.md new file mode 100644 index 00000000000..5b8daff94a3 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/link-error-code.md @@ -0,0 +1,65 @@ +--- +title: Linkis错误代码 +sidebar_position: 5 +--- +** LinkisErrorCodeRestful 类 ** + + + +## 获取Linkis错误代码 + + +**接口地址**:`/api/rest_j/v1/errorcode/getAllErrorCodes` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取Linkis错误代码列表

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/mdq-table-interface-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/mdq-table-interface-api.md new file mode 100644 index 00000000000..75c153c7f5a --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/mdq-table-interface-api.md @@ -0,0 +1,317 @@ +--- +title: Mdq表API +sidebar_position: 4 +--- +** MdqTableRestfulApi 类 ** + + +## 生成新建库表的DDL语句 + + +**接口地址**:`/api/rest_j/v1/datasource/displaysql` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

生成新建库表的DDL语句

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|table|表|String|false|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取分区统计信息 + + +**接口地址**:`/api/rest_j/v1/datasource/getPartitionStatisticInfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取分区统计信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|数据源|query|false|string| +|partitionSort|分区排序|String|false|String| +|tableName|表名称|query|false|string| +|partitionPath|partitionPath|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取表信息 + + +**接口地址**:`/api/rest_j/v1/datasource/getTableBaseInfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取表信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|数据源|query|false|string| +|tableName|表名称|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取表格字段信息 + + +**接口地址**:`/api/rest_j/v1/datasource/getTableFieldsInfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取表格字段信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|数据源|query|false|string| +|tableName|表名称|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取表统计信息 + + +**接口地址**:`/api/rest_j/v1/datasource/getTableStatisticInfo` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取表统计信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|数据源|query|false|string| +|pageNow|页码|query|false|string| +|pageSize|页面大小|query|false|string| +|partitionSort|分区排序|query|false|string| +|tableName|表名称|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadatamanager-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadatamanager-api.md new file mode 100644 index 00000000000..c23802ccfc5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadatamanager-api.md @@ -0,0 +1,331 @@ +--- +title: 元数据查询API +sidebar_position: 3 +--- +> 本接口为已废弃的老接口,请使用新接口[元数据查询新API](./metadatamanager-api.md) + +** MetadataCoreRestful 类 ** + +## getColumns +**接口地址**:`/api/rest_j/v1/metadatamanager/columns/{dataSourceId}/db/{database}/table/{table}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: 获取数据表的column信息 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string| +|database|database|path|true|string| +|system|system|query|true|string| +|table|table|path|true|string| + +**响应示例**: + +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "columns": [ + { + "index": 1, + "primaryKey": true, + "name": "id", + "type": "INT" + }, + { + "index": 2, + "primaryKey": false, + "name": "datasource_name", + "type": "VARCHAR" + }, + { + "index": 3, + "primaryKey": false, + "name": "datasource_desc", + "type": "VARCHAR" + }, + { + "index": 4, + "primaryKey": false, + "name": "datasource_type_id", + "type": "INT" + }, + { + "index": 5, + "primaryKey": false, + "name": "create_identify", + "type": "VARCHAR" + }, + { + "index": 6, + "primaryKey": false, + "name": "create_system", + "type": "VARCHAR" + }, + { + "index": 7, + "primaryKey": false, + "name": "parameter", + "type": "VARCHAR" + }, + { + "index": 8, + "primaryKey": false, + "name": "create_time", + "type": "DATETIME" + }, + { + "index": 9, + "primaryKey": false, + "name": "modify_time", + "type": "DATETIME" + }, + { + "index": 10, + "primaryKey": false, + "name": "create_user", + "type": "VARCHAR" + }, + { + "index": 11, + "primaryKey": false, + "name": "modify_user", + "type": "VARCHAR" + }, + { + "index": 12, + "primaryKey": false, + "name": "labels", + "type": "VARCHAR" + }, + { + "index": 13, + "primaryKey": false, + "name": "version_id", + "type": "INT" + }, + { + "index": 14, + "primaryKey": false, + "name": "expire", + "type": "TINYINT" + }, + { + "index": 15, + "primaryKey": false, + "name": "published_version_id", + "type": "INT" + } + ] + } +} +``` + + +## getDatabases +**接口地址**:`/api/rest_j/v1/metadatamanager/dbs/{dataSourceId}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:获取数据源的数据库名称列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string| +|system|system|query|true|string| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "dbs": [ + "information_schema", + "linkis", + "linkis_sit" + ] + } +} +``` + + +## getPartitions +**接口地址**:`/api/rest_j/v1/metadatamanager/partitions/{dataSourceId}/db/{database}/table/{table}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string| +|database|database|path|true|string| +|system|system|query|true|string| +|table|table|path|true|string| +|traverse|traverse|query|false|boolean| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "props": { + "partKeys": [ + "ds" + ], + "root": {} + } + } +} +``` + +## getTableProps +**接口地址**:`/api/rest_j/v1/metadatamanager/props/{dataSourceId}/db/{database}/table/{table}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string| +|database|database|path|true|string| +|system|system|query|true|string| +|table|table|path|true|string| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "props": { + "skip.header.line.count": "1", + "columns.types": "int:int:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string", + "columns": "id,age,job,marital,education,default,balance,housing,loan,contact,day,month,duration,campaign,pdays,previous,poutcome,y", + "field.delim": ",", + "transient_lastDdlTime": "1646732554", + "partition_columns.types": "string", + "columns.comments": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "bucket_count": "-1", + "serialization.ddl": "struct demo_data { i32 id, i32 age, string job, string marital, string education, string default, string balance, string housing, string loan, string contact, string day, string month, string duration, string campaign, string pdays, string previous, string poutcome, string y}", + "file.outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", + "partition_columns": "ds", + "colelction.delim": "-", + "serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", + "name": "dss_autotest.demo_data", + "location": "hdfs://bdpdev01/user/hive/warehouse/hadoop/dss_autotest.db/demo_data", + "mapkey.delim": ":", + "file.inputformat": "org.apache.hadoop.mapred.TextInputFormat", + "serialization.format": ",", + "column.name.delimiter": "," + } + } +} +``` + + +## getPartitionProps +**接口地址**:`/api/rest_j/v1/metadatamanager/props/{dataSourceId}/db/{database}/table/{table}/partition/{partition}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string| +|database|database|path|true|string| +|partition|partition|path|true|string| +|system|system|query|true|string| +|table|table|path|true|string| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## getTables +**接口地址**:`/api/rest_j/v1/metadatamanager/tables/{dataSourceId}/db/{database}` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: 获取数据源的某个数据库的数据表列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string| +|database|database|path|true|string| +|system|system|query|true|string| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "tables": [ + "test", + "test_0317a", + "test_import_sqoop_1", + "test_linkis_sqoop_1", + "test_linkis_sqoop_2", + "test_linkis_sqoop_3", + "upload_test" + ] + } +} +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadataquery-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadataquery-api.md new file mode 100644 index 00000000000..0274ae27d77 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadataquery-api.md @@ -0,0 +1,266 @@ +--- +title: 元数据查询API(新) +sidebar_position: 3 +--- +> 元数据查询接口优化之后的新接口,已废弃的旧接口见[元数据查询API](./metadatamanager-api.md),相对于旧接口,主要调整请求的路径和接口参数命名 + +** MetadataQueryRestful 类 ** + +## getColumns + +**接口地址**:`/api/rest_j/v1/metadataQuery/getColumns` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: 获取数据表的column信息 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|envId|envId|path| false |string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + +**响应示例**: + +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "columns": [ + { + "index": 1, + "primaryKey": true, + "name": "id", + "type": "INT" + }, + { + "index": 2, + "primaryKey": false, + "name": "datasource_name", + "type": "VARCHAR" + }, + { + "index": 3, + "primaryKey": false, + "name": "datasource_desc", + "type": "VARCHAR" + }, + ] + } +} +``` + + +## getDatabases +**接口地址**:`/api/rest_j/v1/metadataQuery/getDatabases` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**:获取数据源的数据库名称列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- |-------| -------- | ------ | +|dataSourceName|dataSourceName|path| true |string|| +|envId|envId|path| false |string|| +|system|system|query| true |string|| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "dbs": [ + "information_schema", + "linkis", + "linkis_sit" + ] + } +} +``` + + +## getPartitions + +> 返回值调整为 props -> partitions + +**接口地址**:`/api/rest_j/v1/metadataQuery/getPartitions` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| +|traverse|traverse|query|false|boolean|| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "partitions": { + "partKeys": [ + "ds" + ], + "root": {} + } + } +} +``` + +## getTableProps +**接口地址**:`/api/rest_j/v1/metadataQuery/getTableProps` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "props": { + "skip.header.line.count": "1", + "columns.types": "int:int:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string", + "columns": "id,age,job,marital,education,default,balance,housing,loan,contact,day,month,duration,campaign,pdays,previous,poutcome,y", + "field.delim": ",", + "transient_lastDdlTime": "1646732554", + "partition_columns.types": "string", + "columns.comments": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "bucket_count": "-1", + "serialization.ddl": "struct demo_data { i32 id, i32 age, string job, string marital, string education, string default, string balance, string housing, string loan, string contact, string day, string month, string duration, string campaign, string pdays, string previous, string poutcome, string y}", + "file.outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", + "partition_columns": "ds", + "colelction.delim": "-", + "serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", + "name": "dss_autotest.demo_data", + "location": "hdfs://localhost01/user/hive/warehouse/hadoop/dss_autotest.db/demo_data", + "mapkey.delim": ":", + "file.inputformat": "org.apache.hadoop.mapred.TextInputFormat", + "serialization.format": ",", + "column.name.delimiter": "," + } + } +} +``` + + +## getPartitionProps +**接口地址**:`/api/rest_j/v1/metadataQuery/getPartitionProps` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|database|database|path|true|string|| +|partition|partition|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## getTables +**接口地址**:`/api/rest_j/v1/metadataQuery/getTables` + +**请求方式**:`GET` + +**请求数据类型**:`application/x-www-form-urlencoded` + +**响应数据类型**:`application/json` + +**接口描述**: 获取数据源的某个数据库的数据表列表 + +**请求参数**: + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|envId|envId|path| false |string|| +|database|database|path|true|string|| +|system|system|query|true|string|| + +**响应示例**: +```javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "tables": [ + "test", + "test_0317a", + "test_import_sqoop_1", + "test_linkis_sqoop_1", + "test_linkis_sqoop_2", + "test_linkis_sqoop_3", + "upload_test" + ] + } +} +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/parameter-configuration-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/parameter-configuration-api.md new file mode 100644 index 00000000000..89a3288ba5d --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/parameter-configuration-api.md @@ -0,0 +1,891 @@ +--- +title: 参数配置 +sidebar_position: 3 +--- +** ConfigurationRestfulApi 类 ** + + + + +## 添加KeyForEngine + + +**接口地址**:`/api/rest_j/v1/configuration/addKeyForEngine` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

添加KeyForEngine

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|engineType|engineType|query|false|string| +|keyJson|keyJson|query|false|string| +|token|token|query|false|string| +|version|version|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 新增应用类型 + + +**接口地址**:`/api/rest_j/v1/configuration/createFirstCategory` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

新增应用类型标签

+ +**请求示例**: +```javascript +{ + "categoryName": “”, + "description": "" +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryName|引用类型标签名称|String|false|String| +|description|描述|String|false|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/createFirstCategory", + "status": 0, + "message": "OK", + "data": {} +} +``` + + +## 新增参数配置 + + +**接口地址**:`/api/rest_j/v1/configuration/createSecondCategory` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

添加参数配置

+ +**请求示例**: +```javascript +{ + categoryId: , + description: "", + engineType: "", + version: "" +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryId|参数配置Id|String|true|String| +|description|描述|String|true|String| +|engineType|引擎类型|String|true|String| +|version|版本号|String|true|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/createSecondCategory", + "status": 0, + "message": "OK", + "data": {} +} +``` + + +## 删除配置 + + +**接口地址**:`/api/rest_j/v1/configuration/deleteCategory` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除参数配置

+ +**请求示例**: +```javascript +{ + categoryId: +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryId|参数配置Id|String|true|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/deleteCategory", + "status": 0, + "message": "OK", + "data": {} +} +``` + + +## 引擎类型列表 + + +**接口地址**:`/api/rest_j/v1/configuration/engineType` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取引擎类型列表

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/engineType", + "status": 0, + "message": "OK", + "data": { + "engineType": [] + } +} +``` + + +## 应用类型 + + +**接口地址**:`/api/rest_j/v1/configuration/getCategory` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数配置中应用类型标签

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/getCategory", + "status": 0, + "message": "OK", + "data": { + "Category": [{ + "categoryId": , + "labelId": , + "categoryName": "", + "childCategory": [], + "description": null, + "tag": null, + "createTime": , + "updateTime": , + "level": , + "fatherCategoryName": "" + }], + "description": null, + "tag": null, + "createTime": , + "updateTime": , + "level": , + "fatherCategoryName": + }] + } +} +``` + + +## 队列资源 + + +**接口地址**:`/api/rest_j/v1/configuration/getFullTreesByAppName` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

参数配置中的队列资源模块返回队列资源的列及值

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|标签名称|query|false|string| +|engineType|engineType|query|false|string| +|version|version|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/getFullTreesByAppName", + "status": 0, + "message": "OK", + "data": { + "fullTree": [{ + "name": "队列资源", + "description": null, + "settings": [{ + "id": , + "key": "", + "description": "", + "name": "", + "defaultValue": "", + "validateType": "", + "validateRange": "[]", + "level": 1, + "engineType": , + "treeName": "", + "valueId": , + "configValue": "", + "configLabelId": , + "unit": null, + "isUserDefined": , + "hidden": , + "advanced": + }] + }] + } +} +``` + + +## 获取键值 + + +**接口地址**:`/api/rest_j/v1/configuration/keyvalue` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取键值

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|configKey|configKey|query|true|string| +|creator|creator|query|false|string| +|engineType|engineType|query|false|string| +|version|version|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 保存键值 + + +**接口地址**:`/api/rest_j/v1/configuration/keyvalue` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

保存键值

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|configKey|configKey|true|String|String| +|configValue|configValue|true|String|String| +|creator|creator|true|String|String| +|engineType|engineType|true|String|String| +|version|version|true|String|String| +|SaveKeyValue|json|body|true|SaveKeyValue|SaveKeyValue| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除键值 + + +**接口地址**:`/api/rest_j/v1/configuration/keyvalue` + + +**请求方式**:`DELETE` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除键值

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|configKey|configKey|true|String|String| +|creator|creator|true|String|String| +|engineType|engineType|true|String|String| +|version|version|true|String|String| +|DeleteKeyValue|json|body|true|DeleteKeyValue|DeleteKeyValue| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|204|No Content| +|401|Unauthorized| +|403|Forbidden| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## rpc测试 + + +**接口地址**:`/api/rest_j/v1/configuration/rpcTest` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

rpc测试

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|creator|query|false|string| +|engineType|engineType|query|false|string| +|username|username|query|false|string| +|version|version|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 保存队列资源 + + +**接口地址**:`/api/rest_j/v1/configuration/saveFullTree` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

保存队列资源

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|应用类型名称|String|true|String| +|description|描述,属于fullTree中的内容|String|true|String| +|engineType|引擎类型|String|true|String| +|fullTree|应用类型下的详细信息|List|true|List| +|name|队列资源名称,属于fullTree中的内容|String|true|String| +|settings|队列资源中的详细内容,属于fullTree中的内容|List|true|List| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/saveFullTree", + "status": 0, + "message": "OK", + "data": {} +} +``` + + +## 更新类别信息 + + +**接口地址**:`/api/rest_j/v1/configuration/updateCategoryInfo` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

更新类别信息

+ + +**响应示例**: +```javascript +{ + description: "", + categoryId: +} +``` + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryId|categoryId|String|true|String| +|description|description|String|true|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/configuration/updateCategoryInfo", + "status": 0, + "message": "OK", + "data": {} +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/udf-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/udf-api.md new file mode 100644 index 00000000000..97f07f1b7e1 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/http/linkis-ps-publicservice-api/udf-api.md @@ -0,0 +1,1395 @@ +--- +title: UDF操作管理 +sidebar_position: 16 +--- + +** UDFApi 类 ** + +## 新增 + +**接口地址**:`/api/rest_j/v1/udf/add` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

新增

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|clusterName|clusterName|false|String|String| +|createTime|创建时间|false|Date|Date| +|createUser|创建者|false|String|String| +|description|描述|false|String|String| +|directory|分类,个人函数一级目录|false|String|String| +|isExpire|是否失效|false|Boolean|Boolean| +|isLoad|是否负载|false|Boolean|Boolean| +|isShared|是否共享|false|Boolean|Boolean| +|path|仅存储用户上一次上传的路径 作提示用|false|String|String| +|registerFormat|注册执行地址|false|String|String| +|sys|sys|false|String|String| +|treeId|treeId|false|Long|Long| +|udfName|udfName|false|String|String| +|udfType|udfType|false|Integer|Integer| +|updateTime|更新时间|false|Date|Date| +|useFormat|使用格式|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## udf树形菜单 + + +**接口地址**:`/api/rest_j/v1/udf/all` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取udf树形菜单详细信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|请求路径|false|String|String| +|jsonString|jsonString|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取udf用户列表 + + +**接口地址**:`/api/rest_j/v1/udf/allUdfUsers` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取udf用户列表

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|json|json|body|true|JsonNode|JsonNode| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 证实 + + +**接口地址**:`/api/rest_j/v1/udf/authenticate` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

证明…是真实的

+ + + +**请求参数**: + + +暂无 + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 删除 + + +**接口地址**:`/api/rest_j/v1/udf/delete/{id}` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

删除

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|false|integer(int64)| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## udf文件下载到本地 + + +**接口地址**:`/api/rest_j/v1/udf/downloadToLocal` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

根据版本参数下载UDF文件到本地

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## UDF查看源码 + + +**接口地址**:`/api/rest_j/v1/udf/downloadUdf` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

UDF查看源码

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## UDF共享用户列表 + + +**接口地址**:`/api/rest_j/v1/udf/getSharedUsers` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

UDF共享用户列表

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## UDF移交 + + +**接口地址**:`/api/rest_j/v1/udf/handover` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

UDF移交

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|handoverUser|切换用户|false|String|String| +|udfId|udfId|false|integer| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 是否负载 + + +**接口地址**:`/api/rest_j/v1/udf/isload` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

是否负载

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|isLoad|是否负载|query|false|boolean| +|udfId|udfId|query|false|integer(int64)| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 函数列表 + + +**接口地址**:`/api/rest_j/v1/udf/list` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取函数列表

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ListUDF|json|body|true|ListUDF|ListUDF| +|category|类别|false|String|String| +|treeId|树形菜单Id|false|String|String| +|type|函数类型,比如expire,self,share等类型|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 基本信息 + + +**接口地址**:`/api/rest_j/v1/udf/managerPages` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

基本信息

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|curPage|页码|false|Integer|Integer| +|pageSize|页面大小|false|Integer|Integer| +|udfName|udf名称|false|String|String| +|udfType|udf类型|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 出版 + + +**接口地址**:`/api/rest_j/v1/udf/publish` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

UDF版本发布

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 回退版本 + + +**接口地址**:`/api/rest_j/v1/udf/rollback` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

回退版本

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 设置过期 + + +**接口地址**:`/api/rest_j/v1/udf/setExpire` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

设置过期

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|Long|Long| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## UDF共享 + + +**接口地址**:`/api/rest_j/v1/udf/shareUDF` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

UDF共享

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|sharedUsers|sharedUsers|false|List|List| +|udfInfo|udfInfo|false|UDFInfo|UDFInfo| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## tree新增 + + +**接口地址**:`/api/rest_j/v1/udf/tree/add` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

tree新增

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|category|category|false|String|String| +|childrens|childrens|false|List|List| +|clusterName|clusterName|false|String|String| +|createTime|createTime|false|Date|Date| +|description|description|false|String|String| +|id|id|false|Long|Long| +|name|name|false|String|String| +|parent|parent|false|Long|Long| +|udfInfos|udfInfos|false|List|List| +|updateTime|updateTime|false|Date|Date| +|userName|userName|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## tree删除 + + +**接口地址**:`/api/rest_j/v1/udf/tree/delete/{id}` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

tree删除

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|false|integer(int64)| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## tree更新 + + +**接口地址**:`/api/rest_j/v1/udf/tree/update` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

tree更新

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|category|category|false|String|String| +|childrens|childrens|false|List|List| +|clusterName|clusterName|false|String|String| +|createTime|createTime|false|Date|Date| +|description|description|false|String|String| +|id|id|false|Long|Long| +|name|name|false|String|String| +|parent|parent|false|Long|Long| +|udfInfos|udfInfos|false|List|List| +|updateTime|updateTime|false|Date|Date| +|userName|userName|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 更新 + + +**接口地址**:`/api/rest_j/v1/udf/update` + + +**请求方式**:`POST` + + +**请求数据类型**:`application/json` + + +**响应数据类型**:`*/*` + + +**接口描述**:

UDF修改

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|description|描述|false|String|String| +|id|id|false|Long|Long| +|isLoad|是否负载|false|Boolean|Boolean| +|path|仅存储用户上一次上传的路径 作提示用|false|String|String| +|registerFormat|注册执行地址|false|String|String| +|udfName|udfName|false|String|String| +|udfType|udfType|false|Integer|Integer| +|useFormat|使用格式|false|String|String| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 获取用户目录 + + +**接口地址**:`/api/rest_j/v1/udf/userDirectory` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

获取用户个人函数的一级分类

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|category|获取指定集合类型用户目录,如类型为UDF即获取该类型下的用户目录|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## 版本列表 + + +**接口地址**:`/api/rest_j/v1/udf/versionList` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

版本列表查看

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|query|false|integer(int64)| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/jdbc-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/jdbc-api.md new file mode 100644 index 00000000000..fbfef1539ea --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/jdbc-api.md @@ -0,0 +1,59 @@ +--- +title: JDBC Driver 文档 +sidebar_position: 4 +--- +## 1. 引入依赖模块: +第一种方式在pom里面依赖JDBC模块: +```xml + + org.apache.linkis + linkis-jdbc-driver + ${linkis.version} + +``` +**注意:** 该模块还没有deploy到中央仓库,需要在linkis-computation-governance/linkis-jdbc-driver目录里面执行`mvn install -Dmaven.test.skip=true`进行本地安装。 + +**第二种方式通过打包和编译:** +1. 在Linkis项目中进入到linkis-computation-governance/linkis-jdbc-driver目录然后在终端输入指令进行打包`mvn assembly:assembly -Dmaven.test.skip=true` +该打包指令会跳过单元测试的运行和测试代码的编译,并将JDBC模块需要的依赖一并打包进Jar包之中。 +2. 打包完成后在JDBC的target目录下会生成两个Jar包,Jar包名称中包含dependencies字样的那个就是我们需要的驱动包 + +## 2. 建立测试类: +建立Java的测试类LinkisJDBCTest,具体接口含义可以见注释: + +```java +package org.apache.linkis.jdbc.test; + +import java.sql.*; + +public class LinkisJDBCTest { + + public static void main(String[] args) throws SQLException, ClassNotFoundException { + + //1. load driver:org.apache.linkis.ujes.jdbc.UJESSQLDriver + Class.forName("org.apache.linkis.ujes.jdbc.UJESSQLDriver"); + + //2. Get Connection:jdbc:linkis://gatewayIP:gatewayPort/dbName?EngineType=hive&creator=test, user/password + Connection connection = DriverManager.getConnection("jdbc:linkis://127.0.0.1:9001/default?EngineType=hive&creator=test","hadoop","hadoop"); + //3. Create statement + Statement st= connection.createStatement(); + ResultSet rs=st.executeQuery("show tables"); + //4.get result + while (rs.next()) { + ResultSetMetaData metaData = rs.getMetaData(); + for (int i = 1; i <= metaData.getColumnCount(); i++) { + System.out.print(metaData.getColumnName(i) + ":" +metaData.getColumnTypeName(i)+": "+ rs.getObject(i) + " "); + } + System.out.println(); + } + //close resource + rs.close(); + st.close(); + connection.close(); + } +} +``` + +备注: +1. 其中EngineType为指定对应的引擎类型:支持Spark/hive/presto/shell等 +2. 其中creator为指定对应的应用类型,用于应用间的资源隔离 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/linkis-task-operator.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/linkis-task-operator.md new file mode 100644 index 00000000000..ecc10804201 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/linkis-task-operator.md @@ -0,0 +1,402 @@ +--- +title: 任务提交执行 Rest API 文档 +sidebar_position: 3 +--- +- Linkis Restful接口的返回,都遵循以下的标准返回格式: + +```json +{ + "method": "", + "status": 0, + "message": "", + "data": {} +} +``` + +**约定**: + + - method:返回请求的Restful API URI,主要是 WebSocket 模式需要使用。 + - status:返回状态信息,其中:-1表示没有登录,0表示成功,1表示错误,2表示验证失败,3表示没该接口的访问权限。 + - data:返回具体的数据。 + - message:返回请求的提示信息。如果status非0时,message返回的是错误信息,其中data有可能存在stack字段,返回具体的堆栈信息。 + +更多关于 Linkis Restful 接口的规范,请参考:[Linkis Restful 接口规范](../development/development-specification/api) + +### 1. 提交执行 + +- 接口 `/api/rest_j/v1/entrance/submit` + +- 提交方式 `POST` + +```json +{ + "executionContent": { + "code": "show tables", + "runType": "sql" + }, + "params": { + "variable": {// task variable + "testvar": "hello" + }, + "configuration": { + "runtime": {// task runtime params + "jdbc.url": "XX" + }, + "startup": { // ec start up params + "spark.executor.cores": "4" + } + } + }, + "source": { //task source information + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +``` + +- 返回示例 + +```json +{ + "method": "/api/rest_j/v1/entrance/submit", + "status": 0, + "message": "请求执行成功", + "data": { + "execID": "030418IDEhivelocalhost010004:10087IDE_hadoop_21", + "taskID": "123" + } +} +``` + +- execID是用户任务提交到 Linkis 之后,为该任务生成的唯一标识执行ID,为 String 类型,这个ID只在任务运行时有用,类似PID的概念。ExecID 的设计为`(requestApplicationName长度)(executeAppName长度)(Instance长度)${requestApplicationName}${executeApplicationName}${entranceInstance信息ip+port}${requestApplicationName}_${umUser}_${index}` + +- taskID 是表示用户提交task的唯一ID,这个ID由数据库自增生成,为 Long 类型 + + +### 2. 获取状态 + +- 接口 `/api/rest_j/v1/entrance/${execID}/status` + +- 提交方式 `GET` + +- 返回示例 + +```json +{ + "method": "/api/rest_j/v1/entrance/{execID}/status", + "status": 0, + "message": "获取状态成功", + "data": { + "execID": "${execID}", + "status": "Running" + } +} +``` + +### 3. 获取日志 + +- 接口 `/api/rest_j/v1/entrance/${execID}/log?fromLine=${fromLine}&size=${size}` + +- 提交方式 `GET` + +- 请求参数fromLine是指从第几行开始获取,size是指该次请求获取几行日志 + +- 返回示例,其中返回的fromLine需要作为下次请求该接口的参数 + +```json +{ + "method": "/api/rest_j/v1/entrance/${execID}/log", + "status": 0, + "message": "返回日志信息", + "data": { + "execID": "${execID}", + "log": ["error日志","warn日志","info日志", "all日志"], + "fromLine": 56 + } +} +``` + +### 4. 获取进度 + +- 接口 `/api/rest_j/v1/entrance/${execID}/progress` + +- 提交方式 `GET` + +- 返回示例 + +```json +{ + "method": "/api/rest_j/v1/entrance/{execID}/progress", + "status": 0, + "message": "返回进度信息", + "data": { + "execID": "${execID}", + "progress": 0.2, + "progressInfo": [ + { + "id": "job-1", + "succeedTasks": 2, + "failedTasks": 0, + "runningTasks": 5, + "totalTasks": 10 + }, + { + "id": "job-2", + "succeedTasks": 5, + "failedTasks": 0, + "runningTasks": 5, + "totalTasks": 10 + } + ] + } +} +``` + +### 5. kill任务 + +- 接口 `/api/rest_j/v1/entrance/${execID}/kill` + +- 提交方式 `GET` + +- 返回示例 + +```json +{ + "method": "/api/rest_j/v1/entrance/{execID}/kill", + "status": 0, + "message": "OK", + "data": { + "execID":"${execID}" + } +} +``` + +### 6. 获取任务信息 + +- 接口 `/api/rest_j/v1/jobhistory/{id}/get` + +- 提交方式 `GET` + +- 请求参数 + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + + +- 返回示例 + +```json +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "task": { + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + } + } +} +``` + +### 7. 获取结果集信息 + +支持多结果集信息 + +- 接口 `/api/rest_j/v1/filesystem/getDirFileTrees` + +- 提交方式 `GET` + +- 请求参数 + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|结果集目录路径|query|true|string|| + + +- 返回示例 + +```json +{ + "method": "/api/filesystem/getDirFileTrees", + "status": 0, + "message": "OK", + "data": { + "dirFileTrees": { + "name": "1946923", + "path": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923", + "properties": null, + "children": [ + { + "name": "_0.dolphin", + "path": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923/_0.dolphin",//result set 1 + "properties": { + "size": "7900", + "modifytime": "1657113288360" + }, + "children": null, + "isLeaf": true, + "parentPath": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923" + }, + { + "name": "_1.dolphin", + "path": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923/_1.dolphin",//result set 2 + "properties": { + "size": "7900", + "modifytime": "1657113288614" + }, + "children": null, + "isLeaf": true, + "parentPath": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923" + } + ], + "isLeaf": false, + "parentPath": null + } + } +} +``` + +### 8. 获取结果集内容 + +- 接口 `/api/rest_j/v1/filesystem/openFile` + +- 提交方式 `GET` + +- 请求参数 + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|结果集文件|query|true|string|| +|charset|字符集|query|false|string|| +|page|页码|query|false|ref|| +|pageSize|页面大小|query|false|ref|| + + +- 返回示例 + +```json +{ + "method": "/api/filesystem/openFile", + "status": 0, + "message": "OK", + "data": { + "metadata": [ + { + "columnName": "count(1)", + "comment": "NULL", + "dataType": "long" + } + ], + "totalPage": 0, + "totalLine": 1, + "page": 1, + "type": "2", + "fileContent": [ + [ + "28" + ] + ] + } +} +``` + +### 9. 获取结果集按照文件流的方式 + +获取结果集为CSV和Excel按照流的方式 + +- 接口 `/api/rest_j/v1/filesystem/resultsetToExcel` + +- 提交方式 `GET` + +- 请求参数 + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|autoFormat|是否自动转换格式|query|false|boolean|| +|charset|字符集|query|false|string|| +|csvSeperator|csv分隔栏|query|false|string|| +|limit|获取行数|query|false|ref|| +|nullValue|空值转换|query|false|string|| +|outputFileName|输出文件名称|query|false|string|| +|outputFileType|输出文件类型 csv 或者Excel|query|false|string|| +|path|结果集路径|query|false|string|| + +- 返回示例 + +```json +文件流 +``` + +### 10. 兼容0.X的任务执行接口 + +- 接口 `/api/rest_j/v1/entrance/execute` + +- 提交方式 `POST` + +```json +{ + "executeApplicationName": "hive", //Engine type + "requestApplicationName": "dss", //Client service type + "executionCode": "show tables", + "params": { + "variable": {// task variable + "testvar": "hello" + }, + "configuration": { + "runtime": {// task runtime params + "jdbc.url": "XX" + }, + "startup": { // ec start up params + "spark.executor.cores": "4" + } + } + }, + "source": { //task source information + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + }, + "runType": "hql", //The type of script to run + "source": {"scriptPath":"file:///tmp/hadoop/1.hql"} +} +``` + +- Sample Response + +```json +{ + "method": "/api/rest_j/v1/entrance/execute", + "status": 0, + "message": "Request executed successfully", + "data": { + "execID": "030418IDEhivelocalhost010004:10087IDE_hadoop_21", + "taskID": "123" + } +} +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/login-api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/login-api.md new file mode 100644 index 00000000000..aa896f0ebde --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/login-api.md @@ -0,0 +1,133 @@ +--- +title: 登录文档 +sidebar_position: 2 +--- + + + +## 1.对接LDAP服务 + +进入/conf目录,执行命令: + +```bash + vim linkis-mg-gateway.properties +``` + +添加LDAP相关配置: +```bash +wds.linkis.ldap.proxy.url=ldap://127.0.0.1:1389/ # 您的LDAP服务URL +wds.linkis.ldap.proxy.baseDN=dc=webank,dc=com # 您的LDAP服务的配置 +``` + +## 2.免登录配置 + +如何打开测试模式,实现免登录?进入/conf目录,执行命令: + +```bash + vim linkis-mg-gateway.properties +``` + +将测试模式打开,参数如下: + +```shell + wds.linkis.test.mode=true # 打开测试模式 + wds.linkis.test.user=hadoop # 指定测试模式下,所有请求都代理给哪个用户 +``` + +## 3.登录接口汇总 + +我们提供以下几个与登录相关的接口: + + - 登录 + - 登出 + - 心跳 + + +## 4.接口详解 + +- Linkis Restful接口的返回,都遵循以下的标准返回格式: + +```json +{ + "method": "", + "status": 0, + "message": "", + "data": {} +} +``` + +**约定**: + + - method:返回请求的Restful API URI,主要是 WebSocket 模式需要使用。 + - status:返回状态信息,其中:-1表示没有登录,0表示成功,1表示错误,2表示验证失败,3表示没该接口的访问权限。 + - data:返回具体的数据。 + - message:返回请求的提示信息。如果status非0时,message返回的是错误信息,其中data有可能存在stack字段,返回具体的堆栈信息。 + +更多关于 Linkis Restful 接口的规范,请参考:[Linkis Restful 接口规范](../development/development-specification/api) + +### 4.1 登录 + +- 接口 `/api/rest_j/v1/user/login` + +- 提交方式 `POST` + +```json + { + "userName": "", + "password": "" + } +``` + +- 返回示例 + +```json + { + "method": null, + "status": 0, + "message": "login successful(登录成功)!", + "data": { + "isAdmin": false, + "userName": "" + } + } +``` + +其中: + + - isAdmin: Linkis只有admin用户和非admin用户,admin用户的唯一特权,就是支持在Linkis管理台查看所有用户的历史任务。 + +### 4.2 登出 + +- 接口 `/api/rest_j/v1/user/logout` + +- 提交方式 `POST` + + 无参数 + +- 返回示例 + +```json + { + "method": "/api/rest_j/v1/user/logout", + "status": 0, + "message": "退出登录成功!" + } +``` + +### 4.3 心跳 + +- 接口 `/api/rest_j/v1/user/heartbeat` + +- 提交方式 `POST` + + 无参数 + +- 返回示例 + +```json + { + "method": "/api/rest_j/v1/user/heartbeat", + "status": 0, + "message": "维系心跳成功!" + } +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/overview.md new file mode 100644 index 00000000000..a4d0d3889aa --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/api/overview.md @@ -0,0 +1,13 @@ +--- +title: 总览 +sidebar_position: 1 +--- + +## 1. 文档说明 +Linkis1.0 在Linkix0.x版本的基础上进行了重构优化,同时也兼容了0.x的接口,但是为了防止在使用1.0版本时存在兼容性问题,需要您仔细阅读以下文档: + +1. 使用Linkis1.0定制化开发时,需要使用到Linkis的权限认证接口,请仔细阅读 [登录API文档](login-api.md)。 + +2. Linkis1.0提供JDBC的接口,需要使用JDBC的方式接入Linkis,请仔细阅读[任务提交执行JDBC API文档](jdbc-api.md)。 + +3. Linkis1.0提供了Rest接口,如果需要在Linkis的基础上开发上层应用,请仔细阅读[任务提交执行Rest API文档](linkis-task-operator.md)。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/_category_.json new file mode 100644 index 00000000000..33d9cbb6e4d --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "架构设计", + "position": 7 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/_category_.json new file mode 100644 index 00000000000..35d4ecf92fb --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "关键特性架构", + "position": 4 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/_category_.json new file mode 100644 index 00000000000..1b0f37a1f69 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "公共模块", + "position": 1 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/proxy-user.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/proxy-user.md new file mode 100644 index 00000000000..3284e323f7b --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/proxy-user.md @@ -0,0 +1,38 @@ +--- +title: Linkis 支持代理用户提交架构设计 +sidebar_position: 6 +--- + +## 1 背景 +目前linkis在执行用户提交的任务时,linkis主要进程服务会通过sudo -u ${submit user} 切换到对应用户下,然后执行对应的引擎启动命令, +这就需要为每个${submit user} 提前创建对应的系统用户,并且配置好相关的环境变量。 +对于新用户,需要一系列的环境的初始化准备工作,如果频繁的用户变化,会增大运维成本,而且用户过多,没法针对单个用户配置资源,资源之间无法很好的管控。如果能够实现A代理给指定的代理用户执行,可以将执行入口统一收敛,解决需要初始化环境的问题。 + +## 2 基本概念 +- 登陆用户:通过用户名密码直接登陆系统的用户 +- 代理用户:作为登陆用户实际执行操作的用户称之为代理用户,代理登陆用户的相关操作 + +## 3 实现的目标 +- 登陆用户A可以进行代理用户的选择,决定代理给哪个代理用户 +- 登陆用户A可以将任务代理给代理用户B执行 +- 登陆用户A代理到代理用户B时,可以查看B相关的执行记录,任务结果等数据 +- 一个代理用户同时可以代理多个登陆用户,但是一个登陆用户同一时刻只能关联某一个代理用户 + +## 4 实现大体思路 + +修改现有接口cookie处理,需要能在cookie中解析出登录用户和代理用户 +```html +代理用户的cookie的key为:linkis_user_session_proxy_ticket_id_v1 +登录用户的cookie: linkis_user_session_ticket_id_v1 + +``` + +- linkis的相关接口需要 在原来获取UserName的基础上,要能识别出代理用户信息,使用代理用户进行各项操作。并记录审计日志,包含用户的任务执行操作,下载操作 +- 任务提交执行的时候,entrance入口服务需要修改执行的用户为代理用户 + +## 5 需要考虑&注意的事项 + +- 用户分为代理用户和非代理用户,代理类型的用户不能进行再次代理到其他用户执行 +- 需要控制登陆用户与可代理的系统用户列表,禁止出现任意代理的情况,避免权限不可控。最好支持数据库表来配置,并可以直接修改生效,不需要重启服务 +- 单独记录日志文件包含代理用户的操作,如代理执行、函数更新等PublicService的代理用户操作全部记录到日志中,方便审计 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/rpc.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/rpc.md new file mode 100644 index 00000000000..1a310f51705 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/rpc.md @@ -0,0 +1,137 @@ +--- +title: RPC 模块 +sidebar_position: 2 +--- + +基于Feign的微服务之间HTTP接口调用,只能满足简单的A微服务实例根据简单的规则随机访问B微服务之中的某个服务实例,而这个B微服务实例如果想异步回传信息给调用方,是根本无法实现的。 +同时,由于Feign只支持简单的服务选取规则,无法做到将请求转发给指定的微服务实例,无法做到将一个请求广播给接收方微服务的所有实例。 +Linkis RPC是基于Spring Cloud + Feign实现的一套微服务间的异步请求和广播通信服务,可以独立于Linkis而使用。 + + + +## 1. 简介 +Linkis RPC作为底层的通信方案,将提供SDK集成到有需要的微服务之中。 +一个微服务既可以作为请求调用方,也可以作为请求接收方。 + +作为请求调用方时,将通过Sender请求目标接收方微服务的Receiver,作为请求接收方时,将提供Receiver用来处理请求接收方Sender发送过来的请求,以便完成同步响应或异步响应。 +![](/Images/Architecture/RPC-01.png) + +``` +org.apache.linkis.rpc.Sender +org.apache.linkis.rpc.Receiver +``` + +### 1.1. 架构设计图 +![Linkis RPC架构图](/Images-zh/Architecture/Commons/linkis-rpc.png) +### 1.2. 模块说明 +主要模块的功能介绍如下: +* Eureka:服务注册中心,用户管理服务,服务发现。 +* Sender发送器:服务请求接口,发送端使用Sender向接收端请求服务。 +* Receiver接收器:服务请求接收相应接口,接收端通过该接口响应服务。 +* Interceptor拦截器:Sender发送器会将使用者的请求传递给拦截器。拦截器拦截请求,对请求做额外的功能性处理,分别是广播拦截器用于对请求广播操作、重试拦截器用于对失败请求重试处理、缓存拦截器用于简单不变的请求读取缓存处理、和提供默认实现的默认拦截器。 +* Decoder,Encoder:用于请求的编码和解码。 +* Feign:是一个http请求调用的轻量级框架,声明式WebService客户端程序,用于Linkis-RPC底层通信。 +* Listener:监听模块,主要用于监听广播请求。 + + + +## 2. 实现 + +基于请求调用方的Sender体系和请求接收方的Receiver体系,构成了Linkis RPC的全部架构。 +![](/Images/Architecture/RPC-01.png) + +### 2.1 发送端 +Linkis RPC作为底层的通信层,发送端无需调用者写任何的实际代码。 + +- 调用者通过调用Linkis RPC提供的SDK,通过微服务名(Service Name)或指定微服务实例(微服务名+微服务实例的IP和端口),获取一个Sender发送器。 + +Sender提供的可使用方法,见如下伪代码: +``` +abstract class Sender { + Object ask(Object message); + Object ask(Object message, Duration timeout); + void send(Object message); + void deliver(Object message); +} + +其中: +1. ask方法为同步请求响应方法,要求接收端必须同步返回响应; +2. send方法为同步请求方法,只负责同步将请求发送给接收端,不要求接收端给出答复; +3. deliver则为异步请求方法,只要发送端的进程不异常退出,在稍后会通过其它线程将请求发送给接收端。 +``` + +- 调用者作为发送端,通过Sender发送器提供的请求方法,发送请求给接收端。 +- Sender发送器会将调用者的请求传递给拦截器,进行一系列发送前的逻辑处理。 + +拦截器拦截请求,开始对请求做额外的功能性处理: + +**广播拦截器** +``` +org.apache.linkis.rpc.interceptor.common.BroadcastRPCInterceptor +``` +广播拦截器只对需要进行广播的请求生效。 +广播拦截器会提供特殊的广播接口,如果本次请求实现了该广播接口,且该请求不是正在广播中,广播拦截器则认为本次请求需要进行广播,这时会触发广播操作。 + +**重试拦截器** + +``` +org.apache.linkis.rpc.interceptor.common.RetryableRPCInterceptor +``` + +重试拦截器会对接下来的所有步骤提供重试功能。 +如果接收端要求重试,或者发送请求时出现了ConnectException(连接异常),或者调用者指定某些异常需要重试,这时重试拦截器会自动进行重试。 + + +**缓存拦截器** +``` +org.apache.linkis.rpc.interceptor.common.CacheableRPCInterceptor +``` + +缓存拦截器是针对一些响应内容不大可能经常变动的同步请求而设定的。 +缓存拦截器也会提供特殊的缓存接口,如果本次请求实现了缓存接口,会首先在缓存拦截器中寻找缓存,不存在缓存才会继续请求,并在拿到响应后,先将响应缓存起来,再将响应返回。 + +**公共默认拦截器** +``` +org.apache.linkis.rpc.interceptor.common.CommonRPCInterceptor +``` + + +公共默认拦截器用于调用接下来的处理步骤(示例参考:org.apache.linkis.rpc.BaseRPCSender#ask) + + +- 请求编码器会先将用户请求的数据(实体Bean)转换成序列化的JSON字符串,然后传递给Feign客户端生成器。 +- Feign客户端生成器,生成可访问接收端Restful请求接收器的Feign客户端。 +- 生成的Feign客户端,会调用Eureka客户端,获取所有微服务列表,通过服务选择器,如果调用者指定微服务名,则通过Feign的负载均衡策略, + 选择一个合适的接收方微服务实例进行请求转发,否则服务选择器会重写Spring Cloud Feign的FeignLoadBalancer(Feign负载均衡器), + 在创建LoadBalancerCommand时,请求调用者指定的微服务实例(微服务名+微服务实例address)。 + 调用Feign客户端,开始请求接收端的Restful请求接收器。 + +**自定义拦截器** + +调用者也可以自己实现自定义拦截器(在linkis-commons/linkis-rpc/src/main/scala/org/apache/linkis/rpc/interceptor/common下实现RPCInterceptor接口,并通过@Component注入),用于实现一些特定的功能。 + +### 2.2 接收端 +接收端需要调用者**实现Receiver接口**,用于处理真正的业务逻辑。 +- 1. RPCReceiveRestful请求接收器作为Linkis RPC内嵌的HTTP请求Web Service服务,负责接收发送端的请求 +- 2. RPCReceiveRestful请求接收器接收到请求后,先调用请求解码器对请求进行解码,解析出实际的请求信息和发送端微服务信息(微服务名+微服务实例的IP和端口),如果解析失败,会直接响应解析请求失败。 +- 3. 将解析后的请求信息和发送端微服务信息放入请求消息队列; +- 4. 请求消费器会消费请求消息队列里,已经解码的发送端请求。 +- 5. 通过调用Receiver管理器获取一个合适的Receiver;同时通过发送端微服务信息,使用Sender生成器生成一个指向发送端的Sender。 然后请求消费器将实际的请求信息和生成的发送端Sender,传给Receiver进行处理。 +- 6. Receiver作为用户请求的实际处理单元,要求调用者必须实现Receiver接口,完成对调用端请求的实际处理逻辑。 +``` +Receiver的伪代码如下: +public interface Receiver { + void receive(Object message, Sender sender); + Object receiveAndReply(Object message, Sender sender); + Object receiveAndReply(Object message, Duration duration, Sender sender); +} +``` +Receiver提供了处理同步请求和异步请求的方法。 +- 如果本次请求是异步请求,则调用Receiver的receive方法,由上层业务决定是否需要通过发送端的Sender回传响应。 +- 如果本次请求是同步请求,则调用 Receiver的receiveAndReply方法,将返回值作为响应结果,回传发送端。 + + + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/variable.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/variable.md new file mode 100644 index 00000000000..ebcca3464c6 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/commons/variable.md @@ -0,0 +1,102 @@ +--- +title: 自定义变量设计 +sidebar_position: 1 +--- + +## 1. 总述 +### 需求 +1. 用户希望Linkis能够提供一些公共变量然后执行的时候进行替换,比如用户每天都会批量跑同一段sql,需要指定上一天的分区时间,如果基于sql去写会比较复杂如果系统提供一个run_date的变量将会非常方便使用。 +2. 用户希望Linkis支持date pattern计算,支持在代码中写&{YYYY-MM-DD}等变量计算时间变量 +3. 用户希望自己定义变量,比如定一个一个float变量,然后在代码中进行使用 + +### 目标 +1. 支持任务代码的变量替换 +2. 支持自定义变量,支持用户在脚本和提交给Linkis的任务参数定义自定义变量,支持简单的+,-等计算 +3. 预设置系统变量:run_date,run_month,run_today等系统变量 +4. 支持date pattern变量,支持pattern的+,-操作 + +## 2. 总体设计 +     在Linkis任务执行过程中自定义变量在Entrance进行,主要通过Entrance在任务提交执行前的拦截器进行拦截替换实现,通过正则表达式获取到任务代码中使用到的变量和定义的变量,并通过任务传入的自定义变量初始值完成代码的替换,变成最终可以执行的代码。 + +### 2.1 技术架构 +     自定义变量整体架构如下,用于任务提交过来后,会经过变量替换拦截器。首先会解析出所有代码中用到的变量和表达式,然后通过和系统以及用户自定义的变量初始值进行替换,最终将解析后的代码提交给EngineConn执行。所以到底层引擎已经是替换好的代码。 + +![arc](/Images/Architecture/Commons/var_arc.png) + +备注:变量和解析的功能因为比较通用,抽成工具类定义在linkis-commons中:org.apache.linkis.common.utils.VariableUtils + +### 2.2 业务架构 +     此次的特性主要是为了完成变量替换的解析、计算、替换功能,主要涉及到linkis的Entrance模块做代码拦截和Linkis-commons模块定义的变量替换的工具类: + +| 组件名| 一级模块 | 二级模块 | 功能点 | +|---|---|---|---| +| Linkis | CG | Entrance|拦截任务的代码并调用linkis-common的VariableUtils进行代码替换| +| Linkis | Linkis-commons | linkis-common|提供变量、解析、计算的工具类VariableUtils| + +## 3. 模块设计 +### 3.1核心执行流程 +[输入端] 输入端为代码和代码类型(python/sql/scala/sh). +[处理流程] Entrance在接受到任务后会首先进过拦截器,启动变量拦截器会完成变量的解析、替换、计算 +整体时序图如下: + +![time](/Images/Architecture/Commons/var_time.png) + +这里需要说明的是: +1. 自定义变量和系统变量使用方式为${},如${run_date} +2. date pattern变量的使用方式为&{},如&{yyyy-01-01} 值为2022-01-01。 + 之所以分成两种不同的方式是为了防止自定义变量定义的字符串中包含pattern字符,如定义了一个y=1的自定义变量可能代表不同的含义,会被pattern任务是年变量 + + +### 3.2具体细节: +1、run_date为核心自带日期变量,支持用户自定义日期,如果不指定默认为当前系统时间的前一天。 +2、其他衍生内置日期变量定义:其他日期内置变量都是相对run_date计算出来的,一旦run_date变化,其他变量值也会自动跟着变化,其他日期变量不支持设置初始值,只能通过修改run_date进行修改。 +3、内置变量支持更加丰富的使用场景:${run_date-1}为run_data的前一天;${run_month_begin-1}为run_month_begin的上个月的第一天,这里的-1表示减一个月。 +4、Pattern类型变量也是基于run_date进行计算,然后再进行替换和+— + +### 3.3 变量作用域 +在linkis中自定义变量也有作用域,优先级为脚本中定义的变量大于在任务参数中定义的Variable大于内置的run_date变量。任务参数中定义如下: +``` +## restful +{ + "executionContent": {"code": "select \"${f-1}\";", "runType": "sql"}, + "params": { + "variable": {f: "20.1"}, + "configuration": { + "runtime": { + "linkis.openlookeng.url":"http://127.0.0.1:9090" + } + } + }, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.sql"}, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +## java SDK +JobSubmitAction.builder + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) //execute user + .setLabels(labels) + .setVariableMap(varMap) //setVar + .build +``` + +## 4. 接口设计: +主要工具类为: +``` +VariableUtils: +def replace(replaceStr: String): String 替换代码中的变量返回替换后的代码 +def replace(replaceStr: String, variables: util.Map[String, Any]): String 支持传入自定义变量的值,进行替换 +def replace(code: String, runtType: String, variables: util.Map[String, String]): String 支持传入代码类型,按照不同的类型进行替换解析 +``` + + + + + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/_category_.json new file mode 100644 index 00000000000..883115fccbc --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "计算治理服务架构", + "position": 2 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine-conn-manager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine-conn-manager.md new file mode 100644 index 00000000000..535a47e8d33 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine-conn-manager.md @@ -0,0 +1,51 @@ +--- +title: EngineConnManager 架构 +sidebar_position: 2 +--- + +EngineConnManager(ECM):EngineConn的管理器,提供引擎的生命周期管理,同时向RM汇报负载信息和自身的健康状况。 + +### 一、ECM架构 + +![](/Images-zh/Architecture/engine/ecm-01.png) + +### 二、二级模块介绍 + +**Linkis-engineconn-linux-launch** + +引擎启动器,核心类为LinuxProcessEngineConnLauch,用于提供执行命令的指令。 + +**Linkis-engineconn-manager-core** + +ECM的核心模块,包含ECM健康上报、EngineConn健康上报功能的顶层接口,定义了ECM服务的相关指标,以及构造EngineConn进程的核心方法。 + +| 核心顶层接口/类 | 核心功能 | +|---------------------|------------------------------------------| +| EngineConn | 定义了EngineConn的属性,包含的方法和参数 | +| EngineConnLaunch | 定义了EngineConn的启动方法和停止方法 | +| ECMEvent | 定义了ECM相关事件 | +| ECMEventListener | 定义了ECM相关事件监听器 | +| ECMEventListenerBus | 定义了ECM的监听器总线 | +| ECMMetrics | 定义了ECM的指标信息 | +| ECMHealthReport | 定义了ECM的健康上报信息 | +| NodeHealthReport | 定义了节点的健康上报信息 | + +**Linkis-engineconn-manager-server** + +ECM的服务端,定义了ECM健康信息处理服务、ECM指标信息处理服务、ECM注册服务、EngineConn启动服务、EngineConn停止服务、EngineConn回调服务等顶层接口和实现类,主要用于ECM对自己和EngineConn的生命周期管理以及健康信息上报、发送心跳等。 + +模块中的核心Service和功能简介如下: + +| 核心service | 核心功能 | +|---------------------------------|-------------------------------------------------| +| EngineConnLaunchService | 包含生成EngineConn和启动进程的核心方法 | +| BmlResourceLocallizationService | 用于将BML的引擎相关资源下载并生成本地化文件目录 | +| ECMHealthService | 向AM定时上报自身的健康心跳 | +| ECMMetricsService | 向AM定时上报自身的指标状况 | +| EngineConnKillSerivce | 提供停止引擎的相关功能 | +| EngineConnListService | 提供缓存和管理引擎的相关功能 | +| EngineConnCallBackService | 提供回调引擎的功能 | + +ECM构建EngineConn启动流程: + +![](/Images-zh/Architecture/engine/engineconn-01.png) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/_category_.json new file mode 100644 index 00000000000..7d5b0b6f6b9 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "引擎连接器架构", + "position": 5 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/add-an-engine-conn.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/add-an-engine-conn.md new file mode 100644 index 00000000000..f5ae4c565a5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/add-an-engine-conn.md @@ -0,0 +1,114 @@ +--- +title: EngineConn 启动流程 +sidebar_position: 3 +--- + +EngineConn的新增,是Linkis计算治理的计算任务准备阶段的核心流程之一。它主要包括了Client端(Entrance或用户客户端)向LinkisManager发起一个新增EngineConn的请求,LinkisManager为用户按需、按标签规则,向EngineConnManager发起一个启动EngineConn的请求,并等待EngineConn启动完成后,将可用的EngineConn返回给Client的整个流程。 + +如下图所示,接下来我们来详细说明一下整个流程: + +![EngineConn新增流程](/Images-zh/Architecture/EngineConn新增流程/EngineConn新增流程.png) + +## 1. LinkisManager接收客户端请求 + +**名词解释**: + +- LinkisManager:是Linkis计算治理能力的管理中枢,主要的职责为: + 1. 基于多级组合标签,为用户提供经过复杂路由、资源管控和负载均衡后的可用EngineConn; + + 2. 提供EC和ECM的全生命周期管理能力; + + 3. 为用户提供基于多级组合标签的多Yarn集群资源管理功能。主要分为 AppManager(应用管理器)、ResourceManager(资源管理器)、LabelManager(标签管理器)三大模块,能够支持多活部署,具备高可用、易扩展的特性。 + +    AM模块接收到Client的新增EngineConn请求后,首先会对请求做参数校验,判断请求参数的合法性;其次是通过复杂规则选中一台最合适的EngineConnManager(ECM),以用于后面的EngineConn启动;接下来会向RM申请启动该EngineConn需要的资源;最后是向ECM请求创建EngineConn。 + +下面将对四个步骤进行详细说明。 + +### 1.1 请求参数校验 + +    AM模块在接受到引擎创建请求后首先会做参数判断,首先会做请求用户和创建用户的权限判断,接着会对请求带上的Label进行检查。因为在AM后续的创建流程当中,Label会用来查找ECM和进行资源信息记录等,所以需要保证拥有必须的Label,现阶段一定需要带上的Label有UserCreatorLabel(例:hadoop-IDE)和EngineTypeLabel(例:spark-2.4.3)。 + +### 1.2 EngineConnManager(ECM)选择 + +    ECM选择主要是完成通过客户端传递过来的Label去选择一个合适的ECM服务去启动EngineConn。这一步中首先会通过LabelManager去通过客户端传递过来的Label去注册的ECM中进行查找,通过按照标签匹配度进行顺序返回。在获取到注册的ECM列表后,会对这些ECM进行规则选择,现阶段已经实现有可用性检查、资源剩余、机器负载等规则。通过规则选择后,会将标签最匹配、资源最空闲、负载低的ECM进行返回。 + +### 1.3 EngineConn资源申请 + +1. 在获取到分配的ECM后,AM接着会通过调用EngineConnPluginServer服务请求本次客户端的引擎创建请求会使用多少的资源,这里会通过封装资源请求,主要包含Label、Client传递过来的EngineConn的启动参数、以及从Configuration模块获取到用户配置参数,通过RPC调用ECP服务去获取本次的资源信息。 + +2. EngineConnPluginServer服务在接收到资源请求后,会先通过传递过来的标签找到对应的引擎标签,通过引擎标签选择对应引擎的EngineConnPlugin。然后通过EngineConnPlugin的资源生成器,对客户端传入的引擎启动参数进行计算,算出本次申请新EngineConn所需的资源,然后返回给LinkisManager。 + + **名词解释:** +- EgineConnPlugin:是Linkis对接一个新的计算存储引擎必须要实现的接口,该接口主要包含了这种EngineConn在启动过程中必须提供的几个接口能力,包括EngineConn资源生成器、EngineConn启动命令生成器、EngineConn引擎连接器。具体的实现可以参考Spark引擎的实现类:[SparkEngineConnPlugin](https://github.com/apache/linkis/blob/master/linkis-engineconn-plugins/spark/src/main/scala/com/webank/wedatasphere/linkis/engineplugin/spark/SparkEngineConnPlugin.scala)。 + +- EngineConnPluginServer:是加载了所有的EngineConnPlugin,对外提供EngineConn的所需资源生成能力和EngineConn的启动命令生成能力的微服务。 + +- EngineConnPlugin资源生成器(EngineConnResourceFactory):通过传入的参数,计算出本次EngineConn启动时需要的总资源。 + +- EngineConn启动命令生成器(EngineConnLaunchBuilder):通过传入的参数,生成该EngineConn的启动命令,以提供给ECM去启动引擎。 +3. AM在获取到引擎资源后,会接着调用RM服务去申请资源,RM服务会通过传入的Label、ECM、本次申请的资源,去进行资源判断。首先会判断客户端对应Label的资源是否足够,然后再会判断ECM服务的资源是否足够,如果资源足够,则本次资源申请通过,并对对应的Label进行资源的加减。 + +### 1.4 请求ECM创建引擎 + +1. 在完成引擎的资源申请后,AM会封装引擎启动的请求,通过RPC发送给对应的ECM进行服务启动,并获取到EngineConn的实例对象; +2. AM接着会去通过EngineConn的上报信息判断EngineConn是否启动成功变成可用状态,如果是就会将结果进行返回,本次新增引擎的流程也就结束。 + +## 2. ECM启动EngineConn + +名词解释: + +- EngineConnManager(ECM):EngineConn的管理器,提供引擎的生命周期管理,同时向RM汇报负载信息和自身的健康状况。 + +- EngineConnBuildRequest:LinkisManager传递给ECM的启动引擎命令,里面封装了该引擎的所有标签信息、所需资源和一些参数配置信息。 + +- EngineConnLaunchRequest:包含了启动一个EngineConn所需的BML物料、环境变量、ECM本地必需环境变量、启动命令等信息,让ECM可以依此构建出一个完整的EngineConn启动脚本。 + +ECM接收到LinkisManager传递过来的EngineConnBuildRequest命令后,主要分为三步来启动EngineConn:1. 请求EngineConnPluginServer,获取EngineConnPluginServer封装出的EngineConnLaunchRequest;2. 解析EngineConnLaunchRequest,封装成EngineConn启动脚本;3. 执行启动脚本,启动EngineConn。 + +### 2.1 EngineConnPluginServer封装EngineConnLaunchRequest + +通过EngineConnBuildRequest的标签信息,拿到实际需要启动的EngineConn类型和对应版本,从EngineConnPluginServer的内存中获取到该EngineConn类型的EngineConnPlugin,通过该EngineConnPlugin的EngineConnLaunchBuilder,将EngineConnBuildRequest转换成EngineConnLaunchRequest。 + +### 2.2 封装EngineConn启动脚本 + +ECM获取到EngineConnLaunchRequest之后,将EngineConnLaunchRequest中的BML物料下载到本地,并检查EngineConnLaunchRequest要求的本地必需环境变量是否存在,校验通过后,将EngineConnLaunchRequest封装成一个EngineConn启动脚本 + +### 2.3 执行启动脚本 + +目前ECM只对Unix系统做了Bash命令的支持,即只支持Linux系统执行该启动脚本。 + +启动前,会通过sudo命令,切换到对应的请求用户去执行该脚本,确保启动用户(即JVM用户)为Client端的请求用户。 + +执行该启动脚本后,ECM会实时监听脚本的执行状态和执行日志,一旦执行状态返回非0,则立马向LinkisManager汇报EngineConn启动失败,整个流程完成;否则则一直监听启动脚本的日志和状态,直到该脚本执行完成。 + +## 3. EngineConn初始化 + +ECM执行了EngineConn的启动脚本后,EngineConn微服务正式启动。 + +名词解释: + +- EngineConn微服务:指包含了一个EngineConn、一个或多个Executor,用于对计算任务提供计算能力的实际微服务。我们说的新增一个EngineConn,其实指的就是新增一个EngineConn微服务。 + +- EngineConn:引擎连接器,是与底层计算存储引擎的实际连接单元,包含了与实际引擎的会话信息。它与Executor的差别,是EngineConn只是起到一个连接、一个客户端的作用,并不真正的去执行计算。如SparkEngineConn,其会话信息为SparkSession。 + +- Executor:执行器,作为真正的计算存储场景执行器,是实际的计算存储逻辑执行单元,对EngineConn各种能力的具体抽象,提供交互式执行、订阅式执行、响应式执行等多种不同的架构能力。 + +EngineConn微服务的初始化一般分为三个阶段: + +1. 初始化具体引擎的EngineConn。先通过Java main方法的命令行参数,封装出一个包含了相关标签信息、启动信息和参数信息的EngineCreationContext,通过EngineCreationContext初始化EngineConn,完成EngineConn与底层Engine的连接建立,如:SparkEngineConn会在该阶段初始化一个SparkSession,用于与一个Spark application建立了连通关系。 + +2. 初始化Executor。EngineConn初始化之后,接下来会根据实际的使用场景,初始化对应的Executor,为接下来的用户使用,提供服务能力。比如:交互式计算场景的SparkEngineConn,会初始化一系列可以用于提交执行SQL、PySpark、Scala代码能力的Executor,支持Client往该SparkEngineConn提交执行SQL、PySpark、Scala等代码。 + +3. 定时向LinkisManager汇报心跳,并等待EngineConn结束退出。当EngineConn对应的底层引擎异常、或是超过最大空闲时间、或是Executor执行完成、或是用户手动kill时,该EngineConn自动结束退出。 + +---- + +到了这里,EngineConn的新增流程就基本结束了,最后我们再来总结一下EngineConn的新增流程: + +- 客户端向LinkisManager发起新增EngineConn的请求; + +- LinkisManager校验参数合法性,先是根据标签选择合适的ECM,再根据用户请求确认本次新增EngineConn所需的资源,向LinkisManager的RM模块申请资源,申请通过后要求ECM按要求启动一个新的EngineConn; + +- ECM先请求EngineConnPluginServer获取一个包含了启动一个EngineConn所需的BML物料、环境变量、ECM本地必需环境变量、启动命令等信息的EngineConnLaunchRequest,然后封装出EngineConn的启动脚本,最后执行启动脚本,启动该EngineConn; + +- EngineConn初始化具体引擎的EngineConn,然后根据实际的使用场景,初始化对应的Executor,为接下来的用户使用,提供服务能力。最后定时向LinkisManager汇报心跳,等待正常结束或被用户终止。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-metrics.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-metrics.md new file mode 100644 index 00000000000..e5fa561def5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-metrics.md @@ -0,0 +1,77 @@ +--- +title: EngineConn Metrics 上报特性 +sidebar_position: 5 +tags: [Feature] +--- + + +## 1. 功能需求 +### 1.1 需求背景 + 上报信息缺少引擎信息、以及上报的资源和进度接口有冗余,降低了性能,需要对其进行优化调整,并且在上报协议中增加扩展模块。 + +### 1.2 目标 +- 增加了包含资源、进度、额外信息的RPC 协议,支持在一次请求中上报这些信息 +- 重构已有的资源、进度上报的链路,将上报相关信息的动作合并为一个请求 + +## 2. 总体设计 + +本次需求涉及`linkis-entrance、linkis-computation-orchestrator、linkis-orchestrator-ecm-plugin、linkis-computation-engineconn`模块。在`computation-engineconn`模块添加和重构上报信息,并且在entrance端解析这些信息和入库。 + +### 2.1 技术架构 + +引擎信息上报架构如图所示。用户提交任务到entrance后,entrance向linkismanager申请引擎。 +申请到引擎后,向EngineConn提交任务,并接收任务的定时上报(资源、进度、状态)。直到任务执行完毕,entrance在用户查询时返回最终结果。 +本次需求修改,需要在entrance中新增引擎metrics信息入库; +在Orchestrator中将Resource和Progress接口信息合并,并且增加metrics等额外信息; +在交互式引擎ComputationEngineConn端将上报的资源和进度信息合并,并且额外上报引擎统计信息。 + +![engineconn-mitrics-1.png](/Images-zh/Architecture/EngineConn/engineconn-mitrics-1.png) + + +### 2.2 业务架构 +此次特性涉及功能点模块如下: + +| 一级模块 | 二级模块 | 功能点 | +| :------------ | :------------ | :------------ | +| Entrance | | 合并资源和进度接口;解析新增引擎metrics | +| Orchestrator | orchestrator-core | 合并资源和进度接口;处理TaskRunningInfo消息 | +| Orchestrator | orchestrator-plugin-ecm | 合并监听引擎信息的资源和进度接口 | +| Orchestrator | computation-engineconn | 合并资源和进度的上报接口;新增上报引擎示例metrics | + + +## 3. 模块设计 +### 核心执行流程 +- [输入端]输入端为交互式引擎端`computation-engineconn`。引擎在执行任务时,上报运行信息`TaskRunningInfo`,包含原有的`TaskProgressInfo`和`TaskResourceInfo`,新增了引擎示例信息和引擎现有任务数信息。 +- [处理流程]`orchestrator-plugin-ecm`负责监听引擎运行任务时的上报信息,接收上报信息,并生成`TaskRunningInfoEvent`异步消息, +发给`OrchestratorAsyncListenerBus`处理。注册到`OrchestratorAsyncListener`的`TaskRunningInfoListener`收到消息,触发`listener`方法,回调到`Entrance`的Job的`TaskRunningInfo`回调方法。 +回调方法解析出`TaskRunningInfo`中的资源、进度、引擎`metrancs`信息,分别进行持久化。 + +![engineconn-mitrics-2.png](/Images-zh/Architecture/EngineConn/engineconn-mitrics-2.png) + +## 4. 数据结构 + +需求新增了`RPC protocol TaskRunningInfo` ,无新增db表 + +## 5. 接口设计 +无对外接口 + +## 6. 非功能性设计: +### 6.1 安全 +RPC接口内部鉴权,不涉及对外安全问题 + +### 6.2 性能 +合并了两个RPC接口,减少上报次数,提升了性能 + +### 6.3 容量 +metrics信息较少,无影响 + +### 6.4 高可用 +不涉及 + + + + + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-plugin.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-plugin.md new file mode 100644 index 00000000000..1ab526636e9 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-plugin.md @@ -0,0 +1,73 @@ +--- +title: EngineConnPlugin 服务架构 +sidebar_position: 6 +--- + +引擎连接器插件是一种能够动态加载引擎连接器并减少版本冲突发生的实现,具有方便扩展、快速刷新、选择加载的特性。为了能让开发用户自由扩展Linkis的Engine引擎,并动态加载引擎依赖避免版本冲突,设计研发了EngineConnPlugin,允许以实现既定的插件化接口的方式引入新引擎到计算中间件的执行生命周期里, +插件化接口对引擎的定义做了拆解,包括参数初始化、分配引擎资源,构建引擎连接以及设定引擎默认标签。 + +一、ECP架构图 + +![](/Images-zh/Architecture/linkis-engineConnPlugin-01.png) + +二级模块介绍: +============== + +EngineConn-Plugin-Server +------------------------ + +引擎连接器插件服务是对外提供注册插件、管理插件,以及插件资源构建的入口服务。成功注册加载的引擎插件会包含资源分配和启动参数配置的逻辑,在引擎初始化过程中,EngineConn +Manager等其他服务通过RPC请求调用Plugin Server里对应插件的逻辑。 + +| 核心类 | 核心功能 | +|----------------------------------|---------------------------------------| +| EngineConnLaunchService | 负责构建引擎连接器启动请求 | +| EngineConnResourceFactoryService | 负责生成引擎资源 | +| EngineConnResourceService | 负责从BML下载引擎连接器使用的资源文件 | + + +EngineConn-Plugin-Loader 引擎连接器插件加载器 +--------------------------------------- + +引擎连接器插件加载器是用来根据请求参数动态加载引擎连接器插件的加载器,并具有缓存的特性。具体加载流程主要由两部分组成:1)插件资源例如主程序包和程序依赖包等加载到本地(未开放)。2)插件资源从本地动态加载入服务进程环境中,例如通过类加载器加载入JVM虚拟机。 + +| 核心类 | 核心功能 | +|---------------------------------|----------------------------------------------| +| EngineConnPluginsResourceLoader | 加载引擎连接器插件资源 | +| EngineConnPluginsLoader | 加载引擎连接器插件实例,或者从缓存加载已有的 | +| EngineConnPluginClassLoader | 动态从jar中实例化引擎连接器实例 | + +EngineConn-Plugin-Cache 引擎插件缓存模组 +---------------------------------------- + +引擎连接器插件缓存是专门用来缓存已经加载的引擎连接器的缓存服务,并支持读取、更新、移除的能力。已经加载进服务进程的插件会被连同其类加载器一起缓存起来,避免多次加载影响效率;同时缓存模组会定时通知加载器去更新插件资源,如果发现有变动,会重新加载并自动刷新缓存。 + +| 核心类 | 核心功能 | +|-----------------------------|------------------------------| +| EngineConnPluginCache | 缓存已经加载的引擎连接器实例 | +| RefreshPluginCacheContainer | 定时刷新缓存的引擎连接器 | + +EngineConn-Plugin-Core:引擎连接器插件核心模组 +--------------------------------------------- + +引擎连接器插件核心模块是引擎连接器插件的核心模块。包含引擎插件基本功能实现,如引擎连接器启动命令构建,引擎资源工厂构建和引擎连接器插件核心接口实现。 + +| 核心类 | 核心功能 | +|-------------------------|----------------------------------------------------------| +| EngineConnLaunchBuilder | 构建引擎连接器启动请求 | +| EngineConnFactory | 创建引擎连接器 | +| EngineConnPlugin | 引擎连接器插件实现接口,包括资源,命令,实例的构建方法。 | +| EngineResourceFactory | 引擎资源的创建工厂 | + +EngineConn-Plugins:引擎连接插件集合 +----------------------------------- + +引擎连接插件集合是用来放置已经基于我们定义的插件接口实现的默认引擎连接器插件库。提供了默认引擎连接器实现,如jdbc、spark、python、shell等。用户可以基于自己的需求参考已经实现的案例,实现更多的引擎连接器。 + +| 核心类 | 核心功能 | +|---------------------|------------------| +| engineplugin-jdbc | jdbc引擎连接器 | +| engineplugin-shell | shell引擎连接器 | +| engineplugin-spark | spark引擎连接器 | +| engineplugin-python | python引擎连接器 | + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn.md new file mode 100644 index 00000000000..c215f424a18 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn.md @@ -0,0 +1,141 @@ +--- +title: EngineConn 架构 +sidebar_position: 1 +--- + + +## 1.总述 + +EngineConn:引擎连接器,用于连接底层的计算存储引擎,完成任务的执行、任务信息推送和结果返回等,是Linkis提供计算存储能力的基础。 + +## 2. 总体设计 + + EngineConn的整体设计思路,启动的时候会完成底层引擎Session信息的获取和存储,完成EngineConn进程和底层引擎的连接,然后通过Executor执行器单元完成任务的调度到EngineConn存储的底层引擎Session中进行执行,并获取执行相关的信息。 + +### 2.1 技术架构 + +**关名词介绍:** + +**EngineConn:** 用于存储底层引擎的Session信息。来完成和底层引擎的连接,例如Spark引擎存储的是SparkSession。 + +**Executor:**用于接受调用方(如:Entrance)传过来的任务的调度执行器,并将任务最终提交给底层的引擎Session进行执行,不同的任务实现不同的Executor类。使用最多的是交互式ComputationExecutor,用于接受任务并实时推送任务信息给到调用方。以及非交互式的只接受一次任务的ManageableOnceExecutor,用于完成对EngineConn启动的任务的提交执行。 + +![arc](/Images/Architecture/engine/ec_arc_01.png) + +### 2.2 业务架构 + +|组件名|一级模块|二级模块|功能点| +|:----|:----|:----|:----| +|Linkis|EngineConn|linkis-engineconn-common|引擎连接器的通用模块,定义了引擎连接器中最基础的实体类和接口。| +|Linkis|EngineConn|linkis-engineconn-core|引擎连接器的核心模块,定义了EngineConn的核心逻辑涉及的接口。| +|Linkis|EngineConn|linkis-executor-core|执行器的核心模块,定义了执行器相关的核心类。| +|Linkis|EngineConn|linkis-accessible-executor|能够被访问的Executor底层抽象。可以通过RPC请求与它交互,从而获取它的状态、负载、并发等基础指标Metrics数据| +|Linkis|EngineConn|linkis-computation-engineconn|提供交互式计算任务能力的相关类。| + +## 3. 模块设计 + +输入:调用方执行任务 + +输出:返回执行状态、结果、日志等任务信息 + +关键逻辑:任务执行的关键逻辑的时序图 + +![time](/Images/Architecture/engine/ec_arc_02.png) + +关键说明: + +1. 如果是串行Executor,EngineConn接收到任务后就会将EngineConn标记为Busy状态,不能再接受其他任务,并且会判断任务的锁是否一致,防止EngineConn被多个调用方同时提交的情况。任务执行完变成Unlock状态 +2. 如果是并行的Executor,EngineConn接收到任务后,状态还是Unlock状态,可以继续接受任务,只有当达到任务并发数或者机器指标异常才会标记为Busy状态 +3. 如果是Once类型任务,EngineConn启动后就会自动执行任务,任务执行结束EngineConn进程退出 + +## 4. 数据结构/存储设计 + +不涉及 + +## 5. 接口设计 + +**其他类简要介绍:** + +linkis-engineconn-common引擎连接器的通用模块,定义了引擎连接器中最基础的实体类和接口。 + +|核心Service|核心功能| +|:----|:----| +|EngineCreationContext|包含了EngineConn在启动期间的上下文信息| +|EngineConn|包含了EngineConn的具体信息,如类型、与层计算存储引擎的具体连接信息等| +|EngineExecution|提供Executor的创建逻辑| +|EngineConnHook|定义引擎启动各个阶段前后的操作| + +linkis-engineconn-core引擎连接器的核心模块,定义了EngineConn的核心逻辑涉及的接口。 + +|核心类|核心功能| +|:----|:----| +|EngineConnManager|提供创建、获取EngineConn的相关接口| +|ExecutorManager|提供创建、获取Executor的相关接口| +|ShutdownHook|定义引擎关闭阶段的操作| +|EngineConnServer|EngineConn微服务的启动类| + +linkis-executor-core执行器的核心模块,定义了执行器相关的核心类。执行器是真正的计算执行单元,负责将用户代码提交给EngineConn进行执行。 + +|核心类|核心功能| +|:----|:----| +|Executor|是实际的计算逻辑执行单元,并提供对引擎各种能力的顶层抽象。| +|EngineConnAsyncEvent|定义了EngineConn相关的异步事件| +|EngineConnSyncEvent|定义了EngineConn相关的同步事件| +|EngineConnAsyncListener|定义了EngineConn相关异步事件监听器| +|EngineConnSyncListener|定义了EngineConn相关同步事件监听器| +|EngineConnAsyncListenerBus|定义了EngineConn异步事件的监听器总线| +|EngineConnSyncListenerBus|定义了EngineConn同步事件的监听器总线| +|ExecutorListenerBusContext|定义了EngineConn事件监听器的上下文| +|LabelService|提供标签上报功能| +|ManagerService|提供与LinkisManager进行信息传递的功能| + +linkis-accessible-executor:能够被访问的Executor底层抽象。可以通过RPC请求与它交互,从而获取它的状态、负载、并发等基础指标Metrics数据。 + +|核心类|核心功能| +|:----|:----| +|LogCache|提供日志缓存的功能| +|AccessibleExecutor|能够被访问的Executor,可以通过RPC请求与它交互。| +|NodeHealthyInfoManager|管理Executor的健康信息| +|NodeHeartbeatMsgManager|管理Executor的心跳信息| +|NodeOverLoadInfoManager|管理Executor的负载信息| +|Listener相关|提供与Executor相关的事件以及对应的监听器定义| +|EngineConnTimedLock|定义Executor级别的锁| +|AccessibleService|提供Executor的启停、状态获取功能| +|ExecutorHeartbeatService|提供Executor的心跳相关功能| +|LockService|提供锁管理功能| +|LogService|提供日志管理功能| +|EngineConnCallback|定义EngineConn的回调逻辑| + +提供交互式计算任务能力的相关类。 + +|核心类|核心功能| +|:----|:----| +|EngineConnTask|定义了提交给EngineConn的交互式计算任务| +|ComputationExecutor|定义了交互式Executor,具备状态查询、任务kill等交互式能力,默认每次只能执行一次任务。| +|ConcurrentComputationExecutor|交互式同步并发Executor,继承于ComputationExecutor,但是支持同时执行多个任务| +|AsyncConcurrentComputationExecutor|交互式异步并发Executor,继承ComputationExecutor,支持同时执行多个任务,并且任务不占用执行线程采用异步通知的形式| +|TaskExecutionService|提供对交互式计算任务的管理功能| + + +## 6. 非功能性设计 + +### 6.1 安全 + +1. 任务所有相关的信息,只能提交用户才能进行查询 +2. EngineConn进程的默认启动用户为提交用户 +### 6.2 性能 + +支持并发的EngineConn支持同事并发跑大量任务,如单个trino的EngineConn可以同时跑300多个trino任务 + +### 6.3 容量 + +不涉及 + +### 6.4 高可用 + +EngineConn是按需、按任务启动的进程。支持高可用 + +### 6.5 数据质量 + +不涉及 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/entrance.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/entrance.md new file mode 100644 index 00000000000..84130e6aa51 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/entrance.md @@ -0,0 +1,28 @@ +--- +title: 入口服务 Entrance 架构 +sidebar_position: 3 +--- + +Linkis任务提交入口是用来负责计算任务的接收、调度、转发执行请求、生命周期管理的服务,并且能把计算结果、日志、进度返回给调用方,是从Linkis0.X的Entrance拆分出来的原生能力。 + +一、Entrance架构图 + +![](/Images-zh/Architecture/linkis-entrance-01.png) + +**二级模块介绍:** + +EntranceServer +-------------- + +EntranceServer计算任务提交入口服务是Entrance的核心服务,负责Linkis执行任务的接收、调度、执行状态跟踪、作业生命周期管理等。主要实现了把任务执行请求转成可调度的Job,调度、申请Executor执行,Job状态管理,结果集管理,日志管理等。 + +| 核心类 | 核心功能 | +|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| +| EntranceInterceptor | Entrance拦截器用来对传入参数task进行信息的补充,使得这个task的内容更加完整, 补充的信息包括: 数据库信息补充、自定义变量替换、代码检查、limit限制等 | +| EntranceParser | Entrance解析器用来把请求参数Map解析成Task,也可以将Task转成可调度的Job,或者把Job转成可存储的Task。 | +| EntranceExecutorManager | Entrance执行器管理为EntranceJob的执行创建Executor,并维护Job和Executor的关系,且支持Job请求的标签能力 | +| PersistenceManager | 持久化管理负责作业相关的持久化操作,如结果集路径、作业状态变化、进度等存储到数据库。 | +| ResultSetEngine | 结果集引擎负责作业运行后的结果集存储,以文件的形式保存到HDFS或者本地存储目录。 | +| LogManager | 日志管理负责作业日志的存储并对接日志错误码管理。 | +| Scheduler | 作业调度器负责所有Job的调度执行,主要通过调度作业队列实现。 | +| | | diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-cli.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-cli.md new file mode 100644 index 00000000000..9ce64d01bd6 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-cli.md @@ -0,0 +1,38 @@ +--- +title: Linkis Client 架构设计 +sidebar_position: 2 +--- + +为用户提供向Linkis提交执行任务的轻量级客户端。 + +#### Linkis-Client架构图 + +![img](/Images-zh/Architecture/linkis-client-01.png) + + + +#### 二级模块介绍 + +##### Linkis-Computation-Client + +以SDK的形式为用户提供向Linkis提交执行任务的接口。 + +| 核心类 | 核心功能 | +| ---------- | ------------------------------------------------ | +| Action | 定义了请求的属性,包含的方法和参数 | +| Result | 定义了返回结果的属性,包含的方法和参数 | +| UJESClient | 负责请求的提交,执行,状态、结果和相关参数的获取 | + + + +##### Linkis-Cli + +以shell命令端的形式为用户提供向Linkis提交执行任务的方式。 + +| 核心类 | 核心功能 | +| ----------- | ------------------------------------------------------------ | +| Common | 定义了指令模板父类、指令解析实体类、任务提交执行各环节的父类和接口 | +| Core | 负责解析输入、任务执行和定义输出方式 | +| Application | 调用linkis-computation-client执行任务,并实时拉取日志和最终结果 | + + \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/_category_.json new file mode 100644 index 00000000000..2682d5e9e76 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Manager 架构", + "position": 4 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/app-manager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/app-manager.md new file mode 100644 index 00000000000..a7ce769b7f9 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/app-manager.md @@ -0,0 +1,49 @@ +--- +title: AppManager 架构 +sidebar_position: 1 +--- + +## 背景 +针对旧版本Linkis的Entrance模块负责太多的职责,对Engine的管理能力较弱,且不易于后续的扩展,新抽出了AppManager模块,完成 +以下职责: +1. 新增AM模块将Entrance之前做的管理Engine的功能移动到AM模块 +2. AM需要支持操作Engine,包括:新增、复用、回收、预热、切换等功能 +3. 需要对接Manager模块对外提供Engine的管理功能:包括Engine状态维护、引擎列表维护、引擎信息等 +4. AM需要管理EM服务,需要完成EM的注册并将资源注册转发给RM进行EM的资源注册 +5. AM需要对接Label模块,包括EM/Engine的增删需要通知标签管理器进行标签更新 +6. AM另外需要对接标签模块进行标签解析,并需要通过一系列标签获取一些列打好分的serverInstance列表(EM和Engine怎么区分,1、标签完全不一样) +7. 需要对外提供基础接口:包括引擎和引擎管理器的增删改,提供metric查询等 + +## 架构图 + +![](/Images-zh/Architecture/AppManager-03.png) + +如上图所示:AM在LinkisMaster中属于AppManager模块,作为一个Service提供服务 + +新引擎申请流程图: +![](/Images-zh/Architecture/AppManager-02.png) + + +从上面的引擎生命周期流程图可知,Entrance已经不在做Engine的管理工作,engine的启动和管理都由AM控制。 + +## 架构说明: + +AppManager主要包含了引擎服务和EM服务: +引擎服务包含了所有和引擎EngineConn相关的操作,如引擎创建、引擎复用、引擎切换、引擎回收、引擎停止、引擎销毁等。 +EM服务负责所有EngineConnManager的信息管理,可以在线上对ECM进行服务管理,包括标签修改,暂停ECM服务,获取ECM实例信息,获取ECM运行的引擎信息,kill掉ECM操作,还可以根据EM Node的信息查询所有的EngineNode,也支持按用户查找,保存了EM Node的负载信息、节点健康信息、资源使用信息等。 +新的EngineConnManager和EngineConn都支持标签管理,引擎的类型也增加了离线、流式、交互式支持。 + +引擎创建:专门负责LinkisManager服务的新建引擎功能,引擎启动模块完全负责一个新引擎的创建,包括获取ECM标签集合、资源申请、获得引擎启动命令,通知ECM新建引擎,更新引擎列表等。 +CreateEngienRequest->RPC/Rest -> MasterEventHandler ->CreateEngineService -> +->LabelContext/EnginePlugin/RMResourcevice->(RcycleEngineService)EngineNodeManager->EMNodeManager->sender.ask(EngineLaunchRequest)->EngineManager服务->EngineNodeManager->EngineLocker->Engine->EngineNodeManager->EngineFactory=>EngineService=>ServerInstance +在创建引擎是存在和RM交互的部分,EnginePlugin应该需要通过Lables返回具体的资源类型,然后AM向RM发送资源请求 + +引擎复用:为了减少引擎启动所耗费的时间和资源,引擎使用必须优先考虑复用原则,复用一般是指复用用户已经创建好的引擎,引擎复用模块负责提供可复用引擎集合,选举并锁定引擎后开始使用,或者返回没有可以复用的引擎。 +ReuseEngienRequest->RPC/Rest -> MasterEventHandler ->ReuseEngineService ->abelContext->EngineNodeManager->EngineSelector->EngineLocker->Engine->EngineNodeManager->EngineReuser->EngineService=>ServerInstance + +引擎切换:主要是指对已有引擎进行标签切换,例如创建引擎的时候是由Creator1创建的,现在可以通过引擎切换改成Creator2。这个时候就可以允许当前引擎接收标签为Creator2的任务了。 +SwitchEngienRequest->RPC/Rest -> MasterEventHandler ->SwitchEngineService ->LabelContext/EnginePlugin/RMResourcevice->EngineNodeManager->EngineLocker->Engine->EngineNodeManager->EngineReuser->EngineService=>ServerInstance + +引擎管理器:引擎管理负责管理所有引擎的基本信息、元数据信息 + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/engine-conn-history.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/engine-conn-history.md new file mode 100644 index 00000000000..e0164797bfc --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/engine-conn-history.md @@ -0,0 +1,89 @@ +--- +title: EngineConn 历史信息记录特性 +sidebar_position: 4 +tags: [Feature] +--- + +## 1. 功能需求 +### 1.1 需求背景 + 1.1.3版本前,LinkisManager只记录了在运行中的EngineConn的信息和资源使用,但是在任务结束后这些信息就丢失了。如果需要做历史EC的一些统计和查看,或者要去查看已经结束的EC的日志,过于繁琐,因此对于历史EC的记录显得较为重要。 + +### 1.2 目标 +- 完成EC信息和资源信息持久化到DB的存储 +- 支持通过restful接口完成历史EC信息的查看和搜索 +- 支持查看已经结束EC的日志 + +## 2. 总体设计 + +此次特性新增主要修改为LinkisManager下的RM和AM模块,并新增了一种信息记录表。 + +### 2.1 技术架构 +因为此次的实现需要记录EC的信息和资源信息,而资源信息分为请求资源、真实使用资源、释放资源等三个概念,而且都需要进行记录。所以此次实现大体方案是:基于EC在ResourceManager的生命周期去进行实现,在EC完成以上三个阶段时,都加上EC信息的更新操作。整体如下图所示: + +![engineconn-history-01.png](/Images-zh/Architecture/EngineConn/engineconn-history-01.png) + + + +### 2.2 业务架构 + +此次的特性主要是为了完成历史EC的信息记录和支持历史技术EC的日志查看。功能点设计的模块如下: + +| 一级模块 | 二级模块 | 功能点 | +|---|---|---| +| LinkisManager | ResourceManager| 在EC请求资源、上报使用资源、释放资源时完成EC信息的记录| +| LinkisManager | AppManager| 提供list和搜索所有历史EC信息的接口| + +## 3. 模块设计 +### 核心执行流程 + +- [输入端] 输入端主要为创建引擎时的请求资源、引擎启动后上报的真实使用资源、引擎退出时释放资源时输入的信息,主要包括请求的label、资源、EC唯一的ticketid、资源类型等. +- [处理流程] 信息记录service,对输入的数据进行处理,通过标签会解析出对应的引擎信息、用户、creator,以及日志路径。通过资源类型确认是资源请求、使用、释放。接着将这些信息存储到DB中。 + +调用时序图如下: +![engineconn-history-02.png](/Images-zh/Architecture/EngineConn/engineconn-history-02.png) + + +## 4. 数据结构: +```sql +# EC信息资源记录表 +DROP TABLE IF EXISTS `linkis_cg_ec_resource_info_record`; +CREATE TABLE `linkis_cg_ec_resource_info_record` ( + `id` INT(20) NOT NULL AUTO_INCREMENT, + `label_value` VARCHAR(255) NOT NULL COMMENT 'ec labels stringValue', + `create_user` VARCHAR(128) NOT NULL COMMENT 'ec create user', + `service_instance` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'ec instance info', + `ecm_instance` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'ecm instance info ', + `ticket_id` VARCHAR(100) NOT NULL COMMENT 'ec ticket id', + `log_dir_suffix` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'log path', + `request_times` INT(8) COMMENT 'resource request times', + `request_resource` VARCHAR(255) COMMENT 'request resource', + `used_times` INT(8) COMMENT 'resource used times', + `used_resource` VARCHAR(255) COMMENT 'used resource', + `release_times` INT(8) COMMENT 'resource released times', + `released_resource` VARCHAR(255) COMMENT 'released resource', + `release_time` datetime DEFAULT NULL COMMENT 'released time', + `used_time` datetime DEFAULT NULL COMMENT 'used time', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'create time', + PRIMARY KEY (`id`), + KEY (`ticket_id`), + UNIQUE KEY `label_value_ticket_id` (`ticket_id`,`label_value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +``` + +## 5. 接口设计 +引擎历史管理页面API接口,参考文档 管理台添加历史引擎页面 + +## 6. 非功能性设计 + +### 6.1 安全 +不涉及安全问题,restful接口需要登录认证 + +### 6.2 性能 +对引擎生命周期性能影响较小 + +### 6.3 容量 +需要定期进行清理 + +### 6.4 高可用 +不涉及 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/label-manager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/label-manager.md new file mode 100644 index 00000000000..92b8392ab6a --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/label-manager.md @@ -0,0 +1,43 @@ +--- +title: LabelManager 架构 +sidebar_position: 3 +--- + +#### 简述 +LabelManager是Linkis中对上层应用提供标签服务的功能模组,运用标签技术管理集群资源分配、服务节点选举、用户权限匹配以及网关路由转发;包含支持各种自定义Label标签的泛化解析处理工具,以及通用的标签匹配评分器。 + +### 整体架构示意 + +![整体架构示意图](/Images-zh/Architecture/LabelManager/label_manager_global.png) + +#### 架构说明 +- LabelBuilder: 承担着标签解析的工作,从输入的标签类型、关键字或者字符数值中解析得到具体的标签实体,有默认的泛化实现类也可做自定义扩展。 +- LabelEntities: 指代标签实体集合,有且包含集群标签,配置标签,引擎标签,节点标签,路由标签,搜索标签等。 +- NodeLabelService: 实例/节点与标签的关联服务接口类,定义对两者关联关系的增删改查以及根据标签匹配实例/节点的接口方法。 +- UserLabelService: 声明用户与标签的关联操作。 +- ResourceLabelService: 声明集群资源与标签的关联操作,涉及到对组合标签的资源管理,清理或设置标签关联的资源数值。 +- NodeLabelScorer: 节点标签评分器,对应不同的标签匹配算法的实现,使用评分表示节点的标签匹配度。 + +### 一. LabelBuilder解析流程 +以泛化标签解析类GenericLabelBuilder为例,阐明整体流程: +![泛化标签解析流程](/Images-zh/Architecture/LabelManager/label_manager_builder.png) +标签解析/构建的流程概括包含几步: +1. 根据输入选择要构建解析的合适标签类。 +2. 根据标签类的定义信息,递归解析泛型结构,得到具体的标签值类型。 +3. 转化输入值对象到标签值类型,运用隐式转化或正反解析框架。 +4. 根据1-3的返回,实例化标签,并根据不同的标签类进行一些后置操作。 + +### 二. NodeLabelScorer打分流程 +为了根据Linkis用户执行请求中附带的标签列表挑选合适的引擎节点,需要对符合的引擎列表做择优,量化为引擎节点的标签匹配度即评分。 +在标签定义里,每个标签都有feature特征值,分别为CORE,SUITABLE,PRIORITIZED,OPTIONAL,每个特征值都有一个boost值,相当于权重和激励值, +同时有些特征例CORE和SUITABLE为必须唯一特征即在匹配过程中需做强过滤,且一个节点只能分别关联一个CORE/SUITABLE标签。 +根据现有标签,节点,请求附带标签三者之间的关系,可以绘制出如下示意图: +![标签打分](/Images-zh/Architecture/LabelManager/label_manager_scorer.png) + +自带的默认评分逻辑过程应大体包含以下几点步骤: +1. 方法的输入应该为两组网络关系列表,分别是`Label -> Node` 和 `Node -> Label`, 其中`Node -> Label`关系里的Node节点必须具有请求里涉及到所有CORE以及SUITABLE特征的标签,这些节点也称为备选节点。 +2. 第一步遍历计算`Node -> Label`关系列表,遍历每个节点关联的标签Label,这一步先给标签打分,如果标签不是请求中附带的标签,打分为0, +否则打分为: (基本分/该标签对应特征值在请求中的出现次数) * 对应特征值的激励值,其中基本分默认为1,节点的初始分为相关联的标签打分的总和;其中因为CORE/SUITABLE类型标签为必须唯一标签,出现次数恒定为1。 +3. 得到节点的初始分后,第二步遍历计算`Label -> Node`关系,由于第一步中忽略了非请求附带标签对评分的作用,但无关标签比重确实会对评分造成影响,对应这类的标签统一打上UNKNOWN的特征,同样该特征也有相对应的激励值; +我们设定无关标签关联的备选节点占总关联节点的比重越高,对评分的影响越显著,以此可以对第一步得出的节点初始分做进一步累加。 +4. 对得到的备选节点的分数做标准差归一化,并排序。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/overview.md new file mode 100644 index 00000000000..ef78d69c07d --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/overview.md @@ -0,0 +1,80 @@ +--- +title: Linkis Manager 服务架构 +sidebar_position: 5 +--- + + +LinkisManager架构设计 +==================== + +LinkisManager作为Linkis的一个独立微服务,对外提供了AppManager(应用管理)、ResourceManager(资源管理)、LabelManager(标签管理)的能力,能够支持多活部署,具备高可用、易扩展的特性。 + +## 一. 架构图 + +![01](/Images-zh/Architecture/LinkisManager/LinkisManager-01.png) + +### 名词解释 +- EngineConnManager(ECM): 引擎管理器,用于启动和管理引擎 +- EngineConn(EC):引擎连接器,用于连接底层计算引擎 +- ResourceManager(RM):资源管理器,用于管理节点资源 + +## 二. 二级模块介绍 + +### 1. 应用管理模块 linkis-application-manager + +AppManager用于引擎的统一调度和管理 + +| 核心接口/类 | 主要功能 | +|------------|--------| +|EMInfoService | 定义了EngineConnManager信息查询、修改功能 | +|EMRegisterService| 定义了EngineConnManager注册功能 | +|EMEngineService | 定义了EngineConnManager对EngineConn的创建、查询、关闭功能 | +|EngineAskEngineService | 定义了查询EngineConn的功能 | +|EngineConnStatusCallbackService | 定义了处理EngineConn状态回调的功能 | +|EngineCreateService | 定义了创建EngineConn的功能 | +|EngineInfoService | 定义了EngineConn查询功能 | +|EngineKillService | 定义了EngineConn的停止功能 | +|EngineRecycleService | 定义了EngineConn的回收功能 | +|EngineReuseService | 定义了EngineConn的复用功能 | +|EngineStopService | 定义了EngineConn的自毁功能 | +|EngineSwitchService | 定义了引擎切换功能 | +|AMHeartbeatService | 提供了EngineConnManager和EngineConn节点心跳处理功能 | + + +通过AppManager申请引擎流程如下: +![](/Images-zh/Architecture/LinkisManager/AppManager-01.png) + + +### 2. 标签管理模块 linkis-label-manager + +LabelManager提供标签管理和解析能力 + +| 核心接口/类 | 主要功能 | +|------------|--------| +|LabelService | 提供了标签增删改查功能 | +|ResourceLabelService | 提供了资源标签管理功能 | +|UserLabelService | 提供了用户标签管理功能 | + +LabelManager架构图如下: +![](/Images-zh/Architecture/LinkisManager/LabelManager-01.png) + + + +### 3. 资源管理模块 linkis-resource-manager + +ResourceManager用于管理引擎和队列的所有资源分配 + +| 核心接口/类 | 主要功能 | +|------------|--------| +|RequestResourceService | 提供了EngineConn资源申请功能 | +|ResourceManagerService | 提供了EngineConn资源释放功能 | +|LabelResourceService | 提供了标签对应资源管理功能 | + + +ResourceManager架构图如下: + +![](/Images-zh/Architecture/LinkisManager/ResourceManager-01.png) + +### 4. 监控模块 linkis-manager-monitor + +Monitor提供了节点状态监控的功能 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/resource-manager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/resource-manager.md new file mode 100644 index 00000000000..839e47bd8cb --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/resource-manager.md @@ -0,0 +1,152 @@ +--- +title: ResourceManager 架构 +sidebar_position: 2 +--- + +ResourceManager(简称RM),是Linkis的计算资源管理模块,所有的EngineConn(简称EC)、EngineConnManager(简称ECM),甚至包括Yarn在内的外部资源,都由RM负责统筹管理。RM能够基于用户、ECM或其它通过复杂标签定义的粒度对资源进行管控。 + +### RM在Linkis中的作用 +![01](/Images-zh/Architecture/rm-01.png) +![02](/Images-zh/Architecture/rm-02.png) + +RM作为Linkis Manager的一部分,主要作用为:维护ECM上报的可用资源信息,处理ECM提出的资源申请,记录成功申请后,EC在生命周期内实时上报的实际资源使用信息,并提供查询当前资源使用情况的相关接口。 + +Linkis中,与RM产生交互的其它服务主要有: + +- **引擎管理器,简称ECM**:处理启动引擎连接器请求的微服务。ECM作为资源的提供者,负责向RM注册资源(register)和下线资源(unregister)。同时,ECM作为引擎的管理者,负责代替准备启动的新引擎连接器向RM申请资源。每一个ECM实例,均在RM中有一条对应的资源记录,包含它提供的总资源、保护资源等信息,并动态更新已使用资源。 +![03](/Images-zh/Architecture/rm-03.png) + +- **引擎连接器,简称EC**,是用户作业的实际执行单元。同时,EC作为资源的实际使用者,负责向RM上报实际使用资源。每一个EC,均在RM中有一条对应的资源记录:在启动过程中,体现为锁定资源;在运行过程中,体现为已使用资源;在被结束之后,该资源记录随之被删除。 +![04](/Images-zh/Architecture/rm-04.png) + +### 资源的类型与格式 + +![05](/Images-zh/Architecture/rm-05.png) + +如上图所示,所有的资源类均实现一个顶层的Resource接口,该接口定义了所有资源类均需要支持的计算和比较的方法,并进行相应的数学运算符的重载,使得资源之间能够像数字一样直接被计算和比较。 + +| 运算符 | 对应方法 | 运算符 | 对应方法 | +|--------|-------------|--------|-------------| +| \+ | add | \> | moreThan | +| \- | minus | \< | lessThan | +| \* | multiply | = | equals | +| / | divide | \>= | notLessThan | +| \<= | notMoreThan | | | + +当前支持的资源类型如下表所示,所有的资源都有对应的json序列化与反序列化方法,能够通过json格式进行存储和在网络间传递: + +| 资源类型 | 描述 | +|-----------------------|--------------------------------------------------------| +| MemoryResource | 内存资源 | +| CPUResource | CPU资源 | +| LoadResource | 同时具备内存与CPU的资源 | +| YarnResource | Yarn队列资源(队列,队列内存,队列CPU,队列实例数) | +| LoadInstanceResource | 服务器资源(内存,CPU,实例数) | +| DriverAndYarnResource | 驱动器与执行器资源(同时具备服务器资源,Yarn队列资源) | +| SpecialResource | 其它自定义资源 | + +### 可用资源管理 + +RM中的可用资源,主要有两个来源:ECM上报的可用资源,以及Configuration模块中根据标签配置的资源限制。 +**ECM资源上报**: + +1. ECM启动时,会广播ECM注册的消息,RM接收到消息后,根据消息中包含的内容进行资源注册,资源相关的内容包括: +- 总资源:该ECM能够提供的资源总数。 +- 保护资源:当剩余资源小于该资源时,不再允许继续分配资源。 +- 资源类型:如LoadResource,DriverAndYarnResource等类型名称。 +- 实例信息:机器名加端口名。 + +2. RM在收到资源注册请求后,在资源表中新增一条记录,内容与接口的参数信息一致,并通过实例信息找到代表该ECM的标签,在资源、标签关联表中新增一条关联记录。 + +3. ECM在关闭时,会广播ECM关闭的消息,RM接收到消息后,根据消息中的ECM实例信息来进行资源的下线,即删除该ECM实例标签对应的资源和关联记录。 + +**Configuration模块标签资源配置**: + +用户能够在Configuration模块中,根据不同的标签组合进行资源数量限制的配置,如限制User/Creator/EngineType组合的最大可用资源。 + +RM通过RPC消息,以组合标签为查询条件,向Configuration模块查询资源信息,并转换成Resource对象参与后续的比较和记录。 + + +### 资源使用管理 + +**接收用户的资源申请** + +1. LinkisManager在收到启动EngineConn的请求时,会调用RM的资源申请接口,进行资源申请。资源申请接口接受一个可选的时间参数,当申请资源的等待时间超出该时间参数的限制时,该资源申请将自动作为失败处理。 + +**判断是否有足够的资源** + +即为判断剩余可用资源是否大于申请资源,如果大于或等于,则资源充足;否则资源不充足。 + +1. RM预处理资源申请中附带的标签信息,根据规则将原始的标签进行过滤、组合和转换等操作(如将User/Creator标签和EngineType标签进行组合),这使得后续的资源判断的粒度更加灵活多变。 + +2. 在每个转换后的标签上逐一加锁,使得它们所对应的资源记录在资源申请的处理期间保持不变。 + +3. 根据每个标签: + + 1. 通过Persistence模块从数据库中查询对应的资源记录,如果该记录包含剩余可用资源,则直接用来比较。 + + 2. 如果没有直接的剩余可用资源记录,则通过[剩余可用资源=最大可用资源-已用资源-已锁定资源-保护资源]公式进行计算得出。 + + 3. 如果没有最大可用资源记录,则请求Configuration模块,看是否有配置的资源信息,如果有则使用到公式中进行计算,如果没有则跳过针对这个标签的资源判断。 + + 4. 如果没有任何资源记录,则跳过针对这个标签的资源判断。 + +4. 只要有一个标签被判断为资源不充足,则资源申请失败,对每个标签逐一解锁。 + +5. 只有所有标签都判断为资源充足的情况下,才成功通过资源申请,进入下一步。 + +**锁定申请通过的资源** + +1. 根据申请通过的资源数量,在资源表中生成一条新的记录,并与每个标签进行关联。 + +2. 如果对应的标签有剩余可用资源记录,则扣减对应的数量。 + +3. 生成一个定时任务,在一定时间后检查这批锁定的资源是否被实际使用,如果超时未使用,则强制回收。 + +4. 对每个标签进行解锁。 + +**上报实际使用资源** + +1. EngineConn启动后,广播资源使用消息。RM收到消息后,检查该EngineConn对应的标签是否有锁定资源记录,如果没有,则报错。 + +2. 如果有锁定资源,则对该EngineConn有关联的所有标签进行加锁。 + +3. 对每个标签,将对应的锁定资源记录转换为已使用资源记录。 + +4. 解锁所有标签。 + +**释放实际使用资源** + +1. EngineConn结束生命周期后,广播资源回收消息。RM收到消息后,检查该EngineConn对应的标签是否有已使用资源记录。 + +2. 如果有,则对该EngineConn有关联的所有标签进行加锁。 + +3. 对每个标签,在已使用资源记录中减去对应的数量。 + +4. 如果对应的标签有剩余可用资源记录,则增加对应的数量。 + +5. 对每个标签解锁 + + +### 外部资源管理 + +在RM中,为了更加灵活并有拓展性对资源进行分类,支持多集群的资源管控的同时,使得接入新的外部资源更加便利,在设计上进行了以下几点的考虑: + +1. 通过标签来对资源进行统一管理。资源注册后,与标签进行关联,使得资源的属性能够无限拓展。同时,资源申请也都带上标签,实现灵活的匹配。 + +2. 将集群抽象成一个或多个标签,并在外部资源管理模块中维护每个集群标签对应的环境信息,实现动态的对接。 + +3. 抽象出通用的外部资源管理模块,如需接入新的外部资源类型,只要实现固定的接口,即可将不同类型的资源信息转换为RM中的Resource实体,实现统一管理。 + +![06](/Images-zh/Architecture/rm-06.png) + +RM的其它模块,通过ExternalResourceService提供的接口来进行外部资源信息的获取。 + +而ExternalResourceService通过资源类型和标签来获取外部资源的信息: + +1. 所有外部资源的类型、标签、配置等属性(如集群名称、Yarn的web + url、Hadoop版本等信息),都维护在linkis\_external\_resource\_provider表中。 + +2. 针对每种资源类型,均有一个ExternalResourceProviderParser接口的实现,将外部资源的属性进行解析,将能够匹配到Label的信息转换成对应的Label,将能够作为参数去请求资源接口的都转换成params。最后构建成一个能够作为外部资源信息查询依据的ExternalResourceProvider实例。 + +3. 根据ExternalResourceService方法的参数中的资源类型和标签信息,找到匹配的ExternalResourceProvider,根据其中的信息生成ExternalResourceRequest,正式调用外部资源提供的API,发起资源信息请求。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/overview.md new file mode 100644 index 00000000000..503efc0bff1 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/computation-governance-services/overview.md @@ -0,0 +1,57 @@ +--- +title: 总览 +sidebar_position: 1 +--- + + +## **总述** + +计算治理服务组,CGS:Computation Governance Services.完成计算任务和请求的提交、准备、执行、返回结果等主要步骤,是Linkis的核心模块 + +## **架构图** +![](/Images-zh/Architecture/linkis-computation-gov-01.png) + +**作业流程优化:** +Linkis1.0将优化Job的整体执行流程,从提交 —\> 准备 —\> +执行三个阶段,来全面升级Linkis的Job执行架构,如下图所示: + +![](/Images-zh/Architecture/linkis-computation-gov-02.png) + +## **架构说明** + +### 1、Entrance + + Entrance作为计算类型任务的提交入口,提供任务的接收、调度和Job信息的转发能力,是从Linkis0.X的Entrance拆分出来的原生能力; + + [进入Entrance架构设计](entrance.md) + +### 2、Orchestrator + + Orchestrator 作为准备阶段的入口,从 Linkis0.X 的 Entrance 继承了解析Job、申请Engine和提交执行的能力;同时,Orchestrator将提供强大的编排和计算策略能力,满足多活、主备、事务、重放、限流、异构和混算等多种应用场景的需求。 + + + +### 3、LinkisManager + + LinkisManager作为Linkis的管理大脑,主要由AppManager、ResourceManager、LabelManager和EngineConnPlugin组成。 + + 1. ResourceManager 不仅具备 Linkis0.X 对 Yarn 和 Linkis EngineManager的资源管理能力,还将提供基于标签的多级资源分配和回收能力,让ResourceManager具备跨集群、跨计算资源类型的全资源管理能力; + 2. AppManager 将统筹管理所有的 EngineConnManager 和 EngineConn,EngineConn 的申请、复用、创建、切换、销毁等生命周期全交予 AppManager 进行管理;而 LabelManager 将基于多级组合标签,提供跨IDC、跨集群的 EngineConn 和 EngineConnManager 路由和管控能力; + 3. EngineConnPlugin 主要用于降低新计算存储的接入成本,真正做到让用户只需要实现一个类,就能接入一个全新的计算存储引擎。 + + [进入LinkisManager架构设计](linkis-manager/overview.md) + +### 4、EngineConnManager + + EngineConnManager (简称ECM)是 Linkis0.X EngineManager 的精简升级版。Linkis1.0下的ECM去除了引擎的申请能力,整个微服务完全无状态,将聚焦于支持各类 EngineConn 的启动和销毁。 + + [进入EngineConnManager架构设计](engine-conn-manager.md) + +### 5、EngineConn + +EngineConn 是 Linkis0.X Engine 的优化升级版本,将提供 EngineConn 和 Executor 两大模块,其中 EngineConn 用于连接底层的计算存储引擎,提供一个打通了底层各计算存储引擎的 Session 会话;Executor 则基于这个 Session 会话,提供交互式计算、流式计算、离线计算、数据存储的全栈计算能力支持。 + +[进入EngineConn架构设计](engine/engine-conn.md) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/_category_.json new file mode 100644 index 00000000000..75425a8bf62 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "公共增强服务架构", + "position": 3 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/_category_.json new file mode 100644 index 00000000000..98d0a1aaade --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "BML 服务架构", + "position": 4 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/engine-bml-dissect.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/engine-bml-dissect.md new file mode 100644 index 00000000000..923c4ca5219 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/engine-bml-dissect.md @@ -0,0 +1,294 @@ +--- +title: BML 引擎物料管理功能剖析 +sidebar_position: 1 +--- + +> 导语:本文以引擎相关的物料管理流程为切入点,同时结合底层数据模型和源码,为大家详细剖析引擎物料管理功能的实现细节,期望能够帮助大家更好地理解BML(物料库)服务的架构。 + +## 1. BML物料库服务 + +BML物料库是Linkis中PublicEnhancementService(PS)——公共增强服务架构下的功能模块。 + +![PS-BML](/Images/Architecture/Public_Enhancement_Service/engine_bml/PS-BML.png) + +在Linkis的架构体系里,`物料`的概念是指被统一存储托管起来的各种文件数据,包括脚本代码、资源文件、第三方jar、引擎启动时所需的相关类库和配置文件以及用于安全认证的keytab文件等。 + +总之,任何以文件态存在的数据,都可以被集中托管在物料库之中,然后在各自所需的场景中被下载使用。 + +物料服务是无状态的,可进行多实例部署,做到服务高可用,每个实例对外提供独立的服务,互不干扰,所有物料元数据及版本信息等在数据库中共享,底层物料数据可被存储到HDFS或本地(共享)文件系统之中,以及支持实现文件存储相关的接口,扩展其他文件存储系统等。 + +物料服务提供精确的权限控制,对于引擎资源类型的物料,可被所有用户共享访问;对于一些含有敏感信息的物料数据,也可做到仅有限用户可读。 + +物料文件采用追加的方式,可将多个版本的资源文件合并成一个大文件,避免产生过多的HDFS小文件,HDFS小文件过多会导致HDFS整体性能的下降。 + +物料服务提供了文件上传、更新、下载等操作任务的生命周期管理。同时,使用物料服务的方式有rest接口和SDK两种形式,用户可以根据自己的需要进行选择。 + +BML架构图如下: + +![BML架构](/Images/Architecture/Public_Enhancement_Service/engine_bml/bml-jiagou.png) + +上述关于BML架构的概述,有参考官网文档:https://linkis.apache.org/zh-CN/docs/latest/architecture/public-enhancement-services/bml + +## 2. BML物料库服务底层表模型 + +在深入理解BML物料管理的流程细节之前,有必要先梳理下BML物料管理服务底层依赖的数据库表模型。 + +![BML-Model](/Images/Architecture/Public_Enhancement_Service/engine_bml/BML-Model.png) + +可结合Linkis的`linkis_ddl.sql`文件以及下文内容阐述的引擎物料上传和更新流程来理解bml resources相关表的字段含义以及表与表之间的字段关系。 + +## 3. BML物料库服务的使用场景 + +目前在Linkis中,BML物料库服务的使用场景包括: + +- 引擎物料文件,包括引擎启动时所需的conf和lib中的文件 +- 存储脚本,比如工作流任务节点链接的Scripts中的脚本是存储在BML物料库中的 +- DSS中工作流内容版本管理 +- 任务运行时所需资源文件管理 + +## 4. 引擎物料管理流程剖析 + +`引擎物料`是Linkis物料概念中的一个子集,其作用是为引擎启动时提供最新版本的jar包资源和配置文件等。本小节主要从引擎物料管理功能为切入点,剖析引擎物料数据在BML中的流转细节。 + +### 4.1 引擎物料说明 + +对Linkis的安装包正常部署之后,在`LINKIS_INSTALL_HOME/lib/linkis-engineconn-plugins`目录之下可以看到所有的引擎物料目录,以jdbc引擎为例,引擎物料目录的结构如下: + +```shell +jdbc +├── dist +│   └── v4 +│   ├── conf +│   ├── conf.zip +│   ├── lib +│   └── lib.zip +└── plugin + └── 4 + └── linkis-engineplugin-jdbc-1.1.2.jar +``` + +物料目录构成: + +```shell +jdbc/dist/版本号/conf.zip +jdbc/dist/版本号/lib.zip + +jdbc/plugin/版本号(去v留数字)/linkis-engineplugin-引擎名称-1.1.x.jar +``` + +conf.zip和lib.zip会作为引擎物料被托管在物料管理服务中,本地每次对物料conf或lib进行修改之后,对应物料会产生一个新的版本号,物料文件数据会被重新上传。引擎启动时,会获取最新版本号的物料数据,加载lib和conf并启动引擎的java进程。 + +### 4.2 引擎物料上传和更新流程 + +在Linkis完成部署并首次启动时,会触发引擎物料(lib.zip和conf.zip)首次上传至物料库;当引擎lib下jar包或conf中引擎配置文件有修改时,则需要触发引擎物料的刷新机制来保证引擎启动时能够加载到最新的物料文件。 + +以现在Linkis1.1.x版本为例,触发引擎物料刷新的两种方式有两种: + +通过命令`sh sbin/linkis-daemon.sh restart cg-engineplugin`重启engineplugin服务 + +通过请求引擎物料刷新的接口 + +```shell +# 刷新所有引擎物料 +curl --cookie "linkis_user_session_ticket_id_v1=kN4HCk555Aw04udC1Npi4ttKa3duaCOv2HLiVea4FcQ=" http://127.0.0.1:9001/api/rest_j/v1/engineplugin/refreshAll +# 指定引擎类型和版本刷新物料 +curl --cookie "linkis_user_session_ticket_id_v1=kN4HCk555Aw04udC1Npi4ttKa3duaCOv2HLiVea4FcQ=" http://127.0.0.1:9001/api/rest_j/v1/engineplugin/refresh?ecType=jdbc&version=4 +``` + +这两种引擎物料的刷新方式,其底层的实现机制是一样的,都是调用了`EngineConnResourceService`类中的refreshAll()或refresh()方法。 + +在抽象类`EngineConnResourceService`的默认实现类`DefaultEngineConnResourceService`中的init()方法内部,通过参数wds.linkis.engineconn.dist.load.enable(默认为true)来控制是否在每次启动engineplugin服务时都执行refreshAll(false)来检查所有引擎物料是否有更新(其中faslse代表异步获取执行结果)。 + +> init()方法被注解@PostConstruct修饰,在DefaultEngineConnResourceService加载后,对象使用前执行,且只执行一次。 + +手动调用engineplugin/refresh的接口,即手动执行了`EngineConnResourceService`类中的refreshAll或refresh方法。 + +所以引擎物料检测更新的逻辑在`DefaultEngineConnResourceService`中的refreshAll和refresh方法内。 + +其中refreshAll()的核心逻辑是: + +1)通过参数wds.linkis.engineconn.home获取引擎的安装目录,默认是: + +```scala +getEngineConnsHome = Configuration.getLinkisHome() + "/lib/linkis-engineconn-plugins"; +``` + +2)遍历引擎目录 + +```scala +getEngineConnTypeListFromDisk: Array[String] = new File(getEngineConnsHome).listFiles().map(_.getName) +``` + +3)`EngineConnBmlResourceGenerator`接口提供对各个引擎(版本)底层文件或目录的合法性检测。对应实现存在于抽象类`AbstractEngineConnBmlResourceGenerator`中。 + +4)`DefaultEngineConnBmlResourceGenerator`类主要是为了生成`EngineConnLocalizeResource`。EngineConnLocalizeResource是对物料资源文件元数据和InputStream的封装,在后续的逻辑中EngineConnLocalizeResource会被作为物料参数来参与物料的上传过程。 + +EngineConnBmlResourceGenerator、AbstractEngineConnBmlResourceGenerator、DefaultEngineConnBmlResourceGenerator这三个文件的代码细节暂不细说,可通过以下UML类图,大致了解其继承机制,并结合方法内的具体实现来理解这一部分的功能。 + +![BML](/Images/Architecture/Public_Enhancement_Service/engine_bml/bml_uml.png) + +再重新回到`DefaultEngineConnResourceService`类中的refreshAll方法内,继续看refreshTask线程的核心流程: + +```scala +engineConnBmlResourceGenerator.getEngineConnTypeListFromDisk foreach { engineConnType => + Utils.tryCatch { + engineConnBmlResourceGenerator.generate(engineConnType).foreach { + case (version, localize) => + logger.info(s" Try to initialize ${engineConnType}EngineConn-$version.") + refresh(localize, engineConnType, version) + } + } + ...... +} +``` + +扫描引擎的安装目录,可获得每个引擎物料目录的列表,对于每个引擎物料目录结构的合法性校验通过之后,可得到对应的`EngineConnLocalizeResource`,然后通过调用refresh(localize: Array[EngineConnLocalizeResource], engineConnType: String, version: String)来完成后续物料的上传工作。 + +而在refresh()方法的内部,主要经过的流程有: + +从表`linkis_cg_engine_conn_plugin_bml_resources`中获取对应engineConnType和version的物料列表数据,赋值给变量engineConnBmlResources。 + +```scala +val engineConnBmlResources = asScalaBuffer(engineConnBmlResourceDao.getAllEngineConnBmlResource(engineConnType, version)) +``` + +![ec数据](/Images/Architecture/Public_Enhancement_Service/engine_bml/ec-data.png) + + + +#### 4.2.1 引擎物料上传流程 + +**引擎物料上传流程时序图** + +![引擎物料上传流程时序图](/Images/Architecture/Public_Enhancement_Service/engine_bml/bml-shixu.png) + +如果表`linkis_cg_engine_conn_plugin_bml_resources`中没有匹配到数据,则需要拿EngineConnLocalizeResource中的数据来构造EngineConnBmlResource对象,并保存至`linkis_cg_engine_conn_plugin_bml_resources`表中,此数据保存之前,需要先完成物料文件的上传操作,即执行`uploadToBml(localizeResource)`方法。 + +在uploadToBml(localizeResource)方法内部,通过构造bmlClient来请求物料上传的接口。即: + +```scala +private val bmlClient = BmlClientFactory.createBmlClient() +bmlClient.uploadResource(Utils.getJvmUser, localizeResource.fileName, localizeResource.getFileInputStream) +``` + +在BML Server中,物料上传的接口位置在BmlRestfulApi类中的uploadResource接口方法内。主要经历的过程是: + +```scala +ResourceTask resourceTask = taskService.createUploadTask(files, user, properties); +``` + +每一次物料上传,都会构造一个ResourceTask来完成文件上传的流程,并记录此次文件上传Task的执行记录。在createUploadTask方法内部,主要完成的操作如下: + +1)为此次上传的资源文件产生`一个全局唯一标识的resource_id`,String resourceId = UUID.randomUUID().toString(); + +2)构建ResourceTask记录,并存储在表`linkis_ps_bml_resources_task`中,以及后续一系列的Task状态修改。 + +```scala +ResourceTask resourceTask = ResourceTask.createUploadTask(resourceId, user, properties); +taskDao.insert(resourceTask); + +taskDao.updateState(resourceTask.getId(), TaskState.RUNNING.getValue(), new Date()); +``` + +3)物料文件真正写入物料库的操作是由ResourceServiceImpl类中的upload方法完成的,在upload方法内部,会把一组`List files`对应的字节流持久化至物料库文件存储系统中;把物料文件的properties数据,存储到资源记录表(linkis_ps_bml_resources)和资源版本记录表(linkis_ps_bml_resources_version)中。 + +```scala +MultipartFile p = files[0] +String resourceId = (String) properties.get("resourceId"); +String fileName =new String(p.getOriginalFilename().getBytes(Constant.ISO_ENCODE), + Constant.UTF8_ENCODE); +fileName = resourceId; +String path = resourceHelper.generatePath(user, fileName, properties); +// generatePath目前支持Local和HDFS路径,路径的构成规则由LocalResourceHelper或HdfsResourceHelper +// 中的generatePath方法实现 +StringBuilder sb = new StringBuilder(); +long size = resourceHelper.upload(path, user, inputStream, sb, true); +// 文件size计算以及文件字节流写入文件由LocalResourceHelper或HdfsResourceHelper中的upload方法实现 +Resource resource = Resource.createNewResource(resourceId, user, fileName, properties); +// 插入一条记录到resource表linkis_ps_bml_resources中 +long id = resourceDao.uploadResource(resource); +// 新增一条记录到resource version表linkis_ps_bml_resources_version中,此时的版本号是onstant.FIRST_VERSION +// 除了记录这个版本的元数据信息外,最重要的是记录了该版本的文件的存储位置,包括文件路径,起始位置,结束位置。 +String clientIp = (String) properties.get("clientIp"); +ResourceVersion resourceVersion = ResourceVersion.createNewResourceVersion( + resourceId, path, md5String, clientIp, size, Constant.FIRST_VERSION, 1); +versionDao.insertNewVersion(resourceVersion); +``` + +上述流程执行成功之后,物料数据才算是真正完成,然后把UploadResult返回给客户端,并标记此次ResourceTask的状态为完成,如果有遇到上传文件报错,则标记此次ResourceTask的状态为失败,记录异常信息。 + +![resource-task](/Images/Architecture/Public_Enhancement_Service/engine_bml/resource-task.png) + + + +#### 4.2.2 引擎物料更新流程 + +**引擎物料更新流程时序图** + +![引擎物料更新流程时序图](/Images/Architecture/Public_Enhancement_Service/engine_bml/engine-bml-update-shixu.png) + +如果表`linkis_cg_engine_conn_plugin_bml_resources`中匹配到本地物料数据,则需要拿EngineConnLocalizeResource中的数据来构造EngineConnBmlResource对象,并更新`linkis_cg_engine_conn_plugin_bml_resources`表中原有物料文件的版本号、文件大小、修改时间等元数据信息,此数据更新前,需要先完成物料文件的更新上传操作,即执行`uploadToBml(localizeResource, engineConnBmlResource.getBmlResourceId)`方法。 + +在uploadToBml(localizeResource, resourceId)方法内部,通过构造bmlClient来请求物料资源更新的接口。即: + +```scala +private val bmlClient = BmlClientFactory.createBmlClient() +bmlClient.updateResource(Utils.getJvmUser, resourceId, localizeResource.fileName, localizeResource.getFileInputStream) +``` + +在BML Server中,实现物料更新的接口位置在BmlRestfulApi类中的updateVersion接口方法内,主要经历的过程是: + +完成resourceId的有效性检测,即检测传入的resourceId是否在linkis_ps_bml_resources表中存在,如果此resourceId不存在,给客户端抛出异常,在接口层面此次物料更新操作失败。 + +所以在表`linkis_cg_engine_conn_plugin_bml_resources`和`linkis_ps_bml_resources`中的资源数据的对应关系需要保证完整,否则会出现物料文件无法更新的报错。 + +```scala +resourceService.checkResourceId(resourceId) +``` + +resourceId如果存在于linkis_ps_bml_resources表中,会继续执行: + +```scala +StringUtils.isEmpty(versionService.getNewestVersion(resourceId)) +``` + +getNewestVersion方法是为了在表`linkis_ps_bml_resources_version`中获取该resourceId的最大版本号,如果resourceId对应的最大version为空,那么物料同样会更新失败,所以此处数据的对应关系完整性也需要严格保证。 + +上述两处检查都通过之后,会创建ResourceUpdateTask来完成最终的文件写入和记录更新保存等工作。 + +```scala +ResourceTask resourceTask = null; +synchronized (resourceId.intern()) { + resourceTask = taskService.createUpdateTask(resourceId, user, file, properties); +} +``` + +而在createUpdateTask方法内部,主要实现的功能是: + +```scala +// 为物料Resource生成新的version +String lastVersion = getResourceLastVersion(resourceId); +String newVersion = generateNewVersion(lastVersion); +// 然后是对ResourceTask的构建,和状态维护 +ResourceTask resourceTask = ResourceTask.createUpdateTask(resourceId, newVersion, user, system, properties); +// 物料更新上传的逻辑由versionService.updateVersion方法完成 +versionService.updateVersion(resourceTask.getResourceId(), user, file, properties); +``` + +在versionService.updateVersion方法内部,主要实现的功能是: + +```scala +ResourceHelper resourceHelper = ResourceHelperFactory.getResourceHelper(); +InputStream inputStream = file.getInputStream(); +// 获取资源的path +String newVersion = params.get("newVersion").toString(); +String path = versionDao.getResourcePath(resourceId) + "_" + newVersion; +// getResourcePath的获取逻辑是从原有路径中limit一条,然后以_拼接newVersion +// select resource from linkis_ps_bml_resources_version WHERE resource_id = #{resourceId} limit 1 +// 资源上传到hdfs或local +StringBuilder stringBuilder = new StringBuilder(); +long size = resourceHelper.upload(path, user, inputStream, stringBuilder, OVER_WRITE); +// 最后在linkis_ps_bml_resources_version表中插入一条新的资源版本记录 +ResourceVersion resourceVersion = ResourceVersion.createNewResourceVersion(resourceId, path, md5String, clientIp, size, newVersion, 1); +versionDao.insertNewVersion(resourceVersion); +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/overview.md new file mode 100644 index 00000000000..fe9efb703ad --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/overview.md @@ -0,0 +1,97 @@ +--- +title: 总览 +sidebar_position: 0 +--- +## 背景 + +BML(物料库服务)是linkis的物料管理系统,主要用来存储用户的各种文件数据,包括用户脚本、资源文件、第三方Jar包等,也可以存储引擎运行时需要使用到的类库。 + +具备以下功能点: + +1)、支持各种类型的文件。支持文本形式和二进制形式的文件,如果是在大数据领域的用户,可以将他们的脚本文件、物料压缩包都可以存储到本系统中。 + +2)、服务无状态,多实例部署,做到服务高可用。本系统在部署的时候,可以进行多实例部署,每个实例对外独立提供服务,不会互相干扰,所有的信息都是存储在数据库中进行共享。 + +3)、使用方式多样。提供Rest接口和SDK两种方式,用户可以根据自己的需要进行选择。 + +4)、文件采用追加方式,避免过多的HDFS小文件。HDFS小文件多会导致HDFS整体性能的下降,我们采用了文件追加的方式,将多个版本的资源文件合成一个大文件,有效减少了HDFS的文件数量。 + +5)、精确权限控制,用户资源文件内容安全存储。资源文件往往会有重要的内容,用户只希望自己可读 + +6)、提供了文件上传、更新、下载等操作任务的生命周期管理。 + +## 架构图 + +![BML架构图](/Images-zh/Architecture/bml-02.png) + +## 架构说明 + +1、Service层 包含资源管理、上传资源、下载资源、共享资源还有工程资源管理。 + +资源管理负责资源的增删改查操作,访问权限控制,文件是否过期等基本操作。 + +2、文件版本控制 +每个BML资源文件都是具有版本信息的,同一个资源每次更新操作都会产生一个新的版本,当然也支持历史版本的查询和下载操作。BML使用版本信息表记录了每个版本的资源文件HDFS存储的偏离位置和大小,可以在一个HDFS文件上存储多个版本的数据。 + +3、资源文件存储 +主要使用HDFS文件作为实际的数据存储,HDFS文件可以有效保证物料库文件不被丢失,文件采用追加方式,避免过多的HDFS小文件。 + +### 核心流程 + +**上传文件:** + +1. 判断用户上传文件的操作类型,属于首次上传还是更新上传,如果是首次上传需要新增一条资源信息记录,系统已经为这个资源生成了一个全局唯一标识的resource_id和一个资源放置的位置resource_location。资源A的第一个版本A1需要在HDFS文件系统中resource_location位置进行存储。存储完之后,就可以得到第一个版本记为V00001,如果是更新上传需要查找上次最新的版本。 + +2. 上传文件流到指定的HDFS文件,如果是更新则采用文件追加的方式加到上次内容的末尾。 + +3. 新增一条版本记录,每次上传都会产生一条新的版本记录。除了记录这个版本的元数据信息外,最重要的是记录了该版本的文件的存储位置,包括文件路径,起始位置,结束位置。 + +**下载文件:** + +1. 用户下载资源的时候,需要指定两个参数一个是resource_id,另外一个是版本version,如果不指定version的话,默认下载最新版本。 + +2. 用户传入resource_id和version两个参数到系统之后,系统查询resource_version表,查到对应的resource_location和start_byte和end\_byte进行下载,通过流处理的skipByte方法,将resource\_location的前(start_byte-1)个字节跳过,然后读取到end_byte + 字节数。读取成功之后,将流信息返回给用户。 + +3. 在resource_download_history中插入一条下载成功的记录 + +## 数据库设计 + +1、资源信息表(resource) + +| 字段名 | 作用 | 备注 | +|-------------------|------------------------------|----------------------------------| +| resource_id | 全局唯一标识一个资源的字符串 | 可以采用UUID进行标识 | +| resource_location | 存放资源的位置 | 例如 hdfs:///tmp/bdp/\${用户名}/ | +| owner | 资源的所属者 | 例如 zhangsan | +| create_time | 记录创建时间 | | +| is_share | 是否共享 | 0表示不共享,1表示共享 | +| update\_time | 资源最后的更新时间 | | +| is\_expire | 记录资源是否过期 | | +| expire_time | 记录资源过期时间 | | + +2、资源版本信息表(resource_version) + +| 字段名 | 作用 | 备注 | +|-------------------|--------------------|----------| +| resource_id | 唯一标识资源 | 联合主键 | +| version | 资源文件的版本 | | +| start_byte | 资源文件开始字节数 | | +| end\_byte | 资源文件结束字节数 | | +| size | 资源文件大小 | | +| resource_location | 资源文件放置位置 | | +| start_time | 记录上传的开始时间 | | +| end\_time | 记录上传的结束时间 | | +| updater | 记录更新用户 | | + +3、资源下载历史表(resource_download_history) + +| 字段 | 作用 | 备注 | +|-------------|---------------------------|--------------------------------| +| resource_id | 记录下载资源的resource_id | | +| version | 记录下载资源的version | | +| downloader | 记录下载的用户 | | +| start\_time | 记录下载时间 | | +| end\_time | 记录结束时间 | | +| status | 记录是否成功 | 0表示成功,1表示失败 | +| err\_msg | 记录失败原因 | null表示成功,否则记录失败原因 | diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/_category_.json new file mode 100644 index 00000000000..ab3f408b8cd --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "上下文务架构", + "position": 3 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/content-service-cleanup.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/content-service-cleanup.md new file mode 100644 index 00000000000..609c85b3ac5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/content-service-cleanup.md @@ -0,0 +1,338 @@ +--- +title: CS 清理接口特性 +sidebar_position: 8 +tags: [Feature] +--- + +## 1. 功能需求 +### 1.1 背景 +1.1.3版本前,ContextService 统一上下文服务缺少清理机制,且缺少创建时间、更新时间字段以及批量清理的接口, +在长期累积情况下可能出现百万级数据,影响查询效率。 + +### 1.2 目标 +- 修改1ContextService`底层库表,添加创建时间、修改时间、最后访问时间字段,完成`ContextID`和`ContextMap`相关数据的更新时间入库 +- 添加清理清理的`restful`接口,支持按照时间范围、按照id列表的批零清理接口 +- 添加对应的`cs-client`的`java sdk`接口 + +## 2. 总体设计 +本次需求涉及`ContextService`下的`cs-client`、`cs-persistence`以及`cs-server`模块。 +在`cs-persistence`模块添加已有表的3个字段;在`cs-server`模块添加3个`restful`接口,在`cs-client`模块添加3个`sdk api`。 + +### 2.1 技术架构 + +ContextService 整体架构可参考已有文档: [ContextService架构文档](overview.md) + +ContestService各模块访问关系如下图所示 +![linkis-contextservice-clean-01.png](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-clean-01.png) + + + 表变更均在`cs-persistence`模块。此次变更涉及5张表`context_id、 context_map 、context_id_listener 、context_key_listener 、 context_history`表,均需要添加`create_time,update_time,access_time` 3个字段。其中`context_id 、context_map` 表已启用,其它3张表未启用。`create_time` 在persistence模块执行insert操作前,添加时间。`update_time` 和 `access_time` 由上游接口主动调用,在update接口中,`update_time` 和 `access_time` 互斥更新,即当`access_time` 存在(不为null)则不更新`update_time`,否则更新update_time。 + +`update_time`字段更新在cs-cache模块中,检测到从db加载新的`context_id`时的ADD消息,此时同步`access_time` 到db。 +表中仅记录`context_id` 表的`create_time、update_time、access_time`。后续搜索清理,也是从context_id 表进行清理。 + +增加3个清理相关接口:`searchContextIDByTime、clearAllContextByID、clearAllContextByTime` +- `searchContextIDByTime`按照3个时间起止范围搜索,返回contextID列表 +- `clearAllContextByID`清理输入的contextID列表中ID对应的context_map表和context_id表内容 +- `clearAllContextByTime` 按照3个时间起止范围搜索,并且清理所有搜索到的contextID对应的context_map表和context_id表的内容 + +### 2.2 业务架构 +此次特性是给ContextService服务增加批量查询和清理的相关接口,以及增加底层数据表的更新时间等字段,便于根据访问情况清理过期数据。功能点涉及模块如下表。 + +| 一级模块 | 二级模块 | 功能点 | +| :------------ | :------------ | :------------ | +| linkis-ps-cs | cs-client | 增加批量清理接口相关java sdk api接口 | +| Linkis-ps-cs | cs-server | 增加批量清理接口相关restful接口 | +| linkis-ps-cs | cs-persistence | 增加底层表的3个时间相关字段 | + + +## 3. 模块设计 +### 主要执行流程 +- 创建ContextID。用户创建ContextID时,会记录create_time,后期不更新这个字段 +- 更新ContextID。用户更新ContextID时,会更新update_time字段。注意此时更新如果是从cache中更新,则不会更新access_time字段;如果从db加载到cache,再更新contextID,则会先更新access_time,然后单独更新update_time +- 根据时间查询ContextID。用户查询对应时间范围的ContextID,仅会返回haid字符串列表。此接口有分页,默认仅限5000条数据 +- 批量清理ContextID。会批量清理传入的idList对应的所有contextMap数据和contextID数据。传入数组最大5000条 +- 查询并清理ContextID,先查询再批量清理 + +上述对应时序图如下: +![linkis-contextservice-clean-02.png](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-clean-02.png) + +其中有两处需要额外注意: +①cs-server服务中restful api,会将请求封装成Job提交到队列并阻塞等待结果。新定义了CLEAR 的操作类型,便于匹配到清理相关接口。 +②处理①中Job的Service服务,需要将名称定义为不包含ContextID,来避免HighAvailable模块的动态代理转换,这个转换仅对于请求内只有一个ContextID的接口,对于批量清理和批量查询接口无意义且影响性能。 + +## 4. 数据结构 +``` +# 主要涉及的context_id表结构如下,增加了create_time、update_time、expire_time字段 +CREATE TABLE `linkis_ps_cs_context_id` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user` varchar(32) DEFAULT NULL, + `application` varchar(32) DEFAULT NULL, + `source` varchar(255) DEFAULT NULL, + `expire_type` varchar(32) DEFAULT NULL, + `expire_time` datetime DEFAULT NULL, + `instance` varchar(128) DEFAULT NULL, + `backup_instance` varchar(255) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time', + `access_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'last access time', + PRIMARY KEY (`id`), + KEY `instance` (`instance`(128)), + KEY `backup_instance` (`backup_instance`(191)), + KEY `instance_2` (`instance`(128),`backup_instance`(128)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +``` + +## 5. 接口设计 +### 5.1 Restful接口 + + +#### 搜索文本Id执行时间 + + +**接口地址**:`/api/rest_j/v1/contextservice/searchContextIDByTime` + + +**请求方式**:`GET` + + +**请求数据类型**:`application/x-www-form-urlencoded` + + +**响应数据类型**:`*/*` + + +**接口描述**:

搜索文本Id执行时间

+ + + +**请求参数**: + + +| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessTimeEnd|访问结束时间|query|false|string| +|accessTimeStart|访问开始时间|query|false|string| +|createTimeEnd|创建结束时间|query|false|string| +|createTimeStart|创建时间|query|false|string| +|pageNow|页码|query|false|string| +|pageSize|页面大小|query|false|string| +|updateTimeEnd|更新结束时间|query|false|string| +|updateTimeStart|更新时间|query|false|string| + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/contextservice/searchContextIDByTime", + "status": 0, + "message": "OK", + "data": { + "contextIDs": [ + "8-8--cs_1_devcs_2_dev10493", + "8-8--cs_1_devcs_2_dev10494", + "8-8--cs_1_devcs_2_dev10495", + "8-8--cs_1_devcs_2_dev10496", + "8-8--cs_1_devcs_2_dev10497", + "8-8--cs_2_devcs_2_dev10498" + ] + } +} +``` + + +#### 清理指定ID + + +**接口地址**:`/api/rest_j/v1/contextservice/clearAllContextByID` + +**请求方式**:`POST` + +**请求数据类型**:`application/json` + +**响应数据类型**:`*/*` + +**接口描述**:

通过ID清除所以上下文

+ +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|idList|上下文id集合|false|String|String| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + + +**响应示例**: +```javascript +{ + "method": "/api/contextservice/clearAllContextByID", + "status": 0, + "message": "OK", + "data": { + "num": "1" + } +} +``` + + +## 通过时间清除所以上下文 + + +**接口地址**:`/api/rest_j/v1/contextservice/clearAllContextByTime` + +**请求方式**:`POST` + +**请求数据类型**:`application/json` + +**响应数据类型**:`*/*` + +**接口描述**:

通过时间清除所以上下文

+ +**请求参数**: + + +| 参数名称 | 参数说明 | 是否必须 | 请求类型 | 数据类型 | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessTimeEnd|访问时间结束|false|String|String| +|accessTimeStart|访问时间开始|false|String|String| +|createTimeEnd|创建时间结束|false|String|String| +|createTimeStart|创建时间|false|String|String| +|updateTimeStart|更新开始时间|false|String|String| + + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| -------- | -------- | ----- |----- | +|data|数据集|object| +|message|描述|string| +|method|请求url|string| +|status|状态|integer(int32)|integer(int32)| + +**输入参数示例** +```javascript +{ + "createTimeStart": "2022-06-01 00:00:00", + "createTimeEnd": "2022-06-30 00:00:00" +} +``` + + +**响应示例**: +```javascript +{ + "method": "/api/contextservice/clearAllContextByTime", + "status": 0, + "message": "OK", + "data": { + "num": "1" + } +} +``` + +### 5.2 JAVA SDK API +``` +# 引入pom + + org.apache.linkis + linkis-cs-client + 1.1.3 + + +# 代码参考如下 + + String createTimeStart = "2022-05-26 22:04:00"; + String createTimeEnd = "2022-06-01 24:00:00"; + + ContextClient contextClient = ContextClientFactory.getOrCreateContextClient(); + + # 接口1 searchHAIDByTime + List idList = + contextClient.searchHAIDByTime( + createTimeStart, createTimeEnd, null, null, null, null, 0, 0); + + for (String id : idList) { + System.out.println(id); + } + + System.out.println("Got " + idList.size() + " ids."); + + if (idList.size() > 0) { + String id1 = idList.get(0); + System.out.println("will clear context of id : " + id1); + } + + # 接口2 batchClearContextByHAID + List tmpList = new ArrayList<>(); + tmpList.add(id1); + int num = contextClient.batchClearContextByHAID(tmpList); + System.out.println("Succeed to clear " + num + " ids."); + + # 接口3 batchClearContextByTime + int num1 = + contextClient.batchClearContextByTime( + createTimeStart, createTimeEnd, null, null, null, null); + System.out.println("Succeed to clear " + num1 + " ids by time."); + +``` + + +## 6. 非功能性设计 +### 6.1 安全 +resultful接口需要登录认证,且需要管理员才能操作,管理员用户配置在properties文件中 + +### 6.2 性能 +- 查询ID接口searchContextIDByTime有分页,无性能影响 +- 清理指定ID接口clearAllContextByID限制操作数据量,无性能影响 +- 根据时间清理接口clearAllContextByTime,如果查询时间范围过大,可能会有查询超时,但不会任务失败。并且清理操作是单个操作,不会影响其他查询 + +### 6.3 容量 +本需求提供了时间范围查询和批量清理接口,需要上层使用ContextService的应用主动清理数据。 + +### 6.4 高可用 +接口复用ContextService微服务本身的高可用能力。 + + + + + + + + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-cache.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-cache.md new file mode 100644 index 00000000000..936f667a882 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-cache.md @@ -0,0 +1,101 @@ +--- +title: CS Cache 架构 +sidebar_position: 7 +--- + + +## **CSCache架构** +### **需要解决的问题** + +### 1.1. 内存结构需要解决的问题: + +1. 支持按ContextType进行拆分:加快存储和查询性能 + +2. 支持按不同的ContextID进行拆分:需要完成ContextID间元数据隔离 + +3. 支持LRU:按照特定算法进行回收 + +4. 支持按关键字进行检索:支持通过关键字进行索引 + +5. 支持索引:支持直接通过ContextKey进行索引 + +6. 支持遍历:需要支持通过按照ContextID、ContextType进行遍历 + +### 1.2 加载与解析需要解决的问题: + +1. 支持将ContextValue解析成内存数据结构:需要完成对ContextKey和value解析出对应的关键字。 + +2. 需要与与Persistence模块进行对接完成ContextID内容的加载与解析 + +### 1.3 Metric和清理机制需要解决的问题: + +1. 当JVM内存不够时能够基于内存使用和使用频率的清理 + +2. 支持统计每个ContextID的内存使用情况 + +3. 支持统计每个ContextID的使用频率 + +## **ContextCache架构** + +ContextCache的架构如下图展示: + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-01.png) + +1. ContextService:完成对外接口的提供,包括增删改查; + +2. Cache:完成对上下文信息的存储,通过ContextKey和ContextValue进行映射存储 + +3. Index:建立的关键字索引,存储的是上下文信息的关键字和ContextKey的映射; + +4. Parser:完成对上下文信息的关键字解析; + +5. LoadModule当ContextCache没有对应的ContextID信息时从持久层完成信息的加载; + +6. AutoClear:当Jvm内存不足时完成对ContextCache进行按需清理; + +7. Listener:用于监听ContextCache的Metric信息,如:内存占用、访问次数。 + +## **ContextCache存储结构设计** + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-02.png) + +ContextCache的存储结构划分为了三层结构: + +**ContextCach:**存储了ContextID和ContextIDValue的映射关系,并能够完成ContextID按照LRU算法进行回收; + +**ContextIDValue:**拥有存储了ContextID的所有上下文信息和索引的CSKeyValueContext。并统计ContextID的内存和使用记录。 + +**CSKeyValueContext:**包含了按照类型存储并支持关键词的CSInvertedIndexSet索引集,还包含了存储ContextKey和ContextValue的存储集CSKeyValueMapSet。 + +CSInvertedIndexSet:通过CSType进行分类存储关键词索引 + +CSKeyValueMapSet:通过CSType进行分类存储上下文信息 + +## **ContextCache UML类图设计** + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-03.png) + +## **ContextCache 时序图** + +下面的图绘制了以ContextID、KeyWord、ContextType去ContextCache中查对应的ContextKeyValue的整体流程。 +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-04.png) + +说明:其中ContextIDValueGenerator会去持久层拉取ContextID的Array[ContextKeyValue],并通过ContextKeyValueParser解析ContextKeyValue的关键字存储索引和内容。 + +ContextCacheService提供的其他接口流程类似,这里不再赘述。 + +## **KeyWord解析逻辑** + +ContextValue具体的实体Bean需要在对应可以作为keyword的get方法上面使用注解\@keywordMethod,比如Table的getTableName方法必须加上\@keywordMethod注解。 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-05.png) + +ContextKeyValueParser在解析ContextKeyValue的时候,会去扫描传入的具体对象的所有被KeywordMethod修饰的注解并调用该get方法获得返回对象toString并会通过用户可选的规则进行解析,存入keyword集合里面。规则有分隔符,和正则表达式 + +注意事项: + +1. 该注解会定义到cs的core模块 + +2. 被修饰的Get方法不能带参数 + +3. Get方法的返回对象的toSting方法必须返回的是关键字 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-client.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-client.md new file mode 100644 index 00000000000..b8a45b6c819 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-client.md @@ -0,0 +1,65 @@ +--- +title: CS Client +sidebar_position: 2 +--- +## **CSClient设计的思路和实现** + + +CSClient是每一个微服务和CSServer组进行交互的客户端,CSClient需要满足下面的功能。 + +1. 微服务向cs-server申请一个上下文对象的能力 + +2. 微服务向cs-server注册上下文信息的能力 + +3. 微服务能够向cs-server更新上下文信息的能力 + +4. 微服务向cs-server获取上下文信息的能力 + +5. 某一些特殊的微服务能够嗅探到cs-server中已经修改了上下文信息的操作 + +6. CSClient在csserver集群都失败的情况下能够给出明确的指示 + +7. CSClient需要提供复制csid1所有上下文信息为一个新的csid2用来提供给调度执行的 + +> 总体的做法是通过的linkis自带的linkis-httpclient进行发送http请求,通过实现各种Action和Result的实体类进行发送请求和接收响应。 + +### 1. 申请上下文对象的能力 + +申请上下文对象,例如用户在前端新建了一条工作流,dss-server需要向dss-server申请一个上下文对象,申请上下文对象的时候,需要将工作流的标识信息(工程名、工作流名)通过CSClient发送到CSServer中(这个时候gateway应该是随机发送给一个的,因为此时没有携带csid的信息),申请上下文一旦反馈到正确的结果之后,就会返回一个csid和该工作流进行绑定。 + +### 2. 注册上下文信息的能力 + +> 注册上下文的能力,例如用户在前端页面上传了资源文件,文件内容上传到dss-server,dss-server将内容存储到bml中,然后需要将从bml中获得的resourceid和version注册到cs-server中,此时需要使用到csclient的注册的能力,注册的能力是通过传入csid,以及cskey +> 和csvalue(resourceid和version)进行注册。 + +### 3. 更新注册的上下文的能力 + +> 更新上下文信息的能力。举一个例子,比如一个用户上传了一个资源文件test.jar,此时csserver已经有注册的信息,如果用户在编辑工作流的时候,将这个资源文件进行了更新,那么cs-server需要将这个内容进行更新。此时需要调用csclient的更新的接口 + +### 4. 获取上下文的能力 + +注册到csserver的上下文信息,在变量替换、资源文件下载、下游节点调用上游节点产生信息的时候,都是需要被读取的,例如engine端在执行代码的时候,需要进行下载bml的资源,此时需要通过csclient和csserver进行交互,获取到文件在bml中的resourceid和version然后再进行下载。 + +### 5. 某一些特殊的微服务能够嗅探到cs-server中已经修改了上下文信息的操作 + +这个操作是基于以下的例子,比如一个widget节点和上游的sql节点是有很强的联动性,用户在sql节点中写了一个sql,sql的结果集的元数据为a,b,c三个字段,后面的widget节点绑定了这个sql,能够在页面中进行对这三个字段的编辑,然后用户更改了sql的语句,元数据变成了a,b,c,d四个字段,此时用户需要手动刷新一下才行。我们希望做到如果脚本做到了改变,那么widget节点能够自动的进行将元数据进行更新。这个一般采用的是listener模式,为了简便,也可以采用心跳的机制进行轮询。 + +### 6. CSClient需要提供复制csid1所有上下文信息为一个新的csid2用来提供给调度执行的 + +用户一旦发布一个工程,就是希望对这个工程的所有信息进行类似于git打上一个tag,这里的资源文件、自定义变量这些都是不会再变的,但是有一些动态信息,如产生的结果集等还是会更新csid的内容。所以csclient需要提供一个csid1复制所有上下文信息的接口以供微服务进行调用 + +## **ClientListener模块的实现** + +对于一个client而言,有时候会希望在尽快的时间内知道某一个csid和cskey在cs-server中发生了改变,例如visualis的csclient需要能够知道上一个sql节点进行了改变,那么需要被通知到,服务端有一个listener模块,而客户端也需要一个listener模块,例如一个client希望能够监听到某一个csid的某一个cskey的变化,那么他需要将该cskey注册到对应的csserver实例中的callbackEngine,后续的比如有另外一个client进行更改了该cskey的内容,第一个client进行了heatbeat的时候,callbackengine就需要将这个信息通知到已经client监听的所有cskey,这样的话,第一个client就知道了该cskey的内容已经发生了变化。当heatbeat返回数据的时候,我们就应该通知到注册到ContextClientListenerBus的所有的listener进行使用on方法 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-client-01.png) + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-client-02.png) + +## **GatewayRouter的实现** + + +Gateway插件实现Context进行转发Gateway的插件的转发逻辑是通过的GatewayRouter进行的,需要分成两种方式进行,第一种是申请一个context上下文对象的时候,这个时候,CSClient携带的信息中是没有包含csid的信息的,此时的判断逻辑应该是通过eureka的注册信息,第一次发送的请求将会随机进入到一个微服务实例中。 +第二种情况是携带了ContextID的内容,我们需要将csid进行解析,解析的方式就是通过字符串切割的方法,获取到每一个instance的信息,然后通过instance的信息通过eureka判断是否还存在这个微服务,如果是存在的,就往这个微服务实例进行发送 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-client-03.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-highavailable.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-highavailable.md new file mode 100644 index 00000000000..0ff23ddf098 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-highavailable.md @@ -0,0 +1,90 @@ +--- +title: CS HA 架构设计 +sidebar_position: 3 +--- +## **CS HA架构设计** + +### 1,CS HA架构概要 + +#### (1)CS HA架构图 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-01.png) + +#### (2)要解决的问题 + +- Context instance对象的HA + +- Client创建工作流时生成CSID请求 + +- CS Server的别名列表 + +- CSID统一的生成和解析规则 + +#### (3)主要设计思路 + +①负载均衡 + +当客户端创建新的工作流时,等概率随机请求到某台Server的HA模块生成新的HAID,HAID信息包含该主Server信息(以下称主instance),和备选instance,其中备选instance为剩余Server中负载最低的instance,以及一个对应的ContextID。生成的HAID与该工作流绑定且被持久化到数据库,并且随后该工作流所有变更操作请求都将发送至主instance,实现负载的均匀分配。 + +②高可用 + +在后续操作中,当客户端或者gateway判定主instance不可用时,会将操作请求转发至备instance处理,从而实现服务的高可用。备instance的HA模块会根据HAID信息首先验证请求合法性。 + +③别名机制 + +对机器采用别名机制,HAID中包含的Instance信息采用自定义别名,后台维护别名映射队列。在客户端交互时采用HAID,而与后台其它组件交互则采用ContextID,在实现具体操作时采用动态代理机制,将HAID转换为ContextID进行处理。 + +### 2,模块设计 + +#### (1)模块图 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-02.png) + +#### (2)具体模块 + +①ContextHAManager模块 + +提供接口供CS Server调用生成CSID及HAID,并提供基于动态代理的别名转换接口; + +调用持久化模块接口持久化CSID信息; + +②AbstractContextHAManager模块 + +ContextHAManager的抽象,可支持实现多种ContextHAManager; + +③InstanceAliasManager模块 + +RPC模块提供Instance与别名转换接口,维护别名映射队列,并提供别名与CS +Server实例的查询;提供验证主机是否有效接口; + +④HAContextIDGenerator模块 + +生成新的HAID,并且封装成客户端约定格式返回给客户端。HAID结构如下: + +\${第一个instance长度}\${第二个instance长度}{instance别名1}{instance别名2}{实际ID},实际ID定为ContextID +Key; + +⑤ContextHAChecker模块 + +提供HAID的校验接口。收到的每个请求会校验ID格式是否有效,以及当前主机是否为主Instance或备Instance:如果是主Instance,则校验通过;如果为备Instance,则验证主Instance是否失效,主Instance失效则验证通过。 + +⑥BackupInstanceGenerator模块 + +生成备用实例,附加在CSID信息里; + +⑦MultiTenantBackupInstanceGenerator接口 + +(保留接口,暂不实现) + +### 3. UML类图 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-03.png) + +### 4. HA模块操作时序图 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-04.png) + +第一次生成CSID: +由客户端发出请求,Gateway转发到任一Server,HA模块生成HAID,包含主Instance和备instance及CSID,完成工作流与HAID的绑定。 + +当客户端发送变更请求时,Gateway判定主Instance失效,则将请求转发到备Instance进行处理。备Instance上实例验证HAID有效后,加载Instance并处理请求。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-listener.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-listener.md new file mode 100644 index 00000000000..87ce94f0978 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-listener.md @@ -0,0 +1,37 @@ +--- +title: CS Listener 架构 +sidebar_position: 4 +--- +## **Listener架构** + +在DSS中,当某个节点更改了它的元数据信息后,则整个工作流的上下文信息就发生了改变,我们期望所有的节点都能感知到变化,并自动进行元数据更新。我们采用监听模式来实现,并使用心跳机制进行轮询,保持上下文信息的元数据一致性。 + +### **客户端 注册自己、注册CSKey及更新CSKey过程** + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-listener-01.png) + +主要过程如下: + +1、注册操作:客户端client1、client2、client3、client4通过HTPP请求分别向csserver注册自己以及想要监听的CSKey,Service服务通过对外接口获取到callback引擎实例,注册客户端及其对应的CSKeys。 + +2、更新操作:如ClientX节点更新了CSKey内容,Service服务则更新ContextCache缓存的CSKey,ContextCache将更新操作投递给ListenerBus,ListenerBus通知具体的listener进行消费(即ContextKeyCallbackEngine去更新Client对应的CSKeys),超时未消费的事件,会被自动移除。 + +3、心跳机制: + +所有Client通过心跳信息探测ContextKeyCallbackEngine中CSKeys的值是否发生了变化。 + +ContextKeyCallbackEngine通过心跳机制返回更新的CSKeys值给所有已注册的客户端。如果有客户端心跳超时,则移除该客户端。 + +### **Listener UM类图** + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-02.png) + +接口:ListenerManager + +对外:提供ListenerBus,用于投递事件。 + +对内:提供 callback引擎,进行事件的具体注册、访问、更新,及心跳处理等逻辑 + +## **Listener callbackengine时序图** + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-03.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-persistence.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-persistence.md new file mode 100644 index 00000000000..b19366084c8 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-persistence.md @@ -0,0 +1,13 @@ +--- +title: CS Persistence 架构 +sidebar_position: 5 +--- + +## **CSPersistence架构** + +### Persistence UML图 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-persistence-01.png) + + +Persistence模块主要定义了ContextService持久化相关操作。实体主要包含CSID、ContextKeyValue相关、CSResource相关、CSTable相关。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-search.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-search.md new file mode 100644 index 00000000000..18c1f8ed5e9 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-search.md @@ -0,0 +1,131 @@ +--- +title: CS Search 架构 +sidebar_position: 6 +--- +## **CSSearch架构** +### **总体架构** + +如下图所示: + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-01.png) + +1. ContextSearch:查询入口,接受Map形式定义的查询条件,根据条件返回相应的结果。 + +2. 构建模块:每个条件类型对应一个Parser,负责将Map形式的条件转换成Condition对象,具体通过调用ConditionBuilder的逻辑实现。具有复杂逻辑关系的Condition会通过ConditionOptimizer进行基于代价的算法优化查询方案。 + +3. 执行模块:从Cache中,筛选出与条件匹配的结果。根据查询目标的不同,分为Ruler、Fetcher和Match而三种执行模式,具体逻辑在后文描述。 + +4. 评估模块:负责条件执行代价的计算和历史执行状况的统计。 + +### **查询条件定义(ContextSearchCondition)** + +一个查询条件,规定了该如何从一个ContextKeyValue集合中,筛选出符合条件的那一部分。查询条件可以通过逻辑运算构成更加复杂的查询条件。 + +1. 支持ContextType、ContextScope、KeyWord的匹配 + + 1. 分别对应一个Condition类型 + + 2. 在Cache中,这些都应该有相应的索引 + +2. 支持对key的contains/regex匹配模式 + + 1. ContainsContextSearchCondition:包含某个字符串 + + 2. RegexContextSearchCondition:匹配某个正则表达式 + +3. 支持or、and和not的逻辑运算 + + 1. 一元运算UnaryContextSearchCondition: + +> 支持单个参数的逻辑运算,比如NotContextSearchCondition + +1. 二元运算BinaryContextSearchCondition: + +> 支持两个参数的逻辑运算,分别定义为LeftCondition和RightCondition,比如OrContextSearchCondition和AndContextSearchCondition + +1. 每个逻辑运算均对应一个上述子类的实现类 + +2. 该部分的UML类图如下: + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-02.png) + +### **查询条件的构建** + +1. 支持通过ContextSearchConditionBuilder构建:构建时,如果同时声明多项ContextType、ContextScope、KeyWord、contains/regex的匹配,自动以And逻辑运算连接 + +2. 支持Condition之间进行逻辑运算,返回新的Condition:And,Or和Not(考虑condition1.or(condition2)的形式,要求Condition顶层接口定义逻辑运算方法) + +3. 支持通过每个底层实现类对应的ContextSearchParser从Map构建 + +### **查询条件的执行** + +1. 查询条件的三种作用方式: + + 1. Ruler:从一个Array中筛选出符合条件的ContextKeyValue子Array + + 2. Matcher:判断单个ContextKeyValue是否符合条件 + + 3. Fetcher:从ContextCache里筛选出符合条件的ContextKeyValue的Array + +2. 每个底层的Condition都有对应的Execution,负责维护相应的Ruler、Matcher、Fetcher。 + +### **查询入口ContextSearch** + +提供search接口,接收Map作为参数,从Cache中筛选出对应的数据。 + +1. 通过Parser,将Map形式的条件转换为Condition对象 + +2. 通过Optimizer,获取代价信息,并根据代价信息确定查询的先后顺序 + +3. 通过对应的Execution,执行相应的Ruler/Fetcher/Matcher逻辑后,得到搜索结果 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-03.png) + +### **查询优化** + +1. OptimizedContextSearchCondition维护条件的Cost和Statistics信息: + + 1. Cost信息:由CostCalculator负责判断某个Condition是否能够计算出Cost,如果可以计算,则返回对应的Cost对象 + + 2. Statistics信息:开始/结束/执行时间、输入行数、输出行数 + +2. 实现一个CostContextSearchOptimizer,其optimize方法以Condition的代价为依据,对Condition进行调优,转换为一个OptimizedContextSearchCondition对象。具体逻辑描述如下: + + 1. 将一个复杂的Condition,根据逻辑运算的组合,拆解成一个树形结构,每个叶子节点均为一个最基本的简单Condition;每个非叶子节点均为一个逻辑运算。 + +> 如下图所示的树A,就是一个由ABCDE这五个简单条件,通过各种逻辑运算组合成的一个复杂条件。 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-04.png) +
(树A)
+ +1. 这些Condition的执行,事实上就是深度优先、从左到右遍历这个树。而且根据逻辑运算的交换规律,Condition树中一个节点的子节点的左右顺序可以互换,因此可以穷举出所有可能的执行顺序下的所有可能的树。 + +> 如下图所示的树B,就是上述树A的另一个可能的顺序,与树A的执行结果完全一致,只是各部分的执行顺序有所调整。 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-05.png) +
(树B)
+ +1. 针对每一个树,从叶子节点开始计算代价,归集到根节点,即为该树的最终代价,最终得出代价最小的那个树,作为最优执行顺序。 + +> 计算节点代价的规则如下: + +1. 针对叶子节点,每个节点有两个属性:代价(Cost)和权重(Weight)。Cost即为CostCalculator计算出的代价,Weight是根据节点执行先后顺序的不同赋予的,当前默认左边为1,右边为0.5,后续看如何调整(赋予权重的原因是,左边的条件在一些情况下已经可以直接决定整个组合逻辑的匹配与否,所以右边的条件并非所有情况下都要执行,实际开销就需要减少一定的比例) + +2. 针对非叶子节点,Cost=所有子节点的Cost×Weight的总和;Weight的赋予逻辑与叶子节点一致。 + +> 以树A和树B为例子,分别计算出这两个树的代价,如下图所示,节点中的数字为Cost\|Weight,假设ABCDE这5个简单条件的Cost为10、100、50、10和100。由此可以得出,树B的代价小于树A,为更优方案。 + + +
+ +
+ +1. 用CostCalculator衡量简单条件的Cost的思路: + + 1. 作用在索引上的条件:根据索引值的分布来确定代价。比如当条件A从Cache中get出来的Array长度是100,条件B为200,那么条件A的代价小于B。 + + 2. 需要遍历的条件: + + 1. 根据条件本身匹配模式给出一个初始Cost:如Regex为100,Contains为10等(具体数值等实现时根据情况调整) + + 2. 根据历史查询的效率,在初始Cost的基础上进行不断调整后,得到实时的Cost。单位时间吞吐量 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service.md new file mode 100644 index 00000000000..628b09a2943 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service.md @@ -0,0 +1,60 @@ +--- +title: CS 架构 +sidebar_position: 1 +--- + +## **ContextService架构** + +### **水平划分** + +从水平上划分为三个模块:Restful,Scheduler,Service + +#### Restful职责: + + 将请求封装为httpjob提交到Scheduler + +#### Scheduler职责: + + 通过httpjob的protocol的ServiceName找到相应的服务执行这个job + +#### Service职责: + + 真正执行请求逻辑的模块,封装ResponseProtocol,并唤醒Restful中wait的线程 + +### **垂直划分** +从垂直上划分为4个模块:Listener,History,ContextId,Context: + +#### Listener职责: + +1. 负责Client端的注册和绑定(写入数据库和在CallbackEngine中进行注册) + +2. 心跳接口,通过CallbackEngine返回Array[ListenerCallback] + +#### History职责: +创建和移除history,操作Persistence进行DB持久化 + +#### ContextId职责: +主要是对接Persistence进行ContextId的创建,更新移除等操作 + +#### Context职责: + +1. 对于移除,reset等方法,先操作Persistence进行DB持久化,并更新ContextCache + +2. 封装查询condition去ContextSearch模块获取相应的ContextKeyValue数据 + +请求访问步骤如下图: +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-01.png) + +## **UML类图** +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-02.png) + +## **Scheduler线程模型** + +需要保证Restful的线程池不被填满 + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-03.png) + +时序图如下: +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-04.png) + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/overview.md new file mode 100644 index 00000000000..68591cc5386 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/overview.md @@ -0,0 +1,129 @@ +--- +title: 总览 +sidebar_position: 0 +--- + +## **背景** + +### **什么是上下文Context?** + +保持某种操作继续进行的所有必需信息。如:同时看三本书,每本书已翻看的页码就是继续看这本书的上下文。 + +### **为什么需要CS(Context Service)?** + +CS,用于解决一个数据应用开发流程,跨多个系统间的数据和信息共享问题。 + +例如,B系统需要使用A系统产生的一份数据,通常的做法如下: + +1. B系统调用A系统开发的数据访问接口; + +2. B系统读取A系统写入某个共享存储的数据。 + +有了CS之后,A和B系统只需要与CS交互,将需要共享的数据和信息写入到CS,需要读取的数据和信息从CS中读出即可,无需外部系统两两开发适配,极大降低了系统间信息共享的调用复杂度和耦合度,使各系统的边界更加清晰。 + +## **产品范围** + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-01.png) + + +### 元数据上下文 + +元数据上下文定义元数据规范。 + +元数据上下文依托于数据中间件,主要功能如下: + +1. 打通与数据中间件的关系,能拿到所有的用户元数据信息(包括Hive表元数据、线上库表元数据、其他NOSQL如HBase、Kafka等元数据) + +2. 所有节点需要访问元数据时,包括已有元数据和应用模板内元数据,都必须经过元数据上下文。元数据上下文记录了应用模板所使用的所有元数据信息。 + +3. 各节点所产生的新元数据,都必须往元数据上下文注册。 + +4. 抽出应用模板时,元数据上下文为应用模板抽象(主要是将用到的多个库表做成\${db}.表形式,避免数据权限问题)和打包所有依赖的元数据信息。 + +元数据上下文是交互式工作流的基础,也是应用模板的基础。设想:Widget定义时,如何知道DataWrangler定义的各指标维度?Qualitis如何校验Widget产生的图报表? + +### 数据上下文 + +数据上下文定义数据规范。 + +数据上下文依赖于数据中间件和Linkis计算中间件。主要功能如下: + +1. 打通数据中间件,拿到所有用户数据信息。 + +2. 打通计算中间件,拿到所有节点的数据存储信息。 + +3. 所有节点需要写临时结果时,必须通过数据上下文,由数据上下文统一分配。 + +4. 所有节点需要访问数据时,必须通过数据上下文。 + +5. 数据上下文会区分依赖数据和生成数据,在抽出应用模板时,为应用模板抽象和打包所有依赖的数据。 + +### 资源上下文 + +资源上下文定义资源规范。 + +资源上下文主要与Linkis计算中间件交互。主要功能如下: + +1. 用户资源文件(如Jar、Zip文件、properties文件等) + +2. 用户UDF + +3. 用户算法包 + +4. 用户脚本 + +### 环境上下文 + +环境上下文定义环境规范。 + +主要功能如下: + +1. 操作系统 + +2. 软件,如Hadoop、Spark等 + +3. 软件包依赖,如Mysql-JDBC。 + +### 对象上下文 + +运行时上下文为应用模板(工作流)在定义和执行时,所保留的所有上下文信息。 + +它用于协助定义工作流/应用模板,在工作流/应用模板执行时提示和完善所有必要信息。 + +运行时工作流主要是Linkis使用。 + + +## **CS架构图** + +![](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-02.png) + +## **架构说明:** + +### 1. Client +外部访问CS的入口,Client模块提供HA功能; +[进入Client架构设计](context-service-client.md) + +### 2. Service模块 +提供Restful接口,封装和处理客户端提交的CS请求; +[进入Service架构设计](context-service.md) + +### 3. ContextSearch +上下文查询模块,提供丰富和强大的查询能力,供客户端查找上下文的Key-Value键值对; +[进入ContextSearch架构设计](context-service-search.md) + +### 4. Listener +CS的监听器模块,提供同步和异步的事件消费能力,具备类似Zookeeper的Key-Value一旦更新,实时通知Client的能力; +[进入Listener架构设计](context-service-listener.md) + +### 5. ContextCache +上下文的内存缓存模块,提供快速检索上下文的能力和对JVM内存使用的监听和清理能力; +[进入ContextCache架构设计](context-service-cache.md) + +### 6. HighAvailable +提供CS高可用能力; +[进入HighAvailable架构设计](context-service-highavailable.md) + +### 7. Persistence +CS的持久化功能; +[进入Persistence架构设计](context-service-persistence.md) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/datasource-manager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/datasource-manager.md new file mode 100644 index 00000000000..66fc3b7fc69 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/datasource-manager.md @@ -0,0 +1,140 @@ +--- +title: 数据源管理服务架构 +sidebar_position: 5 +--- +## 背景 + +早期版本中的Exchangis0.x和Linkis0.x都有整合数据源模块,为复用数据源的管理能力,Linkis以linkis-datasource为蓝本(可以参阅相关的文档)重构数据源模块,将数据源管理拆封成数据源管理服务与元数据查询服务。 + +本文主要涉及DataSource Manager Server数据源管理服务,提供如下功能: + +1)、Linkis统一管理服务启动与部署,不增加运维成本,复用Linkis服务能力; + +2)、通过Linkis Web提供图形界面的管理服务,界面提供了新增数据源,数据源查询、数据源更新,连通性测试等管理服务; + +3)、服务无状态,多实例部署,做到服务高可用。本系统在部署的时候,可以进行多实例部署,每个实例对外独立提供服务,不会互相干扰,所有的信息都是存储在数据库中进行共享。 + +4)、提供数据源全生命周期管理,包括新建、查询、更新、测试、过期管理。 + +5)、多版本数据源管理,历史数据源会保存在数据库中,并提供数据源过期管理。 + +6)、Restful接口提供功能,详细列表:数据源类型查询、数据源详细信息查询、基于版本进行数据源信息查询、数据源版本查询、获取数据源参数列表、多维度数据源搜索、获数据源环境查询及更新、新增数据源、数据源参数配置、数据源过期设置、数据源连通性测试。 + +## 架构图 + +![datasource结构图](/Images-zh/Architecture/datasource/linkis-datasource-server.png) + +## 架构说明 + +1、服务登记在Linkis-Eureak-Service服务中,与Linkis其他微服务统一管理,客户端可以通过连接Linkis-GateWay-Service服务与服务名 data-source-manager获取数据源管理服务。 + +2、接口层,通过Restful接口向其他应用,提供了针对数据源、数据源环境的增删查改、数据源链接与双链接测试、数据源版本管理及过期操作; + +3、Service层,主要针对数据库与物料库的服务管理,永久保留数据源相关信息; + +4、数据源的链接测试都是通过linkis metastore server服务完成的,该服务现在提供mysql\es\kafka\hive服务 + +### 核心流程 + +1、 新建数据源,首先会从请求中获取新建数据源的用户,判断用户是否有效,下一步会对数据源相关字段信息进行校验,数据源名称和数据源类型不能为空,再下一步会根据数据源名称进行确认该数据源是否存在,如果不存在则将在数据库中进行插入,同时数据源ID号返回。 + +2、 更新数据源,首先会从请求中获取新建数据源的用户,判断用户是否有效,下一步会对新的数据源相关字段信息进行校验,数据源名称和数据源类型不能为空,再下一步会根据数据源ID号进行确认该数据源是否存在,如果不存在返回异常,如果存在将进一步判断该用户是否对该数据源有更新权限,用户是管理员或者数据源owner才有权限更新,如果有权限则将更新该数据源,并返回数据源ID。 + +3、 更新数据源参数,首先会从请求中获取新建数据源的用户,判断用户是否有效,根据所传参数数据源ID获取详细的数据源信息,接着会判断用户是否是改数据源的owner后者是否为管理员,如果有则进一步校验修改的参数,通过后则会更新参数,并返回versionId。 + +## 实体对象 + +| 类名 | 作用 | +| ---------------------------- | -------------------------------------------- | +| DataSourceType | 表示数据源的类型 | +| DataSourceParamKeyDefinition | 声明数据源属性配置定义 | +| DataSource | 数据源对象实体类,包含权限标签和属性配置定义 | +| DataSourceEnv | 数据源环境对象实体类,也包含属性配置定义 | +| DataSourceParameter | 数据源具体参数配置 | +| DatasourceVersion | 数据源版本详细信息 | + +## **数据库设计** + +##### 数据库关系图: + +![](/Images-zh/Architecture/datasource/dn-db.png) + +##### 数据表定义: + +表名:linkis_ps_dm_datatsource <-->实体:DataSource + +| 序号 | 字段 | 字段描述 | +| ---- | -------------------- | ---------------- | +| 1 | id | 数据源ID | +| 2 | datasource_name | 数据源名称 | +| 3 | datasource_desc | 数据源详细描述 | +| 4 | datasource_type_id | 数据源类型ID | +| 5 | create_identify | 标识 | +| 6 | create_system | 创建数据源的系统 | +| 7 | parameter | 数据源参数,注意 不做存储,实体类parameter字段通过linkis_ps_dm_datasource_version的parameter获取 | +| 8 | create_time | 数据源创建时间 | +| 9 | modify_time | 数据源修改时间 | +| 10 | create_user | 数据源创建用户 | +| 11 | modify_user | 数据源修改用户 | +| 12 | labels | 数据源标签 | +| 13 | version_id | 数据源版本ID | +| 14 | expire | 数据源是否过期 | +| 15 | published_version_id | 数据源发布版本号 | + +表名:linkis_ps_dm_datasource_type <-->实体:DataSourceType + +| 序号 | 字段 | 字段描述 | +| ---- | ----------- | ------------------ | +| 1 | id | 数据源类型ID | +| 2 | name | 数据源类型名称 | +| 3 | description | 数据源类型描述 | +| 4 | option | 数据源所属类型 | +| 5 | classifier | 数据源类型分类词 | +| 6 | icon | 数据源图片显示路径 | +| 7 | layers | 数据源类型层次 | + +表名:linkis_ps_dm_datasource_env <-->实体:DataSourceEnv + +| 序号 | 字段 | 字段描述 | +| ---- | ------------------ | ------------------ | +| 1 | id | 数据源环境ID | +| 2 | env_name | 数据源环境名称 | +| 3 | env_desc | 数据源环境描述 | +| 4 | datasource_type_id | 数据源类型ID | +| 5 | parameter | 数据源环境参数 | +| 6 | create_time | 数据源环境创建时间 | +| 7 | create_user | 数据源环境创建用户 | +| 8 | modify_time | 数据源修改时间 | +| 9 | modify_user | 数据源修改用户 | + +表名:linkis_ps_dm_datasource_type_key <-->实体:DataSourceParamKeyDefinition + +| 序号 | 字段 | 字段描述 | +| ---- | ------------------- | ------------------ | +| 1 | id | 键值类型ID | +| 2 | data_source_type_id | 数据源类型ID | +| 3 | key | 数据源参数key值 | +| 4 | name | 数据源参数名称 | +| 5 | default_value | 数据源参数默认值 | +| 6 | value_type | 数据源参数类型 | +| 7 | scope | 数据源参数范围 | +| 8 | require | 数据源参数是否必须 | +| 9 | description | 数据源参数描述 | +| 10 | value_regex | 数据源参数正则 | +| 11 | ref_id | 数据源参数关联ID | +| 12 | ref_value | 数据源参数关联值 | +| 13 | data_source | 数据源 | +| 14 | update_time | 更新时间 | +| 15 | create_time | 创建时间 | + +表名:linkis_ps_dm_datasource_version <-->实体:DatasourceVersion + +| 序号 | 字段 | 字段描述 | +| ---- | ------------- | ---------------- | +| 1 | version_id | 数据源版本ID | +| 2 | datasource_id | 数据源ID | +| 3 | parameter | 数据源该版本参数 | +| 4 | comment | 内容 | +| 5 | create_time | 创建时间 | +| 6 | create_user | 创建用户 | + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/metadata-manager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/metadata-manager.md new file mode 100644 index 00000000000..5d1eed0b683 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/metadata-manager.md @@ -0,0 +1,39 @@ +--- +title: 元数据管理服务架构 +sidebar_position: 3 +--- +## 背景 + +早期版本中的Exchangis0.x和Linkis0.x都有整合数据源模块,为复用数据源的管理能力,Linkis以linkis-datasource为蓝本(可以参阅相关的文档)重构数据源模块,将数据源管理拆封成数据源管理服务与元数据查询服务。 + +本文主要涉及MetaData Manager Server数据源管理服务,提供如下功能: + +1)、Linkis统一管理服务启动与部署,不增加运维成本,复用Linkis服务能力; + +2)、服务无状态,多实例部署,做到服务高可用。本系统在部署的时候,可以进行多实例部署,每个实例对外独立提供服务,不会互相干扰,所有的信息都是存储在数据库中进行共享。 + +3)、提供数据源全生命周期管理,包括新建、查询、更新、测试、过期管理。 + +4)、多版本数据源管理,历史数据源会保存在数据库中,并提供数据源过期管理。 + +5)、Restful接口提供功能,详细列表:数据库信息查询、数据库表信息查询、数据库表参数信息查询、数据分区信息查询。 + +## 架构图 + +![BML架构图](/Images-zh/Architecture/datasource/meta-server.png) + +## 架构说明 + +1、服务登记在Linkis-Eureak-Service服务中,与Linkis其他微服务统一管理,客户端可以通过连接Linkis-GateWay-Service服务与服务名 metamanager获取数据源管理服务。 + +2、接口层,通过Restful接口向其他应用,提供了数据库\表\分区信息查询; + +3、Service层,通过数据源ID号在数据源管理服务中获取到数据源类型,通过类型获取具体支持的服务,支持的服务为mysql\es\kafka\hive; + +### 核心流程 + +1、 客户端输入指定的数据源ID,通过restful接口获取信息,如查询数据源ID为1的数据库列表,,则url为`http:///metadatamanager/dbs/1`, + +2、 根据数据源ID,通过RPC访问数据源服务``获取到数据源类型 + +3、 根据数据源类型,加载对应的Service服务[hive\es\kafka\mysql],执行对应的操作,然后返回; \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/overview.md new file mode 100644 index 00000000000..c1e2aff2188 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/overview.md @@ -0,0 +1,96 @@ +--- +title: 总览 +sidebar_position: 1 +--- + +PublicEnhencementService(PS)架构设计 +====================================== + +PublicEnhancementService(PS):公共增强服务,为其他微服务模块提供统一配置管理、上下文服务、物料库、数据源管理、微服务管理和历史任务查询等功能的模块。 + +![](/Images-zh/Architecture/PublicEnhencement架构图.png) + +二级模块介绍: +============== + +BML物料库 +--------- + +是linkis的物料管理系统,主要用来存储用户的各种文件数据,包括用户脚本、资源文件、第三方Jar包等,也可以存储引擎运行时需要使用到的类库。 + +| 核心类 | 核心功能 | +|-----------------|------------------------------------| +| UploadService | 提供资源上传服务 | +| DownloadService | 提供资源下载服务 | +| ResourceManager | 提供了上传、下载资源的统一管理入口 | +| VersionManager | 提供了资源版本标记和版本管理功能 | +| ProjectManager | 提供了项目级的资源管控能力 | + +Configuration统一配置管理 +------------------------- + +Configuration提供了“用户—引擎—应用”三级配置管理方案,实现了为用户提供配置各种接入应用下自定义引擎参数的功能。 + +| 核心类 | 核心功能 | +|----------------------|--------------------------------| +| CategoryService | 提供了应用和引擎目录的管理服务 | +| ConfigurationService | 提供了用户配置统一管理服务 | + +ContextService上下文服务 +------------------------ + +ContextService用于解决一个数据应用开发流程,跨多个系统间的数据和信息共享问题。 + +| 核心类 | 核心功能 | +|---------------------|------------------------------------------| +| ContextCacheService | 提供对上下文信息缓存服务 | +| ContextClient | 提供其他微服务和CSServer组进行交互的能力 | +| ContextHAManager | 为ContextService提供高可用能力 | +| ListenerManager | 提供消息总线的能力 | +| ContextSearch | 提供了查询入口 | +| ContextService | 实现了上下文服务总体的执行逻辑 | + +Datasource数据源管理 +-------------------- + +Datasource为其他微服务提供不同数据源连接的能力。 + +| 核心类 | 核心功能 | +|-------------------|--------------------------| +| datasource-server | 提供不同数据源连接的能力 | + +InstanceLabel微服务管理 +----------------------- + +InstanceLabel为其他接入linkis的微服务提供注册和标签功能。 + +| 核心类 | 核心功能 | +|-----------------|--------------------------------| +| InsLabelService | 提供微服务注册和标签管理的功能 | + +Jobhistory历史任务管理 +---------------------- + +Jobhistory为用户提供了linkis历史任务查询、进度、日志展示的相关功能,为管理员提供统一历史任务视图。 + +| 核心类 | 核心功能 | +|------------------------|----------------------| +| JobHistoryQueryService | 提供历史任务查询服务 | + +Variable用户自定义变量管理 +-------------------------- + +Variable为用户提供自定义变量存储和使用的相关功能。 + +| 核心类 | 核心功能 | +|-----------------|------------------------------------| +| VariableService | 提供自定义变量存储和使用的相关功能 | + +UDF用户自定义函数管理 +--------------------- + +UDF为用户提供自定义函数的功能,用户可以在在编写代码时自行引入。 + +| 核心类 | 核心功能 | +|------------|------------------------| +| UDFService | 提供用户自定义函数服务 | diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/public-service.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/public-service.md new file mode 100644 index 00000000000..2ca0ea2e92e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/feature/public-enhancement-services/public-service.md @@ -0,0 +1,27 @@ +--- +title: 公共服务架构 +sidebar_position: 2 +--- +## **背景** +为什么在我们将Linkis作为统一网关或JobServer后,还要为其增加公共增强的能力呢?这个是在我们实际去开发了多个上层应用工具后,发现如在IDE工具里面定义了一个UDF、变量调试通过后,在发布到调度工具的时候,这些UDF和变量又需要重现定义一遍。当依赖的一些jar包、配置文件等发生变化时,也需要修改两个地方。 +针对这些类似跨上层应用工具的公共上下文的问题,在我们实现任务统一入口为Linkis后,我们就在想是不是可以由Linkis去提供这个公共增强的能力,提供一些公共可以被多个应用工具去复用的能力。所以在Linkis层设计了一层公共增强服务PES + + +## **架构图** + +![](/Images/Architecture/Public_Enhancement_Service/pes_arc.png) + +## **架构说明** + +现在已经提供了以下能力: +- 提供统一的数据源能力:数据源在Linkis层进行统一定义和管理,应用工具只需要通过数据源名字来进行使用,不再需要去维护对应数据源的连接信息。而且在不同的工具间数据源的含义都是一样的。并提供了相应的数据源的元数据的查询能力。 +- 提供公共的UDF能力:统一UDF、小函数的定义规范和语义,做到一处定义多个工具都可使用。 +- 提供统一上下文的能力:支持任务间传递信息,包括变量、结果集、资源文件的多任务间传递,提供任务间传递上下文的能力。 +- 提供统一物料的能力:提供统一的物料,在多个工具间支持共享访问这些物料,并且物料支持存储多种的文件类型,并支持版本控制。 +- 提供统一配置和变量的能力:提供了统一的配置能力支持模板化的配置不同的引擎参数模版,支持自定义变量、内置常用的系统变量和时间格式变量等。 +- 提供公共错误码的能力:提供统一的错误码能力,对常用计算存储引擎的作物进行分类编码以及知识库的能力,并提供了方便的SDK进行调用。 + +通过Linkis的公共增强服务,可以打破上层应用工具间的孤岛,做到变量、函数、文件、结果集等上下文的共享,就像下图所暂时的一样,并且大大减少应用工具间的重复开发工作。 +![](/Images/Architecture/Public_Enhancement_Service/pes_arc_demo.png) + +[详细介绍可以参考](https://mp.weixin.qq.com/s/UfUB8AGZtusbFmmtiZfK1A) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/overview.md new file mode 100644 index 00000000000..334314da502 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/overview.md @@ -0,0 +1,26 @@ +--- +title: 总览 +sidebar_position: 1 +--- + +Linkis 1.0 将所有微服务总体划分为三大类:公共增强服务、计算治理服务、微服务治理服务。如下图所示为Linkis 1.0 的架构图。 + +![Linkis1.0架构图](/Images-zh/Architecture/Linkis1.0-architecture.png) + + +各大类的具体职责如下: + +1. 公共增强服务为 Linkis 0.X 已经提供的物料库服务、上下文服务、数据源服务和公共服务等。 + +2. 微服务治理服务为 Linkis 0.X 已经提供的 Spring Cloud Gateway、Eureka 和 Open Feign。 + +3. 计算治理服务是 Linkis 1.0 的核心重点,从 提交 —> 准备 —> 执行三个阶段,来全面升级 Linkis 对 用户任务的执行管控能力。 + +以下是 Linkis1.0 架构文档的目录列表: + +1. Linkis1.0公共增强服务相关文档,请阅读[公共增强服务](feature/public-enhancement-services/overview.md)。 + +2. Linkis1.0微服务治理相关文档,请阅读[微服务治理](service-architecture/overview.md)。 + +3. Linkis1.0提出的计算治理服务相关文档,请阅读 [计算治理服务](feature/computation-governance-services/overview.md)。 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/_category_.json new file mode 100644 index 00000000000..87ec81471d2 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "微服务架构", + "position": 3 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/gateway.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/gateway.md new file mode 100644 index 00000000000..ca13c7470e2 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/gateway.md @@ -0,0 +1,34 @@ +--- +title: 网关架构 +sidebar_position: 1 +--- +## Gateway 架构设计 + +#### 简述 +Gateway网关是Linkis接受客户端以及外部请求的首要入口,例如接收作业执行请求,而后将执行请求转发到具体的符合条件的Entrance服务中去。 +整个架构底层基于SpringCloudGateway做扩展实现,上层叠加了与Http请求解析,会话权限,标签路由和WebSocket多路转发等相关的模组设计,整体架构可见如下。 + +### 整体架构示意图 + +![Gateway整体架构示意图](/Images-zh/Architecture/Gateway/gateway_server_global.png) + +#### 架构说明 +- gateway-core: Gateway的核心接口定义模块,主要定义了GatewayParser和GatewayRouter接口,分别对应请求的解析和根据请求进行路由选择;同时还提供了SecurityFilter的权限校验工具类。 +- spring-cloud-gateway: 该模块集成了所有与SpringCloudGateway相关的依赖,对HTTP和WebSocket两种协议类型的请求分别进行了处理转发。 +- gateway-server-support: Gateway的服务驱动模块,依赖spring-cloud-gateway模块,对GatewayParser、GatewayRouter分别做了实现,其中DefaultLabelGatewayRouter提供了请求标签路由的功能。 +- gateway-httpclient-support: 提供了Http访问Gateway服务的客户端通用类。 +- instance-label: 外联的实例标签模块,提供InsLabelService服务接口,用于路由标签的创建以及与应用实例关联。 + +涉及的详细设计如下: + +#### 一、请求路由转发(带标签信息) +请求的链路首先经SpringCloudGateway的Dispatcher分发后,进入网关的过滤器链表,进入GatewayAuthorizationFilter 和 SpringCloudGatewayWebsocketFilter 两大过滤器逻辑,过滤器集成了DefaultGatewayParser和DefaultGatewayRouter。 +从Parser到Router,执行相应的parse和route方法,DefaultGatewayParser和DefaultGatewayRouter内部还包含了自定义的Parser和Router,按照优先级顺序执行。最后由DefaultGatewayRouter输出路由选中的服务实例ServiceInstance,交由上层进行转发。 +现我们以具有标签信息的作业执行请求转发为例子,绘制如下流程图: +![Gateway请求路由转发](/Images-zh/Architecture/Gateway/gateway_server_dispatcher.png) + + +#### 二、WebSocket连接转发管理 +默认情况下SpringCloudGateway对WebSocket请求只做一次路由转发,无法做动态的切换,而在Linkis Gateway架构下,每次信息的交互都会附带相应的uri地址,引导路由到不同的后端服务。 +除了负责与前端、客户端连接的webSocketService以及负责和后台服务连接的webSocketClient, 中间会缓存一系列GatewayWebSocketSessionConnection列表,一个GatewayWebSocketSessionConnection代表一个session会话与多个后台ServiceInstance的连接。 +![Gateway的WebSocket转发管理](/Images-zh/Architecture/Gateway/gatway_websocket.png) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/overview.md new file mode 100644 index 00000000000..ef33e8fea28 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/overview.md @@ -0,0 +1,27 @@ +--- +title: 总览 +sidebar_position: 0 +--- +## **背景** + +微服务治理包含了Gateway、Eureka、Open Feign等三个主要的微服务。用来解决Linkis的服务发现与注册、统一网关、请求转发、服务间通信、负载均衡等问题。整个Linkis是一个完全的微服务架构,每个业务流程都是需要多个微服务协同完成的。 + +## **架构图** + +![](/Images-zh/Architecture/linkis-microservice-gov-01.png) + +## **架构描述** + +1. Linkis Gateway作为Linkis的网关入口,主要承担了请求转发、用户访问认证、WebSocket通信等职责。Linkis1.0的Gateway还新增了基于Label的路由转发能力。Linkis在Spring +Cloud Gateway中,实现了WebSocket路由转发器,用于与客户端建立WebSocket连接,建立连接成功后,会自动分析客户端的WebSocket请求,通过规则判断出请求该转发给哪个后端微服务,从而将WebSocket请求转发给对应的后端微服务实例。 + +     [进入Linkis Gateway](gateway.md) + +2. Linkis Eureka +主要负责服务注册与发现,Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service +Provider和Service Consumer。Eureka Server 提供服务注册和发现,Service Provider服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到Service +Consumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务。 + +3. Linkis基于Feign实现了一套自己的底层RPC通信方案。Linkis RPC作为底层的通信方案,将提供SDK集成到有需要的微服务之中。一个微服务既可以作为请求调用方,也可以作为请求接收方。作为请求调用方时,将通过Sender请求目标接收方微服务的Receiver,作为请求接收方时,将提供Receiver用来处理请求接收方Sender发送过来的请求,以便完成同步响应或异步响应。 + + ![](/Images-zh/Architecture/linkis-microservice-gov-03.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/service_isolation.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/service_isolation.md new file mode 100644 index 00000000000..f0a51748f1f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/service-architecture/service_isolation.md @@ -0,0 +1,196 @@ +--- +title: 微服务租户隔离架构设计 +sidebar_position: 9 +--- + +## 1. 总述 +### 1.1 需求背景 +     Linkis在Gateway进行服务转发时是基于ribbon进行负载均衡的,但是有些情况下存在一些重要业务的任务希望做到服务级别的隔离,如果基于ribbon进行服务在均衡就会存在问题。比如租户A希望他的任务都路由到特定的Linkis-CG-Entrance服务,这样当其他的实例出现异常时可以不会影响到A服务的Entrance。另外支持服务的租户及隔离也可以做到快速隔离某个异常服务,支持灰度升级等场景。 + +### 1.2 目标 +1. 支持通过解析请求的标签按照路由标签对服务进行转发 +2. 支持服务的标签注册和修改 + +## 2. 总体设计 +     此次特性新增主要修改点位linkis-mg-gateway和instance-label两个模块,设计到新增Gateway的转发逻辑,以及instance-label支持服务和标签的注册。 + +### 2.1 技术架构 +     整体技术架构主要修改点位RestFul请求需要带上路由标签等标签参数信息,然后在Gateway进行转发时会解析对应的标签完成接口的路由转发。整体如下图所示 +![arc](/Images/Architecture/Gateway/service_isolation_arc.png) + +几点说明: +1. 如果存在多个对应的服务打上了同一个roteLabel则随机转发 +2. 如果对应的routeLabel没有对应的服务,则接口直接失败 +3. 如果接口没有routeLabel则基于原有的转发逻辑,不会路由到打上了特定标签的服务 + +### 2.2 业务架构 +     此次的特性主要是为了完成Restful租户隔离转发功能。功能点设计的模块如下: + +| 组件名| 一级模块 | 二级模块 | 功能点 | +|---|---|---|---| +| Linkis | MG | Gateway| 解析restful请求参数中的路由标签,完成接口按照路由标签的转发功能| +| Linkis | PS | InstanceLabel| InstanceLabel服务,完成服务和标签的关联| + +## 3. 模块设计 +### 3.1 核心执行流程 +- [输入端] 输入端为请求Gatway的restful请求,且是参数中待用roure label的请求才会进行处理 +- [处理流程] Gateway会判断请求是否带有对应的RouteLabel,如果存在则基于RouteLabel来进行转发。 +调用时序图如下: + +![Time](/Images/Architecture/Gateway/service_isolation_time.png) + + + +## 4. 数据结构: +```sql +DROP TABLE IF EXISTS `linkis_ps_instance_label`; +CREATE TABLE `linkis_ps_instance_label` ( + `id` int(20) NOT NULL AUTO_INCREMENT, + `label_key` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'string key', + `label_value` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'string value', + `label_feature` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'store the feature of label, but it may be redundant', + `label_value_size` int(20) NOT NULL COMMENT 'size of key -> value map', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + PRIMARY KEY (`id`), + UNIQUE KEY `label_key_value` (`label_key`,`label_value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +DROP TABLE IF EXISTS `linkis_ps_instance_info`; +CREATE TABLE `linkis_ps_instance_info` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `instance` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'structure like ${host|machine}:${port}', + `name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'equal application name in registry', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'create unix timestamp', + PRIMARY KEY (`id`), + UNIQUE KEY `instance` (`instance`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +DROP TABLE IF EXISTS `linkis_ps_instance_label_relation`; +CREATE TABLE `linkis_ps_instance_label_relation` ( + `id` int(20) NOT NULL AUTO_INCREMENT, + `label_id` int(20) DEFAULT NULL COMMENT 'id reference linkis_ps_instance_label -> id', + `service_instance` varchar(128) NOT NULL COLLATE utf8_bin COMMENT 'structure like ${host|machine}:${port}', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'create unix timestamp', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +``` +## 5. 如何使用: + +### 5.1 add route label for entrance +``` +echo "spring.eureka.instance.metadata-map.route=et1" >> $LINKIS_CONF_DIR/linkis-cg-entrance.properties +sh $LINKIS_HOME/sbin/linkis-damemon.sh restart cg-entrance +``` +![Time](/Images/Architecture/Gateway/service_isolation_time.png) + +### 5.2 Use route label +submit task: +``` +url:/api/v1/entrance/submit +{ + "executionContent": {"code": "echo 1", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "ip"}, + "labels": { + "engineType": "shell-1", + "userCreator": "peacewong-IDE", + "route": "et1" + } +} +``` +will be routed to a fixed service: +``` +{ + "method": "/api/entrance/submit", + "status": 0, + "message": "OK", + "data": { + "taskID": 45158, + "execID": "exec_id018030linkis-cg-entrancelocalhost:9205IDE_peacewong_shell_0" + } +} +``` + +or linkis-cli: + +``` +sh bin/linkis-cli -submitUser hadoop -engineType shell-1 -codeType shell -code "whoami" -labelMap route=et1 --gatewayUrl http://127.0.0.1:9101 +``` + +### 5.3 Use non-existing label +submit task: +``` +url:/api/v1/entrance/submit +{ + "executionContent": {"code": "echo 1", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "ip"}, + "labels": { + "engineType": "shell-1", + "userCreator": "peacewong-IDE", + "route": "et1" + } +} +``` +will get the error +``` +{ + "method": "/api/rest_j/v1/entrance/submit", + "status": 1, + "message": "GatewayErrorException: errCode: 11011 ,desc: Cannot route to the corresponding service, URL: /api/rest_j/v1/entrance/submit RouteLabel: [{\"stringValue\":\"et2\",\"labelKey\":\"route\",\"feature\":null,\"modifiable\":true,\"featureKey\":\"feature\",\"empty\":false}] ,ip: localhost ,port: 9101 ,serviceKind: linkis-mg-gateway", + "data": { + "data": "{\r\n \"executionContent\": {\"code\": \"echo 1\", \"runType\": \"shell\"},\r\n \"params\": {\"variable\": {}, \"configuration\": {}},\r\n \"source\": {\"scriptPath\": \"ip\"},\r\n \"labels\": {\r\n \"engineType\": \"shell-1\",\r\n \"userCreator\": \"peacewong-IDE\",\r\n \"route\": \"et2\"\r\n }\r\n}" + } +} +``` + +### 5.4 without label +submit task: +``` +url:/api/v1/entrance/submit +{ + "executionContent": {"code": "echo 1", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "ip"}, + "labels": { + "engineType": "shell-1", + "userCreator": "peacewong-IDE" + } +} +``` + +``` + +will route to untagged entranceservices +{ + "method": "/api/entrance/submit", + "status": 0, + "message": "OK", + "data": { + "taskID": 45159, + "execID": "exec_id018018linkis-cg-entrancelocalhost2:9205IDE_peacewong_shell_0" + } +} + +``` + +## 6. 非功能性设计: + +### 6.1 安全 +不涉及安全问题,restful需要登录认证 + +### 6.2 性能 +对Gateway转发性能影响较小,有缓存相应的label和instance的数据 + +### 6.3 容量 +不涉及 + +### 6.4 高可用 +不涉及 + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/task-flow.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/task-flow.md new file mode 100644 index 00000000000..0dd9d2a3ede --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/architecture/task-flow.md @@ -0,0 +1,187 @@ +--- +title: 任务流转流程介绍 +sidebar_position: 2 +--- + +> Linkis任务执行是Linkis的核心功能,调用到Linkis的计算治理服务、公共增强服务,微服务治理的三层服务,现在已经支持了OLAP、OLTP、Streaming等引擎类型的任务执行,本文将对OLAP类型引擎的任务提交、准备、执行、结果返回等流程进行介绍。 + +## 关键名词: +LinkisMaster:Linkis的计算治理服务层架中的管理服务,主要包含了AppManager、ResourceManager、LabelManager等几个管控服务。原名LinkisManager服务。 + +Entrance:计算治理服务层架中的入口服务,完成任务的调度、状态管控、任务信息推送等功能。 + +Orchestrator:Linkis的编排服务,提供强大的编排和计算策略能力,满足多活、主备、事务、重放、限流、异构和混算等多种应用场景的需求。现阶段Orchestrator被Entrance服务所依赖。 + +EngineConn(EC):引擎连接器,负责接受任务并提交给底层引擎如Spark、hive、Flink、Presto、trino等进行执行。 + +EngineConnManager(ECM):Linkis 的EC进程管理服务,负责管控EngineConn的生命周期(启动、停止)。 + +LinkisEnginePluginServer:该服务负责管理各个引擎的启动物料和配置,另外提供每个EngineConn的启动命令获取,以及每个EngineConn所需要的资源。 + +PublicEnhencementService(PES): 公共增强服务,为其他微服务模块提供统一配置管理、上下文服务、物料库、数据源管理、微服务管理和历史任务查询等功能的模块。 + +## 一、Linkis交互式任务执行架构 +### 1.1、任务执行思考 +    在现有Linkis1.0任务执行架构之前,也经历了多次演变,从最开始用户一多起来就各种FullGC导致服务崩溃,到用户开发的脚本如何支持多平台、多租户、强管控、高并发运行,我们遇见了如下几个问题: +1. 如何支持租户户的上万并发并互相隔离? +2. 如何支持上下文统一 ,用户定义的UDF、自定义变量等支持多个系统使用? +3. 如何支持高可用,做到用户提交的任务能够正常运行完? +4. 如何支持任务的底层引擎日志、进度、状态能够实时推送给前端? +5. 如何支持多种类型的任务提交sql、python、shell、scala、java等 + +### 1.2、Linkis任务执行设计 +    基于以上5个问题出发,Linkis将OLTP任务分成了四个阶段,分别是: +1. 提交阶段:APP提交到Linkis的CG-Entrance服务到完成任务的持久化(PS-JobHistory)以及任务的各种拦截器处理(危险语法、变量替换、参数检查)等步骤,并做生产者消费者的并发控制; +2. 准备阶段:任务在Entrance被Scheduler消费调度给Orchestrator模块进行任务的编排、并向LinkisMaster完成EngineConn的申请,在这过程中会对租户的资源进行管控; +3. 执行阶段:任务从Orchestrator提交给EngineConn执行,EngineConn具体提交底层引擎进行执行,并实时将任务的信息推送给调用方; +4. 结果返回阶段:向调用方返回结果,支持json和io流返回结果集 + Linkis的整体任务执行架构如下图所示: + ![arc](/Images/Architecture/Job_submission_preparation_and_execution_process/linkis_job_arc.png) + +## 二、任务执行流程介绍 +    首先我们先对OLAP型任务的处理流程进行一个简要介绍,任务整体的一个执行流程如下图所示: +![flow](/Images/Architecture/Job_submission_preparation_and_execution_process/linkis_job_flow.png) + +    整个任务涉及到了所有的计算治理的所有服务,任务通过Gateway转发到Linkis的人口服务Entrance后,会通过对任务的标签进行多级调度(生产者消费者模式)通过FIFO的模式完成任务的调度执行,Entrance接着将任务提交给Orchestrator进行任务编排和提交,Orchestrator会向LinkisMaster完成EC的申请,在这过程中会通过任务的Label进行资源管控和引擎版本选择申请不同的EC。接着Orchestrator将编排后的任务提交给EC进行执行,EC会将job的日志、进度、资源使用等信息推动给Entrance服务,并推送给调用方。下面我们基于上图和结合任务的四个阶段(提交、准备、执行、返回)对任务的执行流程进行一个简要介绍。 + + +### 2.1 Job提交阶段 +    Job提交阶段Linkis支持多种类型的任务:SQL, Python, Shell, Scala, Java等,支持不同的提交接口,支持Restful/JDBC/Python/Shell等提交接口。提交任务主要包含任务代码、标签、参数等信息即可,下面是一个RestFul的示例: +通过Restfu接口发起一个Spark Sql任务 +```JSON + "method": "/api/rest_j/v1/entrance/submit", + "data": { + "executionContent": { + "code": "select * from table01", + "runType": "sql" + }, + "params": { + "variable": {// task variable + "testvar": "hello" + }, + "configuration": { + "runtime": {// task runtime params + "jdbc.url": "XX" + }, + "startup": { // ec start up params + "spark.executor.cores": "4" + } + } + }, + "source": { //task source information + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +``` +1. 任务首先会提交给Linkis的网关linkis-mg-gateway服务,Gateway会通过任务中是否带有routeLabel来转发给对应的Entrance服务,如果没有RouteLabel则随机转发给一个Entrance服务 +2. Entrance接受到对应的Job后,会调用PES中JobHistory模块的RPC对Job的信息进行持久化,并对参数和代码进性解析对自定义变量进行替换,并提交给调度器(默认FIFO调度)调度器会通过任务的标签进行分组,标签不同的任务互相不影响调度。 +3. Entrance在通过FIFO调度器消费后会提交给Orchestrator进行编排执行,就完成了任务的提交阶段 + 主要涉及的类简单说明: +``` +EntranceRestfulApi: 入口服务的Controller类,任务提交、状态、日志、结果、job信息、任务kill等操作 +EntranceServer:任务的提交入口,完成任务的持久化、任务拦截解析(EntranceInterceptors)、提交给调度器 +EntranceContext:Entrance的上下文持有类,包含获取调度器、任务解析拦截器、logManager、持久化、listenBus等方法 +FIFOScheduler: FIFO调度器,用于调度任务 +EntranceExecutor:调度的执行器,任务调度后会提交给EntranceExecutor进行执行 +EntranceJob:调度器调度的job任务,通过EntranceParser解析用户提交的JobRequest进行生成和JobRequest一一对应 +``` +此时任务状态为排队状态 + +### 2.2 Job准备阶段 +    Entrance的调度器,会按照Job中的Label生成不同的消费器去消费任务,任务被消费修改状态为Running时开始进入准备状态,到对应的任务后就是任务的准备阶段开始了。主要涉及以下几个服务:Entrance、LinkisMaster、EnginepluginServer、EngineConnManager、EngineConn,下面将对以下服务进行分开介绍。 +### 2.2.1 Entrance步骤: +1. 消费器(FIFOUserConsumer)通过对应标签配置的支持并发数进行消费将任务消费调度给编排器(Orchestrator)进行执行 +2. 首先是Orchestrator对提交的任务进行编排,对于普通的hive和Spark单引擎的任务主要是任务的解析、label检查和校验,对于多数据源混算的场景会拆分不同的任务提交给不同的数据源进行执行等 +3. 在准备阶段,编排器Orchestrator另外一个重要的事情是通过请求LinkisMaster获取用于执行任务的EngineConn。如果LinkisMaster有对应的EngineConn可以复用则直接返回,如果没有则创建EngineConn。 +4. Orchestrator拿到任务后提交给EngineConn进行执行,准备阶段结束,进入Job执行阶段 + 主要涉及的类简单说明: + +``` +## Entrance +FIFOUserConsumer: 调度器的消费器,会根据标签生成不同的消费器,如IDE-hadoop、spark-2.4.3生成不同的消费器。消费提交的任务。并控制同时运行的任务个数,通过对应标签配置的并发数:wds.linkis.rm.instance +DefaultEntranceExecutor:任务执行的入口,发起编排器的调用:callExecute +JobReq: 编排器接受的任务对象,通过EntranceJob转换而来,主要包括代码、标签信息、参数等 +OrchestratorSession:类似于SparkSession,是编排器的入口。正常单例。 +Orchestration:JobReq被OrchestratorSession编排后的返回对象,支持执行和打印执行计划等 +OrchestrationFuture: Orchestration选择异步执行的返回,包括cancel、waitForCompleted、getResponse等常用方法 +Operation:用于扩展操作任务的接口,现在已经实现了用于获取日志的LogOperation、获取进度的ProgressOperation等 + +## Orchestrator +CodeLogicalUnitExecTask: 代码类型任务的执行入口,任务最终编排运行后会调用该类的execute方法,首先会向LinkisMaster请求EngineConn再提交执行 +DefaultCodeExecTaskExecutorManager:负责管控代码类型的EngineConn,包括请求和释放EngineConn +ComputationEngineConnManager:负责LinkisMaster进行对接,请求和释放ENgineConn +``` + +### 2.2.2 LinkisMaster步骤: + +1.LinkisMaster接受到Entrance服务发出的请求EngineConn请求进行处理 +2.判断是否有对应Label可以复用的EngineConn,有则直接返回 +3.如果没有则进入创建EngineConn流程: +- 首先通过Label选择合适的EngineConnManager服务。 +- 接着通过调用EnginePluginServer获取本次请求EngineConn的资源类型和资源使用, +- 通过资源类型和资源,判断对应的Label是否还有资源,如果有则进入创建,否则抛出重试异常 +- 请求第一步的EngineConnManager启动EngineConn +- 等待EngineConn空闲,返回创建的EngineConn,否则判断异常是否可以重试 + +4.锁定创建的EngineConn返回给Entrance,注意这里为异步请求Entrance发出EC请求后会接受到对应的请求ID,LinkisMaster请求完毕后主动通过给对应的Entrance服务 + +主要涉及的类简单说明: +``` +## LinkisMaster +EngineAskEngineService: LinkisMaster负责处理引擎请求的处理类,主要逻辑通过调用EngineReuseService判断是否有EngineConn可以复用,否则调用EngineCreateService创建EngineConn +EngineCreateService:负责创建EngineConn,主要几个步骤: + + +## LinkisEnginePluginServer +EngineConnLaunchService:提供ECM获取对应引擎类型EngineConn的启动信息 +EngineConnResourceFactoryService:提供给LinkisMaster获取对应本次任务所需要启动EngineConn需要的资源 +EngineConnResourceService: 负责管理引擎物料,包括刷新和刷新所有 + +## EngineConnManager +AbstractEngineConnLaunchService:负责启动接受LinkisMaster请求启动EngineConn的请求,并完成EngineConn引擎的启动 +ECMHook: 用于处理EngineConn启动前后的前置后置操作,如hive UDF Jar加入到EngineConn启动的classPath中 +``` + + +这里需要说明的是如果用户存在一个可用空闲的引擎,则会跳过1,2,3,4 四个步骤; + +### 2.3 Job执行阶段 +    当Entrance服务中的编排器拿到EngineConn后就进入了执行阶段,CodeLogicalUnitExecTask会将任务提交给EngineConn进行执行,EngineConn会通过对应的CodeLanguageLabel创建不同的执行器进行执行。主要步骤如下: +1. CodeLogicalUnitExecTask通过RPC提交任务给到EngineConn +2. EngineConn判断是否有对应的CodeLanguageLabel的执行器,如果没有则创建 +3. 提交给Executor进行执行,通过链接到具体底层的引擎执行进行执行,如Spark通过sparkSession提交sql、pyspark、scala任务 +4. 任务状态流转实时推送给Entrance服务 +5. 通过实现log4jAppender,SendAppender通过RPC将日志推送给Entrance服务 +6. 通过定时任务实时推送任务进度和资源信息给到Entrance + +主要涉及的类简单说明: +``` +ComputationTaskExecutionReceiver:Entrance服务端编排器用于接收EngineConn所有RPC请求的服务类,负责接收进度、日志、状态、结果集在通过ListenerBus的模式推送给上次调用方 +TaskExecutionServiceImpl:EngineConn接收Entrance所有RPC请求的服务类,包括任务执行、状态查询、任务Kill等 +ComputationExecutor:具体的任务执行父类,比如Spark分为SQL/Python/Scala Executor +ComputationExecutorHook: 用于Executor创建前后的Hook,比如初始化UDF、执行默认的UseDB等 +EngineConnSyncListener: ResultSetListener/TaskProgressListener/TaskStatusListener 用于监听Executor执行任务过程中的进度、结果集、和进度等信息 +SendAppender: 负责推送EngineConn端的日志给到Entrance +``` +### 2.4 Job结果推送阶段 +    该阶段比较简单,主要用于将任务在EngineConn产生的结果集返回给Client,主要步骤如下: +1. 首先在EngineConn执行任务过程中会进行结果集写入,写入到文件系统中获取到对应路径。当然也支持内存缓存,默认写文件 +2. EngineConn将对应的结果集路径和结果集个数返回给Entrance +3. Entrance调用JobHistory将结果集路径信息更新到任务表中 +4. Client通过任务信息获取到结果集路径并读取结果集 + 主要涉及的类简单说明: +``` +EngineExecutionContext:负责创建结果集和推送结果集给到Entrance服务 +ResultSetWriter:负责写结果集到文件系统中支持linkis-storage支持的文件系统,现在以及支持本地和HDFS。支持的结果集类型,表格、文本、HTML、图片等 +JobHistory:存储有任务的所有信息包括状态、结果路径、指标信息等对应DB中的实体类 +ResultSetReader:读取结果集的关键类 +``` + +## 三、总结 +    上面我们主要介绍了Linkis计算治理服务组CGS的OLAP任务的整个执行流程,按照任务请求的处理过程对任务拆分成了提交、准备、执行、返回结果四个阶段。CGS主要就是遵循这4个阶段来设计实现的,服务于这4个阶段,且为每个阶段提供了强大和灵活的能力。在提交阶段,主要提供通用的接口,接收上层应用工具提交过来的任务,并能提供基础的解析和拦截能力;在准备阶段,主要通过编排器Orchestrator和LinkisMaster完成对任务的解析编排,并且做资源控制和完成EngineConn的创建;执行阶段,通过引擎连接器EngineConn来去实际完成和底层引擎的对接,通常每个用户要连接不同的底层引擎,就得先启动一个对应的底层引擎连接器EC。计算任务通过EC来提交给底层引擎做实际的执行和状态、日志、结果等信息的获取,及在结果返回阶段,返回任务执行的结果信息,支持按照多种返回模式,如:文件流、JSON、JDBC等。整体的时序图如下: + +![time](/Images/Architecture/Job_submission_preparation_and_execution_process/linkis_job_time.png) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/_category_.json new file mode 100644 index 00000000000..0ab705787e5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "安全认证", + "position": 6 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/kerberos.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/kerberos.md new file mode 100644 index 00000000000..f729498f5d0 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/kerberos.md @@ -0,0 +1,99 @@ +--- +title: Kerberos +sidebar_position: 5 +--- + +## Kerberos 认证 + +## 场景1 HDFS 存储 + +如果使用到的hadoop集群,如用来存储的结果集的文件 +```shell script +# 结果集日志等文件路径,用于存储Job的结果集文件 wds.linkis.filesystem.hdfs.root.path(linkis.properties) +HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis +``` +并且 开启了kerberos认证,需要进行对应的kerberos配置 + +修改`linkis.properties` 对应的配置如下 +```properties +#是否开启了kerberos认证模式 +wds.linkis.keytab.enable=true +#keytab放置目录,该目录存储的是多个用户的username.keytab的文件 +wds.linkis.keytab.file=/appcom/keytab/ +#是否带上principle客户端认证 默认值false +wds.linkis.keytab.host.enabled=false +#principle认证需要带上的客户端IP +wds.linkis.keytab.host=127.0.0.1 +``` +修改后重启服务 + +## 场景2 HDFS 存储 kerberos 代理认证 + +Hadoop2.0版本开始支持ProxyUser的机制。含义是使用User A的用户认证信息,以User B的名义去访问hadoop集群。 +对于服务端来说就认为此时是User B在访问集群,相应对访问请求的鉴权(包括HDFS文件系统的权限,YARN提交任务队列的权限)都以用户User B来进行。 +User A被认为是superuser。 + +和场景1主要区别是,可以解决每个用户都需要生成一个keytab文件的问题,如果设置了 kerberos 代理认证,可以使用代理用户的keytab文件进行认证。 +修改`linkis.properties` 对应的配置如下 + +```properties +#是否开启了kerberos认证模式 +wds.linkis.keytab.enable=true +#keytab放置目录,该目录存储的是多个用户的username.keytab的文件 +wds.linkis.keytab.file=/appcom/keytab/ +#是否带上principle客户端认证 默认值false +wds.linkis.keytab.host.enabled=false +#principle认证需要带上的客户端IP +wds.linkis.keytab.host=127.0.0.1 + +#开启kerberos的代理认证 +wds.linkis.keytab.proxyuser.enable=true + +#使用superuser 来验证用户认证信息的 +wds.linkis.keytab.proxyuser.superuser=hadoop + + + +``` +修改后重启服务 + +## 场景3 队列管理器查看yarn资源信息 +![yarn-normal](/Images-zh/auth/yarn-normal.png) +会访问访问Yarn提供了ResourceManager的REST API 接口 +如果yarn的ResourceManager 开启了kerberos认证,需要配置kerberos相关的认证信息 + +数据库表 `linkis_cg_rm_external_resource_provider` +插入yarn数据信息 +```sql +INSERT INTO `linkis_cg_rm_external_resource_provider` +(`resource_type`, `name`, `labels`, `config`) VALUES +('Yarn', 'sit', NULL, +' + { + "rmWebAddress": "http://xx.xx.xx.xx:8088", + "hadoopVersion": "2.7.2", + "authorEnable":false, + "user":"hadoop","pwd":"123456", + "kerberosEnable":@YARN_KERBEROS_ENABLE, + "principalName":"@YARN_PRINCIPAL_NAME", + "keytabPath":"@YARN_KEYTAB_PATH" + "krb5Path":"@YARN_KRB5_PATH" + } +' +); + +``` +更新后,因为程序中有使用到缓存,想要立即生效,需要重启`linkis-cg-linkismanager`服务 + +```shell script +sh sbin/linkis-daemon.sh restart cg-linkismanager +``` + + + +## 场景4 数据源功能中 HIVE 数据源 + +如果需要连接的hive数据源,对应的 hive 集群环境,有开启kerberos认证,需要在配置集群环境时,将kerberos以及keytab认证文件信息上传。 +![](/Images-zh/auth/dsm-kerberos.png) + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/ldap.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/ldap.md new file mode 100644 index 00000000000..2fcfb991175 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/ldap.md @@ -0,0 +1,51 @@ +--- +title: LDAP +sidebar_position: 1 +--- +> LDAP(Lightweight Directory Access Protocol)配置,默认安装部署后,只支持配置的静态用户和密码登录(只能配置一个),如果需要支持多用户登录可以使用LDAP + +## 1. 实现逻辑介绍 + +默认方式的配置`linkis-mg-gateway.properties` + +```properties +#默认用户名 +wds.linkis.admin.user=hadoop +#默认密码 +wds.linkis.admin.password=123456 +``` + +登陆请求处理时`org.apache.linkis.gateway.security.UserPwdAbstractUserRestful#tryLogin`, +如果登陆用户名/用户密码和配置的默认值不一致,会走LDAP模式。 +LDAP核心处理 `org.apache.linkis.gateway.security.LDAPUserRestful#login` 通过调用jdk通用的ldap工具类进行认证。 +`javax.naming.ldap.InitialLdapContext#InitialLdapContext(java.util.Hashtable, javax.naming.ldap.Control[])` + + +## 2. 使用方式 + +> 前提是有可用的LADP服务 + +### 2.1 Step1 开启ladp登陆验密方式 + +修改`linkis-mg-gateway.properties`配置 + +将LDAP相关参数填入 +```properties +##LDAP +#ldap服务地址 +wds.linkis.ldap.proxy.url=ldap://localhost:1389/ +#Directory Name(DN) ldap的目录构成 +wds.linkis.ldap.proxy.baseDN==dc=linkis,dc=org +#用户名格式化 一般无需要配置 +wds.linkis.ldap.proxy.userNameFormat= +``` +### 2.2 Step2 重启linkis-mg-gateway 的服务 + +修改配置后,需要重启`linkis-mg-gateway`服务 `sh sbin/linkis-daemon.sh start mg-mgtaeway`,才能生效 + +## 3 注意事项 + +- 认证类型使用的是`java.naming.security.authentication`(安全类型,三个值:none,simple或strong。)中的simple模式 + +- 关于ldap的介绍可以参考[LDAP目录服务器介绍](https://juejin.cn/post/6844903857311449102) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/proxy.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/proxy.md new file mode 100644 index 00000000000..2d32ae8bd14 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/proxy.md @@ -0,0 +1,59 @@ +--- +title: 代理认证 +sidebar_position: 4 +--- + + +> 这种方式允许登录用户和实际使用的用户不同,主要作用:控制用户登录时必须为实名用户,但是实际使用大数据平台时,是非实名用户,方便进行权限的校验和管控。 +> 比如:linkis在执行用户提交的任务时,linkis主要进程服务会通过sudo -u ${submit user} 切换到对应用户下,然后执行对应的引擎启动命令, +> 这就需要为每个${submit user} 提前创建对应的系统用户,并且配置好相关的环境变量。 对于新用户,需要一系列的环境的初始化准备工作, +> 如果频繁的用户变化,会增大运维成本,而且用户过多,没法针对单个用户配置资源,资源之间无法很好的管控。如果能够实现A代理给指定的代理用户执行,可以将执行入口统一收敛,解决需要初始化环境的问题。 + +## 1. 实现逻辑介绍 + + +- 登陆用户:通过用户名密码直接登陆系统的用户 +- 代理用户:作为登陆用户实际执行操作的用户称之为代理用户,代理登陆用户的执行相关操作 + +对于登陆cookie处理,解析出登录用户和代理用户 + +```html +代理用户的cookie的key为:linkis_user_session_proxy_ticket_id_v1 +登录用户的cookie: linkis_user_session_ticket_id_v1 + +``` +linkis的相关接口能在基于UserName信息,识别出代理用户信息,使用代理用户进行各项操作。并记录审计日志,包含用户的任务执行操作,下载操作 +任务提交执行的时候,entrance入口服务修改执行的用户为代理用户 + +## 2. 使用方式 + +### 2.1 Step1 开启代理模式 +在 `linkis.properties` 指定如下参数: +```shell script +# 打开代理模式 + wds.linkis.gateway.conf.enable.proxy.user=true + # 指定代理配置文件 + wds.linkis.gateway.conf.proxy.user.config=proxy.properties +``` + + +在 conf 目录下,创建`proxy.properties` 文件,内容如下: +```shell script +# 格式如下: + ${LOGIN_USER}=${PROXY_USER} + # 例如: + enjoyyin=hadoop +``` +如果现有的代理模式不能满足您的需求,也可以对:`org.apache.linkis.gateway.security.ProxyUserUtils`进一步改造。 + +### 2.2 Step2 重启linkis-mg-gateway 的服务 + +修改配置后,需要重启`linkis-mg-gateway`服务 `sh sbin/linkis-daemon.sh start mg-mgtaeway`,才能生效 + +## 3 注意事项 + +- 用户分为代理用户和非代理用户,代理类型的用户不能进行再次代理到其他用户执行 +- 需要控制登陆用户与可代理的系统用户列表,禁止出现任意代理的情况,避免权限不可控。最好支持数据库表来配置,并可以直接修改生效,不需要重启服务 +- 单独记录日志文件包含代理用户的操作,如代理执行、函数更新等PublicService的代理用户操作全部记录到日志中,方便审计 + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/test.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/test.md new file mode 100644 index 00000000000..68375772e85 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/test.md @@ -0,0 +1,76 @@ +--- +title: 免密认证 +sidebar_position: 3 +--- +> 在有些场景下,为了方便开发调试,能够方便的访问页面和接口,可以开启测试模式配置,进行免密认证 + +## 1. 实现逻辑介绍 + +通过统一的认证处理filter:`org.apache.linkis.server.security.SecurityFilter` 来控制 + +配置项 +```properties +#是否开启测试模式 +wds.linkis.test.mode=true +#测试模式的模拟用户名 +wds.linkis.test.user=hadoop +``` +实现的伪代码 +```scala +val BDP_TEST_USER = CommonVars("wds.linkis.test.user", "") +val IS_TEST_MODE = CommonVars("wds.linkis.test.mode", false) + +if (IS_TEST_MODE.getValue) { + logger.info("test mode! login for uri: " + request.getRequestURI) + // 设置登陆用户信息为配置指定的用户 + SecurityFilter.setLoginUser(response, BDP_TEST_USER) + true +} +``` + +## 2. 使用方式 + +### 2.1 Step1 开启测试模式 +直接修改配置文件 `linkis.properties`(对linkis所有服务生效), 修改对应的配置如下 +```shell script +#是否开启测试模式 +wds.linkis.test.mode=true +#测试模式的模拟用户名 +wds.linkis.test.user=hadoop +``` + +如果只需要开启某个服务的测试模式,可以修改对应的服务配置项。 +如 只开启 `entrance` 服务的测试模式 +直接修改配置文件 `linkis-cg-entrance.properties`(对linkis的entrance服务生效), 修改对应的配置如下 +```shell script +#是否开启测试模式 +wds.linkis.test.mode=true +#测试模式的模拟用户名 +wds.linkis.test.user=hadoop +``` + +### 2.2 Step2 重启对应的服务 + +修改配置后,需要重启对应的服务(如果是所有服务都开启,重启所有服务),才能生效 + + +### 2.3 Step3 请求验证 + +重启服务成功后,可以直接请求原来需要认证的http接口,无需额外的认证,便能正常请求. +管理台也无需登陆认证,就可以访问内容页面 + + +## 3 注意事项 + +### 3.1 wds.linkis.test.user的值设置 +因为部分接口会进行用户角色的权限校验,如: 【搜索历史EC信息】的接口:`/api/rest_j/v1/linkisManager/ecinfo/ecrHistoryList` +角色有: + +|角色名 | 权限说明| 配置项 | 默认值 | +| -------- | -------- | ----- |----- | +|管理员角色|最高权限,拥有所有权限操作|`wds.linkis.governance.station.admin`|`hadoop`| +|历史任务角色|相对普通用户,还可以查看其他用户的所有任务列表信息|`wds.linkis.jobhistory.admin`|`hadoop`| +|普通角色|默认的角色||| + +对于不同场景的测试,设置的`wds.linkis.test.user`的值,会有不同,需要按实际场景进行设置。 +如果需要访问所有接口,需要配置为和`wds.linkis.governance.station.admin`一样的值,一般是`hadoop` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/token.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/token.md new file mode 100644 index 00000000000..9cce5e2e4a5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/auth/token.md @@ -0,0 +1,111 @@ +--- +title: Token +sidebar_position: 2 +--- + +> 通常第三方系统调用linkis服务时,一般是通过token的方式进行认证 + +## 1. 实现逻辑介绍 + +通过统一的认证处理filter:`org.apache.linkis.server.security.SecurityFilter` 来控制 + +实现的伪代码 +```scala + +val TOKEN_KEY = "Token-Code" +val TOKEN_USER_KEY = "Token-User" + +/* TokenAuthentication.isTokenRequest 通过判断请求request中: + 1.请求头是否包含TOKEN_KEY和TOKEN_USER_KEY :getHeaders.containsKey(TOKEN_KEY) && getHeaders.containsKey(TOKEN_USER_KEY) + 2.或则请求cookies中是否包含TOKEN_KEY和TOKEN_USER_KEY:getCookies.containsKey(TOKEN_KEY) &&getCookies.containsKey(TOKEN_USER_KEY) +*/ + +if (TokenAuthentication.isTokenRequest(gatewayContext)) { + /* 进行token认证 + 1. 确认是否开启token认证 配置项 `wds.linkis.gateway.conf.enable.token.auth` + 2. 提取token tokenUser host信息进行认证,校验合法性 + */ + TokenAuthentication.tokenAuth(gatewayContext) + } else { + //普通的用户名密码认证 +} +``` +可用的token以及对应可使用的ip相关信息数据存储在表`linkis_mg_gateway_auth_token`中, +详细见[表解析说明](../development/table/all#16-linkis_mg_gateway_auth_token),非实时更新, +会定期`wds.linkis.token.cache.expire.hour`(默认间隔12小时)刷新到服务内存中 + + +## 2. 使用方式 + +### 2.1 新增 Token + +管理台 `基础数据管理> 令牌管理`进行新增 + +```text +名称:token名称 对应 Token-Code,如:TEST-AUTH +用户:该token对应的用户名,即感知到的请求用户,日志审计会使用到。如果不做限制可以配置为 * +主机:可访问的主机,会进行请求方的ip校验过滤。如果不做限制可以配置为 * +有效天数:如果永久有效,配置为-1 +``` + +### 2.2 原生的方式 +构建的http请求方式,需要在请求头中添加`Token-Code`,`Token-User`参数, + +#### 示例 + +请求地址: +`http://127.0.0.1:9001/api/rest_j/v1/entrance/submit` + +body参数: +```json +{ + "executionContent": {"code": "sleep 5s;echo pwd", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.hql"}, + "labels": { + "engineType": "shell-1", + "userCreator": "hadoop-IDE", + "executeOnce":"false " + } +} +``` + +请求头header: +```text +Content-Type:application/json +Token-Code:BML-AUTH +Token-User:hadoop +``` + +### 2.3 客户端使用token认证 + +linkis 提供的客户端认证方式都支持Token策略模式`new TokenAuthenticationStrategy()` + +详细可以参考[SDK 方式](../user-guide/sdk-manual) + +#### 示例 +```java +// 1. build config: linkis gateway url + DWSClientConfig clientConfig = ((DWSClientConfigBuilder) (DWSClientConfigBuilder.newBuilder() + .addServerUrl("http://127.0.0.1:9001/") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connectionTimeOut + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new TokenAuthenticationStrategy()) // AuthenticationStrategy Linkis auth Token + .setAuthTokenKey("Token-Code") // set token key + .setAuthTokenValue("DSM-AUTH") // set token value + .setDWSVersion("v1") //linkis rest version v1 + .build(); +``` + +## 3 注意事项 + +### 3.1 token的配置 +支持的token,对应的可用的用户/可使用请求方ip 是通过表`linkis_mg_gateway_auth_token`来控制,加载是非实时更新,使用了缓存机制 + +### 3.2 管理员权限token +对于高危操作的限制,需要管理员角色的token才能操作,管理员token,格式为 `admin-xxx` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/_category_.json new file mode 100644 index 00000000000..2d42788825d --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "部署指南", + "position": 3.0 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-cluster.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-cluster.md new file mode 100644 index 00000000000..ba837895e9c --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-cluster.md @@ -0,0 +1,176 @@ +--- +title: 分布式部署 +sidebar_position: 2 +--- + +Linkis的单机部署方式简单,过多的进程在同一个服务器上会让服务器压力过大,生产环境为了保证服务的高可用,推荐使用分部署部署。  +部署方案的选择,和公司的用户规模、用户使用习惯、集群同时使用人数都有关,一般来说,我们会以使用Linkis的同时使用人数和用户对执行引擎的偏好来做依据进行部署方式的选择。 + +## 1 多节点部署方式计算模型参考 + +Linkis的每个微服务都支持多活的部署方案,当然不同的微服务在系统中承担的角色不一样,有的微服务调用频率很高,资源会处于高负荷的情况, +**在安装EngineConnManager的机器上,由于会启动用户的引擎进程,机器的内存负载会比较高,其他类型的微服务对机器的负载则相对不会很高, +**对于这类微服务我们建议启动多个进行分布式部署,Linkis动态使用的总资源可以按照如下方式计算。 + +**EngineConnManager**使用总资源
+= 总内存 + 总核数
+= **同时在线人数 \* (所有类型的引擎占用内存) \*单用户最高并发数+ 同时在线人数 \* +(所有类型的引擎占用核数) \*单用户最高并发数** + +例如: +```html + +只使用spark、hive、python引擎且单用户最高并发数为1的情况下,同时使用人数50人, +spark的Driver内存1G,hive client内存1G,python client 1G,每个引擎都使用1个核 + +EngineConnManager(ECM)使用总资源 += 50 *(1+1+1)G *1 + 50 *(1+1+1)核*1 += 150G 内存 + 150 CPU核 +``` + + +分布式部署时微服务本身占用的内存可以按照每个2G计算,对于使用人数较多的情况下建议调大ps-publicservice的内存至6G,同时建议预留10G内存作为buffer。 + +以下配置假设**每个用户同时启动两个引擎为例**,**对于64G内存的机器**,参考配置如下: + +### 1.1 同时在线人数10-50 +**EngineConnManager**使用总资源 = 总内存 + 总核数 = +**同时在线人数 \* (所有类型的引擎占用内存) \*单用户最高并发数+ 同时在线人数 \* +(所有类型的引擎占用核数) \*单用户最高并发数** + +总内存:同时在线人数 50 * 单个引擎 1G内存 * 每个用户同时启动两个引擎 2 = 100G内存 + +> **服务器配置推荐**4台服务器,分别命名为S1,S2,S3,S4 + +| Service | Host name | Remark | +|----------------------|-----------|------------------| +| cg-engineconnmanager | S1、S2(共128G)| 每台机器单独部署 | +| Other services | S3、S4 | Eureka高可用部署 | + +### 1.2 同时在线人数50-100 + +总内存:同时在线人数 100 * 单个引擎 1G内存 * 每个用户同时启动两个引擎 2 = 200G内存 + +> **服务器配置推荐**:6台服务器,分别命名为S1,S2,S3,S4,S5,S6 + +| Service | Host name | Remark | +|----------------------|-----------|------------------| +| cg-engineconnmanager | S1-S4(共256G)| 每台机器单独部署 | +| Other services | S5、S6 | Eureka高可用部署 | + +### 1.3 同时使用人数 100-300 + + +总内存:同时在线人数 300 * 单个引擎 1G内存 * 每个用户同时启动两个引擎 2 = 600G内存 + +**服务器配置推荐**:12台服务器,分别命名为S1,S2..S12 + +| Service | Host name | Remark | +|----------------------|-----------|------------------| +| cg-engineconnmanager | S1-S10(共640G)| 每台机器单独部署 | +| Other services | S11、S12 | Eureka高可用部署 | + +### 1.4 同时使用人数300-500 + +> **服务器配置推荐**:20台服务器,分别命名为S1,S2..S20 + +| Service | Host name | Remark | +|----------------------|-----------|----------------------------------------------------------------------------------------------| +| cg-engineconnmanager | S1-S18 | 每台机器单独部署 | +| Other services | S19、S20 | Eureka高可用部署,部分微服务如果请求量上万可以考虑扩容,目前双活部署可以支持行内上千用户使用 | + +### 1.5 同时使用人数500以上 +> 按照同时在线800人估算 +> **服务器配置推荐**:34台服务器,分别命名为S1,S2..S34 + +| Service | Host name | Remark | +|----------------------|-----------|----------------------------------------------------------------------------------------------| +| cg-engineconnmanager | S1-S32 | 每台机器单独部署 | +| Other services | S33、S34 | Eureka高可用部署,部分微服务如果请求量上万可以考虑扩容,目前双活部署可以支持行内上千用户使用 | + + +## 2 分布式部署的流程 + +>Linkis的所有服务都支持分布式、多集群部署,建议在分布式部署前,先在一台机器上完成单机部署,并保证 Linkis 各功能正常使用。 + +目前一键安装脚本对分布式部署还没有很好的支持,需要手动进行调整部署。具体分布式部署,可以参考以下步骤,假设用户已经在 A 机器上完成了单机部署。 + + +### 2.1 分布式部署的环境准备 +和服务器A一样,服务器B需要进行基础的环境准备,请参考[Linkis环境准备](deploy-quick#3-linkis%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87) + +**网络检查** + +检查需要分布式部署的各服务机器是否网络互通,可用 ping 命令进行检查 +``` +ping IP +``` + +**权限检查** + +检查各机器上是否有 hadoop 用户以及hadoop用户是否有 sudo 权限。 + +**必要的环境检查** + +Linkis各服务启动前或任务执行时会依赖一些基础环境,请根据下表检查各机器基础环境,具体检查方法参考[Linkis环境准备](deploy-quick#3-linkis%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87) + +|服务名称|依赖环境| +|-|-| +|mg-eureka|Java| +|mg-gateway|Java| +|ps-publicservice|Java、Hadoop| +|cg-linkismanager|Java| +|cg-entrance|Java| +|cg-engineconnmanager|Java、Hive、Spark、Python、Shell| + + +注意:如需使用其它非默认引擎,还需要检查cg-engineconnmanager服务所在机器上对应引擎的环境是否OK,引擎环境可参考各[引擎使用中](https://linkis.apache.org/zh-CN/docs/latest/engine-usage/overview)中的前置工作进行检查。 + +### 2.2 Eureka多活配置调整 + +修改 A 机器上 Eureka 配置文件,把所有机器的 Eureka 的配置地址都加上,让 Eureka 服务之间相互注册。 +在服务器A上,进行如下配置修改,以两台 Eureka 集群为例。 + +``` +修改 $LINKIS_HOME/conf/application-eureka.yml和$LINKIS_HOME/conf/application-linkis.yml配置 + +eureka: + client: + serviceUrl: + defaultZone: http:/eurekaIp1:port1/eureka/,http:/eurekaIp2:port2/eureka/ + + +修改 $LINKIS_HOME/conf/linkis.properties 配置 + +wds.linkis.eureka.defaultZone=http:/eurekaIp1:port1/eureka/,http:/eurekaIp2:port2/eureka/ +``` + +### 2.3 安装物料的同步 +在其它所有机器上创建同机器 A 上相同的目录 `$LINKIS_HOME` 。在服务器A上,将linkis的成功安装的目录`$LINKIS_HOME` 打包,然后拷贝并解压到其它机器相同目录下。 +此时,如果在服务器A上以及其它机器上,执行`sbin/linkis-start-all.sh`脚本启动所有服务,那么所有服务都有n个实例,n为机器数量。 可以访问eureka服务展示页面 `http:/eurekaIp1:port1,或http:/eurekaIp2:port2` 查看 + +### 2.4 调整启动脚本 +根据实际情况,确定各机器上需要部署的Linkis服务, +比如 微服务`linkis-cg-engineconnmanager` 不会部署在服务器A上, +则修改服务器A的一键启停脚本,`sbin/linkis-start-all.sh`,`sbin/linkis-stop-all.sh`,将`cg-engineconnmanager`服务相关的启停命令,注释掉 +```html +sbin/linkis-start-all.sh +#linkis-cg-linkismanage +#SERVER_NAME="cg-linkismanager" +#SERVER_IP=$MANAGER_INSTALL_IP +#startApp + +sbin/linkis-stop-all.sh +#linkis-cg-engineconnmanager(ecm) +#SERVER_NAME="cg-engineconnmanager" +#SERVER_IP=$ENGINECONNMANAGER_INSTALL_IP +#stopApp + +``` + + +## 3 注意事项 +- 分部署部署时,linkis的安装目录建议保持一致,方便统一管控,相关的配置文件最好也保持一致 +- 如果某些服务器,端口已被其他应用占用,无法使用时,需要调整该服务端口 +- mg-gateway的多活部署,目前因为登陆session不支持分布式,用一个用户的请求,需要请求到同一个gateway实例上,可以通过nginx的ip hash负载均衡方式来支持 +- 一键启停脚本,根据实际情况,进行调整,对于不再本服务器上部署的微服务,需要在一键启动脚本中,将对应的启停命令注释掉。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-console.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-console.md new file mode 100644 index 00000000000..a276d8022fd --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-console.md @@ -0,0 +1,205 @@ +--- +title: 管理台部署 +sidebar_position: 3 +--- +> web端是使用nginx作为静态资源服务器的,访问请求流程是:`Linkis管理台请求->nginx ip:port->linkis-gateway ip:port-> 其他服务` + + +Linkis 提供了单独的前端管理台功能,提供了展示历史任务的全局历史、修改用户参数、管理ECM和微服务等功能,部署前端管理台前需要先将Linkis后端进行部署,Linkis的部署手册见:[Linkis部署手册](deploy-quick.md) + + +## 1 准备工作 + +1. 从linkis的release页面([点击这里进入下载页面](https://linkis.apache.org/zh-CN/download/main))下载web安装包`apache-linkis-x.x.x-web-bin.tar.gz` +手动解压:`tar -xvf apache-linkis-x.x.x-web-bin.tar.gz`, + +解压后目录为: +``` +├── config.sh +├── dist +├── install.sh +├── LICENSE +├── licenses +└── NOTICE +``` + +## 2 部署 + +> 分为两种部署方式,自动化部署和手动部署 + +### 2.1 自动化部署(推荐) + +#### 2.1.1 修改配置config.sh +```shell script +#linkis-mg-gateway服务地址 +linkis_url="http://127.0.0.1:9001" + +#可以配置为安装机器的ip 也可以使用默认值 +linkis_ipaddr=127.0.0.1 +# 访问管理台的端口 +linkis_port=8088 + +``` + +#### 2.1.2 执行部署脚本 + +```shell script +# nginx 需要sudo权限进行安装 +sudo sh install.sh +``` +安装后,linkis的nginx配置文件默认是 在`/etc/nginx/conf.d/linkis.conf` +nginx的日志文件在 `/var/log/nginx/access.log` 和`/var/log/nginx/error.log` +生成的linkis管理台的nginx配置文件示例如下: +```nginx + + server { + listen 8188;# 访问端口 如果端口被占用,则需要修改 + server_name localhost; + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + location / { + root /appcom/Install/linkis-web/dist; # 静态文件目录 + index index.html index.html; + } + location /ws { + proxy_pass http://localhost:9020;#后端Linkis的地址 + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + location /api { + proxy_pass http://localhost:9020; #后端Linkis的地址 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header x_real_ipP $remote_addr; + proxy_set_header remote_addr $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_connect_timeout 4s; + proxy_read_timeout 600s; + proxy_send_timeout 12s; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + #error_page 404 /404.html; + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +``` + + +### 2.2 手动部署 + +#### 2.2.1 安装Nginx +>如果已经安装过nginx 可以跳过 + +```shell script +sudo yum install nginx -y +``` + +#### 2.2.2 修改配置文件 +```shell script +sudo vi /etc/nginx/conf.d/linkis.conf +``` + +添加如下内容: +``` +server { + listen 8080;# 访问端口 + server_name localhost; + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + location / { + root /appcom/Install/linkis/dist; # 前端包解压的目录 + index index.html index.html; + } + + location /api { + proxy_pass http://192.168.xxx.xxx:9001; # linkis-gateway服务的ip端口 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header x_real_ipP $remote_addr; + proxy_set_header remote_addr $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_connect_timeout 4s; + proxy_read_timeout 600s; + proxy_send_timeout 12s; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + #error_page 404 /404.html; + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } + +``` + +#### 2.2.3 资源部署 + +将前端包拷贝到对应的目录:`/appcom/Install/linkis/dist` + +#### 2.2.4 启动服务 + +``` +sudo systemctl restart nginx +``` + + +## 3 登录管理台 + +浏览器访问`http://linkis_ipaddr:linkis_port` 其中linkis_port为config.sh里面配置的端口,linkis_ipaddr为安装机器的IP + +用户名/密码在`${LINKIS_HOME}/conf/linkis-mg-gateway.properties`中查看 +```shell script +wds.linkis.admin.user= #用户 +wds.linkis.admin.password= #密码 + +``` + +## 4 注意事项 + +如果需要修改端口或则静态资源目录等,请修改`/etc/nginx/conf.d/linkis.conf` 文件后执行 `sudo nginx -s reload` 命令 +:::caution 注意 +- 目前暂未集成visualis功能,安装过程中如果提示安装linkis/visualis失败,可以忽略 +- 查看nginx是否正常启动:检查nginx进程是否存在 `ps -ef |grep nginx` +- 检查nginx的配置是否正确 `sudo nginx -T ` +- 如果端口被占用,可以修改nginx启动的服务端口`/etc/nginx/conf.d/linkis.conf`listen端口值,保存后重新启动 +- 如果访问管理台出现接口502,或则`Unexpected token < in JSON at position 0`异常,请确认linkis-mg-gateway是否正常启动,如果正常启动,查看nginx配置文件中配置的linkis-mg-gateway服务地址是否正确 +::: + + +## 5 常见问题 + +### 5.1 上传文件大小限制 + +``` +sudo vi /etc/nginx/nginx.conf +``` + +更改上传大小 + +``` +client_max_body_size 200m +``` + +### 5.2 接口超时 + +``` +sudo vi /etc/nginx/conf.d/linkis.conf +``` +更改接口超时时间 + +``` +proxy_read_timeout 600s +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-quick.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-quick.md new file mode 100644 index 00000000000..35489d955c4 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/deploy-quick.md @@ -0,0 +1,787 @@ +--- +title: 单机部署 +sidebar_position: 1 +--- + +## 1. 首次安装准备事项 + +### 1.1 Linux服务器 + +**硬件要求** +安装linkis 微服务近6个,至少3G内存。每个微服务默认配置启动的jvm -Xmx 内存大小为 512M(内存不够的情况下,可以尝试调小至256/128M,内存足够情况下也可以调大)。 + + +### 1.2 添加部署用户 + +>部署用户: linkis核心进程的启动用户,同时此用户会默认作为管理员权限,部署过程中会生成对应的管理员登录密码,位于`conf/linkis-mg-gateway.properties`文件中 +Linkis支持指定提交、执行的用户。linkis主要进程服务会通过`sudo -u ${linkis-user}` 切换到对应用户下,然后执行对应的引擎启动命令,所以引擎`linkis-engine`进程归属的用户是任务的执行者(因此部署用户需要有sudo权限,而且是免密的)。 + +以hadoop用户为例(linkis中很多配置用户默认都使用hadoop用户,建议初次安装者使用hadoop用户,否则在安装过程中可能会遇到很多意想不到的错误): + +先查看系统中是否已经有 hadoop 用户,若已经存在,则直接授权即可,若不存在,先创建用户,再授权。 + +查看是否已存在 hadoop 用户 +```shell script +$ id hadoop +uid=2001(hadoop) gid=2001(hadoop) groups=2001(hadoop) +``` + +若不存在,则需要创建 hadoop 用户,并加入 hadoop 用户组 +```shell script +$ sudo useradd hadoop -g hadoop +$ vi /etc/sudoers +#免密配置 +hadoop ALL=(ALL) NOPASSWD: NOPASSWD: ALL +``` + +以下操作都是在hadoop用户下进行 + + + +## 2. 配置修改 + +### 2.1 安装包准备 + +- 方式1:从官网[下载地址](https://linkis.apache.org/zh-CN/download/main):https://linkis.apache.org/zh-CN/download/main +,下载对应的安装包(项目安装包和管理台安装包)。 +- 方式2:根据[Linkis 编译打包](../development/build)和[前端管理台编译](../development/build-console) 自行编译出项目安装包和管理台安装包。 + +上传安装包`apache-linkis-x.x.x-bin.tar.gz`后,进行解压安装包 + +```shell script +$ tar -xvf apache-linkis-x.x.x-bin.tar.gz +``` + +解压后的目录结构如下 +```shell script +-rw-r--r-- 1 hadoop hadoop 518192043 Jun 20 09:50 apache-linkis-x.x.x-bin.tar.gz +drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 bin //执行环境检查和安装的脚本 +drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 deploy-config // 部署时依赖的DB等环境配置信息 +drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 docker +drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 helm +-rwxrwxr-x 1 hadoop hadoop 84732 Jan 22 2020 LICENSE +drwxr-xr-x 2 hadoop hadoop 20480 Jun 20 09:56 licenses +drwxrwxr-x 7 hadoop hadoop 4096 Jun 20 09:56 linkis-package // 实际的软件包,包括lib/服务启动脚本工具/db的初始化脚本/微服务的配置文件等 +-rwxrwxr-x 1 hadoop hadoop 119503 Jan 22 2020 NOTICE +-rw-r--r-- 1 hadoop hadoop 11959 Jan 22 2020 README_CN.md +-rw-r--r-- 1 hadoop hadoop 12587 Jan 22 2020 README.md + +``` + +### 2.2 配置数据库信息 + +`vim deploy-config/linkis-env.sh` + +```shell script +# 选择linkis业务数据库类型,默认mysql +# 如果使用postgresql,请改为postgresql +# 注意: 当前配置只适用于linkis>=1.4.0 +dbType=mysql +``` + +`vim deploy-config/db.sh` + +```shell script +# Linkis自身业务的数据库信息 - mysql +MYSQL_HOST=xx.xx.xx.xx +MYSQL_PORT=3306 +MYSQL_DB=linkis_test +MYSQL_USER=test +MYSQL_PASSWORD=xxxxx + +# Linkis自身业务的数据库信息 - postgresql +# 注意: 以下配置只适用于linkis>=1.4.0 +PG_HOST=xx.xx.xx.xx +PG_PORT=5432 +PG_DB=linkis_test +PG_SCHEMA=linkis_test +PG_USER=test +PG_PASSWORD=123456 + +# 提供 Hive 元数据数据库的 DB 信息,如果不涉及hive引擎(或则只是简单试用),可以不配置 +#主要是配合scriptis一起使用,如果不配置,会默认尝试通过$HIVE_CONF_DIR 中的配置文件获取 +HIVE_META_URL="jdbc:mysql://10.10.10.10:3306/hive_meta_demo?useUnicode=true&characterEncoding=UTF-8" +HIVE_META_USER=demo # HiveMeta元数据库的用户 +HIVE_META_PASSWORD=demo123 # HiveMeta元数据库的密码 +``` + + +### 2.3 配置基础变量 + +文件位于`deploy-config/linkis-env.sh`。 + +#### 部署用户 +```shell script +deployUser=hadoop #执行部署的用户,为 1.2 步骤给中创建的用户 +``` + +#### 基础目录配置(可选) +:::caution 注意 +根据实际情况确定是否需要调整,可以选择使用默认值 +::: + + +```shell script + +# 指定用户使用的目录路径,一般用于存储用户的脚本文件和日志文件等,是用户的工作空间。 对应的配置文件配置项为 wds.linkis.filesystem.root.path(linkis.properties) +WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis + +# 结果集日志等文件路径,用于存储Job的结果集文件 wds.linkis.resultSet.store.path(linkis-cg-entrance.properties) //如果未配置 使用HDFS_USER_ROOT_PATH的配置 +RESULT_SET_ROOT_PATH=file:///tmp/linkis + +# 结果集日志等文件路径,用于存储Job的结果集文件 wds.linkis.filesystem.hdfs.root.path(linkis.properties) +HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis + +# 存放执行引擎的工作路径,需要部署用户有写权限的本地目录 wds.linkis.engineconn.root.dir(linkis-cg-engineconnmanager.properties) +ENGINECONN_ROOT_PATH=/appcom/tmp +``` + +#### Yarn的ResourceManager的地址 + +:::caution 注意 +如果需要使用Spark引擎 则需要配置 +::: + +```shell script + +#可以通过访问http://xx.xx.xx.xx:8088/ws/v1/cluster/scheduler 接口确认是否可以正常访问 +YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088 +``` +执行spark任务时,需要使用到yarn的ResourceManager,linkis默认它是未开启权限验证的,如果ResourceManager开启了密码权限验证,请安装部署后, +修改数据库表 `linkis_cg_rm_external_resource_provider` 插入yarn数据信息,详细可以参考[查看yarn地址是否配置正确](#811-查看yarn地址是否配置正确) + +#### 基础组件环境信息 + +:::caution 注意 +可以通过用户的系统环境变量配置, 如果通过系统环境变量配置的,deploy-config/linkis-env.sh配置文件中可以不进行配置 直接注释掉。 +::: + +```shell script +##如果不使用Hive、Spark等引擎且不依赖Hadoop,则不需要配置以下环境变量 + +#HADOOP +HADOOP_HOME=/appcom/Install/hadoop +HADOOP_CONF_DIR=/appcom/config/hadoop-config + +#Hive +HIVE_HOME=/appcom/Install/hive +HIVE_CONF_DIR=/appcom/config/hive-config + +#Spark +SPARK_HOME=/appcom/Install/spark +SPARK_CONF_DIR=/appcom/config/spark-config +``` + + +#### LDAP 登录配置(可选) + +:::caution 注意 +默认是使用静态用户和密码,静态用户即部署用户,静态密码会在执行部署是随机生成一个密码串,存储于`${LINKIS_HOME}/conf/linkis-mg-gateway.properties`(>=1.0.3版本)。 +::: + + +```shell script +#LDAP配置,默认Linkis只支持部署用户登录,如果需要支持多用户登录可以使用LDAP,需要配置以下参数: +#LDAP_URL=ldap://localhost:1389/ +#LDAP_BASEDN=dc=webank,dc=com +``` + + +#### JVM内存配置(可选) +>微服务启动jvm内存配置,可以根据机器实际情况进行调整,如果机器内存资源较少,可以尝试调小至256/128M +```shell script +## java application default jvm memory +export SERVER_HEAP_SIZE="512M" +``` + +#### 安装目录配置(可选) +> Linkis最终会被安装到此目录下,不配置默认是与当前安装包同一级目录下 + +```shell script +##The decompression directory and the installation directory need to be inconsistent +LINKIS_HOME=/appcom/Install/LinkisInstall +``` + +#### 无HDFS模式部署(可选 >1.1.2版本支持) + +> 在没有HDFS 的环境中部署 Linkis 服务,以方便更轻量化的学习使用和调试。去HDFS模式部署不支持hive/spark/flink引擎等任务 + +修改 `linkis-env.sh` 文件,修改以下内容 +```bash +#使用[file://]路径模式代替[hdfs://]模式 +WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis/ +HDFS_USER_ROOT_PATH=file:///tmp/linkis +RESULT_SET_ROOT_PATH=file:///tmp/linkis + +export ENABLE_HDFS=false +export ENABLE_HIVE=false +export ENABLE_SPARK=false +``` + +#### kerberos 认证(可选) + +> 默认 Linkis 未开启 kerberos 认证,如果使用的hive集群开启了 kerberos 模式认证,需要配置如下参数。 + +修改 `linkis-env.sh` 文件,修改内容如下 +```bash +#HADOOP +HADOOP_KERBEROS_ENABLE=true +HADOOP_KEYTAB_PATH=/appcom/keytab/ +``` + +### 2.4 配置 Token +文件位于 `bin/install.sh` + +Linkis 1.3.2 版本为保证系统安全性已将 Token 值改为32位随机生成,具体可查看[Token变更说明](https://linkis.apache.org/zh-CN/docs/1.3.2/feature/update-token/)。 + +使用随机生成Token,初次与[WDS其它组件](https://github.com/WeDataSphere/DataSphereStudio/blob/master/README-ZH.md)对接时会遇到很多 Token 验证失败的问题,建议初次安装时不使用随机生成Token,修改如下配置为 true 即可。 + +``` +DEBUG_MODE=true +``` + +### 2.5 注意事项 + +**全量安装** + +对于全量安装新版本 Linkis 时, install.sh 脚本中会自动处理配置文件和数据库 Token 保持一致。因此 Linkis 服务自身 Token 无需修改。各应用可通过管理台查询并使用新 Token。 + +**版本升级** + +版本升级时,数据库 Token 并未修改,因此无需修改配置文件和应用 Token。 + +**Token 过期问题** + +当遇到 Token 令牌无效或已过期问题时可以检查 Token 是否配置正确,可通过管理台 ==> 基础数据管理 ==> 令牌管理,查询 Token。 + +**Python 版本问题** +Linkis 升级为 1.4.0 后默认 Spark 版本升级为 3.x,无法兼容 python2。因此如果需要使用 pyspark 功能需要做如下修改。 +1. 映射 python2 命令为 python3 +``` +sudo ln -snf /usr/bin/python3 /usr/bin/python2 +``` +2. spark 引擎连接器配置 $LINKIS_HOME/lib/linkis-engineconn-plugins/spark/dist/3.2.1/conf/linkis-engineconn.properties 中添加如下配置,指定python安装路径 +``` +pyspark.python3.path=/usr/bin/python3 +``` + +## 3. 安装和启动 + +### 3.1 执行安装脚本: + +```bash + sh bin/install.sh +``` + +install.sh脚本会询问您是否需要初始化数据库并导入元数据。如果选择初始化,会把数据库中的表数据清空重新初始化。 + +**第一次安装必须选清空数据库** + +:::tip 注意 +- 如果出现报错,又不清楚具体是执行什么命令报错,可以加 -x 参数`sh -x bin/install.sh`,将shell脚本执行过程日志打印出来,方便定位问题。 +- 权限问题:`mkdir: cannot create directory ‘xxxx’: Permission denied`,请确认部署用户是否拥有该路径的读写权限。 +::: + +执行成功提示如下: +```shell script +`Congratulations! You have installed Linkis x.x.x successfully, please use sh /data/Install/linkis/sbin/linkis-start-all.sh to start it! +Your default account password is [hadoop/5e8e312b4]` +``` + +### 3.2 添加mysql驱动包 + +:::caution 注意 +因为mysql-connector-java驱动是GPL2.0协议,不满足Apache开源协议关于license的政策,因此从1.0.3版本开始,提供的Apache版本官方部署包,默认是没有mysql-connector-java-x.x.x.jar的依赖包(**若是通过集成的全家桶物料包安装,则无需手动添加**),安装部署时需要自行添加依赖到对应的lib包中。 可以在对应的目录下查看是否存在,如果不存在则需要添加。 + +::: + +下载mysql驱动 以 8.0.28 版本为例:[下载链接](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar) + +拷贝mysql 驱动包至lib包下 +``` +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ +``` +### 3.3 添加postgresql驱动包 (可选) +如果选择使用postgresql作为业务数据库,需要手动添加postgresql驱动 +下载postgresql驱动 以42.5.4版本为例:[下载链接](https://repo1.maven.org/maven2/org/postgresql/postgresql/42.5.4/postgresql-42.5.4.jar) +拷贝postgresql驱动包至lib包下 +``` +cp postgresql-42.5.4.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +cp postgresql-42.5.4.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ +``` +### 3.4 配置调整(可选) +> 以下操作,跟依赖的环境有关,根据实际情况,确定是否需要操作 + +#### 3.4.1 Yarn的认证 + +执行spark任务时,需要使用到yarn的ResourceManager,通过配置项`YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088 `控制。 +执行安装部署时,会将`YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088` 信息更新到数据库表中 `linkis_cg_rm_external_resource_provider`中时候,默认访问yarn资源是不需权限验证的, +如果yarn的ResourceManager开启了密码权限验证,请安装部署后,修改数据库表 `linkis_cg_rm_external_resource_provider` 中生成的yarn数据信息, +详细可以参考[查看yarn地址是否配置正确](#811-查看yarn地址是否配置正确)。 + +#### 3.4.2 session +如果您是对Linkis的升级。同时部署DSS或者其他项目,但其它软件中引入的依赖linkis版本<1.1.1(主要看lib包中,所依赖的Linkis的linkis-module-x.x.x.jar包 <1.1.1),则需要修改位于`${LINKIS_HOME}/conf/linkis.properties`文件。 +```shell +echo "wds.linkis.session.ticket.key=bdp-user-ticket-id" >> linkis.properties +``` + +#### 3.4.3 S3 模式 +> 目前支持将引擎执行日志和结果存储到 S3 文件系统 +> +> 注意: linkis没有对 S3 做权限适配,所以无法对其做赋权操作 + +`vim $LINKIS_HOME/conf/linkis.properties` +```shell script +# s3 file system +linkis.storage.s3.access.key=xxx +linkis.storage.s3.secret.key=xxx +linkis.storage.s3.endpoint=http://xxx.xxx.xxx.xxx:xxx +linkis.storage.s3.region=xxx +linkis.storage.s3.bucket=xxx +``` + +`vim $LINKIS_HOME/conf/linkis-cg-entrance.properties` +```shell script +wds.linkis.entrance.config.log.path=s3:///linkis/logs +wds.linkis.resultSet.store.path=s3:///linkis/results +``` + +### 3.5 启动服务 +```shell script +sh sbin/linkis-start-all.sh +``` + +### 3.6 安装后配置的修改 +安装完成后,如果需要修改配置(因端口冲突或则某些配置有问题需要调整配置),可以重新执行安装,或则修改对应服务的配置`${LINKIS_HOME}/conf/*properties`文件后,重启对应的服务,如:`sh sbin/linkis-daemon.sh start ps-publicservice`。 + + +### 3.7 检查服务是否正常启动 +访问eureka服务页面(http://eurekaip:20303), +默认会启动6个 Linkis 微服务,其中下图linkis-cg-engineconn服务为运行任务才会启动。 +![Linkis1.0_Eureka](./images/eureka.png) + +```shell script +LINKIS-CG-ENGINECONNMANAGER 引擎管理服务 +LINKIS-CG-ENTRANCE 计算治理入口服务 +LINKIS-CG-LINKISMANAGER  计算治理管理服务  +LINKIS-MG-EUREKA        微服务注册中心服务   +LINKIS-MG-GATEWAY 网关服务 +LINKIS-PS-PUBLICSERVICE 公共服务 +``` + +注意:在 Linkis 1.3.1 中已将 LINKIS-PS-CS、LINKIS-PS-DATA-SOURCE-MANAGER、LINKIS-PS-METADATAMANAGER服务合并到LINKIS-PS-PUBLICSERVICE,将LINKIS-CG-ENGINEPLUGIN服务合并到LINKIS-CG-LINKISMANAGER。 + +如果有服务未启动,可以在对应的log/${服务名}.log文件中查看详细异常日志。 + +### 3.8 配置 Token + +Linkis 原有默认 Token 固定且长度太短存在安全隐患。因此 Linkis 1.3.2 将原有固定 Token 改为随机生成,并增加 Token 长度。 + +新 Token 格式:应用简称-32 位随机数,如BML-928a721518014ba4a28735ec2a0da799。 + +Token 可能在 Linkis 服务自身使用,如通过 Shell 方式执行任务、BML 上传等,也可能在其它应用中使用,如 DSS、Qualitis 等应用访问 Linkis。 + +#### 查看 Token +**通过 SQL 语句查看** +```sql +select * from linkis_mg_gateway_auth_token; +``` +**通过管理台查看** + +登录管理台 -> 基础数据管理 -> 令牌管理 +![](/Images-zh/deployment/token-list.png) + +#### 检查 Token 配置 + +Linkis 服务本身使用 Token 时,配置文件中 Token 需与数据库中 Token 一致。通过应用简称前缀匹配。 + +$LINKIS_HOME/conf/linkis.properties文件 Token 配置 + +``` +linkis.configuration.linkisclient.auth.token.value=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.client.common.tokenValue=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.bml.auth.token.value=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.context.client.auth.value=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.errorcode.auth.token=BML-928a721518014ba4a28735ec2a0da799 + +wds.linkis.client.test.common.tokenValue=LINKIS_CLI-215af9e265ae437ca1f070b17d6a540d + +wds.linkis.filesystem.token.value=WS-52bce72ed51741c7a2a9544812b45725 +wds.linkis.gateway.access.token=WS-52bce72ed51741c7a2a9544812b45725 + +wds.linkis.server.dsm.auth.token.value=DSM-65169e8e1b564c0d8a04ee861ca7df6e +``` + +$LINKIS_HOME/conf/linkis-cli/linkis-cli.properties文件 Token 配置 +``` +wds.linkis.client.common.tokenValue=BML-928a721518014ba4a28735ec2a0da799 +``` + +其它应用使用 Token 时,需要修改其 Token 配置与数据库中 Token 一致。 + +## 4. 安装web前端 +web端是使用nginx作为静态资源服务器的,访问请求流程是: +`Linkis管理台请求->nginx ip:port->linkis-gateway ip:port-> 其他服务` + +### 4.1 下载前端安装包并解压 +```shell script +tar -xvf apache-linkis-x.x.x-web-bin.tar.gz +``` + +### 4.2 修改配置config.sh +```shell script +#访问管理台的端口 +linkis_port="8188" + +#linkis-mg-gateway服务地址 +linkis_url="http://localhost:9020" +``` + +### 4.3 执行部署脚本 + +```shell script +# nginx 需要sudo权限进行安装 +sudo sh install.sh +``` +安装后,linkis的nginx配置文件默认是 在`/etc/nginx/conf.d/linkis.conf` +nginx的日志文件在 `/var/log/nginx/access.log` 和`/var/log/nginx/error.log` +生成的linkis管理台的nginx配置文件示例如下: +```nginx + + server { + listen 8188;# 访问端口 如果端口被占用,则需要修改 + server_name localhost; + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + location / { + root /appcom/Install/linkis-web/dist; # 静态文件目录 + index index.html index.html; + } + location /ws { + proxy_pass http://localhost:9020;#后端Linkis的地址 + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + location /api { + proxy_pass http://localhost:9020; #后端Linkis的地址 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header x_real_ipP $remote_addr; + proxy_set_header remote_addr $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_connect_timeout 4s; + proxy_read_timeout 600s; + proxy_send_timeout 12s; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + #error_page 404 /404.html; + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +``` + +如果需要修改端口或则静态资源目录等,请修改`/etc/nginx/conf.d/linkis.conf` 文件后执行 `sudo nginx -s reload` 命令 +:::caution 注意 +- 目前暂未集成visualis功能,安装过程中如果提示安装linkis/visualis失败,可以忽略 。 +- 查看nginx是否正常启动:检查nginx进程是否存在 `ps -ef |grep nginx` 。 +- 检查nginx的配置是否正确 `sudo nginx -T ` 。 +- 如果端口被占用,可以修改nginx启动的服务端口`/etc/nginx/conf.d/linkis.conf`listen端口值,保存后重新启动。 +- 如果访问管理台出现接口502,或则`Unexpected token < in JSON at position 0`异常,请确认linkis-mg-gateway是否正常启动,如果正常启动,查看nginx配置文件中配置的linkis-mg-gateway服务地址是否正确。 +::: + +### 4.4 登录管理台 + +浏览器登陆 `http://xx.xx.xx.xx:8188/#/login` +用户名/密码在`{LINKIS_HOME}/conf/linkis-mg-gateway.properties`中查看。 +```shell script +wds.linkis.admin.user= #用户 +wds.linkis.admin.password= #密码 + +``` + +## 5. 验证基础功能 +>根据实际需求,验证对应的引擎任务 + +``` +#引擎的engineType 拼接的版本号,一定要与实际的相匹配,以下示例是默认的版本号 +#shell 引擎任务 +sh bin/linkis-cli -submitUser hadoop -engineType shell-1 -codeType shell -code "whoami" + +#hive引擎任务 +sh bin/linkis-cli -submitUser hadoop -engineType hive-3.1.3 -codeType hql -code "show tables" + +#spark引擎任务 +sh bin/linkis-cli -submitUser hadoop -engineType spark-3.2.1 -codeType sql -code "show tables" + +#python引擎任务 +sh bin/linkis-cli -submitUser hadoop -engineType python-python2 -codeType python -code 'print("hello, world!")' +``` +如果验证失败,请参考【步骤8】进行排查。 + +## 6. 开发工具IDE(Scriptis)的安装(可选) +安装Scripti工具后,可以支持在web页面在线写SQL、Pyspark、HiveQL等脚本,详细指引见[工具Scriptis的安装部署](integrated/install-scriptis)。 + +## 7. 支持的引擎 + +### 7.1 引擎适配列表 + +请注意:Linkis的单独安装包默认只包含Python、Shell、Hive、Spark四个引擎,如果有其他的引擎(如jdbc/flink/sqoop等引擎)使用场景,可以手动安装,具体请参考 [EngineConnPlugin引擎插件安装文档](install-engineconn)。 + +本版本已适配的支持引擎列表如下: + +| 引擎类型 | 适配情况 | 官方安装包是否包含 | +|---------------|-------------------|------| +| Python | >=1.0.0 已适配 | 包含 | +| Shell | >=1.0.0 已适配 | 包含 | +| Hive | >=1.0.0 已适配 | 包含 | +| Spark | >=1.0.0 已适配 | 包含 | +| Pipeline | >=1.0.0 已适配 | **不包含** | +| JDBC | >=1.0.0 已适配 | **不包含** | +| Flink | >=1.0.0 已适配 | **不包含** | +| openLooKeng | >=1.1.1 已适配 | **不包含** | +| Sqoop | >=1.1.2 已适配 | **不包含** | +| Trino | >=1.3.2 已适配 | **不包含** | +| Presto | >=1.3.2 已适配 | **不包含** | +| Elasticsearch | >=1.3.2 已适配 | **不包含** | +| Seatunnel | >=1.3.2 已适配 | **不包含** | +| Impala | >=1.4.0 已适配 | **不包含** | + + + +### 7.2 查看部署的引擎 + +#### 方式1: 查看引擎lib包目录 + +``` +$ tree linkis-package/lib/linkis-engineconn-plugins/ -L 3 +linkis-package/lib/linkis-engineconn-plugins/ +├── hive +│   ├── dist +│   │   └── 3.1.3 #版本为 3.1.3 engineType 为hive-3.1.3 +│   └── plugin +│   └── 3.1.3 +├── python +│   ├── dist +│   │   └── python2 +│   └── plugin +│   └── python2 #版本为python2 engineType 为python-python2 +├── shell +│   ├── dist +│   │   └── 1 +│   └── plugin +│   └── 1 +└── spark + ├── dist + │   └── 3.2.1 + └── plugin + └── 3.2.1 +``` + +#### 方式2: 查看linkis的数据库表 +```shell script +select * from linkis_cg_engine_conn_plugin_bml_resources +``` + + +## 8. 常见异常问题排查指引 +### 8.1. Yarn队列检查 + +>如果需要使用到spark/hive/flink引擎 + +登录后查看能否正常显示yarn队列资源(点击页面右下角按钮)(需要先安装前端)。 + +正常如下图所示: +![yarn-normal](images/yarn-normal.png) + +若如果无法显示:可以按以下指引调整 + +#### 8.1.1 查看yarn地址是否配置正确 +数据库表 `linkis_cg_rm_external_resource_provider` ` +插入yarn数据信息 +```sql +INSERT INTO `linkis_cg_rm_external_resource_provider` +(`resource_type`, `name`, `labels`, `config`) VALUES +('Yarn', 'sit', NULL, +'{\r\n"rmWebAddress": "http://xx.xx.xx.xx:8088",\r\n"hadoopVersion": "3.3.4",\r\n"authorEnable":false,\r\n"user":"hadoop",\r\n"pwd":"123456"\r\n}' +); + +config字段属性 + +"rmWebAddress": "http://xx.xx.xx.xx:8088", #需要带上http以及端口 +"hadoopVersion": "3.3.4", +"authorEnable":true, //是否需要认证 可以在浏览器中通过访问http://xx.xx.xx.xx:8088验证用户名和密码 +"user":"user",//用户名 +"pwd":"pwd"//密码 + +``` +更新后,因为程序中有使用到缓存,想要立即生效,需要重启linkis-cg-linkismanager服务。 +```shell script +sh sbin/linkis-daemon.sh restart cg-linkismanager +``` + +#### 8.1.2 查看yarn队列是否存在 +异常信息:`desc: queue ide is not exists in YARN.`表明配置的yarn队列不存在,需要进行调整。 + +修改方式:`linkis管理台/参数配置>全局设置>yarn队列名[wds.linkis.rm.yarnqueue]`,修改一个可以使用的yarn队列,以使用的yarn 队列可以在 `rmWebAddress:http://xx.xx.xx.xx:8088/cluster/scheduler` 上查看到。 + +查看可用的yarn队列 +- 查看yarn队列地址:http://ip:8888/cluster/scheduler + +### 8.2 检查引擎物料资源是否上传成功 + +```sql +#登陆到linkis的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources +``` + +正常如下: +![bml](images/bml.png) + +查看引擎的物料记录是否存在(如果有更新,查看更新时间是否正确) + +- 如果不存在或则未更新,先尝试手动刷新物料资源(详细见[引擎物料资源刷新](install-engineconn#23-引擎刷新))。 +- 通过`log/linkis-cg-linkismanager.log`日志,查看物料失败的具体原因,很多时候可能是hdfs目录没有权限导致。 +- 检查gateway地址配置是否正确`conf/linkis.properties`的配置项`wds.linkis.gateway.url`。 + +引擎的物料资源默认上传到hdfs目录为 `/apps-data/${deployUser}/bml`。 + +```shell script +hdfs dfs -ls /apps-data/hadoop/bml +#如果没有该目录 请手动创建目录并授予${deployUser}读写权限 +hdfs dfs -mkdir /apps-data +hdfs dfs -chown hadoop:hadoop /apps-data +``` + +### 8.3 登陆密码问题 + +linkis默认是使用静态用户和密码,静态用户即部署用户,静态密码会在执行部署是随机生成一个密码串,存储于 + +`${LINKIS_HOME}/conf/linkis-mg-gateway.properties`(>=1.0.3版本)。 + +### 8.4 版本兼容性问题 + +linkis默认支持的引擎,与dss兼容关系可以查看[此文档](https://github.com/apache/linkis/blob/master/README.md) 。 + + +### 8.5 如何定位服务端异常日志 + +linkis的微服务比较多,若对系统不熟悉,有时候无法定位到具体哪个模块出现了异常,可以通过全局日志搜索方式。 +```shell script +tail -f log/* |grep -5n exception(或则tail -f log/* |grep -5n ERROR) +less log/* |grep -5n exception(或则less log/* |grep -5n ERROR) +``` + + +### 8.6 执行引擎任务的异常排查 + +** step1:找到引擎的启动部署目录 ** + +- 方式1:如果执行日志中有显示,可以在管理台上查看到 如下图: +![engine-log](images/engine-log.png) +- 方式2:如果方式1中没有找到,可以通过找到`conf/linkis-cg-engineconnmanager.properties`配置的`wds.linkis.engineconn.root.dir`的参数,该值就是引擎启动部署的目录,子目录按执行引擎的用户进行了隔离 + +```shell script +# 如果不清楚taskid,可以按时间排序后进行选择 ll -rt /appcom/tmp/${执行的用户}/${日期}/${引擎}/ +cd /appcom/tmp/${执行的用户}/${日期}/${引擎}/${taskId} +``` +目录大体如下 +```shell script +conf -> /appcom/tmp/engineConnPublickDir/6a09d5fb-81dd-41af-a58b-9cb5d5d81b5a/v000002/conf #引擎的配置文件 +engineConnExec.sh #生成的引擎的启动脚本 +lib -> /appcom/tmp/engineConnPublickDir/45bf0e6b-0fa5-47da-9532-c2a9f3ec764d/v000003/lib #引擎依赖的包 +logs #引擎启动执行的相关日志 +``` + +**step2:查看引擎的日志** +```shell script +less logs/stdout +``` + +**step3:尝试手动执行脚本(如果需要)** +可以通过尝试手动执行脚本,进行调试 +``` +sh -x engineConnExec.sh +``` + +### 8.7 如何修改注册中心eureka的端口 +有时候当eureka的端口被其他服务占用,无法使用默认的eureka端口的时候,需要对eureka端口进行修改,这里把对eureka端口的修改分为执行安装之前和执行安装之后两种情况。 + +1.执行安装之前修改注册中心eureka端口 +``` +1. 进入apache-linkis-x.x.x-bin.tar.gz的解压目录 +2. 执行 vi deploy-config/linkis-env.sh +3. 修改EUREKA_PORT=20303为EUREKA_PORT=端口号 +``` +2.执行安装之后修改注册中心eureka端口 +``` +1. 进入${LINKIS_HOME}/conf目录 + +2. 执行grep -r 20303 ./* ,查询结果如下所示: + ./application-eureka.yml: port: 20303 + ./application-eureka.yml: defaultZone: http://ip:20303/eureka/ + ./application-linkis.yml: defaultZone: http://ip:20303/eureka/ + ./linkis-env.sh:EUREKA_PORT=20303 + ./linkis.properties:wds.linkis.eureka.defaultZone=http://ip:20303/eureka/ + +3. 将对应位置的端口修改为新的端口,并且重启所有服务sh restart sbin/linkis-start-all.sh +``` + + +### 8.8 CDH适配版本的注意事项 + +CDH本身不是使用的官方标准的hive/spark包,进行适配时,最好修改linkis的源码中的hive/spark版本的依赖,进行重新编译部署。 +具体可以参考CDH适配博文 +[【Linkis1.0——CDH5环境中的安装与踩坑】](https://mp.weixin.qq.com/s/__QxC1NoLQFwme1yljy-Nw) +[【DSS1.0.0+Linkis1.0.2——CDH5环境中的试用记录】](https://mp.weixin.qq.com/s/9Pl9P0hizDWbbTBf1yzGJA) +[【DSS1.0.0与Linkis1.0.2——JDBC引擎相关问题汇总】](https://mp.weixin.qq.com/s/vcFge4BNiEuW-7OC3P-yaw) +[【DSS1.0.0与Linkis1.0.2——Flink引擎相关问题汇总】](https://mp.weixin.qq.com/s/VxZ16IPMd1CvcrvHFuU4RQ) + +### 8.9 Http接口的调试 + +- 方式1 可以开启[免登陆模式指引](/docs/latest/api/login-api/#2免登录配置) +- 方式2 postman中的,请求头带上登陆成功的cookie值 + cookie值可以在浏览器端登陆成功后,获取 + ![bml](images/bml-cookie.png) + +```shell script +Cookie: bdp-user-ticket-id=xxxxxxxxxxxxxxxxxxxxxxxxxxx +``` +- 方式3 http请求头添加静态的Token令牌 + Token在conf/linkis.properties进行配置 + 如:TEST-AUTH=hadoop,root,user01 +```shell script +Token-Code:TEST-AUTH +Token-User:hadoop +``` + +### 8.10 异常问题的排查流程 + +首先要按上述步骤检查服务/环境等是否都正常启动,然后按上述罗列的一些场景的方式进行基础问题的排查 。 + +[QA文档](https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq)中查找是否有解决方案,链接:https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq +通过搜索issue中的内容,看是否能找到解决方案。 +![issues](images/issues.png) +通过官网文档搜索,对于某些问题,可以通过官网搜索关键字进行查询,比如搜索"部署"相关。(如果出现404,请浏览器中刷新一下) +![search](images/search.png) + + +## 9. 相关的资料如何获取 +linkis官网文档正在不断的完善,可以在本官网查看相关文档。 + +相关博文链接如下。 +- Linkis的技术博文集 https://github.com/apache/linkis/issues/1233 +- 公众号技术博文https://mp.weixin.qq.com/mp/homepage?__biz=MzI4MDkxNzUxMg==&hid=1&sn=088cbf2bbed1c80d003c5865bc92ace8&scene=18 +- 官网文档 https://linkis.apache.org/zh-CN/docs/latest/about/introduction +- bili技术分享视频 https://space.bilibili.com/598542776?spm_id_from=333.788.b_765f7570696e666f.2 + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/directory-linkis.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/directory-linkis.md new file mode 100644 index 00000000000..8811c13cb62 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/directory-linkis.md @@ -0,0 +1,295 @@ +--- +title: 目录结构 +sidebar_position: 7 +--- + +> Linkis代码层级目录结构,以及安装包目录结构和部署后的目录结构说明,如果想详细了解各个模块,请查看[Linkis的相关架构设计](architecture/overview.md) +## 1. 源码目录结构 + +```html +├── docs +│   ├── configuration //linkis所有模块的配置项文档 +│   ├── errorcode //linkis所有模块的错误码文档 +│   ├── configuration-change-records.md +│   ├── index.md +│   ├── info-1.1.3.md +│   ├── info-1.2.1.md +│   ├── info-1.3.1.md +│   └── trino-usage.md +├── linkis-commons //核心抽象,里面放有所有的公用模块 +│   ├── linkis-common //通用模块,内置很多通用工具类 +│   ├── linkis-hadoop-common +│   ├── linkis-httpclient //Java SDK顶层接口 对httpclient的进一步封装 +│   ├── linkis-module // linkis的服务顶层公用模块 涉及到服务启动时的参数和服务初始化 统一的Restful处理 登录态校验等 +│   ├── linkis-mybatis //SpringCloud的Mybatis模块 +│   ├── linkis-protocol //服务请求/响应的一些接口和实体类 +│   ├── linkis-rpc //RPC模块,基于Feign实现的复杂双向通信 +│   ├── linkis-scheduler //通用调度模块 +│   ├── linkis-storage //文件操作工具集 +├── linkis-computation-governance //计算治理服务 +│   ├── linkis-client //Java SDK,用户通过Client可直接访问Linkis +│   ├── linkis-computation-governance-common +│   ├── linkis-engineconn +│   ├── linkis-engineconn-manager +│   ├── linkis-entrance //通用底层entrance模块 +│   ├── linkis-jdbc-driver //可以类似jdbc sdk方式连接使用linkis +│   ├── linkis-manager +├── linkis-dist //编译打包最后阶段步骤 整合所有lib包和安装部署脚本配置等 +│   ├── bin +│   │   ├── checkEnv.sh +│   │   ├── common.sh +│   │   └── install.sh //安装脚本 +│   ├── deploy-config +│   │   ├── db.sh //数据库配置 +│   │   └── linkis-env.sh //linkis 启动相关配置 +│   ├── docker +│   │   └── scripts +│   ├── helm +│   │   ├── charts +│   │   ├── scripts +│   │   ├── README_CN.md +│   │   └── README.md +│   ├── package +│   │   ├── bin +│   │   ├── conf +│   │   ├── db +│   │   └── sbin +│   ├── release-docs +│   │   ├── licenses +│   │   ├── LICENSE +│   │   └── NOTICE +│   ├── src +│   └── pom.xml +├── linkis-engineconn-plugins // 引擎 +│   ├── elasticsearch +│   ├── flink +│   ├── hive +│   ├── io_file +│   ├── jdbc +│   ├── openlookeng +│   ├── pipeline +│   ├── presto +│   ├── python +│   ├── seatunnel +│   ├── shell +│   ├── spark +│   ├── sqoop +├── linkis-extensions // 扩展功能增强插件模块 +│   ├── linkis-io-file-client // 对linkis-storage的功能扩展 +├── linkis-orchestrator //服务的编排 +│   ├── linkis-code-orchestrator +│   ├── linkis-computation-orchestrator +│   ├── linkis-orchestrator-core +├── linkis-public-enhancements //公共增强服务 +│   ├── linkis-basedata-manager +│   ├── linkis-bml // 物料库 +│   ├── linkis-configuration +│   ├── linkis-context-service //统一上下文 +│   ├── linkis-datasource //数据源服务 +│   ├── linkis-error-code +│   ├── linkis-instance-label +│   ├── linkis-jobhistory +│   ├── linkis-ps-common-lock +│   ├── linkis-script-dev +│   ├── linkis-udf +│   ├── linkis-variable +├── linkis-spring-cloud-services //微服务治理 +│   ├── linkis-service-discovery +│   ├── linkis-service-gateway //网关Gateway +├── linkis-web //linkis的管理台代码 +│   ├── release-docs +│   │   ├── licenses +│   │   └── LICENSE +│   ├── src +│   ├── config.sh +│   ├── install.sh +│   ├── package.json +│   ├── pom.xml +│   └── vue.config.js +├── tool +│   ├── dependencies +│   │   ├── known-dependencies.txt +│   │   └── regenerate_konwn_dependencies_txt.sh +│   ├── code-style-idea.xml +│   ├── license-header +│   └── modify_license.sh +├── CONTRIBUTING_CN.md +├── CONTRIBUTING.md +├── linkis-tree.txt +├── mvnw +├── mvnw.cmd +├── pom.xml +├── README_CN.md +├── README.md +└── scalastyle-config.xml + +``` + +## 2. 安装包目录结构 +```html + +├── bin +│   ├── checkEnv.sh ── 环境变量检测 +│   ├── common.sh ── 部分公共shell函数 +│   └── install.sh ── Linkis安装的主脚本 +├── deploy-config +│ ├── db.sh //数据库连接配置 +│ └── linkis-env.sh //相关环境配置信息 +├── docker +├── helm +├── licenses +├── linkis-package //微服务相关的启动配置文件,依赖,脚本,linkis-cli等 +│ ├── bin +│ ├── conf +│ ├── db +│ ├── lib +│ └── sbin +├── NOTICE +├── LICENSE +├── README_CN.md +└── README.md + +``` + + +## 3. 部署后的目录结构 + + +```html +├── bin ── linkis-cli 用于向Linkis提交任务的Shell命令行程序 +│   ├── linkis-cli +│   ├── linkis-cli-hive +│   ├── linkis-cli-pre +│   ├── linkis-cli-spark-sql +│   ├── linkis-cli-spark-submit +│   └── linkis-cli-sqoop +├── conf 配置目录 +│   ├── application-eureka.yml +│   ├── application-linkis.yml ── 微服务通用yml +│   ├── linkis-cg-engineconnmanager.properties +│   ├── linkis-cg-engineplugin.properties +│   ├── linkis-cg-linkismanager.properties +│   │── linkis-cli +│   │ ├── linkis-cli.properties +│   │ └── log4j2.xml +│   ├── linkis-env.sh ── linkis 环境变量配置 +│   ├── linkis-mg-gateway.properties +│   ├── linkis.properties ── linkis 服务的全局配合,所有微服务启动都会加载使用 +│   ├── linkis-ps-publicservice.properties +│   ├── log4j2.xml +├── db 数据库DML和DDL文件目录 +│   ├── linkis_ddl.sql ── 数据库表定义SQL +│   ├── linkis_dml.sql ── 数据库表初始化SQL +│   └── module ── 包含各个微服务的DML和DDL文件 +│   └── upgrade ── 针对每个版本 增量DML/DDL +├── lib lib目录 +│   ├── linkis-commons ── 公共依赖包 大多服务启动时(linkis-mg-gateway除外) -cp 路径参数 都会加载这个目录 +│   ├── linkis-computation-governance ──计算治理模块的lib目录 +│   ├── linkis-engineconn-plugins ──所有引擎插件的lib目录 +│   ├── linkis-public-enhancements ──公共增强服务的lib目录 +│   └── linkis-spring-cloud-services ──SpringCloud的lib目录 +├── logs 日志目录 +│ ├── linkis-cg-engineconnmanager-gc.log +│ ├── linkis-cg-engineconnmanager.log +│ ├── linkis-cg-engineconnmanager.out +│ ├── linkis-cg-engineplugin-gc.log +│ ├── linkis-cg-engineplugin.log +│ ├── linkis-cg-engineplugin.out +│ ├── linkis-cg-entrance-gc.log +│ ├── linkis-cg-entrance.log +│ ├── linkis-cg-entrance.out +│ ├── linkis-cg-linkismanager-gc.log +│ ├── linkis-cg-linkismanager.log +│ ├── linkis-cg-linkismanager.out +│ ├── linkis-cli +│ │   ├── linkis-client.hadoop.log.20220409162400037523664 +│ │   ├── linkis-client.hadoop.log.20220409162524417944443 +│ ├── linkis-mg-eureka-gc.log +│ ├── linkis-mg-eureka.log +│ ├── linkis-mg-eureka.out +│ ├── linkis-mg-gateway-gc.log +│ ├── linkis-mg-gateway.log +│ ├── linkis-mg-gateway.out +│ ├── linkis-ps-publicservice-gc.log +│ ├── linkis-ps-publicservice.log +│ └── linkis-ps-publicservice.out +├── pid 所有微服务的进程ID +│   ├── linkis_cg-engineconnmanager.pid ──引擎管理器微服务 +│   ├── linkis_cg-engineconnplugin.pid ──引擎插件微服务 +│   ├── linkis_cg-entrance.pid ──引擎入口微服务 +│   ├── linkis_cg-linkismanager.pid ──linkis管理器微服务 +│   ├── linkis_mg-eureka.pid ──eureka微服务 +│   ├── linkis_mg-gateway.pid ──gateway微服务 +│   └── linkis_ps-publicservice.pid ──公共微服务 +└── sbin 微服务启停脚本目录 +     ├── ext ──各个微服务的启停脚本目录 +     ├── linkis-daemon.sh ── 快捷启停、重启单个微服务脚本 +  ├── linkis-start-all.sh ── 一键启动全部微服务脚本 + └── linkis-stop-all.sh ── 一键停止全部微服务脚本 + +``` + +### 3.1 配置项修改 + +在执行完Linkis安装后,所有配置项位于conf目录下, +如果需要进行配置项修改,修改配置`${LINKIS_HOME}/conf/*properties`文件后,重启对应的服务, +如:`sh sbin/linkis-daemon.sh start ps-publicservice`。 +如果修改的是公共配置文件`application-eureka.yml/application-linkis.yml/linkis.properties`,需要重启所有服务`sh sbin/linkis-start-all.sh` + + + + +### 3.2 微服务启停 + +所有微服务名称如下: + ``` +├── linkis-cg-engineconnmanager 引擎管理服务 +├── linkis-cg-engineplugin 引擎插件管理服务 +├── linkis-cg-entrance 计算治理入口服务 +├── linkis-cg-linkismanager 计算治理管理服务 +├── linkis-mg-eureka 微服务注册中心服务 +├── linkis-mg-gateway Linkis网关服务 +├── linkis-ps-publicservice 公共服务 + ``` + +**微服务简称**: + +| 简称 | 英文全称 | 中文全称 | + |------|-------------------------|------------| +| cg | Computation Governance | 计算治理 | +| mg | Microservice Covernance | 微服务治理 | +| ps | Public Enhancement Service | 公共增强服务 | + + + +``` +# 一次性启动所有微服务: + + sh linkis-start-all.sh + +# 一次性关停所有微服务 + + sh linkis-stop-all.sh + +# 启动单个微服务(服务名需要去掉linkis前缀如:mg-eureka) + + sh linkis-daemon.sh start service-name + + 例如: sh linkis-daemon.sh start mg-eureka + +# 关闭单个微服务 + + sh linkis-daemon.sh stop service-name + + 例如: sh linkis-daemon.sh stop mg-eureka + +# 重启单个微服务 + + sh linkis-daemon.sh restart service-name + + 例如: sh linkis-daemon.sh restart mg-eureka +# 查看单个微服务的状态 + + sh linkis-daemon.sh status service-name + + 例如: sh linkis-daemon.sh status mg-eureka \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/bml-cookie.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/bml-cookie.png new file mode 100644 index 00000000000..67dc0be98f8 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/bml-cookie.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/bml.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/bml.png new file mode 100644 index 00000000000..ca9290f945d Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/bml.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/engine-log.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/engine-log.png new file mode 100644 index 00000000000..3a4c5ee0fb3 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/engine-log.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/eureka.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/eureka.png new file mode 100644 index 00000000000..3b3f24a4b0e Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/eureka.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/issues.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/issues.png new file mode 100644 index 00000000000..b84a711452c Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/issues.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/search.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/search.png new file mode 100644 index 00000000000..632763a293b Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/search.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/yarn-normal.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/yarn-normal.png new file mode 100644 index 00000000000..fefc3110524 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/images/yarn-normal.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/install-engineconn.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/install-engineconn.md new file mode 100644 index 00000000000..5dd98f4b268 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/install-engineconn.md @@ -0,0 +1,182 @@ +--- +title: 引擎的安装 +sidebar_position: 4 +--- + +> 本文主要介绍对于官方安装包中,未包含的引擎物料(jdbc/sqoop/flink等)/或则自定义实现的新引擎,如何进行安装部署,以支持对应的任务 + +## 1. 引擎插件目录结构 + +Linkis的引擎物料包安装目录为`${LINKIS_HOME}/lib/linkis-engineconn-plugins`,目录结构如下: + +```html +hive #引擎主目录,必须为引擎的名字 +│   ├── dist # 引擎启动需要的jar包依赖和配置,不同的版本需要在该目录放置对应的版本目录 +│   │   └── 2.3.3 # 版本号 版本为2.3.3 任务请求参数的engineType 为hive-2.3.3 +│   │      └── conf # 引擎需要的配置文件目录 +│   │      └── lib # 引擎插件需要的依赖包 +│   ├── plugin #引擎插件目录,该目录用于引擎管理服务封装引擎的启动命令和资源申请 +│      └── 2.3.3 # 引擎版本 +│         └── linkis-engineplugin-hive-1.0.0.jar #引擎模块包(只需要放置单独的引擎包) +├── python +│   ├── dist +│   │   └── python2 +│   └── plugin +│   └── python2 #版本为python2 任务请求参数的engineTypee 为python-python2 + +``` + +这里的物料包文件会在Linkis服务启动时候,会根据目录,解析出引擎和版本号,进行引擎物料的持久化存储(HDFS/本地文件系统中),并将持久化存储信息(引擎类型和版本资源索引) +记录到数据库表`linkis_cg_engine_conn_plugin_bml_resources`中。 + +示例数据如下: + +| engine_conn_type | version | file_name | file_size | last_modified | bml_resource_id | bml_resource_version | create_time | last_update_time | +| --- | --- | --- | ---: | ---: | --- | --- | --- | --- | +| hive | v2.3.4 | conf.zip | 2046 | 1651925378000 | 4f0353ac-5703-4b4d-942d-dbaead38b506 | v000001 | 2022-05-07 20:17:45 | 2022-05-07 20:17:45 | +| hive | v2.3.4 | lib.zip | 137715715 | 1651925379000 | 762595b5-a6d3-4311-8133-4f8d4e0c3aa0 | v000001 | 2022-05-07 20:17:52 | 2022-05-07 20:17:52 | + +提交任务执行时,会通过请求的参数`engineType`,从`linkis_cg_engine_conn_plugin_bml_resources`中查询到对应的资源索引, +通过索引下载对应的引擎物料,并部署启动对应的引擎进程,再进行任务的处理。 + +如 linkis-cli 提交hive查询示例 +```shell +sh ./bin/linkis-cli -engineType hive-2.3.3 -codeType hql -code "show tables" -submitUser hadoop -proxyUser hadoop +``` + +:::caution 注意 +因为引擎执行时传递的参数`engineType:hive-2.3.3` 是通过-来进行拆分出引擎和版本的,所以版本号里面不能出现`-`, +如果出现可以通过用其他符号代替,比如`engineType:hive-cdh-2.3.3`,会拆分错,可以直接使用这个:2.3.3 或则cdh_2.3.3 来命名引擎目录 +::: + + +Linkis项目中包含的引擎模块`linkis-engineconn-plugins/engineconn-plugins`都是按这个目录进行打包配置的, +如果是自己实现的新增引擎,需要按照上述的目录结构进行打包,可以参考hive的assembly配置方式来配置打包流程和配置, +源码目录:`linkis-engineconn-plugins/hive/src/main/assembly/distribution.xml` + +## 2. 引擎的安装 + +### 2.1 引擎包的准备 + +#### 方式1 +如果 [非默认引擎物料包](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin)中有满足条件的,可以直接下载使用 + +#### 方式2 手动编译获取 + +全量编译(首次编译时需要) +```shell script +cd ${linkis_code_dir} +mvn -N install +mvn clean install +``` + +编译引擎 +```shell script +cd linkis-enginepconn-pugins/engineconn-plugins/pipeline/ +mvn clean install +``` + +编译出来的引擎包,位于 +```bash +${linkis_code_dir}/linkis-engineconn-plugins/{插件模块名}/target/out/{插件模块名} +``` + +### 2.2 部署和加载 + +将 2.1 步编译出来的引擎包,上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` + +### 2.4 并配置默认的引擎版本(可选) + +> 主要是配置默认版本,当请求未带版本时 会使用默认版本 + +修改`$LINKIS_HOME/conf/linkis.properties` 配置文件 +```html +wds.linkis.hive.engine.version=2.3.3 +``` + +### 2.5 管理台Configuration配置修改(可选) +管理台的配置是按照引擎标签来进行管理的,如果新增的引擎,有配置参数需要配置的话,需要修改对应的表的元数据 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:hive-2.3.3 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` +以openLooKeng引擎 1.5.0版本 为例 +```html + +SET @OPENLOOKENG_LABEL="openlookeng-1.5.0"; +SET @OPENLOOKENG_ALL=CONCAT('*-*,',@OPENLOOKENG_LABEL); +SET @OPENLOOKENG_IDE=CONCAT('*-IDE,',@OPENLOOKENG_LABEL); + +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@OPENLOOKENG_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@OPENLOOKENG_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @OPENLOOKENG_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + + +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.url', '例如:http://127.0.0.1:8080', '连接地址', 'http://127.0.0.1:8080', 'Regex', '^\\s*http://([^:]+)(:\\d+)(/[^\\?]+)?(\\?\\S*)?$', 'openlookeng', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.catalog', 'catalog', 'catalog', 'system', 'None', '', 'openlookeng', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.source', 'source', 'source', 'global', 'None', '', 'openlookeng', 0, 0, 1, '数据源配置'); + + +-- openlookeng-* +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'openlookeng' and label_value = @OPENLOOKENG_ALL); + +-- openlookeng default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @OPENLOOKENG_ALL); + +``` + +### 2.6 引擎刷新 + +#### 2.6.1 方式1 接口刷新 +引擎支持实时刷新,引擎放置到对应目录后,通过http接口向`linkis-cg-engineconnplugin` 服务发送刷新请求即可。 + +- 接口 `http://${engineconn-plugin-server-IP}:${port}/api/rest_j/v1/rpc/receiveAndReply` + +- 请求方式 `POST` + +```json +{ + "method": "/enginePlugin/engineConn/refreshAll" +} +``` + +#### 2.6.2 方式2 重启刷新 + +通过重启`linkis-cg-engineconnplugin` 服务,也可以强制刷新引擎目录 + +```bash +### cd到sbin目录下,重启linkis-cg-engineconnplugin服务 + +cd ${LINKIS_HOME}/sbin + +## 执行linkis-daemon脚本 + +sh linkis-daemon.sh restart cg-engineplugin + +``` + +#### 2.6.3 检查引擎是否刷新成功 + +如果在刷新过程中遇到问题,需要确认是否刷新成功,则可以查看数据库中的`linkis_engine_conn_plugin_bml_resources`这张表的last_update_time是否为触发刷新的时间。 +```sql +#登陆到linkis的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources +``` + +正常如下: +![bml](images/bml.png) + +查看引擎的物料记录是否存在(如果有更新,查看更新时间是否正确)。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/_category_.json new file mode 100644 index 00000000000..7cd78cc67d9 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "集成", + "position": 9 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/install-scriptis.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/install-scriptis.md new file mode 100644 index 00000000000..ff08cb83b59 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/install-scriptis.md @@ -0,0 +1,205 @@ +--- +title: 集成 Scriptis +sidebar_position: 4.1 +--- + +## 1. 介绍 + +> 在 Apache Linkis >= 1.1.1 和 DSS >= 1.1.0 之后,支持将 scriptis 单独部署和 Linkis 进行搭配使用,使用 scriptis 的交互式分析的功能,可以在 web 页面在线写 SQL、Pyspark、HiveQL 等脚本,提交给 Linkis 执行且支持 UDF、函数、资源管控和自定义变量等特性,本文将介绍如何单独部署 Web 组件-scriptis,并通过 scriptis 这种 Web 页面来使用 Apache Linkis 。 + + +前提:已经成功安装并可以正常使用了 Linkis 服务(后端和管理台服务),Linkis 的部署流程可以见[Apache Linkis 的快速部署 ](../deploy-quick.md) + +示例说明: + +- linkis-gateway 服务的地址为 10.10.10.10 端口为 9001 +- Linkis 的管理台 nginx 部署在 10.10.10.10 端口为 8080 + + +## 2 物料准备 方式1-直接下载 + +| **DSS版本** | **DSS源码** | **Linkis版本要求** |**下载连接** | +|:---- |:---- |:---- |:---- | +|1.1.0 |[dss branch-1.1.0](https://github.com/WeBankFinTech/DataSphereStudio/tree/branch-1.1.0) |>=1.1.1|[scriptis-web 1.1.0](https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeDatasphere/Linkis/scriptis-web/scriptis-1.1.0.tar) | + + +## 3 物料准备 方式2-自行编译 +> 如果不自行编译,可以直接下载编译好的静态资源包,跳过此步 + +### 3.1 环境准备 + +> 首次编译时需要安装 + +#### 3.1.1 安装 node.js +```shell script +将 node.js 下载,安装即可。下载地址:http://nodejs.cn/download/ ( 建议使用node v16版本) 该步骤仅第一次使用时需要执行 +``` +#### 3.1.2 安装 learn +```shell script +#等待安装完即可,安装 liarn 仅第一次使用时需要执行 +npm install lerna -g +``` + +### 3.2 获取 Scriptis 代码 +> scriptis 是一个纯前端的项目,作为一个组件集成在 DSS 的 web 代码组件中,我们只需要将 DSS web 项目进行单独的 scriptis 模块编译 + +```shell script +#通过git下载 >=dss 1.1.0 版本来编译scriptis组件 +git clone -b branch-1.1.0 https://github.com/WeBankFinTech/DataSphereStudio +# 或则直接下载 zip 包 后解压 +https://github.com/WeBankFinTech/DataSphereStudio/archive/refs/heads/branch-1.1.0.zip + +#进入 web 目录 +cd DataSphereStudio/web + +#该步骤仅第一次使用时需要执行 +lerna init + +#添加依赖 注意:这里不是通过 npm install 而是 lerna bootstrap 需先安装 learn 该步骤仅第一次使用时需要执行 +lerna bootstrap +``` + +### 3.3 本地运行项目(可选) + +> 如果不需要本地运行调试查看,可以跳过此步 + +#### 3.3.1 配置 linkis-gateway 服务地址配置 + +如果是在本地启动服务,需要在代码中配置后端 linkis-gateway 服务地址,在`web/packages/dss/`目录下的`.env`文件, +打包部署时不需要进行配置 +```shell script +// 后端 linkis-gatway 服务地址 +VUE_APP_HOST=http://10.10.10.10:9001 +VUE_APP_MN_CONFIG_PREFIX=http://10.10.10.10:9001/api/rest_j/v1 +``` +#### 3.3.2 运行 Scriptis 模块 + +```shell script +cd DataSphereStudio/web +# 运行 scriptis 组件 +npm run serve --module=scriptis --micro_module=scriptis +``` + +打开浏览器,通过链接`http://localhost:8080`(本地请求默认端口是 8080) 访问应用 scriptis ,因为会请求到远端的 linkis-gatway 服务接口,这会存在跨域问题,chrome 浏览器解决跨域问题可参考[解决 Chrome 跨域问题 ](https://www.jianshu.com/p/56b1e01e6b6a) + + +### 3.4 打包 +```shell script +#指定 scriptis 模块 +cd DataSphereStudio/web + +#该指令成功执行后,web 目录下会出现一个名叫 `dist` 的文件夹,该文件夹即为打包好 scriptis 的组件资源代码。我们需要将该前端资源部署到 linkis-web 所在的 nginx 服务器上 +npm run build --module=scriptis --micro_module=scriptis +``` + +## 4 部署 Scriptis + +将直接下载(或编译)的静态资源 上传至 Linkis 管理台所在的服务器上,存放于`/data/Install/scriptis-web/dist/`, +在安装 Linkis 管理台的 nginx 服务器配置中,添加 scriptis 的静态资源访问规则,Linkis 管理台部署的 nginx 配置一般位于 `/etc/nginx/conf.d/linkis.conf` + +```shell script + location /scriptis { + alias /data/Install/scriptis-web/dist/ ; + index index.html ; +} +``` + +sudo vim `/etc/nginx/conf.d/linkis.conf` + +```shell script +server { + listen 8080;# 访问端口 + server_name localhost; + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + + location / { + root /appcom/Install/linkis-web/dist/; # 静态文件目录 + index index.html; + } + + location /scriptis { #scriptis 的资源带有 scriptis 前缀与 linkis 管理台区分开 + alias /data/Install/scriptis-web/dist/ ; #nginx scriptis 静态文件存放路径 (可自定义) + index index.html ; + } + + ....... + +location /api { + proxy_pass http://10.10.10.10:9001; #gatway 的地址 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header x_real_ipP $remote_addr; + proxy_set_header remote_addr $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_connect_timeout 4s; + proxy_read_timeout 600s; + proxy_send_timeout 12s; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + #error_page 404 /404.html; + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } + +``` +修改配置后,重新加载 nginx 配置 + +```shell script +sudo nginx -s reload +``` + +注意 nginx 中,location 配置块中使用 root 和 alias 区别 +- root 的处理结果是:root 路径+location 路径. +- alias 的处理结果是:使用 alias 路径替换 location 路径. +- alias 是一个目录别名的定义,root 则是最上层目录的定义 + +## 5 Scriptis 使用步骤 +必须先通过 Linkis 管理台登陆页面登陆成功后,再访问scriptis 页面 + +### 5.1 正常登录 Linkis 管理台 + +```shell script +#http://10.10.10.10:8080/#/ +http://nginxIp:port/#/ +``` +因访问 scriptis 需要进行登录验证,所以需要先进行登录,获取并缓存 cookie。 + +### 5.2 登录成功后 访问 Scriptis 页面 + +```shell script +#http://10.10.10.10:8080/scriptis/#/home +http://nginxIp:port/scriptis/#/home +``` +`nginxIp`:Linkis 管理台所部署的 nginx 服务器 ip,`port`:nginx 配置启动的端口号,`scriptis`为请求 scriptis 项目静态文件 nginx 配置的 location 地址(可自定义设置) + +### 5.3 使用 Scriptis + +以新建一个 sql 查询任务为例。 + + +step1 新建脚本 选择脚本类型为 sql 类型 + +![效果图 ](/Images-zh/deployment/scriptis/new_script.png) + +step2 输入要查询的语句 + +![效果图 ](/Images-zh/deployment/scriptis/test_statement.png) + +step3 运行 + +![效果图 ](/Images-zh/deployment/scriptis/running_results.png) + + +shep4 查看结果 + +![效果图 ](/Images-zh/deployment/scriptis/design_sketch.png) + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-knife4j.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-knife4j.md new file mode 100644 index 00000000000..f0e75a1e03f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-knife4j.md @@ -0,0 +1,63 @@ +--- +title: 集成 Knife4j +sidebar_position: 5.2 +--- + +## 1.knife4j介绍 +knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!其底层是对Springfox的封装,使用方式也和Springfox一致,只是对接口文档UI进行了优化 +**核心功能:** + +- 文档说明:根据Swagger的规范说明,详细列出接口文档的说明,包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息,对该接口的使用情况一目了然。 +- 在线调试:提供在线接口联调的强大功能,自动解析当前接口参数,同时包含表单验证,调用参数可返回接口响应内容、headers、响应时间、响应状态码等信息,帮助开发者在线调试。 +## 2.Linkis集成knif4j +### 2.1 测试模式下启动knif4j +修改application-linkis.yml文件设置knife4j.production=false +```shell +knife4j: + enable: true + production: false +``` +修改 linkis.properties文件打开测试模式 +```shell +wds.linkis.test.mode=true +wds.linkis.test.user=hadoop +``` +重启所有服务后,可以通过http://ip:port/api/rest_j/v1/doc.html 访问knife4j页面 +```shell +http://ip:port/api/rest_j/v1/doc.html +``` +### 2.2 非测试模式下启动knif4j +修改application-linkis.yml文件设置knife4j.production=false +```shell +knife4j: + enable: true + production: false +``` +修改 linkis.properties文件添加wds.linkis.server.user.restful.uri.pass.auth +```shell +wds.linkis.server.user.restful.uri.pass.auth=/api/rest_j/v1/doc.html,/api/rest_j/v1/swagger-resources,/api/rest_j/v1/webjars,/api/rest_j/v1/v2/api-docs +``` +重启所有服务后,可以通过http://ip:port/api/rest_j/v1/doc.html 访问knife4j页面 +```shell +http://ip:port/api/rest_j/v1/doc.html +``` +由于knife4j调试各接口时,需要进行身份认证,需手工在浏览器添加如下cookie信息 +```shell +#用户登录ticket-id +bdp-user-ticket-id= +#工作空间ID +workspaceId= +#内部请求开关 +dataworkcloud_inner_request=true +``` +以Chrome浏览器为例 +![](/Images-zh/deployment/knife4j/Knife4j_addcookie.png) +## 3.进入Knife4j页面 +通过http://ip:port/api/rest_j/v1/doc.html 访问knife4j页面 +![](/Images-zh/deployment/knife4j/Knife4j_home.png) +点击接口名称可展示详细的接口文档 +![](/Images-zh/deployment/knife4j/Knife4j_interface.png) +点击“调试”并录入参数可对接口进行调试 +![](/Images-zh/deployment/knife4j/Knife4j_debug.png) + +详细使用指南可浏览knife4j官网查看:[https://doc.xiaominfo.com/knife4j/](https://doc.xiaominfo.com/knife4j/) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-prometheus.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-prometheus.md new file mode 100644 index 00000000000..45093aa6e06 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-prometheus.md @@ -0,0 +1,346 @@ +--- +title: 集成 Prometheus +sidebar_position: 5.1 +--- +这篇文章描述了如何让Prometheus监控所有正在运行的Linkis服务。 + +## 1. Prometheus介绍 + +### 1.1 Prometheus是什么 + + +Prometheus 是一个云原生计算基金会项目,是一个系统和服务监控系统。它以给定的时间间隔从配置的目标收集指标,评估规则表达式,显示结果,并在观察到指定条件时触发警报。 + +在微服务上下文中,它提供了服务发现功能,可以从服务注册中心动态查找目标,如 Eureka、Consul 等,并通过 http 协议从 API 端点拉取指标。 + +### 1.2 Prometheus架构 + +下图说明了 Prometheus 的架构及其一些生态系统组件: + +![](https://prometheus.io/assets/architecture.png) + +Prometheus可以直接抓取指标,或通过push gateway间接地接收短作业的指标。它将所有抓取的样本存储在本地,并在这些数据上运行规则,以从现有数据聚合和记录新的时间序列,或生成警报。可以使用Grafana或其他API消费者对收集的数据进行可视化。 + +![](/Images/deployment/monitoring/prometheus_architecture.jpg) + +在 Linkis中,我们将使用 Prometheus 中的 Eureka (Service Discover)SD 来使用 Eureka REST API 来查询抓取目标。 Prometheus 将定期检查 REST 端点并为每个应用程序实例创建一个抓取目标。 + +## 2. 如何启用 Prometheus + +### 2.1 安装 Linkis时 启用 Prometheus + +>安装脚本中,可以通过开关进行开启 + +修改安装脚本linkis-env.sh中的`PROMETHEUS_ENABLE`。 + +```bash +export PROMETHEUS_ENABLE=true +``` + +运行 `install.sh`安装linkis后, `prometheus`的相关配置会出现在下列文件中: + +```yaml +## application-linkis.yml ## + +eureka: + instance: + metadata-map: + prometheus.path: ${prometheus.path:${prometheus.endpoint}} +... +management: + endpoints: + web: + exposure: + include: refresh,info,health,metrics,prometheus +```` + +```yaml +## application-eureka.yml ## + +eureka: + instance: + metadata-map: + prometheus.path: ${prometheus.path:/actuator/prometheus} +... +management: + endpoints: + web: + exposure: + include: refresh,info,health,metrics,prometheus +```` + +```yaml +## linkis.properties ## +... +wds.linkis.prometheus.enable=true +wds.linkis.server.user.restful.uri.pass.auth=/api/rest_j/v1/actuator/prometheus, +... +``` + +如果在引擎内部,如 spark、flink 或 hive,都需要手动添加相同的配置。 +```yaml +## linkis-engineconn.properties ## +... +wds.linkis.prometheus.enable=true +wds.linkis.server.user.restful.uri.pass.auth=/api/rest_j/v1/actuator/prometheus, +... +``` +### 2.2 已经安装后 启用 Prometheus + +修改`${LINKIS_HOME}/conf/application-linkis.yml` +endpoints配置修改 增加`prometheus` +```yaml +## application-linkis.yml ## +management: + endpoints: + web: + exposure: + #增加 prometheus + include: refresh,info,health,metrics,prometheus +``` + +修改`${LINKIS_HOME}/conf/application-eureka.yml`,endpoints配置修改增加`prometheus` + +```yaml +## application-eureka.yml ## +management: + endpoints: + web: + exposure: + #增加 prometheus + include: refresh,info,health,metrics,prometheus +```` + +修改`${LINKIS_HOME}/conf/linkis.properties`,去掉`prometheus.enable`前的注释 + +```yaml +## linkis.properties ## +... +wds.linkis.prometheus.enable=true +... +``` + +### 2.3 启动Linkis + +```bash +$ bash linkis-start-all.sh +```` + +Linkis启动后,各个微服务的prometheus端点是可以直接被访问的,例如http://linkishost:9103/api/rest_j/v1/actuator/prometheus +:::caution 注意 +gateway/eureka 服务prometheus端点是没有`api/rest_j/v1`前缀的 http://linkishost:9001/actuator/prometheus +::: + + +## 3. 部署 Prometheus,Alertmanager和 Grafana 示例 + +:::caution 注意 +gateway/eureka 服务prometheus端点是没有`api/rest_j/v1`前缀的 http://linkishost:9001/actuator/prometheus +::: + +通常来说,云原生应用程序的监控设置将部署在具有服务发现和高可用性的 Kubernetes 上(例如,使用像 Prometheus Operator 这样的 Kubernetes Operator)。 +为了快速展示监控仪表盘,和试验不同类型的图表(histogram/ gauge),你需要一个本地简易的构建。 +这个部分将会解释如何在本地通过 Docker Compose搭建Prometheus/Alert Manager和Grafana这一监控套件。 + +首先,让我们定义该技术栈的通用组件,如下所示: + +- Alert Manager容器对外通过端口9093暴露UI,并从alertmanager.conf读取配置; +- Prometheus容器对外通过端口9090暴露UI,从prometheus.yml读取配置文件,从alert_rules.yml中读取报警规则; +- Grafana容器对外通过端口3000暴露UI, 指标数据源定义在grafana_datasources.yml中,配置文件通过grafana_config.ini定义; +- 以下的docker-compose.yml文件总结了上述组件的配置: + +````yaml +## docker-compose.yml ## +version: "3" +networks: + default: + external: true + name: my-network +services: + prometheus: + image: prom/prometheus:latest + container_name: prometheus + volumes: + - ./config/prometheus.yml:/etc/prometheus/prometheus.yml + - ./config/alertrule.yml:/etc/prometheus/alertrule.yml + - ./prometheus/prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - "9090:9090" + + alertmanager: + image: prom/alertmanager:latest + container_name: alertmanager + volumes: + - ./config/alertmanager.yml:/etc/alertmanager/alertmanager.yml + ports: + - "9093:9093" + + grafana: + image: grafana/grafana:latest + container_name: grafana + environment: + - GF_SECURITY_ADMIN_PASSWORD=123456 + - GF_USERS_ALLOW_SIGN_UP=false + volumes: + - ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards + - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources + - ./grafana/grafana_data:/var/lib/grafana + ports: + - "3000:3000" +```` + +然后,为了根据 Prometheus 中的指标定义一些警报,您可以将它们分组到一个 alert_rules.yml 中,这样您就可以在生产实例中配置它们之前验证这些警报是否在本地设置中正确触发。例如,以下配置转换了用于监控 Linkis 服务的常用指标。 + +- a. Down instance +- b. High Cpu for each JVM instance (>80%) +- c. High Heap memory for each JVM instance (>80%) +- d. High NonHeap memory for each JVM instance (>80%) +- e. High Waiting thread for each JVM instance (100) + +```yaml +## alertrule.yml ## +groups: +- name: LinkisAlert + rules: + - alert: LinkisNodeDown + expr: last_over_time(up{job="linkis", application=~"LINKISI.*", application!="LINKIS-CG-ENGINECONN"}[1m])== 0 + for: 15s + labels: + severity: critical + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} down" + description: "Linkis instance(s) is/are down in last 1m" + value: "{{ $value }}" + + - alert: LinkisNodeCpuHigh + expr: system_cpu_usage{job="linkis", application=~"LINKIS.*"} >= 0.8 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} cpu overload" + description: "CPU usage is over 80% for over 1min" + value: "{{ $value }}" + + - alert: LinkisNodeHeapMemoryHigh + expr: sum(jvm_memory_used_bytes{job="linkis", application=~"LINKIS.*", area="heap"}) by(instance) *100/sum(jvm_memory_max_bytes{job="linkis", application=~"LINKIS.*", area="heap"}) by(instance) >= 50 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} memory(heap) overload" + description: "Memory usage(heap) is over 80% for over 1min" + value: "{{ $value }}" + + - alert: LinkisNodeNonHeapMemoryHigh + expr: sum(jvm_memory_used_bytes{job="linkis", application=~"LINKIS.*", area="nonheap"}) by(instance) *100/sum(jvm_memory_max_bytes{job="linkis", application=~"LINKIS.*", area="nonheap"}) by(instance) >= 60 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} memory(nonheap) overload" + description: "Memory usage(nonheap) is over 80% for over 1min" + value: "{{ $value }}" + + - alert: LinkisWaitingThreadHigh + expr: jvm_threads_states_threads{job="linkis", application=~"LINKIS.*", state="waiting"} >= 100 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} waiting threads is high" + description: "waiting threads is over 100 for over 1min" + value: "{{ $value }}" +``` + +**请注意**: 由于服务实例一旦关闭,它就不会成为 Prometheus Eureka SD 的目标之一,并且 up 指标在短时间内不会返回任何数据。因此,我们将收集最后一分钟是否 up=0 以确定服务是否处于活动状态。 + +第三点, 最重要的是在 prometheus.yml 文件中定义 Prometheus 配置。这将定义: + +- 全局设定,例如指标抓取时间间隔,和规则扫描间隔; +- AlertManager的连接信息,告警规则定义路径; +- 应用指标端口的连接信息。 + +这是 Linkis 的示例配置文件: +````yaml +## prometheus.yml ## +# my global config +global: + scrape_interval: 30s # By default, scrape targets every 15 seconds. + evaluation_interval: 30s # By default, scrape targets every 15 seconds. +alerting: + alertmanagers: + - static_configs: + - targets: ['alertmanager:9093'] +# Load and evaluate rules in this file every 'evaluation_interval' seconds. +rule_files: + - "alertrule.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + - job_name: 'prometheus' + static_configs: + - targets: ['localhost:9090'] + - job_name: linkis + eureka_sd_configs: + # the endpoint of your eureka instance + - server: {{linkis-host}}:20303/eureka + relabel_configs: + - source_labels: [__meta_eureka_app_name] + target_label: application + - source_labels: [__meta_eureka_app_instance_metadata_prometheus_path] + action: replace + target_label: __metrics_path__ + regex: (.+) +```` +第四点,下面的配置定义了警报将如何发送到外部webhook。 +```yaml +## alertmanager.yml ## +global: + resolve_timeout: 5m + +route: + receiver: 'webhook' + group_by: ['alertname'] + + # How long to wait to buffer alerts of the same group before sending a notification initially. + group_wait: 1m + # How long to wait before sending an alert that has been added to a group for which there has already been a notification. + group_interval: 5m + # How long to wait before re-sending a given alert that has already been sent in a notification. + repeat_interval: 12h + +receivers: +- name: 'webhook' + webhook_configs: + - send_resolved: true + url: {{your-webhook-url}} + +```` + +最后,在定义完所有配置文件以及 docker compose 文件后,我们可以使用 docker-compose up启动监控套件 + +## 4. 结果展示 +在 Prometheus 页面上,预计会看到所有 Linkis 服务实例,如下所示: +![](/Images/deployment/monitoring/prometheus_screenshot.jpg) + +当 Grafana 可访问的时候,您需要在 Grafana 中导入 prometheus 作为数据源,并导入 id 为 11378 的仪表板模板,该模板通常用于 springboot 服务(2.1+)。然后您可以在那里查看 Linkis 的一个实时仪表板。 + +然后您可以在那里查看 Linkis 的实时仪表板。 + +![](/Images/deployment/monitoring/grafana_screenshot.jpg) + +您还可以尝试将 Prometheus alter manager 与您自己的 webhook 集成,您可以在其中查看是否触发了告警消息。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-skywalking.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-skywalking.md new file mode 100644 index 00000000000..50000b0fa79 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/involve-skywalking.md @@ -0,0 +1,152 @@ +--- +title: 集成 SkyWalking +sidebar_position: 5.0 +--- +这篇文章介绍一下如何在启动 Linkis 服务的时候开启 SkyWalking,以方便后续做分布式 trace 和 troubleshooting。 + +## 1. SkyWalking 介绍 + +### 1.1 SkyWalking 是什么 + +SkyWalking 是开源的可视化平台,可以从多种数据源采集数据,并提供分析、聚合以及可视化等功能。通过 SkyWalking,我们可以对分布式系统的拓扑结构,数据交互有一个更加清晰的视图。 + + + +### 1.2 SkyWalking 架构 + +下图是 SkyWalking 的整体架构图。 + +![](/Images-zh/deployment/skywalking/SkyWalking_Architecture.png) + +从逻辑上可以划分成 4 个部分: +* **Probe**:可以理解为数据采集 agent,主要负责数据采集和格式化。 +* **Platform Backend**:SkyWalking 的后端服务,支持数据聚合、分析以及流式处理等。 +* **Storage**:负责数据存储,以 plugin 的方式支持多种存储引擎,比如 ElasticSearch, H2, MySQL, TiDB, InfluxDB 等。 +* **UI**: 数据可视化。 + +在 Linkis 中使用 SkyWalking,需要用户已经存在 Backend 服务以及对应的 Storage。Linkis 服务启动的时候集成 Probe 即可。Probe 集成主要有三种方式: +* **Language based native agent**:这些 agent 和目标服务进程运行在相同的用户空间,从外部来看,agent 和目标服务的代码是一样的。一个典型的例子是 Java agent,在运行 Java 应用的时候我们可以通过 `-javaagent` 来指定 agent。 +* **Service Mesh probes**:这种 Probe 通过 sidecar 或者 proxy 收集数据。 +* **3rd-party intrument library**:简单来说就是第三方的数据,比如 zipkin。 + +我们在 Linkis 集成 SkyWalking 的时候采用第一种方式,也就是 java agent 的方式。下面我们为大家演示一下如何在 Linkis 服务中开启 SkyWalking。 + +## 2. 部署 SkyWalking 后端 + +SkyWalking 后端是开启 SkyWalk 的前置条件,下面先简单演示下如何安装 SkyWalking 的后端。 + +首先从 SkyWalking 的 [Downloads](https://skywalking.apache.org/downloads/) 页面下载 SkyWalking APM。 + +![](/Images-zh/deployment/skywalking/SkyWalking_APM_Download.png) + +下载完,直接解压得到如下的目录结构。 + +```bash +$ ls +bin config config-examples LICENSE licenses logs NOTICE oap-libs README.txt tools webapp +``` + +后端默认使用 H2 内存数据库作为后端存储,不需要修改配置。按如下方式启动。 + +启动 Backend +```bash +$ sh bin/startup.sh +``` + +启动 WebApp +```bash +$ sh bin/webappService.sh +``` + +UI 默认启动在 8080 端口,也可以通过修改 webapp 目录下的 webapp.yml 文件修改监听端口。 + +```yaml +server: + port: 8080 + +spring: + cloud: + gateway: + routes: + - id: oap-route + uri: lb://oap-service + predicates: + - Path=/graphql/** + discovery: + client: + simple: + instances: + oap-service: + - uri: http://127.0.0.1:12800 + # - uri: http://: + # - uri: http://: + + mvc: + throw-exception-if-no-handler-found: true + + web: + resources: + add-mappings: true + +management: + server: + base-path: /manage +``` + +## 3. Linkis 服务启动开启 SkyWalking + +这里假定大家对 Linkis 的服务部署已经比较清晰,如果还不清晰,可以异步: + +在 Linkis 中开启 SkyWalking 首先需要下载 SkyWalking 的 Java agent,我们可以在 [Downloads](https://skywalking.apache.org/downloads/) 页面进行下载。 + +![](/Images-zh/deployment/skywalking/SkyWalking_Agent_Download.png) + +下载之后解压,内部的文件结构如下: +```bash +tree skywalking-agent +$ skywalking-agent +├── LICENSE +├── NOTICE +├── activations +│   ├── apm-toolkit-kafka-activation-8.8.0.jar +│   ├── ... +├── bootstrap-plugins +│   ├── apm-jdk-http-plugin-8.8.0.jar +│   └── apm-jdk-threading-plugin-8.8.0.jar +├── config +│   └── agent.config +├── licenses +│   └── LICENSE-asm.txt +├── logs +├── optional-plugins +│   ├── apm-customize-enhance-plugin-8.8.0.jar +│   ├── ... +├── optional-reporter-plugins +│   ├── kafka-reporter-plugin-8.8.0.jar +│   ├── ... +├── plugins +│   ├── apm-activemq-5.x-plugin-8.8.0.jar +│   ├── ... +└── skywalking-agent.jar +``` + +修改 Linkis 的 deploy-config/linkis-env.sh 中的配置项 `SKYWALKING_AGENT_PATH`。将其设置为 `skywalking-agent.jar` 的路径。 +```bash +SKYWALKING_AGENT_PATH=/path/to/skywalking-agent.jar +``` + +然后启动 Linkis 即可。 +```bash +$ sh linkis-start-all.sh +``` + +## 4. 结果展示 +Linkis 的 UI 端口默认启动在 8080 端口,Linkis 开启 SkyWalking 之后打开 UI 如果能看到如下的图就表示成功了。 +如果看不到展示效果,可能是浏览器兼容性问题,尝试切换浏览器试试。 + +![](/Images-zh/deployment/skywalking/SkyWalking_UI_Dashboard.png) + +![](/Images-zh/deployment/skywalking/SkyWalking_UI_Dashboard2.png) + +![](/Images-zh/deployment/skywalking/SkyWalking_Topology.png) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/sso-with-redis.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/sso-with-redis.md new file mode 100644 index 00000000000..aaf9548eb2b --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/integrated/sso-with-redis.md @@ -0,0 +1,47 @@ +--- +title: 网关服务支持多活 +sidebar_position: 8 +--- +## 1.背景 +因为原有的登陆 session 未支持分布式存储,对于同一个用户的所有请求,需要 nginx 转发请求到同一个 gateway 实例上,才能正常处理请求。 +常用的解决方式是通过在入口 nginx 上通过配置 ip hash 负载均衡的方式来支持。 +但是ip hash 方式 如果存在服务器的扩容与缩容时,所有客户端ip的 hash 值都需要重新计算,会导致会话丢失, +其次容易因为节点分部不均匀⽽造成数据倾斜问题。为了优化 ip hash 方式存在的问题,对登陆态的 session 实现共享存储 + + +## 2.实现方案 +因为会话信息主要是通过 ticketId 来标识,所有对外入口为 gateway,所以只需要对 gateway 模块进行改造。 +对于底层的共享存储,选择主流的内存数据库 redis。对于是否启动 redis 会话存储,支持通过配置文件控制。 +关键代码改动为 `org.apache.linkis.server.security.SSOUtils` 的 `userTicketIdToLastAccessTime`。 + +请求流程: + +`用户请求 -> nginx -> linkis-gateway -> linkis 后端服务` + + +## 3.使用方式 + +需要可用的 reids 环境,支持单机版redis和redis 哨兵模式。 + +安装部署Linkis 后,修改配置文件 `${LINKIS_HOME}/conf/linkis.properties` +```shell script +#开启redis cache配置 +linkis.session.redis.cache.enabled=true + + +#单机版 +linkis.session.redis.host=127.0.0.1 +linkis.session.redis.port=6379 +linkis.session.redis.password=test123 + +# 哨兵模式 +linkis.session.redis.sentinel.master=sentinel-master-name +linkis.session.redis.sentinel.nodes=127.0.1.1:6381,127.0.2.1:6381,127.0.3.1:6381 +linkis.session.redis.password=test123 + +``` + +正常启用 gateway 即可,启动 redis 后,对于多个 gateway 示例,在 nginx 侧配置时,可以使用 nginx 默认负载均衡模式。 + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/version-adaptation.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/version-adaptation.md new file mode 100644 index 00000000000..a496e5c5119 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/deployment/version-adaptation.md @@ -0,0 +1,510 @@ +--- +title: 版本适配 +sidebar_position: 8 +--- + +# 版本适配 + +## 1. 功能说明 + +针对Apache,CDH,HDP等版本适配需要手动修改的地方进行说明 + +## 2. 编译指令 + +进入到项目的根目录下,依次执行如下指令 + +```text +mvn -N install +mvn clean install -Dmaven.test.skip=true +``` + +## 3. SQL脚本切换 + +linkis-dist -> package -> db 下的 linkis-dml.sql 脚本 + +将对应的引擎版本切换为自己需要的版本,如果你使用的版本和官方一致的话,则无需修改此步 + +比如: + +1. spark是3.0.0的话,则此处是 SET @SPARK_LABEL="spark-3.0.0"; +2. hive是2.1.1-cdh6.3.2的话,需先调整2.1.1_cdh6.3.2(构建时),则此处是 SET @HIVE_LABEL="hive-2.1.1_cdh6.3.2"; + +```sql +-- 变量: +SET @SPARK_LABEL="spark-2.4.3"; +SET @HIVE_LABEL="hive-2.3.3"; +SET @PYTHON_LABEL="python-python2"; +SET @PIPELINE_LABEL="pipeline-1"; +SET @JDBC_LABEL="jdbc-4"; +SET @PRESTO_LABEL="presto-0.234"; +SET @IO_FILE_LABEL="io_file-1.0"; +SET @OPENLOOKENG_LABEL="openlookeng-1.5.0"; +``` + +## 4. Linkis官方版本 + +| 引擎 | 版本 | +| ------ | ------ | +| hadoop | 2.7.2 | +| hive | 2.3.3 | +| spark | 2.4.3 | +| flink | 1.12.2 | + +## 5. Apache版本适配 + +### 5.1 Apache3.1.x版本 + +| 引擎 | 版本 | +| ------ | ------ | +| hadoop | 3.1.1 | +| hive | 3.1.2 | +| spark | 3.0.1 | +| flink | 1.13.2 | + +#### 5.1.1 linkis的pom文件 + +Linkis版本小于`1.3.2`时 +```java +3.1.1 +2.12.10 +2.12 + + + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + +``` + +当Linkis版本大于等于`1.3.2`时, 只需要设置 `scala.version` and `scala.binary.version` +```java +2.12.10 +2.12 +``` +因为我们可以直接使用`hadoop-3.3` or `hadoop-2.7` profile来编译 +Profile `hadoop-3.3` 可以用于任意hadoop3.x, 默认hadoop3.x版本是3.3.1, +Profile `hadoop-2.7` 可以用于任意hadoop2.x, 默认hadoop2.x版本是2.7.2, +想要用其他版本可以编译时指定 -Dhadoop.version=xxx +```text +mvn -N install +mvn clean install -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Phadoop-3.3 -Dhadoop.version=3.1.1 -Dmaven.test.skip=true +``` + +#### 5.1.2 linkis-hadoop-common的pom文件 + +Linkis版本小于`1.3.2`时 +```java + + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + +``` + +当Linkis版本大于等于`1.3.2`时,`linkis-hadoop-common`模块不需要变更 + +#### 5.1.3 linkis-engineplugin-hive的pom文件 + +```java +3.1.2 +``` + +#### 5.1.4 linkis-engineplugin-spark的pom文件 + +Linkis版本小于`1.3.2`时 +```java +3.0.1 +``` + +当Linkis版本大于等于`1.3.2`时 +```text +我们可以直接编译spark-3.2 profile, 如果我们同时使用hadoop3, 那么我们还需要指定hadoop-3.3 profile. +默认 spark3.x 版本时3.2.1. 如果我们使用spark-3.2 profile编译, scala版本默认是2.12.15,因此我们不需要在项目根目录设置scala版本了(5.1.1提到当) +如果Linkis使用hadoop3编译,同时spark仍旧是2.x版本的话,由于spark兼容性问题需要激活profile `spark-2.4-hadoop-3.3` +``` +```text +mvn -N install +mvn clean install -Pspark-3.2 -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Pspark-2.4-hadoop-3.3 -Phadoop-3.3 -Dmaven.test.skip=true +``` + +#### 5.1.5 flink-engineconn-flink的pom文件 + +```java +1.13.2 +``` + +:::caution 临时方案 + +注意以下复制类操作均在flink中 + +由于flink1.12.2到1.13.2版本,有部分类进行调整,所以需要进行flink的编译和调整,编译flink选择scala的版本为2.12版本(scala版本根据自己的实际使用版本来) + +flink编译参考指令: mvn clean install -DskipTests -P scala-2.12 -Dfast -T 4 -Dmaven.compile.fock=true + +::: + +```text +-- 注意,下列的类是从flink的1.12.2版本给copy到flink的1.13.2版本来 +org.apache.flink.table.client.config.entries.DeploymentEntry +org.apache.flink.table.client.config.entries.ExecutionEntry +org.apache.flink.table.client.gateway.local.CollectBatchTableSink +org.apache.flink.table.client.gateway.local.CollectStreamTableSink +``` + +#### 5.1.6 linkis-label-common调整 + +org.apache.linkis.manager.label.conf.LabelCommonConfig 文件调整 + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "3.0.1"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "3.1.2"); +``` + +#### 5.1.7 linkis-computation-governance-common调整 + +org.apache.linkis.governance.common.conf.GovernanceCommonConf 文件调整 + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "3.0.1") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "3.1.2") +``` + +## 6. HDP版本适配 + +### 6.1 HDP3.0.1版本 + +| 引擎 | 版本 | +| -------------- | ------ | +| hadoop | 3.1.1 | +| hive | 3.1.0 | +| spark | 2.3.2 | +| json4s.version | 3.2.11 | + +#### 6.1.1 linkis的pom文件 + +Linkis版本小于`1.3.2`时 +```java +3.1.1 +3.2.11 + + + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + +``` + +当Linkis版本大于等于`1.3.2`时, 只需要设置 `json4s.version` +```java +3.2.11 +``` +因为我们可以直接使用`hadoop-3.3` or `hadoop-2.7` profile来编译 +Profile `hadoop-3.3` 可以用于任意hadoop3.x, 默认hadoop3.x版本是3.3.1, +Profile `hadoop-2.7` 可以用于任意hadoop2.x, 默认hadoop2.x版本是2.7.2, +想要用其他版本可以编译时指定 -Dhadoop.version=xxx +```text +mvn -N install +mvn clean install -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Phadoop-3.3 -Dhadoop.version=3.1.1 -Dmaven.test.skip=true +``` + +#### 6.1.2 linkis-engineplugin-hive的pom文件 + +```java +3.1.0 +``` + +#### 6.1.3 linkis-engineplugin-spark的pom文件 + +Linkis版本小于`1.3.2`时 +```java +2.3.2 +``` + +当Linkis版本大于等于`1.3.2`时 +```text +我们可以直接编译spark-3.2 profile, 如果我们同时使用hadoop3, 那么我们还需要指定hadoop-3.3 profile. +默认 spark3.x 版本时3.2.1. 如果我们使用spark-3.2 profile编译, scala版本默认是2.12.15,因此我们不需要在项目根目录设置scala版本了(5.1.1提到当) +如果Linkis使用hadoop3编译,同时spark仍旧是2.x版本的话,由于spark兼容性问题需要激活profile `spark-2.4-hadoop-3.3` +``` +```text +mvn -N install +mvn clean install -Pspark-3.2 -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Pspark-2.4-hadoop-3.3 -Phadoop-3.3 -Dmaven.test.skip=true +``` + +#### 6.1.4 linkis-label-common调整 + +org.apache.linkis.manager.label.conf.LabelCommonConfig 文件调整 + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "2.3.2"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "3.1.0"); +``` + +#### 6.1.5 linkis-computation-governance-common调整 + +org.apache.linkis.governance.common.conf.GovernanceCommonConf 文件调整 + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "2.3.2") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "3.1.0") +``` + +## 7 CDH版本适配 + +### 7.1 maven配置地址 + +#### 7.1.1 setting文件 + +```xml + + + + nexus-aliyun + *,!cloudera + Nexus aliyun + http://maven.aliyun.com/nexus/content/groups/public + + + aliyunmaven + *,!cloudera + 阿里云公共仓库 + https://maven.aliyun.com/repository/public + + + aliyunmaven + *,!cloudera + spring-plugin + https://maven.aliyun.com/repository/spring-plugin + + + maven-default-http-blocker + external:http:* + Pseudo repository to mirror external repositories initially using HTTP. + http://0.0.0.0/ + true + + +``` + +#### 7.1.2 linkis的pom文件 + +```xml + + + cloudera + https://repository.cloudera.com/artifactory/cloudera-repos/ + + true + + + + + aliyun + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + +``` + +### 7.2 CDH5.12.1版本 + +| 引擎 | 版本 | +| --------- | --------------- | +| hadoop | 2.6.0-cdh5.12.1 | +| zookeeper | 3.4.5-cdh5.12.1 | +| hive | 1.1.0-cdh5.12.1 | +| spark | 2.3.4 | +| flink | 1.12.4 | +| python | python3 | + +#### 7.2.1 linkis的pom文件 + +```xml +2.6.0-cdh5.12.1 +3.4.5-cdh5.12.1 +2.11.8 +``` + +#### 7.2.2 linkis-engineplugin-hive的pom文件 + +```xml +-- 修改 +1.1.0-cdh5.12.1 +-- 添加 +1.1.0_cdh5.12.1 +``` + +- 修改 assembly 下的 distribution.xml 文件 + +```xml +/dist/v${package.hive.version}/lib +dist/v${package.hive.version}/conf +plugin/${package.hive.version} +``` + +- 修改CustomerDelimitedJSONSerDe文件 + + ``` + /* hive版本过低,需注释 + case INTERVAL_YEAR_MONTH: + { + wc = ((HiveIntervalYearMonthObjectInspector) oi).getPrimitiveWritableObject(o); + binaryData = Base64.encodeBase64(String.valueOf(wc).getBytes()); + break; + } + case INTERVAL_DAY_TIME: + { + wc = ((HiveIntervalDayTimeObjectInspector) oi).getPrimitiveWritableObject(o); + binaryData = Base64.encodeBase64(String.valueOf(wc).getBytes()); + break; + } + */ + ``` + +#### 7.2.3 linkis-engineplugin-flink的pom文件 + +```xml +1.12.4 +``` + +#### 7.2.4 linkis-engineplugin-spark的pom文件 + +```xml +2.3.4 +``` + +#### 7.2.5 linkis-engineplugin-python的pom文件 + +```xml +python3 +``` + +#### 7.2.6 linkis-label-common调整 + +org.apache.linkis.manager.label.conf.LabelCommonConfig 文件调整 + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "2.3.4"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "1.1.0"); + + CommonVars.apply("wds.linkis.python.engine.version", "python3") +``` + +#### 7.2.7 linkis-computation-governance-common调整 + +org.apache.linkis.governance.common.conf.GovernanceCommonConf 文件调整 + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "2.3.4") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "1.1.0") + + val PYTHON_ENGINE_VERSION = CommonVars("wds.linkis.python.engine.version", "python3") +``` + +### 7.3 CDH6.3.2 + +| 引擎 | 版本 | +| ------ | -------------- | +| hadoop | 3.0.0-cdh6.3.2 | +| hive | 2.1.1-cdh6.3.2 | +| spark | 3.0.0 | + +#### 7.3.1 linkis的pom文件 + +```xml +3.0.0-cdh6.3.2 +2.12.10 +``` + +#### 7.3.2 linkis-hadoop-common + +```xml + + + org.apache.hadoop + hadoop-hdfs-client + +``` + +#### 7.3.3 linkis-engineplugin-hive的pom文件 + +```xml +-- 修改 +2.1.1-cdh6.3.2 +-- 添加 +2.1.1_cdh6.3.2 +``` + +修改 assembly 下的 distribution.xml 文件 + +```xml +/dist/v${package.hive.version}/lib +dist/v${package.hive.version}/conf +plugin/${package.hive.version} +``` + +#### 7.3.4 linkis-engineplugin-spark的pom文件 + +```xml +3.0.0 +``` + +#### 7.3.5 linkis-label-common调整 + +org.apache.linkis.manager.label.conf.LabelCommonConfig 文件调整 + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "3.0.0"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "2.1.1_cdh6.3.2"); +``` + +#### 7.3.6 linkis-computation-governance-common调整 + +org.apache.linkis.governance.common.conf.GovernanceCommonConf 文件调整 + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "3.0.0") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "2.1.1_cdh6.3.2") +``` + +## 8 编译技巧 + +- 如果遇到类缺少或者类中方法缺少的情况下,找到对应引用这个包依赖,如何尝试切换到有对应包或者类的版本中来 +- 引擎版本如果需要使用到-的话,使用_来进行替换,并且加上来指定替换后的版本,同时在对应的引擎distribution文件中使用${package.引擎名字.version}来替换原有的 +- 如果有时候使用阿里云镜像出现下载guava的jar出现403的问题的话,可以切换到华为,腾讯等镜像仓库 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/_category_.json new file mode 100644 index 00000000000..a857e622c21 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "开发指南", + "position": 8 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build-console.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build-console.md new file mode 100644 index 00000000000..6fa4f38643e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build-console.md @@ -0,0 +1,79 @@ +--- +title: 管理台编译 +sidebar_position: 4.0 +--- + +## 1. 前置准备 + +## 1.1 安装Node.js + +>该步骤仅第一次使用时需要执行,如果已有node环境,可跳过 + +将Node.js下载到本地,安装即可。下载地址:[http://nodejs.cn/download/](http://nodejs.cn/download/) (建议使用node v16版本) + +## 1.2 源码获取 + +- 方式1:从[github仓库](https://github.com/apache/linkis) https://github.com/apache/linkis 获取项目的源代码。 +- 方式2:从[linkis的官方下载页面](https://linkis.apache.org/download/main) https://linkis.apache.org/download/main 下载所需版本的源码包。 + + +## 2. 编译 + +## 2.1 安装npm依赖 + +在终端命令行中执行以下指令: +``` +#进入项目WEB根目录 +$ cd linkis/linkis-web +#安装项目所需依赖 +$ npm install +``` +**该步骤仅第一次使用时需要执行。** + + +## 2.2. 打包项目 + +在终端命令行执行以下指令对项目进行打包,生成压缩后的部署安装包。 +检查`linkis-web/package.json`,`linkis-web/.env`文件,检查前端管理台版本号是否正确。 +``` +$ npm run build +``` +上述命令执行成功后,会生成前端管理台安装包 `apache-linkis-${version}-web-bin.tar.gz`,可以直接将该文件夹放进您的静态服务器中,或者参考[安装文档](../deployment/deploy-console.md),使用脚本进行部署安装。 + +## 3 . 注意事项 +### 3.1 Windows下npm install 步骤报错 +```shell +Error: Can't find Python executable "python", you can set the PYTHON env variable +安装windows-build-tools (管理员权限) +$ npm install --global --production windows-build-tools +安装node-gyp +$ npm install --global node-gyp + +2.如果编译失败 请按如下步骤清理后重新执行 +#进入项目工作目录,删除 node_modules +$ rm -rf node_modules +#删除 package-lock.json +$ rm -rf package-lock.json +#清除 npm 缓存 +$ npm cache clear --force +#重新下载依赖 +$ npm install + +``` +### 3.2 如果出现兼容问题,建议重新安装node +[node下载地址](https://nodejs.org/zh-cn/download/) +```shell +1.查看node版本(推荐使用node v16版本) +$ node -v +2.下载node v16版本并且重新安装node +``` + +### 3.3 npm install下载前端依赖无法成功 +如果遇到该情况,可以使用国内的淘宝npm镜像: +``` +npm install -g cnpm --registry=https://registry.npm.taobao.org +``` +接着,通过执行以下指令代替npm install指令 +``` +cnpm install +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build-docker.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build-docker.md new file mode 100644 index 00000000000..17c01e84f5b --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build-docker.md @@ -0,0 +1,136 @@ +--- +title: Docker 编译 +sidebar_position: 5.0 +--- + +## Linkis 镜像组成 + +从1.3.0版本起,Linkis引入了一些 Docker 镜像,项目所有镜像的 Dockerfile 文件都在`linkis-dist/docker`目录下。 + +目前由如下几个镜像组成: + +### linkis-base + + - __Dockerfile__: + - 文件名: linkis.Dockerfile + - 参数, 可以通过 `docker build` 命令的 `--build-arg` 参数来重载: + * JDK_VERSION: JDK 版本,默认为 1.8.0-openjdk + * JDK_BUILD_REVISION: JDK 发布版本, 默认为 1.8.0.332.b09-1.el7_9 + - __说明__: Linkis服务基础镜像,主要用于预安装 Linkis 系统需要的外部库,初始化系统环境和目录。本镜像不需要经常更新,利用 docker 的镜像缓存机制,可以加速 Linkis 镜像的制作。 + +### linkis + - __Dockerfile__: + - 文件名: linkis.Dockerfile + - 参数: + * LINKIS_VERSION: Linkis 版本号,默认为 0.0.0 + * LINKIS_SYSTEM_USER: 系统用户,默认为 hadoop + * LINKIS_SYSTEM_UID: 系统用户UID, 默认为 9001 + * LINKIS_HOME: Linkis 主目录,默认为 /opt/linkis , 系统的二进制包和各类脚本会部署到这里 + * LINKIS_CONF_DIR: Linkis 配置文件目录,默认为 /etc/linkis-conf + * LINKIS_LOG_DIR: Linkis 日志目录,默认为 /var/logs/linkis + - __说明__: Linkis服务镜像,镜像中包含了 Apache Linkis 的所有组件的二进制包和各类脚本。 + +### linkis-web + - __Dockerfile__: + - 文件名: linkis.Dockerfile + - 参数: + * LINKIS_VERSION: Linkis 版本号,默认为 0.0.0 + * LINKIS_HOME: Linkis 主目录,默认为 /opt/linkis , Web 相关的包会被放置在 ${LINKIS_HOME}-web 下 + - __说明__: Linkis Web 控制台镜像,镜像中包含了 Apache Linkis Web 控制台的的二进制包和各类脚本,本镜像使用 nginx 作为 Web 服务器。 + +### linkis-ldh + - __Dockerfile__: + - 文件名: ldh.Dockerfile + - 参数: + * JDK_VERSION: JDK 版本,默认为 1.8.0-openjdk + * JDK_BUILD_REVISION: JDK 发布版本, 默认为 1.8.0.332.b09-1.el7_9 + * LINKIS_VERSION: Linkis 版本号,默认为 0.0.0 + * MYSQL_JDBC_VERSION: MySQL JDBC 版本,默认为 8.0.28 + * HADOOP_VERSION: Apache Hadoop 组件版本,默认为 2.7.2 + * HIVE_VERSION: Apache Hive 组件版本,默认为 2.3.3 + * SPARK_VERSION: Apache Spark 组件版本,默认为 2.4.3 + * SPARK_HADOOP_VERSION: 预编译的 Apache Spark 发布包 Hadoop 版本后缀,默认为 2.7,该值不能任意设置,需要和 Apache Spark 官方发布版本保持一致,否则无法自动下载相关组件 + * FLINK_VERSION: Apache Flink 组件版本,默认为 1.12.2 + * ZOOKEEPER_VERSION: Apache Zookeeper 组件版本,默认为 3.5.9 + - __说明__: LDH 是一个面向测试用途的镜像,LDH 镜像提供了一套完整的、伪分布式模式的 Apache Hadoop 运行环境,包含了 HDFS, YARN, HIVE, Spark, Flink 和 Zookeeper, 可以很方便的在开发环境中拉起一个全真的 Hadoop 环境用来测试 Linkis 的功能。LDH 镜像的 ENTRYPOINT 为 `linkis-dist/docker/scripts/entry-point-ldh.sh`,一些初始化操作,如 HDFS 的 format 操作都是在这个脚本中完成的。 + +### 集成 MySQL JDBC + +由于MySQL的许可协议限制,官方发布的 Linkis 镜像没有集成 MySQL JDBC 驱动,用户在使用 Linkis 容器前需要自行将 MySQL JDBC 驱动放置到容器中。为了简化这个过程,我们提供了一个 Dockerfile: + +- 文件名: linkis-with-mysql-jdbc.Dockerfile +- 参数: + * LINKIS_IMAGE: Linkis 镜像名,基于这个镜像来制作包含 MySQL JDBC 驱动的自定义镜像, 默认为 `linkis:dev` + * LINKIS_HOME: Linkis 主目录,默认为 /opt/linkis + * MYSQL_JDBC_VERSION: MySQL JDBC 版本,默认为 8.0.28 + +## Linkis 镜像制作 + +> 因为镜像制作过程中使用了一些 Bash 脚本,目前仅支持在 Linux/MaxOS 下完成 Linkis 镜像打包的工作。 + +### 使用 Maven 构建镜像 + +Linkis 镜像制作过程都已经集成到项目的 Maven Profile 中,可以通过 Maven 命令实现 Liniks 镜像的制作。 + +1. 构建 `linkis` 镜像 + + ``` shell + # 构建不包含 MySQL JDBC 的 Linkis 镜像 + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true + # 构建包含 MySQL JDBC 的 Linkis 镜像 + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.with.jdbc=true + ``` + 需要注意: + * `linkis-base` 镜像会在 `linkis` 镜像第一次构建时被构建,后续如果 Dockerfile 没有被修改,将不会被重复构建; + * 受制于 Maven POM 文件的语法,`linkis.build.with.jdbc` 是一个伪布尔参数,实际上`-Dlinkis.build.with.jdbc=false`和`-Dlinkis.build.with.jdbc=true`是一样的,如希望表达`-Dlinkis.build.with.jdbc=false`,请直接将这个参数去掉。其他参数类似。 + +2. 构建 `linkis-web` 镜像 + + ``` shell + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.web=true + ``` + +3. 构建 `linkis-ldh` 镜像 + + ``` shell + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.ldh=true + ``` + + 需要注意: + * 在制作本镜像的过程中,我们从 [Apache Archives](https://archive.apache.org/dist/) 这个官方站点下载每个hadoop组件的预建二进制发行版。但是,受制于国内的网络环境,这种方式可能会非常缓慢。如果你有更快的站点,你可以手动从这些站点下载相应的包,并将其移动到如下这个目录`${HOME}/.linkis-build-cache` 来解决这个问题。 + +上述参数都可以组合使用,如希望一次性构建所有镜像,可以使用如下命令: + +``` shell +$> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.web=true -Dlinkis.build.ldh=true +``` + +### 使用 docker build 命令构建镜像 + +使用 Maven 命令构建镜像固然方便,但是构建过程中引入了不少重复的编译过程,整个过程比较漫长。如果仅调整镜像内部结构,如目录结构,初始化命令等,可以在第一次使用 Maven 命令构建镜像后,直接使用`docker build` 命令来快速构建镜像进行测试。 + +使用 `docker build` 命令构建 linkis-ldh 镜像示例如下: + +``` shell +$> docker build -t linkis-ldh:dev --target linkis-ldh -f linkis-dist/docker/ldh.Dockerfile linkis-dist/target + +[+] Building 0.2s (19/19) FINISHED + => [internal] load build definition from ldh.Dockerfile 0.0s + => => transferring dockerfile: 41B 0.0s + => [internal] load .dockerignore 0.0s + => => transferring context: 2B 0.0s + => [internal] load metadata for docker.io/library/centos:7 0.0s + => [ 1/14] FROM docker.io/library/centos:7 0.0s + => [internal] load build context 0.0s + => => transferring context: 1.93kB 0.0s + => CACHED [ 2/14] RUN useradd -r -s ... 0.0s + => CACHED [ 3/14] RUN yum install -y ... 0.0s + ... + => CACHED [14/14] RUN chmod +x /usr/bin/start-all.sh 0.0s + => exporting to image 0.0s + => => exporting layers 0.0s + => => writing image sha256:aa3bde0a31bf704413fb75673fc2894b03a0840473d8fe15e2d7f7dd22f1f854 0.0s + => => naming to docker.io/library/linkis-ldh:dev +``` + +其他镜像的构建命令请参考 `linkis-dist/pom.xml` 中相关的 profile. diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build.md new file mode 100644 index 00000000000..aba12c6c0e1 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/build.md @@ -0,0 +1,213 @@ +--- +title: 后端编译 +sidebar_position: 3.0 +--- + +## 1. 前置准备 + +## 1.1 环境要求 + +__编译环境要求:__ 必须 **JDK8** 以上,**Oracle/Sun** 和 **OpenJDK**都支持。 + + +### 1.2 源码获取 + +- 方式1:从[github仓库](https://github.com/apache/linkis) https://github.com/apache/linkis 获取项目的源代码。 +- 方式2:从[linkis的官方下载页面](https://linkis.apache.org/download/main) https://linkis.apache.org/download/main 下载所需版本的源码包。 + +**请注意**:官方推荐使用 Hadoop-2.7.2、Hive-1.2.1、Spark-2.4.3 和 Scala-2.11.12 对 Linkis 进行编译。 + +如果您想使用 Hadoop、Hive、Spark 的其他版本对 Linkis 进行编译,请参考:[如何修改Linkis的依赖的Hadoop、Hive、Spark版本](#4-如何修改linkis的依赖的hadoophivespark版本) + +### 1.2 修改依赖配置 +:::caution 注意 +因为mysql-connector-java驱动是GPL2.0协议,不满足Apache开源协议关于license的政策,因此从1.0.3版本开始,对mysql-connector-java的依赖项作用域scope默认是test,若自行编译,可以修改顶级pom.xml的mysql-connector-java依赖的scope作用域(注释掉即可) +::: +```xml + + mysql + mysql-connector-java + ${mysql.connector.version} + + +``` + +## 2. 全量编译 Linkis + +### step1 首次编译(非首次可跳过此步) + +**如果您是本地第一次编译使用,必须在 Linkis 源码工程的根目录先执行以下命令**: +```bash + cd linkis-x.x.x + mvn -N install +``` + +### step2 执行编译 +在 Linkis 源码包根目录执行以下命令: + +```bash + cd linkis-x.x.x + mvn clean install + +``` + +### step3 获取安装包 +编译后的完整安装包,在工程的linkis-dist->target目录下: + +```bash + #详细路径如下 + linkis-x.x.x/linkis-dist/target/apache-linkis-x.x.x-bin.tar.gz +``` + +## 3 常见问题 + +### 3.1 如何编译单个模块 +> 有些场景可能只需要针对某个模块进行编译,可参考如下流程 + +:::caution 注意 +如有没有执行过全量编译,先要进行一次全量编译 +::: + +#### step1 进入到对应模块进行编译 +进入到对应模块进行编译,比如想重新编译 Entrance,命令如下: + +```bash + cd linkis-x.x.x/linkis-computation-governance/linkis-entrance + mvn clean install +``` + +#### step2 获取安装包 +获取安装包,在对应模块的->target目录下会有编译好的包: + +``` + ls linkis-x.x.x/linkis-computation-governance/linkis-entrance/target/linkis-entrance.x.x.x.jar +``` + +### 3.2 如何编译某个引擎 + +>有些场景可能只需要针对某个引擎进行编译,可参考如下流程 + +:::caution 注意 +如有没有执行过全量编译,先要进行一次全量编译 +::: + +这里以编译Spark 引擎为例: + +#### step1 进入到对应模块进行编译 +进入到 Spark 引擎所在的目录进行编译打包,命令如下: + +```bash + cd linkis-x.x.x/linkis-engineconn-plugins/spark + mvn clean install +``` +#### step2 获取引擎的物料包 +在对应模块的target目录下: + +``` + #spark文件下就是编译好的引擎物料 + linkis-x.x.x/linkis-engineconn-plugins/spark/target/out/spark +``` +如何单独安装 Spark 引擎?请参考 [Linkis 引擎插件安装文档](../deployment/install-engineconn) + + +### 3.2 如何将非默认引擎打包至安装部署包中 + +> 默认打包配置中`linkis-dist/src/main/assembly/distribution.xml`,只会将`spark/hive/python/shell`打包到安装包中,如果需要添加其它引擎,可参考此步骤 + +以jdbc引擎为例 + +step1 修改`linkis-dist/src/main/assembly/distribution.xml` 添加jdbc引擎 +```shell script + + + + ../../linkis-engineconn-plugins/jdbc/target/out/ + + lib/linkis-engineconn-plugins/ + + **/* + + +``` +step2 如果已经全量编译,可以直接重新编译`linkis-dist`模块,如果没有,这执行全量编译 + +### 3.3 如何在全量编译时跳过指定引擎 +可使用mvn指令中的`-pl`选项,详情可参考如下 +``` +-pl,--projects Comma-delimited list of specified + reactor projects to build instead + of all projects. A project can be + specified by [groupId]:artifactId + or by its relative path. +``` +通过`!`实现反选,从而排除指定的引擎,缩短全量编译所需时间,以flink、sqoop和hive为例,跳过这些引擎进行编译: +``` +mvn clean install -Dmaven.test.skip=true \ +-pl '!linkis-engineconn-plugins/flink,!linkis-engineconn-plugins/sqoop,!linkis-engineconn-plugins/hive' +``` + +## 4. 如何修改Linkis的依赖的Hadoop、Hive、Spark版本 + +请注意:Hadoop 作为大数据基础服务,Linkis 必须依赖 Hadoop 进行编译; +而 Spark、Hive等计算存储引擎则不然,如果您不想使用某个引擎,可以无需设置该引擎的版本,无需编译该引擎插件。 + +具体而言,修改 Hadoop 的版本与 Spark、Hive 等计算引擎的方式不同,下面详细介绍: + +### 4.1 如何修改 Linkis 依赖的 Hadoop 版本 + +进入 Linkis 源码包根目录,手动修改 pom.xml 文件的 Hadoop 版本信息,具体如下: + +```bash + cd linkis-x.x.x + vim pom.xml +``` + +```xml + + + 2.7.2 在这里修改Hadoop版本号 <--> + 2.11.12 + 1.8 + + +``` +:::caution 注意 +**请注意:如果你的hadoop版本是hadoop3,需要修改linkis-hadoop-common的pom文件** +::: + +因为在hadoop2.8以下的时候,hdfs相关的class是在hadoop-hdfs模块中的,但是在hadoop 3.X中将对应的class移动到了模块hadoop-hdfs-client当中,您需要修改下这个文件: + +pom:Linkis/linkis-commons/linkis-hadoop-common/pom.xml +修改依赖hadoop-hdfs为hadoop-hdfs-client: +``` + + org.apache.hadoop + hadoop-hdfs + ${hadoop.version} + + 将hadoop-hdfs修改为: + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + +``` + +### 4.2 如何修改 Linkis 依赖的 Spark、Hive 版本 + +这里以修改 Spark 的版本为例进行介绍。进入 Spark 引擎所在的目录,手动修改 pom.xml 文件的 Spark 版本信息,具体如下: + +```bash + cd linkis-x.x.x/linkis-engineconn-plugins/spark + vim pom.xml +``` + +```xml + + 2.4.3 在这里修改Spark版本号 <--> + +``` + +修改其他引擎的版本与修改 Spark 版本类似,先进入相关引擎所在的目录,手动修改 pom.xml 文件的引擎版本信息即可。 + +然后请参考 [编译某个引擎](#32-如何编译某个引擎) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/config.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/config.md new file mode 100644 index 00000000000..a0b86b0d18a --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/config.md @@ -0,0 +1,131 @@ +--- +title: 配置参数介绍 +sidebar_position: 11.0 +--- + +## 1. 参数分类 + +Linkis参数主要分为以下三个部分: +- Linkis 服务端参数,主要包含Linkis本身的参数和Spring的参数 +- Linkis SDK、Restful等客户端端调用提交的参数 +- Linkis 管理台参数 + + +## 2. Linkis 服务端参数 + +1. Linkis本身的参数 +linkis本身的参数支持在配置文件里面进行设置,也支持通过环境变量和系统属性进行设置,推荐使用配置文件进行设置。 +Linkis配置文件格式如下所示: +```shell +├── conf 配置目录 +│ ├── application-eureka.yml +│ ├── application-linkis.yml +│ ├── linkis-cg-engineconnmanager-io.properties +│ ├── linkis-cg-engineconnmanager.properties +│ ├── linkis-cg-engineplugin.properties +│ ├── linkis-cg-entrance.properties +│ ├── linkis-cg-linkismanager.properties +│ ├── linkis.properties ──linkis global properties +│ ├── linkis-ps-bml.properties +│ ├── linkis-ps-cs.properties +│ ├── linkis-ps-datasource.properties +│ ├── linkis-ps-publicservice.properties +│ ├── log4j2.xml +``` +每个服务会加载两个属性配置文件,一个为公用的主配置文件linkis.properties,以及服务配置文件linkis-serviceName.properties。设置的优先级为服务配置文件高于主配置文件 +建议通用的参数放置在主配置文件,个性化配置文件放在服务配置文件 + +2. Spring 参数 +Linkis服务是基于SpringBoot应用的,Spring相关的参数支持在application-linkis.yml进行设置,也支持在linkis配置文件里面进行配置。在linkis配置文件里面配置需要加上spring.的前缀。如下: + +```shell +# spring port default +server.port=9102 +# in linkis conf need spring prefix +spring.server.port=9102 + +``` + +## 3. Linkis 客户端参数 +Linkis客户端参数主要是指任务提交时的参数,主要在提交接口里面进行指定的参数。 +1.restful 如何设置参数: + +```shell +{ + "executionContent": {"code": "show tables", "runType": "sql"}, + "params": { // 提交参数 + "variable":{ //代码中需要的自定义变量 + "k1":"v1" + }, + "configuration":{ + "special":{ //特殊配置参数 如日志路径,结果集路径等 + "k2":"v2" + }, + "runtime":{ //运行时参数,执行配置参数,如JDBC引擎的的数据库连接参数,presto引擎的数据源参数 + "k3":"v3" + }, + "startup":{ //启动参数,如启动EC的内存参数,spark引擎参数、hive引擎参数等 + "k4":"v4" 如:spark.executor.memory:5G 设置Spark的执行器内存,底层Spark、hive等引擎参数keyName是和原生参数一致的 + } + } + }, + "labels": { //标签参数,支持设置引擎版本、用户和提应用 + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +``` +2.SDK如何设置参数: + +```java +JobSubmitAction jobSubmitAction = JobSubmitAction.builder() + .addExecuteCode(code) + .setStartupParams(startupMap) //启动参数,如启动EC的内存参数,spark引擎参数、hive引擎参数等, 如:spark.executor.memory:5G 设置Spark的执行器内存,底层Spark、hive等引擎参数keyName是和原生参数一致的 + .setRuntimeParams(runTimeMap) //引擎,执行配置参数,如JDBC引擎的的数据库连接参数,presto引擎的数据源参数 + .setVariableMap(varMap) //代码中需要的自定义变量 + .setLabels(labels) //标签参数,支持设置引擎版本、用户和提应用等 + .setUser(user) //submit user + .addExecuteUser(user) // execute user + .build(); +``` +3.linkis-cli如何设置参数 + +```shell +linkis-cli -runtieMap key1=value -runtieMap key2=value + -labelMap key1=value + -varMap key1=value + -startUpMap key1=value + +``` +注意: 客户端参数提交时,只有引擎相关参数和标签参数,以及Yarn队列设置可以生效,其他Linkis服务端参数和资源限制参数,如任务和引擎并发参数wds.linkis.rm.instances不支持任务设置 + +4.常用标签参数: + +```shell + Map labels = new HashMap(); + labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-2.4.3"); // 指定引擎类型和版本 + labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, user + "-IDE");// 指定运行的用户和您的APPName + labels.put(LabelKeyConstant.CODE_TYPE_KEY, "sql"); // 指定运行的脚本类型:spark支持:sql、scala、py;Hive:hql;shell:sh;python:python;presto:psql + labels.put(LabelKeyConstant.JOB_RUNNING_TIMEOUT_KEY, "10000");//job运行10s没完成自动发起Kill,单位为s + labels.put(LabelKeyConstant.JOB_QUEUING_TIMEOUT_KEY, "10000");//job排队超过10s没完成自动发起Kill,单位为s + labels.put(LabelKeyConstant.RETRY_TIMEOUT_KEY, "10000");//job因为资源等原因失败重试的等待时间,单位为ms,如因为队列资源不足的失败,会默认按间隔发起10次重试 + labels.put(LabelKeyConstant.TENANT_KEY,"hduser02");//租户标签,任务如果指定了租户参数则任务会被路由到单独的ECM机器 + labels.put(LabelKeyConstant.EXECUTE_ONCE_KEY,"");//执行一次标签,该参数不建议设置,设置后引擎不会复用任务运行完就会结束引擎,只有某个任务参数有特殊化的可以进行设置 +``` + +## 4. Linkis 管理台参数 +Linkis管理台参数时方便用户指定资源限制参数和默认的任务参数提供的Web界面,如下: +全局配置参数: +![](/Images/development/linkis_global_conf.png) +主要包含了全局队列参数[wds.linkis.rm.yarnqueue],任务默认采用的Yarn队列,支持在客户端StartUPMap里面另外进行指定 +资源限制参数,这些参数不支持任务设置,支持管理台进行调整。 +```shell +队列CPU使用上限[wds.linkis.rm.yarnqueue.cores.max],现阶段只支持限制Spark类型任务总队列资源的使用 +队列内存使用上限[wds.linkis.rm.yarnqueue.memory.max] +全局各个引擎内存使用上限[wds.linkis.rm.client.memory.max] 该参数不是指总共只能使用的内存,而是指定某个Creator特定引擎总的内存使用,如限制IDE-SPARK任务只能使用10G内存 +全局各个引擎核心个数上限[wds.linkis.rm.client.core.max]该参数不是指总共只能使用的CPU,而是指定某个Creator特定引擎总的内存使用,如限制IDE-SPARK任务只能使用10Cores +全局各个引擎最大并发数[wds.linkis.rm.instance],该参数有两层含义,一个是限制某个Creator特定引擎总共能启动多少个,以及限制某个Creator特定引擎任务同时能运行的任务数 +``` +引擎配置参数: +![](/Images/development/linkis_creator_ec_conf.png) +主要指定引擎的启动参数和运行时参数,这些参数支持在客户端进行设置,建议使用客户端进行个性化提交设置,页面只设置默认值 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/debug-with-helm-charts.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/debug-with-helm-charts.md new file mode 100644 index 00000000000..349662b6d53 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/debug-with-helm-charts.md @@ -0,0 +1,500 @@ +--- +title: 容器化开发调试 +sidebar_position: 7.0 +--- + +## 前言 + +本文介绍如何使用 Kubernetes 技术来简化 Linkis 项目的开发调试工作。在没有引入 Kubernetes 工具前,调试 Linkis 是一个非常繁琐和复杂的工作,有时候可能需要搭建 Linkis 依赖的 Hadoop 环境。为了改善这个问题,本文使用了另一种方法,利用 Kubernetes 技术在开发机上创建一个 Hadoop 集群并拉起所有 Linkis 服务,这是个分布式的环境,并且可以随时拉起和销毁,开发者通过 JVM 远程调试功能连接这些服务并进行单步调试. 这里我们用到了如下几个技术: + +* Docker: 一种容器化技术,用于支创建和使用 Linux 容器; +* Kubernetes: 一种可自动部署和管理 Linux 容器的开源平台,Kubernetes 还整合了网络、存储、安全性、遥测和其他服务,提供了全面的基于容器的基础设施; +* KinD: 一个使用Docker容器作为 "Kubernetes节点" 来运行本地 Kubernetes 集群的工具; +* Helm: Kubernetes 上一个开源的包管理工具, 通过 Helm 命令行工具和安装包(Chart)来管理 Kubernetes 上的用户资源; + +## 依赖工具介绍 + +### 版本要求 + +* [Docker](https://docs.docker.com/get-docker/), 最低版本 v20.10.8+ +* [Kubernetes](https://kubernetes.io/docs/setup/), 最低版本 v1.21.0+ +* [Helm](https://helm.sh/docs/intro/install/), 最低版本 v3.0.0+. +* [KinD](https://kind.sigs.k8s.io/docs/user/quick-start/), 最低版本 v0.11.0+. + +### Helm Charts 介绍 + +Helm 是 Kubernetes 上一个开源的包管理工具,Helm 最初的目标是为用户提供一种更好的方式来管理在 Kubernetes 上创建的所有 Kubernetes YAML 文件。Helm 使用 Charts 这个方式来解决上述问题,Chart 是一组文本文件,使用 Helm 模版语言编写,用来描述一个或者多个 Kubernetes 资源文件,Chart 直接依赖或者引用其他 Chart. 在使用 Charts 时,用户需要提供一个 变量文件,Helm 使用这个变量文件中定义的变量来渲染相应的 Chart, 生产 Kubernetes YAML 文件, 然后调用 Kubernetes api 提交到 Kubernetes 上。每一个发布到 Kubernetes 的 Charts 被称为 Release,一个 Chart 通常可以被多次安装到同一个集群中,而每次安装时,都会创建一个新的 Release。 + +Helm 的安装方式比较简单,请参考官方文档进行安装: [Installing Helm](https://helm.sh/docs/intro/install/) + +### KinD 介绍 + +在本地创建一个 Kubernetes 测试环境是一个非常普遍的需求,Kubernetes 社区提供了多种解决方案,如 MiniKube 或 MicroK8s 等,KinD 是一个相对较新的工具,KinD 是 Kubernetes IN Docker 的缩写,顾名思义,它使用 Docker 托管节点来创建一个面向测试的 Kubernetes 集群。 + +KinD 系统架构 + +![](/Images/development/kind-arc.png) + +部署 KinD 也非常简单,请参考官方部署文档: [KinD Installation](https://kind.sigs.k8s.io/docs/user/quick-start/#installation), 部署 KinD 前请先安装 Docker . + +> ⚠️注意: +> KinD 是面向测试的用途的工具,不能用于生产部署。同时,KinD 利用 Docker 带来的便利的同时,也引入了一些限制, 比如,开发机重启后,KinD 集群无法继续使用,需要重新创建(因为 KinD 在创建 Node 容器后会进行一系列的初始化工作,这些工作在机器重启后无法自动回复)。 + +## Linkis 容器化组件 + +### Linkis 镜像 + +Linkis 提供了多个镜像,所有镜像的 Dockerfile 和相关脚本都在 `linkis-dist/docker` 目录下。 可以通过 Maven 命令和 `docker build` 命令来制作相应的镜像。Linkis 镜像主要包括如下几个: + +* `linkis`: Linkis 服务镜像,镜像中包含了 Apache Linkis 的所有组件的二进制包和各类脚本。 +* `linkis-web`: Linkis Web 控制台镜像,镜像中包含了 Apache Linkis Web 控制台的的二进制包和各类脚本,本镜像使用 nginx 作为 Web 服务器。 +* `linkis-ldh`: LDH 是一个面向测试用途的镜像,LDH 镜像提供了一套完整的、伪分布式模式的 Apache Hadoop 运行环境,包含了 HDFS, YARN, HIVE, Spark, Flink 和 Zookeeper, 可以很方便的在开发环境中拉起一个全真的 Hadoop 环境用来测试 Linkis 的功能。 + +具体请参考: [Linkis Docker 镜像打包](https://linkis.apache.org/zh-CN/docs/latest/development/linkis_docker_build_instrument). + +### Linkis Helm Chart + +Linkis Helm Chart 是遵循 Helm Chart 规范开发的 Helm 安装包,在 `linkis-dist/helm` 目录下. 模块目录结构如下: + +``` shell +linkis-dist/helm +├── charts # Charts 目录, 目前仅包含 Linkis Helm Chart +│   └── linkis # Linkis Helm Chart 目录 +│   ├── Chart.yaml # - Chart 元数据 +│   ├── templates # - Chart 模版文件,包含了所有 linkis 组件的 Kubernetes YAML 模版 +│   │   ├── NOTES.txt # - Chart 提示信息 +│   │   ├── _helpers.tpl # - Chart 变量辅助模版 +│   │   ├── configmap-init-sql.yaml # - 数据库初始化 SQL 脚本模版 +│   │   ├── configmap-linkis-config.yaml # - Linkis 服务配置文件模版 +│   │   ├── configmap-linkis-web-config.yaml # - Linkis Web 控制台配置文件模版 +│   │   ├── jobs.yaml # - Kubernetes Job 模版,目前仅包括一个数据库初始化作业, 数据库初始化 SQL 脚本会在这个 +| | | # 作业中被执行 +│   │   ├── linkis-cg-engineconnmanager.yaml # - Linkis EngineConnManager 部署模版,是一个 Kubernetes Deployment 类型的工作负载 +│   │   ├── linkis-cg-engineplugin.yaml # - Linkis EngineConn 部署模版,是一个 Kubernetes Deployment 类型的工作负载 +│   │   ├── linkis-cg-entrance.yaml # - Linkis Entrance 部署模版,是一个 Kubernetes Deployment 类型的工作负载 +│   │   ├── linkis-cg-linkismanager.yaml # - Linkis Manager 部署模版,是一个 Kubernetes Deployment 类型的工作负载 +│   │   ├── linkis-mg-eureka.yaml # - Linkis Eureka 部署模版,是一个 Kubernetes Statefulset 类型的工作负载 +│   │   ├── linkis-mg-gateway.yaml # - Linkis Gateway 部署模版,是一个 Kubernetes Deployment 类型的工作负载 +│   │   ├── linkis-ps-publicservice.yaml # - Linkis PublicService 部署模版,是一个 Kubernetes Deployment 类型的工作负载 +│   │   ├── linkis-web.yaml # - Linkis Web Console 部署模版,是一个 Kubernetes Deployment 类型的工作负载 +│   │   └── serviceaccount.yaml # - Linkis 相关的 Kubernetes Service Account 模版 +│   └── values.yaml # - Linkis Helm Chart 变量文件,默认提供了 Linkis Local 模式相关的变量 +├── scripts # 一些用于简化开发调试的工具脚本 +│   ├── common.sh # - 公共脚本,定义了一些公共方法和变量 +│   ├── create-kind-cluster.sh # - 创建 KinD 集群 +│   ├── install-charts-with-ldh.sh # - 在 KinD 集群上部署 Linkis 服务,使用 On-LDH 的部署方式, 调用 install-linkis.sh 实现 +│   ├── install-charts.sh # - 在 KinD 集群上部署 Linkis 服务,使用 Local 的部署方式, 调用 install-linkis.sh 实现 +│   ├── install-ldh.sh # - 在 KinD 集群上部署 LDH 部署 +│   ├── install-linkis.sh # - 在 KinD 集群上部署 Linkis 服务,可以为 Local 或者 On-LDH 的模式 +│   ├── install-mysql.sh # - 在 KinD 集群上部署一个 MySQL 实例 +│   ├── login-pod.sh # - 登入一个 Pod,打开 Bash 进行交互 +│   ├── remote-debug-proxy.sh # - 开启 JVM 远程调试代理,开启后,可以在 IDE 上连接相应的端口进行调试 +│   └── resources # - 一些资源文件 +│   ├── kind-cluster.yaml # - KinD 集群配置,默认为单个 Node +│   ├── ldh # - LDH 相关资源文件 +│   │   ├── configmaps # - LDH 各个组件的配置文件 +│   │   │   ├── configmap-flink.yaml # - Flink 配置文件 +│   │   │   ├── configmap-hadoop.yaml # - Hdfs & Yarn 配置文件 +│   │   │   ├── configmap-hive.yaml # - Hive 配置文件 +│   │   │   ├── configmap-spark.yaml # - Spark 配置文件 +│   │   │   └── configmap-zookeeper.yaml # - Zookeeper 配置文件 +│   │   └── ldh.yaml # - LDH Kubernetes YAML, 用于在 KinD 上部署 LDH 实例 +│   └── mysql.yaml # - MySQL Kubernetes YAML, 用于在 KinD 上部署 MySQL 实例 + +``` + +本项目提供了一组工具脚本,用于快速创建一个用于开发测试的 Linkis 环境。在生产部署中,需要根据集群的实际情况,修改 `values.yaml` 文件,再使用 Helm CLI 进行部署。使用 Helm CLI 进行部署时,通常有如下两种比较常见的做法: +1. 使用 `helm install` 命令直接部署。适用于非定制化的部署方式; +2. 使用 `helm template` 命令选生成 Kubernetes YAML 文件,然后手动修改这些文件,添加自定义配置,然后使用`kubectl apply`命令进行部署。适用于需要定制 Linkis Helm Charts 不支持的 Kubernetes 特性的高阶用户, 如需要使用特定的 StorageClass 或者 PV 等; + +### LDH + +LDH 是一个面向测试用途的 Hadoop 集群镜像,它提供了一个伪分布式的 hadoop 集群,方便快速测试 On Hadoop 的部署模式。 +这个镜像包含以下多个 hadoop 组件,LDH 中引擎的默认模式是 on-yarn 的。 +* Hadoop 2.7.2 , 包括 HDFS 和 YARN +* Hive 2.3.3 +* Spark 2.4.3 +* Flink 1.12.2 +* ZooKeeper 3.5.9 + +LDH 启动时会进行一些初始化操作,比如 format hdfs, 在 HDFS 上创建初始化目录等,这些操作定义在`linkis-dist/docker/scripts/entry-point-ldh.sh`这个文件中,添加、修改、删除一些初始化操作需要重新制作 LDH 镜像才能生效。 + +另外,LDH 中的 Hive 组件依赖外部的 MySQL 实例,需要先部署 MySQL 实例才能使用 LDH 中的 Hive 组件。 + +```shell +# 创建 KinD 集群,并部署 Linkis 和 LDH 实例 +$> sh ./scripts/create-kind-cluster.sh \ + && sh ./scripts/install-mysql.sh \ + && sh ./scripts/install-ldh.sh + +# 快速体验 LDH +$> kubectl exec -it -n ldh $(kubectl get pod -n ldh -o jsonpath='{.items[0].metadata.name}') -- bash + +[root@ldh-96bdc757c-dnkbs /]# hdfs dfs -ls / +Found 4 items +drwxrwxrwx - root supergroup 0 2022-07-31 02:48 /completed-jobs +drwxrwxrwx - root supergroup 0 2022-07-31 02:48 /spark2-history +drwxrwxrwx - root supergroup 0 2022-07-31 02:49 /tmp +drwxrwxrwx - root supergroup 0 2022-07-31 02:48 /user + +[root@ldh-96bdc757c-dnkbs /]# beeline -u jdbc:hive2://ldh.ldh.svc.cluster.local:10000/ -n hadoop +Connecting to jdbc:hive2://ldh.ldh.svc.cluster.local:10000/ +Connected to: Apache Hive (version 2.3.3) +Driver: Hive JDBC (version 2.3.3) +Transaction isolation: TRANSACTION_REPEATABLE_READ +Beeline version 2.3.3 by Apache Hive +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> create database demo; +No rows affected (1.306 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> use demo; +No rows affected (0.046 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> create table t1 (id int, data string); +No rows affected (0.709 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> insert into t1 values(1, 'linikis demo'); +WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases. +No rows affected (5.491 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> select * from t1; ++--------+---------------+ +| t1.id | t1.data | ++--------+---------------+ +| 1 | linikis demo | ++--------+---------------+ +1 row selected (0.39 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> !q + +[root@ldh-96bdc757c-dnkbs /]# spark-sql +22/07/31 02:53:18 INFO hive.metastore: Trying to connect to metastore with URI thrift://ldh.ldh.svc.cluster.local:9083 +22/07/31 02:53:18 INFO hive.metastore: Connected to metastore. +... +22/07/31 02:53:19 INFO spark.SparkContext: Running Spark version 2.4.3 +22/07/31 02:53:19 INFO spark.SparkContext: Submitted application: SparkSQL::10.244.0.6 +... +22/07/31 02:53:27 INFO yarn.Client: Submitting application application_1659235712576_0001 to ResourceManager +22/07/31 02:53:27 INFO impl.YarnClientImpl: Submitted application application_1659235712576_0001 +22/07/31 02:53:27 INFO cluster.SchedulerExtensionServices: Starting Yarn extension services with app application_1659235712576_0001 and attemptId None +22/07/31 02:53:28 INFO yarn.Client: Application report for application_1659235712576_0001 (state: ACCEPTED) +... +22/07/31 02:53:36 INFO yarn.Client: Application report for application_1659235712576_0001 (state: RUNNING) +... +Spark master: yarn, Application Id: application_1659235712576_0001 +22/07/31 02:53:46 INFO thriftserver.SparkSQLCLIDriver: Spark master: yarn, Application Id: application_1659235712576_0001 +spark-sql> use demo; +Time taken: 0.074 seconds +22/07/31 02:58:02 INFO thriftserver.SparkSQLCLIDriver: Time taken: 0.074 seconds +spark-sql> select * from t1; +... +1 linikis demo +2 linkis demo spark sql +Time taken: 3.352 seconds, Fetched 2 row(s) +spark-sql> quit; + +[root@ldh-96bdc757c-dnkbs /]# zkCli.sh +Connecting to localhost:2181 +Welcome to ZooKeeper! +JLine support is enabled +WATCHER:: + +WatchedEvent state:SyncConnected type:None path:null + +[zk: localhost:2181(CONNECTED) 0] get -s /zookeeper/quota + +cZxid = 0x0 +ctime = Thu Jan 01 00:00:00 UTC 1970 +mZxid = 0x0 +mtime = Thu Jan 01 00:00:00 UTC 1970 +pZxid = 0x0 +cversion = 0 +dataVersion = 0 +aclVersion = 0 +ephemeralOwner = 0x0 +dataLength = 0 +numChildren = 0 +[zk: localhost:2181(CONNECTED) 1] quit + +# 以 per-job cluster 模式启动 Flink 作业 +[root@ldh-96bdc757c-dnkbs /]# HADOOP_CLASSPATH=`hadoop classpath` flink run -t yarn-per-job /opt/ldh/current/flink/examples/streaming/TopSpeedWindowing.jar +# 以 session 模式启动 Flink 作业, +# Flink session 在 LDH Pod 启动时会被启动了一个. +[root@ldh-96bdc757c-dnkbs /]# flink run /opt/ldh/current/flink/examples/streaming/TopSpeedWindowing.jar +Executing TopSpeedWindowing example with default input data set. +Use --input to specify file input. +Printing result to stdout. Use --output to specify output path. +... +``` + +### KinD 集群 + +Linkis 项目默认使用的 KinD 集群描述文件是`linkis-dist/helm/scripts/resources/kind-cluster.yaml`, 默认会创建一个包含一个节点的 KinD 集群。打开文件中注释的内容可以添加多个节点。 + +> ⚠️注意,KinD 集群仅用于测试用途。 + +``` yaml +# linkis-dist/helm/scripts/resources/kind-cluster.yaml +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: + - role: control-plane + extraMounts: + - hostPath: ${KIND_CLUSTER_HOST_PATH} # 指向开发机上的一个目录。这个目录会被映射到 Kind Node 容器中的 `/data` 目录, + # Linkis Helm Charts 默认会使用这个目录作为数据目录挂载到各个 Linkis 组件的 + # Pod 中。当 Linkis 使用 Local 模式进行部署时,所有组件实际上使用了开发机上的 + # 同一个目录,就和在同一台机器上一样,从而模拟了 Local 模式的行为。当使用 + # On-Hadoop 模式进行部署时,这个目录不会被使用。 + containerPath: /data +# - role: worker # 打开注释可以添加2个 KinD 节点。添加 KinD 节点会增加加载 Docker 镜像到 KinD +# # 集群的时间,所以默认不打开。 +# extraMounts: +# - hostPath: ${KIND_CLUSTER_HOST_PATH} +# containerPath: /data +# - role: worker +# extraMounts: +# - hostPath: ${KIND_CLUSTER_HOST_PATH} +# containerPath: /data + +``` + +## 使用 Linkis 容器化组件开发调试 + +下面介绍使用 Linkis 容器化组件开发调试的步骤(目前仅支持 Linux 和 MacOS)。在进行本步骤前请确认如下事项: +1. 开发机上是否已经安装了 Docker 引擎 +2. 开发机上是否已经安装了 Helm +3. 开发机上是否已经安装了 KinD +4. 是否已经按照 [Linkis Docker 镜像打包](https://linkis.apache.org/zh-CN/docs/latest/development/linkis_docker_build_instrument) 所述的方式制作了 Linkis 镜像 + +### 创建调试环境 + +本步骤会创建一个 KinD 集群,并在其上部署 MySQL、 Linkis 和 LDH 实例。 + +``` shell +$> cd linkis-dist/helm +$> sh ./scripts/create-kind-cluster.sh \ +> && sh ./scripts/install-mysql.sh \ +> && sh ./scripts/install-ldh.sh \ +> && sh ./scripts/install-charts-with-ldh.sh + +# Creating KinD cluster ... +- kind cluster config: /var/folders/9d/bb6ggdm177j25q40yf5d50dm0000gn/T/kind-XXXXX.Fc2dFJbG/kind-cluster.yaml +... +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: + - role: control-plane + extraMounts: + - hostPath: /var/folders/9d/bb6ggdm177j25q40yf5d50dm0000gn/T/kind-XXXXX.Fc2dFJbG/data + containerPath: /data +... +Creating cluster "test-helm" ... + ✓ Ensuring node image (kindest/node:v1.21.1) 🖼 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 +Set kubectl context to "kind-test-helm" +You can now use your cluster with: + +kubectl cluster-info --context kind-test-helm + +Have a nice day! 👋 +# Loading MySQL image ... +Image: "mysql:5.7" with ID "sha256:3147495b3a5ce957dee2319099a8808c1418e0b0a2c82c9b2396c5fb4b688509" not yet present on node "test-helm-control-plane", loading... +# Deploying MySQL ... +namespace/mysql created +service/mysql created +deployment.apps/mysql created +# LDH version: dev +# Loading LDH image ... +Image: "linkis-ldh:dev" with ID "sha256:aa3bde0a31bf704413fb75673fc2894b03a0840473d8fe15e2d7f7dd22f1f854" not yet present on node "test-helm-control-plane", loading... +# Deploying LDH ... +namespace/ldh created +configmap/flink-conf created +configmap/hadoop-conf created +configmap/hive-conf created +configmap/spark-conf created +configmap/zookeeper-conf created +service/ldh created +deployment.apps/ldh created +# Loading Linkis image ... +Image: "linkis:dev" with ID "sha256:0dfa7882c4216305a80cf57efa8cfb483d006bae5ba931288ffb8025e1db4e58" not yet present on node "test-helm-control-plane", loading... +Image: "linkis-web:dev" with ID "sha256:1dbe0e9319761dbe0e93197665d38077cb2432b8b755dee834928694875c8a22" not yet present on node "test-helm-control-plane", loading... +# Installing linkis, image tag=dev,local mode=false ... +NAME: linkis-demo +NAMESPACE: linkis +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +... + +--- +Welcome to Apache Linkis (v1.3.0)! + +.___ .___ .______ .____/\ .___ .________ +| | : __|: \ : / \: __|| ___/ +| | | : || ||. ___/| : ||___ \ +| |/\ | || | || \ | || / +| / \| ||___| || \| ||__:___/ +|______/|___| |___||___\ /|___| : v1.3.0 + \/ + +Linkis builds a layer of computation middleware between upper applications and underlying engines. +Please visit https://linkis.apache.org/ for details. + +Enjoy! +configmap/flink-conf created +configmap/hadoop-conf created +configmap/hive-conf created +configmap/spark-conf created +configmap/zookeeper-conf created + +$> kubectl get pods -n ldh -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +ldh-6648554447-ml2bn 1/1 Running 0 6m25s 10.244.0.6 test-helm-control-plane + +$> kubectl get pods -n linkis -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +init-db-bcp85 0/1 Completed 0 4m52s 10.244.0.14 test-helm-control-plane +linkis-demo-cg-engineconnmanager-659bf85689-ddvhw 1/1 Running 1 4m52s 10.244.0.7 test-helm-control-plane +linkis-demo-cg-engineplugin-98bd6945-tsgjl 1/1 Running 1 4m52s 10.244.0.10 test-helm-control-plane +linkis-demo-cg-entrance-858f74c868-xrd82 1/1 Running 0 4m52s 10.244.0.12 test-helm-control-plane +linkis-demo-cg-linkismanager-6f96f69b8b-ns6st 1/1 Running 0 4m52s 10.244.0.11 test-helm-control-plane +linkis-demo-mg-eureka-0 1/1 Running 0 4m52s 10.244.0.13 test-helm-control-plane +linkis-demo-mg-gateway-68ddb8c547-xgvhn 1/1 Running 0 4m52s 10.244.0.15 test-helm-control-plane +linkis-demo-ps-publicservice-6bbf99fcd7-sc922 1/1 Running 0 4m52s 10.244.0.8 test-helm-control-plane +linkis-demo-web-554bd7659f-nmdjl 1/1 Running 0 4m52s 10.244.0.9 test-helm-control-plane + +``` + +### 调试组件 + +#### 打开端口转发 + +每个组件在容器内的 JVM 远程调试端口均为 5005, 这些端口会被映射到宿主机上的不同端口,具体如下: +* mg-eureka: 5001 +* mg-gateway: 5002 +* ps-publicservice: 5004 +* cg-linkismanager: 5007 +* cg-entrance: 5008 +* cg-engineconnmanager: 5009 +* cg-engineplugin: 5010 + +另外,Web Console 会被映射到宿主机上的 8087 端口,可以在浏览器上输入`http://localhost:8087`进行访问. + +``` shell +$> ./scripts/remote-debug-proxy.sh start +- starting port-forwad for [web] with mapping [local->8087:8087->pod] ... +- starting port-forwad for [mg-eureka] with mapping [local->5001:5005->pod] ... +- starting port-forwad for [mg-gateway] with mapping [local->5002:5005->pod] ... +- starting port-forwad for [ps-publicservice] with mapping [local->5004:5005->pod] ... +- starting port-forwad for [cg-linkismanager] with mapping [local->5007:5005->pod] ... +- starting port-forwad for [cg-entrance] with mapping [local->5008:5005->pod] ... +- starting port-forwad for [cg-engineconnmanager] with mapping [local->5009:5005->pod] ... +- starting port-forwad for [cg-engineplugin] with mapping [local->5010:5005->pod] .. + +$> ./scripts/remote-debug-proxy.sh list +user 10972 0.0 0.1 5052548 31244 s001 S 12:57AM 0:00.10 kubectl port-forward -n linkis pod/linkis-demo-cg-engineplugin-98bd6945-tsgjl 5010:5005 --address=0.0.0.0 +user 10970 0.0 0.1 5053060 30988 s001 S 12:57AM 0:00.12 kubectl port-forward -n linkis pod/linkis-demo-cg-engineconnmanager-659bf85689-ddvhw 5009:5005 --address=0.0.0.0 +user 10968 0.0 0.1 5054084 30428 s001 S 12:57AM 0:00.10 kubectl port-forward -n linkis pod/linkis-demo-cg-entrance-858f74c868-xrd82 5008:5005 --address=0.0.0.0 +user 10966 0.0 0.1 5053316 30620 s001 S 12:57AM 0:00.11 kubectl port-forward -n linkis pod/linkis-demo-cg-linkismanager-6f96f69b8b-ns6st 5007:5005 --address=0.0.0.0 +user 10964 0.0 0.1 5064092 31152 s001 S 12:57AM 0:00.10 kubectl port-forward -n linkis pod/linkis-demo-ps-publicservice-6bbf99fcd7-sc922 5004:5005 --address=0.0.0.0 +user 10962 0.0 0.1 5051012 31244 s001 S 12:57AM 0:00.12 kubectl port-forward -n linkis pod/linkis-demo-mg-gateway-68ddb8c547-xgvhn 5002:5005 --address=0.0.0.0 +user 10960 0.0 0.1 5053060 31312 s001 S 12:57AM 0:00.13 kubectl port-forward -n linkis pod/linkis-demo-mg-eureka-0 5001:5005 --address=0.0.0.0 + +... + +# 在调试完成后,可以使用如下命令停止端口转发 +$> ./scripts/remote-debug-proxy.sh stop +- stopping port-forward for [web] with mapping [local->8087:8087->pod] ... +- stopping port-forward for [mg-eureka] with mapping [local->5001:5005->pod] ... +- stopping port-forward for [mg-gateway] with mapping [local->5002:5005->pod] ... +- stopping port-forward for [ps-publicservice] with mapping [local->5004:5005->pod] ... +- stopping port-forward for [cg-linkismanager] with mapping [local->5007:5005->pod] ... +- stopping port-forward for [cg-entrance] with mapping [local->5008:5005->pod] ... +- stopping port-forward for [cg-engineconnmanager] with mapping [local->5009:5005->pod] ... +- stopping port-forward for [cg-engineplugin] with mapping [local->5010:5005->pod] ... +``` + +#### 配置 IDE 进行远程调试 + +在 IDE 上进行如下配置,开启远程调试: + +![](/Images/development/kube-jvm-remote-debug.png) + +开启远程调试 +![](/Images/development/kube-jvm-remote-debug-start.png) + +设置断点,提交一个作业,进行调试 + +``` shell +$> ./scripts/login-pod.sh mg-gateway + +- login [mg-gateway]'s bash ... +bash-4.2$ ./bin/./linkis-cli -engineType shell-1 -codeType shell -code "echo \"hello\" " -submitUser hadoop -proxyUser hadoop +=====Java Start Command===== +exec /etc/alternatives/jre/bin/java -server -Xms32m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/linkis/logs/linkis-cli -XX:ErrorFile=/opt/linkis/logs/linkis-cli/ps_err_pid%p.log -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -classpath /opt/linkis/conf/linkis-cli:/opt/linkis/lib/linkis-computation-governance/linkis-client/linkis-cli/*:/opt/linkis/lib/linkis-commons/public-module/*: -Dconf.root=/etc/linkis-conf -Dconf.file=linkis-cli.properties -Dlog.path=/opt/linkis/logs/linkis-cli -Dlog.file=linkis-client..log.20220925171540947077800 org.apache.linkis.cli.application.LinkisClientApplication '-engineType shell-1 -codeType shell -code echo "hello" -submitUser hadoop -proxyUser hadoop' +... +``` +![](/Images/development/kube-jvm-remote-debug-breakpoint.png) + + +### 清理环境 + +调试完成后,可以使用如下命令清理整个环境: + +``` shell +$> kind delete clusters test-helm +Deleted clusters: ["test-helm"] +``` + +### 其他常用操作 + +#### 查看组件日志 + +``` bash +$> kubectl logs -n linkis linkis-demo-cg-engineconnmanager-659bf85689-ddvhw -f + ++ RUN_IN_FOREGROUND=true ++ /opt/linkis/sbin/linkis-daemon.sh start cg-engineconnmanager +Start to check whether the cg-engineconnmanager is running +Start server, startup script: /opt/linkis/sbin/ext/linkis-cg-engineconnmanager +=====Java Start Command===== +java -DserviceName=linkis-cg-engineconnmanager -Xmx512M -XX:+UseG1GC -Xloggc:/var/logs/linkis/linkis-cg-engineconnmanager-gc.log -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -cp /etc/linkis-conf:/opt/linkis/lib/linkis-commons/public-module/*:/opt/linkis/lib/linkis-computation-governance/linkis-cg-engineconnmanager/* org.apache.linkis.ecm.server.LinkisECMApplication --eureka.instance.prefer-ip-address=true --eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} 2>&1 +OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N +Listening for transport dt_socket at address: 5005 +16:32:41.101 [main] INFO org.apache.linkis.common.conf.BDPConfiguration$ - ******************* Notice: The Linkis configuration file is linkis.properties ! ******************* +16:32:41.130 [main] INFO org.apache.linkis.common.conf.BDPConfiguration$ - *********************** Notice: The Linkis serverConf file is linkis-cg-engineconnmanager.properties ! ****************** +16:32:41.222 [main] INFO org.apache.linkis.LinkisBaseServerApp - Ready to start linkis-cg-engineconnmanager with args: --eureka.instance.prefer-ip-address=true +--eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} +... +``` + +#### 进入组件 Pod 内 +使用`./scripts/login-pod.sh <组件名>`可以进入组件的 Pod 打开一个 Bash 实例进行交互式操作,其中组件名可以为: +* cg-engineconnmanager +* cg-engineplugin +* cg-entrance +* cg-linkismanager +* mg-eureka +* mg-gateway +* ps-publicservice +* web + +``` bash +$> ./scripts/login-pod.sh cg-engineconnmanager +- login [cg-engineconnmanager]'s bash ... +bash-4.2$ pwd +/opt/linkis +bash-4.2$ env |grep LINKIS +LINKIS_DEMO_PS_PUBLICSERVICE_SERVICE_HOST=127.0.0.1 +LINKIS_DEMO_CG_LINKISMANAGER_PORT_9101_TCP_PROTO=tcp +LINKIS_DEMO_WEB_PORT_8087_TCP_PORT=8087 +... +LINKIS_CLIENT_CONF_DIR=/etc/linkis-conf +bash-4.2$ ps aux |grep linkis +hadoop 1 0.0 0.0 11708 2664 ? Ss 16:32 0:00 /bin/bash /opt/linkis/sbin/linkis-daemon.sh start cg-engineconnmanager +hadoop 10 0.0 0.0 11708 2624 ? S 16:32 0:00 sh /opt/linkis/sbin/ext/linkis-cg-engineconnmanager +hadoop 11 0.0 0.0 11712 2536 ? S 16:32 0:00 sh /opt/linkis/sbin/ext/linkis-common-start +hadoop 12 4.0 3.2 4146404 400084 ? Sl 16:32 0:35 java -DserviceName=linkis-cg-engineconnmanager -Xmx512M -XX:+UseG1GC -Xloggc:/var/logs/linkis/linkis-cg-engineconnmanager-gc.log -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -cp /etc/linkis-conf:/opt/linkis/lib/linkis-commons/public-module/*:/opt/linkis/lib/linkis-computation-governance/linkis-cg-engineconnmanager/* org.apache.linkis.ecm.server.LinkisECMApplication --eureka.instance.prefer-ip-address=true --eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} +bash-4.2$ exit +exit +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/debug.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/debug.md new file mode 100644 index 00000000000..63a527a3c6f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/debug.md @@ -0,0 +1,481 @@ +--- +title: 调试 Debug 指引 +sidebar_position: 6.0 +--- + +> 导语:本文详细记录了如何在IDEA中配置和启动Linkis的各个微服务,并实现JDBC、Python、Shell等脚本的提交和执行。在Mac OS上,Linkis的各个微服务都支持本地调试。 +> 但在Windows OS上,linkis-cg-engineconnmanager服务暂不支持在本地进行调试,可参考下文第4小节的远程调试文档进行调试。 + +

linkis 1.0.3版本前,还未进入apache孵化,组织还是归属webank,主类的包名为`com.webank.wedatasphere.linkis`,调试时,注意区分。

+ +## 1. 代码调试环境 + +- jdk1.8 +- maven3.5+ + +## 2. 准备代码并编译 + +```shell +git clone git@github.com:apache/linkis.git +cd linkis +git checkout dev-1.2.0 +``` + +克隆Linkis的源码到本地,并用IDEA打开,首次打开项目会从maven仓库中下载Linkis项目编译所需的依赖jar包。当依赖jar包加载完毕之后,运行如下编译打包命令。 + +```shell +##如果对应版本已经发布,则可以跳过该步骤。发布的版本相关依赖已经deploy到maven中央仓库 +mvn -N install +mvn clean install -DskipTests +``` + +编译命令运行成功之后,在目录linkis/linkis-dist/target/下可找到编译好的安装包:apache-linkis-版本号-bin.tar.gz + +## 3. 配置并启动服务 + +### 3.1 add mysql-connector-java到classpath中 + +服务启动过程中如果遇到mysql驱动类找不到的情况,可以把mysql-connector-java-版本号.jar添加到对应服务模块的classpath下。 + +目前依赖mysql的服务有和对应的pom.xml路径如下: + +- linkis-mg-gateway:linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-server-support/pom.xml +- linkis-ps-publicservice:linkis-public-enhancements/pom.xml +- linkis-cg-linkismanage:linkis-computation-governance/linkis-manager/linkis-application-manager/pom.xml +- linkis-cg-engineplugin: linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/pom.xml + +增加到依赖的方式如下,修改对应服务的pom.xml文件讲mysql依赖加入进去, +```xml + + mysql + mysql-connector-java + ${mysql.connector.version} + +``` +同时需要留意 根pom.xml的``中是否将mysql-connector-java依赖的scope设置为test,如是,本地调试时需要注释掉 + +### 3.2 调整log4j2.xml配置 + +在Linkis源码文件夹下,子目录linkis-dist/package/conf中,是Linkis的一些默认配置文件,首先对log4j2.xml文件进行编辑,在其中增加日志输出到控制台的配置。 + +![log4j2.xml](/Images/development/debug/log4j.png) + +这里只贴出来需要新增的配置内容。 + +```xml + + + + + + + + + + + + + +``` +__注意:__ linkis.properties需要修改对应的jdbc的参数 + +### 3.3 启动eureka服务 + +Linkis的服务依赖Eureka作为注册中心,所以我们需要首先启动Eureka服务,Eureka服务可以在本地启动,也可以使用远程启动的服务。保证各个服务都能访问到Eureka的IP和端口之后,就可以开始着手启动其他微服务了。 + +在Linkis内部是通过-DserviceName参数设置应用名以及使用配置文件,所以-DserviceName是必须要指定的VM启动参数。 + +可以通过 “-Xbootclasspath/a:配置文件路径”命令,将配置文件追加到引导程序类的路径末尾,即将依赖的配置文件加到classpath中。 + +通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。 + +![eureka](/Images/development/debug/eureka.png) + +参数解释: + +```shell +[service name] +linkis-mg-eureka + +[Use classpath of module] +linkis-eureka + +[Main Class] +org.apache.linkis.eureka.SpringCloudEurekaApplication + +[VM Opitons] +-DserviceName=linkis-mg-eureka -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[Program arguments] +--spring.profiles.active=eureka --eureka.instance.preferIpAddress=true +``` + +注意调试配置中涉及到的本地路径,需要要修改成自己设置的路径; +在Windows中路径书写规则是:D:\{YourPathPrefix}\linkis\linkis-dist\package\conf +(针对以下微服务同样适用) + +如果不想默认的20303端口可以修改端口配置: + +```shell +文件路径:conf/application-eureka.yml +修改端口: +server: + port: 8080 ##启动的端口 +``` + +上述设置完成之后,直接运行此Application,成功启动后可以通过http://localhost:20303/ 查看eureka服务列表。 + +![eureka-web](/Images/development/debug/eureka-web.png) + +### 3.4 启动linkis-mg-gateway + +linkis-mg-gateway是Linkis的服务网关,所有的请求都会经由gateway来转发到对应的服务上。 +启动服务器前,首先需要编辑conf/linkis-mg-gateway.properties配置文件,增加管理员用户名和密码,用户名需要与你当前登录的mac用户名保持一致。 + +```properties +wds.linkis.admin.user=leojie +wds.linkis.admin.password=123456 +``` + +设置 linkis-mg-gateway的启动Application + +![gateway-app](/Images/development/debug/gateway.png) + +参数解释: + +```shell +[Service Name] +linkis-mg-gateway + +[Use classpath of module] +linkis-gateway-server-support + +[VM Opitons] +-DserviceName=linkis-mg-gateway -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.gateway.springcloud.LinkisGatewayApplication +``` + +上述设置完成之后,可直接运行此Application。 + +### 3.5 启动linkis-ps-publicservice + +publicservice是Linkis的公共增强服务,为其他微服务模块提供统一配置管理、上下文服务、物料库、数据源管理、微服务管理和历史任务查询等功能的模块。 + +设置linkis-ps-publicservice的启动Application + +![publicservice-app](/Images/development/debug/publicservice.png) + +参数解释: + +```shell +[Service Name] +linkis-ps-publicservice + +[Module Name] +linkis-public-enhancements + +[VM Opitons] +-DserviceName=linkis-ps-publicservice -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.filesystem.LinkisPublicServiceApp + +[Add provided scope to classpath] +通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。 +``` + +直接启动publicservice时,可能会遇到如下报错: + +![publicservice-debug-error](/Images/development/debug/publicservice-debug-error.png) + +需要把公共依赖的模块加到linkis-public-enhancements模块的classpath下,修改pes的pom增加以下依赖: +linkis-public-enhancements/pom.xml +```xml + + org.apache.linkis + linkis-dist + ${project.version} + + + + mysql + mysql-connector-java + ${mysql.connector.version} + + +``` + +做完上述配置后重新启动publicservice的Application + +### 3.6 启动linkis-cg-linkismanager + +![cg-linkismanager-APP](/Images/development/debug/cg-linkismanager-APP.png) + +参数解释: + +```shell +[Service Name] +linkis-cg-linkismanager + +[Use classpath of module] +linkis-application-manager + +[VM Opitons] +-DserviceName=linkis-cg-linkismanager -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.manager.am.LinkisManagerApplication + +[Add provided scope to classpath] +通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。 +``` + +### 3.7 启动linkis-cg-entrance + +![cg-entrance-APP](/Images/development/debug/cg-entrance-APP.png) + +参数解释: + +```shell +[Service Name] +linkis-cg-entrance + +[Use classpath of module] +linkis-entrance + +[VM Opitons] +-DserviceName=linkis-cg-entrance -Xbootclasspath/a:D:\yourDir\linkis\linkis-dist\package\conf + +[main Class] +org.apache.linkis.entrance.LinkisEntranceApplication + +[Add provided scope to classpath] +通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。 +``` + +### 3.8 启动linkis-cg-engineconnmanager + +![engineconnmanager-app](/Images/development/debug/engineconnmanager-app.png) + +参数解释: + +```shell +[Service Name] +linkis-cg-engineconnmanager + +[Use classpath of module] +linkis-engineconn-manager-server + +[VM Opitons] +-DserviceName=linkis-cg-engineconnmanager -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf -DJAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/ + +[main Class] +org.apache.linkis.ecm.server.LinkisECMApplication + +[Add provided scope to classpath] +通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。 +``` + +-DJAVA_HOME是为了指定ecm启动引擎时所使用的java命令所在的路径,如果你默认JAVA环境变量中的版本满足需要,此配置可以不加 + +针对linkis-cg-engineconnmanager模块调试暂只支持Mac OS 和 Linux系统 + + + + +### 3.9 关键配置修改 + +以上操作只是完成了对Linkis各个微服务启动Application的配置,除此之外,Linkis服务启动时所加载的配置文件中,有些关键配置也需要做针对性地修改,否则启动服务或脚本执行的过程中会遇到一些报错。关键配置的修改归纳如下: + +#### 3.9.1 conf/linkis.properties + +```properties +# linkis底层数据库连接参数配置 +wds.linkis.server.mybatis.datasource.url=jdbc:mysql://yourip:3306/linkis?characterEncoding=UTF-8 +wds.linkis.server.mybatis.datasource.username=your username +wds.linkis.server.mybatis.datasource.password=your password + +# 设置bml物料存储路径不为hdfs +wds.linkis.bml.is.hdfs=false +wds.linkis.bml.local.prefix=/Users/leojie/software/linkis/data/bml + +wds.linkis.home=/Users/leojie/software/linkis + +# 设置管理员用户名,你的本机用户名 +wds.linkis.governance.station.admin=leojie + +# 设置ip地址优先 +linkis.discovery.prefer-ip-address=true + +# 设置ec调试启用 +wds.linkis.engineconn.debug.enable=true +``` + +在配置linkis底层数据库连接参数之前,请创建linkis数据库,并运行linkis-dist/package/db/linkis_ddl.sql和linkis-dist/package/db/linkis_dml.sql来初始化所有表和数据。 + +其中wds.linkis.home={YourPathPrefix}/linkis的目录结构如下,里面只放置了lib目录和conf目录。引擎进程启动时会把wds.linkis.home中的conf和lib路径,加到classpath下,如果wds.linkis.home不指定,可能会遇到目录找不到的异常。 + +![linkis-home](/Images/development/debug/linkis-home.png) + +#### 3.9.2 conf/linkis-cg-entrance.properties + +```properties +# entrance服务执行任务的日志目录 +wds.linkis.entrance.config.log.path=file:///{YourPathPrefix}/linkis/data/entranceConfigLog + +# 结果集保存目录,本机用户需要读写权限 +wds.linkis.resultSet.store.path=file:///{YourPathPrefix}/linkis/data/resultSetDir +``` + +#### 3.9.3 conf/linkis-cg-engineconnmanager.properties + +```properties +wds.linkis.engineconn.root.dir={YourPathPrefix}/linkis/data/engineconnRootDir +``` + +不修改可能会遇到路径不存在异常。 + +#### 3.9.4 conf/linkis-cg-engineplugin.properties + +```properties +wds.linkis.engineconn.home={YourPathPrefix}/linkis/linkis-engineconn-plugins/shell/target/out + +wds.linkis.engineconn.plugin.loader.store.path={YourPathPrefix}/linkis/linkis-engineconn-plugins/shell/target/out +``` + +这里两个配置主要为了指定引擎存储的根目录,指定为target/out的主要目的是,引擎相关代码或配置改动后可以直接重启engineplugin服务后生效。 + +### 3.10 为当前用户设置sudo免密 + +引擎拉起时需要使用sudo来执行启动引擎进程的shell命令,mac上当前用户使用sudo时一般都需要输入密码,因此,需要为当前用户设置sudo免密,设置方法如下: + +```shell +sudo chmod u-w /etc/sudoers +sudo visudo +将#%admin ALL=(ALL) AL替换为 %admin ALL=(ALL) NOPASSWD: ALL +保存文件退出 +``` + +### 3.11 服务测试 + +保证上述服务都是成功启动状态,然后在postman中测试提交运行shell脚本作业。 + +首先访问登录接口来生成Cookie: + +![login](/Images/development/debug/login.png) + +然后提交执行shell代码 + +POST: http://127.0.0.1:9001/api/rest_j/v1/entrance/submit + +body参数: + +```json +{ + "executionContent": { + "code": "echo 'hello'", + "runType": "shell" + }, + "params": { + "variable": { + "testvar": "hello" + }, + "configuration": { + "runtime": {}, + "startup": {} + } + }, + "source": { + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "shell-1", + "userCreator": "leojie-IDE" + } +} +``` + +执行结果: + +```json +{ + "method": "/api/entrance/submit", + "status": 0, + "message": "OK", + "data": { + "taskID": 1, + "execID": "exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0" + } +} +``` + +最后检查任务运行状态和获取运行结果集: + +GET http://127.0.0.1:9001/api/rest_j/v1/entrance/exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0/progress + +```json +{ + "method": "/api/entrance/exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0/progress", + "status": 0, + "message": "OK", + "data": { + "progress": 1, + "progressInfo": [], + "execID": "exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0" + } +} +``` + +GET http://127.0.0.1:9001/api/rest_j/v1/jobhistory/1/get + +GET http://127.0.0.1:9001/api/rest_j/v1/filesystem/openFile?path=file:///Users/leojie/software/linkis/data/resultSetDir/leojie/linkis/2022-07-16/214859/IDE/1/1_0.dolphin + +```json +{ + "method": "/api/filesystem/openFile", + "status": 0, + "message": "OK", + "data": { + "metadata": "NULL", + "totalPage": 0, + "totalLine": 1, + "page": 1, + "type": "1", + "fileContent": [ + [ + "hello" + ] + ] + } +} +``` + +## 4. 远程调试服务指引 + +根据需要调试的代码位置,确定其所属的服务,使用启动脚本`linkis-daemon.sh`,启动时针对该服务设置远程调试端口。 + +### 4.1 确认要调试的包所在的服务 + +根据需要调试的代码位置,确定其所属的服务(如果不确定服务名称,在 ${LINKIS_HOME}/sbin/linkis-start-all.sh 内查询) + +### 4.2 重启需要调试的服务 + +进入{LINKIS_HOME}/sbin目录,在启动命令中添加debug参数,指定远程调试端口。 + +```shell +sh linkis-daemon.sh restart ps-publicservice debug-5005 +``` +观察输出的启动命令,是否包含`-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005`,包含则说明添加远程调试端口成功。 + +### 4.3 编译器配置远程调试 + +如下图所示打开窗口并配置远程调试的端口,服务,以及模块 +![c-debug](images/c-debug.png) + +### 4.4 开始调试 + +点击调试按钮,出现如下信息代表可以开始调试 +![debug](images/debug.png) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/_category_.json new file mode 100644 index 00000000000..b78c0cb3dae --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "开发规范", + "position": 12 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/api.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/api.md new file mode 100644 index 00000000000..dcb2ddd9876 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/api.md @@ -0,0 +1,77 @@ +--- +title: 接口规范 +sidebar_position: 4 +--- + +> Contributor为Linkis贡献新的Restful接口时,需遵循如下接口规范进行接口开发。 + +## 1. HTTP or WebSocket ? + +Linkis目前提供了两种接口方式:HTTP和WebSocket。 + +WebSocket相比于HTTP的优势: + +- 对服务器产生的压力更小 +- 信息推送更加及时 +- 交互性更加友好 + +相应的,WebSocket也有如下的劣势: + +- WebSocket在使用时可能出现断开连接的情况 +- 对前端的技术要求更高 +- 一般要求前端有降级处理机制 + +**如非必要,我们通常强烈建议Contributor尽量少用WebSocket的方式提供接口;** + +**如您觉得使用WebSocket很有必要,且愿意将开发的功能贡献给Linkis,建议您在开发前与我们取得沟通,多谢!** + +## 2. URL规范 + +``` +/api/rest_j/v1/{applicationName}/.+ +/api/rest_s/v1/{applicationName}/.+ +``` + +**约定**: + + - rest_j表示接口符合Jersey规范 + - rest_s表示接口符合springMVC Rest规范 + - v1为服务的版本号,**版本号会随着Linkis版本进行升级** + - {applicationName}为微服务名 + +## 3. 接口请求格式 + +```json +{ + "method":"/api/rest_j/v1/entrance/execute", + "data":{}, + "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" // WebSocket请求的必需参数,HTTP请求可忽略 +} +``` + +**约定**: + + - method:请求的Restful API URL。 + - data:请求的具体数据。 + - websocketTag:某一次WebSocket请求的唯一标识,后台也会带回该参数用于给前端进行识别。 + +## 4. 接口返回格式 + +```json +{"method":"/api/rest_j/v1/project/create","status":0, "message":"创建成功!","data":{}} +``` + +**约定**: + + - method:返回请求的Restful API URL,主要是websocket模式需要使用。 + - status:返回状态信息,其中:-1表示没有登录,0表示成功,1表示错误,2表示验证失败,3表示没该接口的访问权限。 + - data:返回具体的数据。 + - message:返回请求的提示信息。如果status非0时,message返回的是错误信息,其中data有可能存在stack字段,返回具体的堆栈信息。 + +另:根据status的不同,HTTP请求的状态码也不一样,一般情况下: + + - 当status为0时,HTTP的状态码为200 + - 当status为-1时,HTTP的状态码为401 + - 当status为1时,HTTP的状态码为400 + - 当status为2时,HTTP的状态码为412 + - 当status为3时,HTTP的状态码为403 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/commit-message.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/commit-message.md new file mode 100644 index 00000000000..b03e914fcd6 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/commit-message.md @@ -0,0 +1,95 @@ +--- +title: Commit Message 须知 +sidebar_position: 2 +--- +> 本文引用自 https://dolphinscheduler.apache.org/zh-cn/docs/dev/user_doc/contribute/join/commit-message.html + +### 1.前言 + 一个好的 commit message 是能够帮助其他的开发者(或者未来的开发者)快速理解相关变更的上下文,同时也可以帮助项目管理人员确定该提交是否适合包含在发行版中。但当我们在查看了很多开源项目的 commit log 后,发现一个有趣的问题,一部分开发者,代码质量很不错,但是 commit message 记录却比较混乱,当其他贡献者或者学习者在查看代码的时候,并不能通过 commit log 很直观的了解 +该提交前后变更的目的,正如 Peter Hutterer 所言:Re-establishing the context of a piece of code is wasteful. We can’t avoid it completely, so our efforts should go to reducing it as much as possible. Commit messages can do exactly that and as a result, a commit message shows whether a developer is a good collaborator. 因此,DolphinScheduler 结合其他社区以及 Apache 官方文档制定了该规约。 + +### 2.Commit Message RIP + +#### 2.1 明确修改内容 + +commit message 应该明确说明该提交解决了哪些问题(bug 修复、功能增强等),以便于用户开发者更好的跟踪问题,明确版本迭代过程中的优化情况。 + +#### 2.2 关联相应的Pull Request 或者Issue + +当我们的改动较大的时候,commit message 最好能够关联 GitHub 上的相关 Issue 或者 Pull Request,这样,我们的开发者在查阅代码的时候能够通过关联信息较为迅速的了解改代码提交的上下文情景,如果当前 commit 针对某个 issue,那么可以在 Footer 部分关闭这个 issue。 + +#### 2.3 统一的格式 + +格式化后的 CommitMessage 能够帮助我们提供更多的历史信息,方便快速浏览,同时也可以直接从 commit 生成 Change Log。 + +Commit message 应该包括三个部分:Header,Body 和 Footer。其中,Header 是必需的,Body 和 Footer 可以省略。 + +##### header +Header 部分只有一行,包括三个字段:type(必需)、scope(可选)和 subject(必需)。 + +[DS-ISSUE编号][type] subject + +(1) type 用于说明 commit 的类别,只允许使用下面7个标识。 + +* feat:新功能(feature) +* fix:修补bug +* docs:文档(documentation) +* style: 格式(不影响代码运行的变动) +* refactor:重构(即不是新增功能,也不是修改bug的代码变动) +* test:增加测试 +* chore:构建过程或辅助工具的变动 + +如果 type 为 feat 和 fix,则该 commit 将肯定出现在 Change log 之中。其他情况(docs、chore、style、refactor、test)建议不放入。 + +(2)scope + +scope 用于说明 commit 影响的范围,比如 server、remote 等,如果没有更合适的范围,你可以用 *。 + +(3) subject + +subject 是 commit 目的的简短描述,不超过50个字符。 + +##### Body + +Body 部分是对本次 commit 的详细描述,可以分成多行,换行符将以72个字符换行,避免自动换行影响美观。 + +Body 部分需要注意以下几点: + +* 使用动宾结构,注意使用现在时,比如使用 change 而非 changed 或 changes + +* 首字母不要大写 + +* 语句最后不需要 ‘.’ (句号) 结尾 + + +##### Footer + +Footer只适用于两种情况 + +(1) 不兼容变动 + +如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。 + +(2) 关闭 Issue + +如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue,也可以一次关闭多个 issue 。 + +##### 举个例子 +[Linkis-001][docs-zh] add commit message + +* commit message RIP +* build some conventions +* help the commit messages become clean and tidy +* help developers and release managers better track issues +and clarify the optimization in the version iteration + +This closes #001 + +### 3.参考文档 +[Dolphinscheduler Commit Message 须知](https://dolphinscheduler.apache.org/zh-cn/docs/dev/user_doc/contribute/join/commit-message.html) + +[提交消息格式](https://cwiki.apache.org/confluence/display/GEODE/Commit+Message+Format) + +[关于提交消息](http://who-t.blogspot.com/2009/12/on-commit-messages.html) + +[RocketMQ 社区操作约定](https://mp.weixin.qq.com/s/LKM4IXAY-7dKhTzGu5-oug) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/concurrent.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/concurrent.md new file mode 100644 index 00000000000..09221a88a3f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/concurrent.md @@ -0,0 +1,13 @@ +--- +title: 并发规范 +sidebar_position: 5 +--- +1. 【**强制**】获取单例对象要线程安全。在单例对象里面做操作也要保证线程安全。 + +2. 【**强制**】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 + +3. SimpleDateFormat 是线程不安全的类,建议使用使用DateUtils工具类。 + +4. 【**强制**】高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。 + +5. 【**强制**】ThreadLocal尽量少用,用的时候如果存入的是一个需要close的对象,记得及时close释放掉。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/exception-catch.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/exception-catch.md new file mode 100644 index 00000000000..7409280f00f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/exception-catch.md @@ -0,0 +1,87 @@ +--- +title: 异常规范 +sidebar_position: 3 +--- + +## 1. 异常层次定义 +1. linkis异常继承层次: + +LinkisException:异常继承于Exception,存在三个静态属性,是服务在启动时进行赋值的,这三个属性主要为了在进行异常打印时,标明异常来自于哪个微服务 +``` + static String applicationName;//Microservice AppName + static String hostname;//Microservice hostName + static int hostPort;//Microservice port +``` +可继承异常: + +|异常类 | 所在服务| 错误描述| +|:---- |:--- |:--- | +|LinkisException| common| 顶级父类,继承自Exception,不允许直接继承| +|LinkisRuntimeException| common| 顶级父类,继承自RuntimeException,不允许直接继承| +|WarnException| common| 次级父类,继承自LinkisRuntimeException。提示级的异常,必须直接或间接继承该类| +|ErrorException| common| 次级父类,继承自LinkisException。错误级的异常,必须直接或间接继承该类| +|FatalException| common| 次级父类,继承自LinkisException。致命级的异常,必须直接或间接继承该类,出现此类异常服务需要在Catch时进行退出。如:ECM在向LM注册失败时需要退出| +|LinkisRetryException| common| 次级父类,继承自LinkisException。重试级的异常,必须直接或间接继承该类,一般用于Linkis内部,用于捕获该异常进行请求的重试,如:引擎启动的资源不足异常| + +2. 模块使用异常须知: +- 【**强制**】每个模块需要自定义对应模块的异常,自定义的异常都必须继承自LinkisRetryException、WarnException、ErrorException或FatalException之一 +- 【**强制**】自定义的异常必须包含错误码和错误描述,如有必要,也可将发生异常的ip地址和进程端口封装到异常当中 +- 【**强制**】慎用WarnException!WarnException抛出来的异常,如果在Restful和RPC的Receiver端被捕获,不会给前端或sender端抛出执行失败,而是只返回一条警告信息! +- 【**强制**】WARNException的异常级别为1,ErrorException的异常级别为2,FatalException的异常级别为3,LinkisRetryException的异常级别为4 + +3. 错误码需按照规范进行定义,错误码规范如下(PS:现有不规范的错误码,您可以提PR进行修复) +``` +## 错误码定义:整个调用链路的需要有规则 +linkis-commons:10000-11000 +linkis-computattion-governace:11000-12000 +linkis-engineconn-plugins:12000-13000 +linkis-orchestrator:13000-14000 +linkis-public-enghancements:14000-15000 +linkis-spring-cloud-service:15100-15500 +linkis-extensions:15500-16000 +``` + +## 2. 异常规范 +1. [强制] 禁止直接catch Throwable,这种代码非常危险,因为会把Error也给catch住,像OOM等异常会被直接catch,原本JVM检测到该异常会自动停止进程,但是因为我们catch住了,会导致进程实际已经无法提供服务,但是不会正常退出。 +```scala +// 对于Scala代码建议使用Utils工具类里面提供的相关tryCatch方法 + def tryCatch[T](tryOp: => T)(catchOp: Throwable => T): T = { + try tryOp catch { + case t: ControlThrowable => throw t + case fatal: FatalException => + error("Fatal error, system exit...", fatal) + System.exit(fatal.getErrCode) + null.asInstanceOf[T] + case e: VirtualMachineError => + error("Fatal error, system exit...", e) + System.exit(-1) + throw e + case er: Error => + error("Throw error", er) + throw er + case t => catchOp(t) + } + } +``` +2. [强制] 捕获异常后,如果需要创建新的异常,一定要将cause进行传递对新加的异常进行initCause,防止丢失根因 +``` +// 新生成的异常,需要继承cacuse +public StorageErrorException(int errCode, String desc, Throwable t){ + super(errCode, desc); + initCause(t); +} +``` + +3. 【**强制**】每个小模块的异常,都应该定义一个专门的exception类,方便后续给用户生成错误码,不允许抛出任何RuntimeException和直接抛Exception。 + +4. 【推荐】尽量不要对大段代码进行try-catch,这是不负责任的表现。catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。 + +5. 【**强制**】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。注意:什么情况下,都不要用e.printStackTrace()!最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。 + +finally块必须对资源对象、流对象进行关闭,有异常也要做try-catch。 + +6. 【**强制**】预防NullPointerException。方法的返回值可以为null,不强制返回空集合,或者空对象等,但是必须添加注释充分说明什么情况下会返回 null 值。RPC、SpringCloud Feign调用,一律要求进行非空判断。 + +7. 【**强制**】不要在finally中使用Return和抛出异常 + +8. 【**强制**】如果异常已经抛出,禁止打印异常的堆栈日志,会导致日志冗余 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/how-to-write-unit-test-code.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/how-to-write-unit-test-code.md new file mode 100644 index 00000000000..af8faa8bd56 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/how-to-write-unit-test-code.md @@ -0,0 +1,365 @@ +--- +title: 如何编写单元测试代码 +sidebar_position: 10 +--- +## 1.框架选型 +Junit5+Mockito+jacoco+h2本地数据库 +Idea增强插件 +- JUnitGenerator V2.​0 用于生成测试用例的标准模块 +- GenerateAllSet 用于快速new创建对象,并设置默认值 +- MybatisX dao与mapper的关联映射 方便查看 + +### 1.1 配置IDEA的Junit的模板 +```properties +######################################################################################## +## +## Available variables: +## $entryList.methodList - List of method composites +## $entryList.privateMethodList - List of private method composites +## $entryList.fieldList - ArrayList of class scope field names +## $entryList.className - class name +## $entryList.packageName - package name +## $today - Todays date in MM/dd/yyyy format +## +## MethodComposite variables: +## $method.name - Method Name +## $method.signature - Full method signature in String form +## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) +## $method.paramNames - List of Strings representing the method's parameters' names +## $method.paramClasses - List of Strings representing the method's parameters' classes +## +## You can configure the output class name using "testClass" variable below. +## Here are some examples: +## Test${entry.ClassName} - will produce TestSomeClass +## ${entry.className}Test - will produce SomeClassTest +## +######################################################################################## +## +## 首字母大写 +#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end +## 首字母小写 自定义down +#macro (down $strIn)$strIn.valueOf($strIn.charAt(0)).toLowerCase()$strIn.substring(1)#end +## Iterate through the list and generate testcase for every entry. +#foreach ($entry in $entryList) +#set( $testClass="${entry.className}Test") +## + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package $entry.packageName; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * ${entry.className} Tester +*/ +public class $testClass { + + @Autowired + private ${entry.className} #down(${entry.className}); + + @BeforeEach + @DisplayName("Each unit test method is executed once before execution") + public void before() throws Exception { + } + + @AfterEach + @DisplayName("Each unit test method is executed once before execution") + public void after() throws Exception { + } + +#foreach($method in $entry.methodList) + + @Test + @DisplayName("Method description: ...") + public void test#cap(${method.name})() throws Exception { + //TODO: Test goes here... + } + +#end + +#foreach($method in $entry.privateMethodList) + + @Test + @DisplayName("Method description: ...") + public void test#cap(${method.name})() throws Exception { + //TODO: Test goes here... + #foreach($string in $method.reflectionCode) + $string + #end + } + +#end +} +#end + +``` +![test-0](../images/test-0.png) + +1.配置配置测试类生成路径 +原配置:${SOURCEPATH}/test/${PACKAGE}/${FILENAME} +修改后配置:${SOURCEPATH}/../../test/java/${PACKAGE}/${FILENAME} +如图: +![test-1](../images/test-1.png) +2.选择类——>右键——>Generate——>Junit Test,生成测试类 +![test-2](../images/test-2.png) + +## 2.单元测试准则 +### 2.1 目录以及命名准则 + +- 1.单元测试代码目录 + 必须写在如下工程目录:src/test/java,不允许写在业务代码目录下。 + 说明:源码编译时会跳过此目录,而单元测试框架默认是扫描此目录,测试的配置文件必须放在:src/test/resources文件下 + +- 2.测试类所在的包名应该和被测试类所在的包名保持一致 + 示例: + 业务类 src/main/java/org/apache/linkis/jobhistory/dao/JobDetailMapper.java + 对应的测试类 src/test/java/org/apache/linkis/jobhistory/dao/JobDetailMapperTest.java + +- 3.测试类的命名定义规范:使用Test作为类名的后缀 + 测试类的命名如下: + 被测试的业务+Test、被测试的接口+Test、被测试的类+Test + +- 4.测试用例的命名定义规范:使用test作为方法名的前缀 + 测试用例的命名规则是:test+方法名。避免使用test1、test2没有含义的名称,其次需要有必要的函数方法注释。 + + +### 2.2 编写准则 +- 1.单元测试中不准使用 System.out 来进行人肉验证,或则if判断来验证(可以使用log进行关键日志输出),必须使用断言 assert 来验证。 + +- 2.保持单元测试的独立性。为了保证单元测试稳定可靠且便于维护,单元测试用例之间决不能互相调用,也不能依赖执行的先后次序。 + 反例:method2 需要依赖 method1 的执行,将执行结果作为 method2 的输入 + +- 3.单元测试必须可以重复执行的,不能受到外界环境的影响。 + 说明:单元测试通常会被放到持续集成中,每次有代码 check in 时单元测试都会被执行。如果单测对外部环境(网络、服务、中间件等)有依赖,容易导致持续集成机制的不可用。 + 正例:为了不受外界环境影响,要求设计代码时就把被测类的相关依赖改成注入,在测试时用 spring 这样的依赖注入框架注入一个本地(内存)实现或者 Mock 实现。 + +- 4.增量代码确保单元测试通过。 + 说明:新增代码必须补充单元测试,如果新增代码影响了原有单元测试,请修正 + +- 5.对于单元测试,要保证测试粒度足够小,有助于精确定位问题。单测粒度一般都是方法级别(工具类或则枚举类等极少场景可以是类级别)。 + 说明:只有测试粒度小才能在出错时尽快定位到出错位置。单测不负责检查跨类或者跨系统的交互逻辑,那是集成测试的领域。 + + +## 3.断言的使用 +所有的测试用例的结果验证都必须使用断言模式 +优先使用Junit5的Assertions断言,极少数场景允许使用AssertJ的断言 + +### 3.1 Junit5常规断言 + +| 方法 | 说明 | 备注 | +|--------|-------------|-------------| +|assertEquals | 判断两个对象或两个原始类型是否相等| | +|assertNotEquals| 判断两个对象或两个原始类型是否不相等| | +|assertTrue| 判断给定的布尔值是否为 true| | +|assertFalse| 判断给定的布尔值是否为 false | | +|assertNull| 判断给定的对象引用是否为 null| | +|assertNotNull| 判断给定的对象引用是否不为 null | | +|assertAll| 将多个判断逻辑放在一起处理,只要有一个报错就会导致整体测试不通过 | | +### 3.2 Junit5组合断言和异常断言 +**组合断言** +assertAll方法可以将多个判断逻辑放在一起处理,只要有一个报错就会导致整体测试不通过: +```java + @Test + @DisplayName("assert all") + public void all() { + //将多个判断放在一起执行,只有全部通过才算通过 + assertAll("Math", + () -> assertEquals(2, 1 + 1), + () -> assertTrue(1 > 0) + ); + } +``` +**异常断言 ** +Assertions.assertThrows方法,用来测试Executable实例执行execute方法时是否抛出指定类型的异常; +如果execute方法执行时不抛出异常,或者抛出的异常与期望类型不一致,都会导致测试失败; +示例: +```java + @Test + @DisplayName("异常的断言") + void exceptionTesting() { + // 其execute方法执行时,如果抛出了异常,并且异常的类型是assertThrows的第一个参数(这里是ArithmeticException.class), + // 返回值是异常的实例 + Exception exception = assertThrows(ArithmeticException.class, () -> Math.floorDiv(1,0)); + log.info("assertThrows通过后,返回的异常实例:{}", exception.getMessage()); + } +``` +### 3.3 断言使用准则 +**对象实例是否相等断言** +1.是否是同一个对象实例 + ```html + 使用Junitd的Assertions.assertEquals + Assertions.assertEquals(expectedJobDetail, actualJobDetail) + ``` + + + 不是同一个实例,但是比较实例的属性值是否完全相等 + AssertJ + ```html + 常用场景 数据库更新操作前/后的对象比较 + 使用AssertJ的assertThat断言usingRecursiveComparison模式 + Assertions.assertThat(actualObject).usingRecursiveComparison().isEqualTo(expectedObject); + ``` + + +2.list等集合结果的断言 + 结果集集合的大小需要断言 + 范围或则具体大size + + 结果集集合中的每个对象需要断言,推荐结合stream模式的Predicate进行使用 + 示例: + ```java + ArrayList jobRespProtocolArrayList=service.batchChange(jobDetailReqBatchUpdate); + //list配和stream的predicate进行断言判断 + Predicate statusPrecate = e -> e.getStatus()==0; + assertEquals(2, jobRespProtocolArrayList.size()); + assertTrue(jobRespProtocolArrayList.stream().anyMatch(statusPrecate)); + ``` + +## 4.Mock模拟返回数据 + +有时我们单测一些api或者service模块,其中的service或者dao对于一些方法的返回值默认是null,但是逻辑里面有对这个返回null的对象进行判断或者二次取值的话,就是引发一些异常 + +示例: + +```java + PageInfo pageInfo = + udfService.getManagerPages(udfName, udfTypes, userName, curPage, pageSize); + message = Message.ok(); + // 这里的pageInfo是null,后续的get方法就会出现异常 + message.data("infoList", pageInfo.getList()); + message.data("totalPage", pageInfo.getPages()); + message.data("total", pageInfo.getTotal()); +``` + +mock模拟数据示例: + +```java + PageInfo pageInfo = new PageInfo<>(); + pageInfo.setList(new ArrayList<>()); + pageInfo.setPages(10); + pageInfo.setTotal(100); + // 对 udfService.getManagerPages 方法进行任意传递参数,模拟返回pageInfo对象 + // 有了这个模拟数据,上面示例在执行get方法的时候,就不会有异常 + Mockito.when( + udfService.getManagerPages( + Mockito.anyString(), + Mockito.anyCollection(), + Mockito.anyString(), + Mockito.anyInt(), + Mockito.anyInt())) + .thenReturn(pageInfo); +``` + +## 5.单元测试的编写 + +### 5.1 类的划分 + +按类的大功能可以大体分类 +- Controller 提供http服务的controller 配合mockmvc做单元测试 +- Service 业务逻辑代码的service层 +- Dao 与数据库操作的Dao层 +- util工具功能类 常用的功能工具 +- exception类 自定义的异常类 +- enum类 枚举类 +- entity类 用于DB交互以及方法处理的参数VO对象等实体类(若除了正常的get set外还有其他自定义函数的需要进行单元测试) + +### 5.2 Controller类的单元测试 +使用Mockmvc +主要验证 接口请求RequestMethod方式,基本参数,以及返回结果预期。 +主要场景:带上非必要参数和不带非必要参数的场景 异常 + +```java + @Test + public void testList() throws Exception { + //带上非必要参数 + MultiValueMap paramsMap = new LinkedMultiValueMap<>(); + paramsMap.add("startDate", String.valueOf(System.currentTimeMillis())); + MvcResult mvcResult = mockMvc.perform(get("/jobhistory/list") + .params(paramsMap)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + + Message res = JsonUtils.jackson().readValue(mvcResult.getResponse().getContentAsString(), Message.class); + assertEquals(res.getStatus(), MessageStatus.SUCCESS()); + logger.info(mvcResult.getResponse().getContentAsString()); + + //不带非必要参数 + mvcResult = mockMvc.perform(get("/jobhistory/list")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + + res = JsonUtils.jackson().readValue(mvcResult.getResponse().getContentAsString(), Message.class); + assertEquals(res.getStatus(), MessageStatus.SUCCESS()); + + logger.info(mvcResult.getResponse().getContentAsString()); + } + +``` +### 5.3 Server 类的单元测试 + //todo +### 5.4 Dao 类的单元测试 +使用H2数据库,配置文件中application.properties中需要配置H2数据库的基本信息,以及mybatis的相关路径信息 + +```properties +#h2数据库配置 +spring.datasource.driver-class-name=org.h2.Driver +#连接数据库 +spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=true +#初始化数据库表的脚本 +spring.datasource.schema=classpath:create.sql +#初始化数据库表中的数据的脚本 +spring.datasource.data=classpath:data.sql +spring.datasource.username=sa +spring.datasource.password= +spring.datasource.hikari.connection-test-query=select 1 +spring.datasource.hikari.minimum-idle=5 +spring.datasource.hikari.auto-commit=true +spring.datasource.hikari.validation-timeout=3000 +spring.datasource.hikari.pool-name=linkis-test +spring.datasource.hikari.maximum-pool-size=50 +spring.datasource.hikari.connection-timeout=30000 +spring.datasource.hikari.idle-timeout=600000 +spring.datasource.hikari.leak-detection-threshold=0 +spring.datasource.hikari.initialization-fail-timeout=1 + +#配置mybatis-plus的mapper信息 因为使用的是mybatis-plus,使用mybatis-plus浅醉 +mybatis-plus.mapper-locations=classpath:org/apache/linkis/jobhistory/dao/impl/JobDetailMapper.xml,classpath:org/apache/linkis/jobhistory/dao/impl/JobHistoryMapper.xml +mybatis-plus.type-aliases-package=org.apache.linkis.jobhistory.entity +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +``` + +编写规范 +1. 使用@Transactional以及@Rollback 实现数据回滚,避免数据污染 +2. 每一个DaoTest应该有一个创建初始化数据公共方法(或导入数据的方式csv)来准备数据,相关的查询,更新,删除等操作都应该先调用该公共方法进行数据的准备 +3. 创建测试的数据,如果某属性值是自增id,则不应该进行赋值 +4. 创建的测试数据,应尽可能和实际样例数据保持一致 +5. 更新数据测试时,如果字段允许,请带上`modify-原始值`前缀 + + + + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/license.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/license.md new file mode 100644 index 00000000000..8d96d44c674 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/license.md @@ -0,0 +1,166 @@ +--- +title: License 须知 +sidebar_position: 0.1 +--- + +>注:本文仅适用于Apache项目。 +>本文参考 Dolphinscheduler项目的License须知文档 https://dolphinscheduler.apache.org/zh-cn/community/development/DS-License.html + +ASF(Apache基金会)下的开源项目,对于License有着极其严苛的要求,当您为Linkis贡献代码时,就必须按照Apache的规则来,为了避免贡献者在License上浪费过多的时间, +本文将为您讲解ASF—License以及参与 Linkis 项目开发时如何规避掉License风险。 + +## 1.License 文件目录说明 + +licence相关的可以划分为3部分 +- 源码级别 主要需要关注的场景是: 在项目工程源码中,直接引入第三方资源(如 直接使用了某个其他项目的代码JAVA文件,新增了文本、css、js、图片、图标、音视频等文件,以及在第三方基础上做的修改) +- 项目的安装物料包 主要需要关注的场景是: 依赖的第三方jar包的运行态依赖,pom 配置中 通过dependency依赖引入 即最后编译打包会被打包到发布的安装包中的 +- 管理台的安装物料包 主要需要关注的场景是:前端web编译依赖的第三方npm依赖包 通过linkis-web/package.json 配置引入 + + +[Linkis源码](https://github.com/apache/linkis)涉及到license的目录如下 + +```shell script +# 最外层目录开始 + +├── LICENSE //项目源码的LICENSE 一些没有asf header的文件或则引入外部资源需要在这里标明 +├── NOTICE //项目源码的NOTICE 一般不会变动 +├── licenses //项目源码级别引入第三方组件license 说明 +│ └── LICENSE-py4j-0.10.9.5-src.txt +├── linkis-dist +│ └── release-docs +│ ├── LICENSE //编译的安装包中依赖的第三方jar包的license信息汇总 +│ ├── licenses //编译的安装包中依赖的第三方jar包对应的license信息详细 +│ │ ├── LICENSE-log4j-api.txt +│ │ ├── LICENSE-log4j-core.txt +│ │ ├── LICENSE-log4j-jul.txt +│ │ ├── LICENSE-xxxx.txt +│ └── NOTICE //编译的安装包中依赖的第三方jar包的NOTICE 汇总 +├── linkis-web + └── release-docs + ├── LICENSE //前端web编译安装包第三方npm依赖的LICENSE信息汇总 + ├── licenses //前端web编译安装包第三方npm依赖对应的license信息详细 + │ ├── LICENSE-vuedraggable.txt + │ ├── LICENSE-vue-i18n.txt + │ ├── LICENSE-vue.txt + │ ├── LICENSE-vuescroll.txt + │ └── LICENSE-xxxx.txt + └── NOTICE //前端web编译安装包第三方npm依赖的NOTICE 汇总 + + +``` + + +## 2.如何在 Linkis 合法的使用第三方开源软件 + +当你提交的代码有如下场景时: + +- 场景1. 源码中有新增(或移除)使用第三方代码或则静态资源,如源码中直接使用了某个其他项目的代码文件文件,新增了文本、css、js、图片、图标、音视频等文件,以及在第三方基础上做的修改。 +- 场景2. 项目的运行态依赖有新增(或移除)(运行态依赖:即最后编译打包会被打包到发布的安装包中的) + +- 场景1中的引入的文件必须是[ASF第三方许可证策](https://apache.org/legal/resolved.html)的A类License +- 场景2中的引入的依赖必须是[ASF第三方许可证策](https://apache.org/legal/resolved.html)中的A类/B类License,不能是C类License + +我们需要知道被我们项目引入的文件或jar依赖的NOTICE/LICENSE,(绝大多数的开源项目都会有NOTICE文件),这些必须在我们的项目中体现,用Apache的话来讲,就是"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work. + +### 2.1 示例 场景1 +比如源码中引入了`linkis-engineconn-plugins/python/src/main/py4j/py4j-0.10.7-src.zip`第三方文件 + +找到py4j-0.10.7-src.zip 对应的版本源码分支,如果对应版本分支无`LICENSE/NOTICE`文件,则选择主分支 +- 项目源码位于:https://github.com/bartdag/py4j/tree/0.10.7/py4j-python +- LICENSE文件:https://github.com/bartdag/py4j/blob/0.10.7/py4j-python/LICENSE.txt +- NOTICE文件:无 + +需要在`linkis/LICENSE`文件中说明`py4j-0.10.7-src.zip`的license信息。 +`py4j-0.10.7-src.zip`对应的详细的license.txt文件放在同级的目录下`linkis-engineconn-plugins/python/src/main/py4j/LICENSE-py4j-0.10.7-src.txt` +因为https://github.com/bartdag/py4j/tree/0.10.7/py4j-python 没有NOTICE文件,所以`linkis/NOTICE`文件中无需追加。 + +### 2.2 示例 场景 2 + +项目编译依赖了`org.apache.ant:ant:1.9.1`,ant-1.9.1.jar会在最后的编译安装包`target/apache-linkis-x.x.x-bin/linkis-package/lib`中 +可以解压ant-1.9.1.jar,从jar包中提取LICENSE/NOTICE文件,如果没有,则需要找到对应的版本源码 +找到py4j-0.10.7-src.zip 对应的版本源码分支,如果对应版本分支没有,则选择主分支 +- 项目源码位于:https://github.com/apache/ant/tree/rel/1.9.1 +- LICENSE文件:https://github.com/apache/ant/blob/rel/1.9.1/LICENSE +- NOTICE文件:https://github.com/apache/ant/blob/rel/1.9.1/NOTICE + +需要在`linkis/LICENSE-binary`文件中说明`ant-1.9.1.jar`的license信息。 +`ant-1.9.1.jar`对应的详细的license.txt文件放在`licenses-binary/LICENSE-ant.txt` +`ant-1.9.1.jar`对应的详细的notice.txt,追加到 `NOTICE-binary`文件中 + +关于具体的各个开源协议使用协议,在此不做过多篇幅一一介绍,有兴趣可以自行查询了解。 + +## 3.license 检测规则 +我们为自己的项目建立license-check脚本,是为了确保我们在使用过程中能够第一时间避免License的问题。 + +当我们需要添加新的Jar或其他外部资源的时候,我们需要按照以下步骤: + +* 在 tool/dependencies/known-dependencies.txt中添加你所需要的jar名称+版本。 +* 在 linkis-web/release-docs/LICENSE(根据实际情况决定)中添加相关的license信息。 +* 在 linkis-web/release-docs/NOTICE(根据实际情况决定)中追加相关的NOTICE文件,此文件请务必和依赖项的代码版本仓库中的NOTICE文件一致。 + +:::caution 注意 +如果是移除的场景,则对应的上述步骤的反向操作,需要在对应的文件中移除相应的LICENSE/NOTICE内容,总之需要保证这几个文件与实际源码/编译包的数据保持一致 +- tool/dependencies/known-dependencies.txt +- LICENSE/LICENSE-binary/LICENSE-binary-ui +- NOTICE/NOTICE-binary/NOTICE-binary-ui +::: + +** check dependency license fail** + +编译后 执行tool/dependencies/diff-dependenies.sh 脚本验证 +``` +--- /dev/fd/63 2020-12-03 03:08:57.191579482 +0000 ++++ /dev/fd/62 2020-12-03 03:08:57.191579482 +0000 +@@ -1,0 +2 @@ ++HikariCP-java6-2.3.13.jar +@@ -16,0 +18 @@ ++c3p0-0.9.5.2.jar +@@ -149,0 +152 @@ ++mchange-commons-java-0.2.11.jar +Error: Process completed with exit code 1. +``` +一般来讲,添加一个jar的工作往往不会如此轻易的结束,因为它往往依赖了其它各种各样的jar,这些jar我们同样需要添加相应的license。 +这种情况下,我们会在check里面得到 check dependency license fail的错误信息,如上,我们缺少了HikariCP-java6-2.3.13、c3p0等的license声明, +按照添加jar的步骤补充即可。 + + +## 4.附件 +附件:新jar的邮件格式 +``` +[VOTE][New/Remove Jar] jetcd-core(registry plugin support etcd3 ) + + +(说明目的,以及需要添加/移除的 jar 是什么) +Hi, the registry SPI will provide the implementation of etcd3. Therefore, we need to introduce a new jar (jetcd-core, jetcd-launcher (test)), which complies with the Apache-2.0 License. I checked his related dependencies to make sure it complies with the license of the Apache project. + +new or remove jar : + +jetcd-core version -x.x.x license apache2.0 +jetcd-launcher (test) version -x.x.x license apache2.0 + +dependent jar(它依赖了哪些jar,最好附带版本,以及相关采用的license协议): +grpc-core version -x.x.x license XXX +grpc-netty version -x.x.x license XXX +grpc-protobuf version -x.x.x license XXX +grpc-stub version -x.x.x license XXX +grpc-grpclb version -x.x.x license XXX +netty-all version -x.x.x license XXX +failsafe version -x.x.x license XXX + +如果是新增,邮件需要附上如下内容 +相关地址:主要有github地址、license文件地址、notice 文件地址、maven中央仓库地址 + +github address:https://github.com/etcd-io/jetcd +license:https://github.com/etcd-io/jetcd/blob/master/LICENSE +notice:https://github.com/etcd-io/jetcd/blob/master/NOTICE + +Maven repository: +https://mvnrepository.com/artifact/io.etcd/jetcd-core +https://mvnrepository.com/artifact/io.etcd/jetcd-launcher +``` + +## 5.参考文章 +* [COMMUNITY-LED DEVELOPMENT "THE APACHE WAY"](https://apache.org/dev/licensing-howto.html) +* [ASF 3RD PARTY LICENSE POLICY](https://apache.org/legal/resolved.html) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/log.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/log.md new file mode 100644 index 00000000000..ca81c056c35 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/log.md @@ -0,0 +1,23 @@ +--- +title: 日志规范 +sidebar_position: 2 +--- +1. 【**强制**】日志信息需要使用英文,不能使用中文。可选中英文混打。 + +1. 【**约定**】Linkis选择slf4j和Log4j2作为日志打印框架,去除了Spring-Cloud包中自带的logback。由于Slf4j会随机选择一个日志框架进行绑定,所以以后在引入新maven包的时候,需要将诸如slf4j-log4j等桥接包exclude掉,不然日志打印会出现问题。但是如果新引入的maven包依赖log4j等包,不要进行exclude,不然代码运行可能会报错 + +2. 【**配置**】log4j2的配置文件默认为log4j2.xml,需要放置在classpath中。如果需要和springcloud结合,可以在application.yml中加上logging:config:classpath:log4j2-spring.xml(配置文件的位置) + +3. 【**强制**】类中不可直接使用日志系统(log4j2、Log4j、Logback)中的API。java采用 LoggerFactory.getLogger(getClass).如果是Scala代码,强制继承Logging trait,Scala打印日志建议加上logger.info 不要直接用info等方法调用,不会打印正确的方法和行数。 + +4. 【**开发约定**】由于EngineConn是由EngineConnManager通过命令行进行启动的,所以我们在命令行中指定了日志的配置文件的路径,同时也对日志的配置在代码运行中进行了改造,特别是将EngineConn的日志重定向到了系统的standard out中。所以约定EngineConn的日志配置文件在EnginePlugin中定义,名称为log4j2-engineconn.xml(这个是约定名,不能更改) + +5. 【**强制**】严格区分日志级别。Fatal级别的日志,在springcloud应用初始化的时候,就应该抛出来,并使用System.out(-1)退出。ERROR级别的异常为开发人员必须关注和处理的异常,不要随便用ERROR级别的。Warn级别是用户操作异常日志和一些方便日后排除BUG的日志。INFO为关键的流程日志。DEBUG为调式日志,尽量少写。 + +6. 【**强制**】要求:INFO级别的日志,每个小模块都必须有,关键的流程,都至少有INFO级别的日志。守护线程清理资源等必须有WARN级别的日志。 + +7. 【**强制**】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。 正例:logger.error(各类参数或者对象toString + "_" + e.getMessage(), e); + +8. 【**强制**】日志打印时禁止直接用 JSON 工具将对象转换成 String,如果你的类需要在log里面打印,请重写toString方法,不然不知道怎么找问题,只会打印对象名,不会知道具体的对象内容 + +9. 【**强制**】在日志输出时,字符串变量之间的拼接使用占位符的方式 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/mapper-xml.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/mapper-xml.md new file mode 100644 index 00000000000..c85afb6fa79 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/mapper-xml.md @@ -0,0 +1,159 @@ +--- +title: Mapper XML 规范 +sidebar_position: 10 +--- + +> Contributor为Apache Linkis贡献新的数据表,编写Mapper XML时需遵循如下规范进行开发。 + +## 1.基本遵循规范 +- 在mapper.xml中namespace等于java接口地址 +- java接口中的方法名和XML中statement的id一致 +- java接口中的方法输入参数类型和XML中statement的parameterType指定的类型一致 +- java接口中的方法返回值类型和XML中statement的resultType指定的类型一致 +- XML中所有mysql关键字统一使用小写 +- 对于过多的查询字段抽象出SQL片段 +- 对于整型返回值类型建议使用Integer,可以区分未赋值和值为0的情况,如确定返回值为数字可使用int。其它数据类型类似。 +- 对于占位符,使用#{name},而不要使用${name}。模糊查询可以使用CONCAT('%',#{sname},'%') +- 对于sql语句编写,不使用注解方式,统一写在XML文件中 + +## 2.方法名称规范 + +|方法名称| 说明| 核心点| 建议| +|:---- |:--- |:--- |:--- | +|insert | 新增数据 | 如果是自增主键,应该返回主键ID| | +|deleteById | 根据主键ID删除数据| sql默认加limit 1,防止多删数据 |此方法不建议有,建议逻辑删除| +|updateById | 根据主键ID修改数据| sql默认加limit 1,防止多修改数据| | +|selectById | 根据主键查询数据| 查询一条数据 | | +|selectByIdForUpdate | 根据主键加锁查询数据| 加锁查询一条数据,事务处理用 | | +|queryListByParam | 根据输入条件查询数据列表| 多参数查询列表 | | +|queryCountByParam | 根据输入条件查询总数| 多参数查询数量 | | + +## 3.parameterType规范 +java接口中必须包含@Param,XML中可以不包含parameterType +### 3.1 基本类型 +```java +// java接口 +User selectUserById(@Param("id") Integer id); +// XML文件 + +``` +### 3.2 集合类型 +```java +// java接口 +List userListByIds(@Param("ids") List ids); +// XML文件 + +``` +### 3.3 Map类型 +```java +// java接口 +User queryByParams(@Param("map") Map parasms); +// XML文件 + +``` +### 3.4 实体类型 +```java +// java接口 +User queryByUser(@Param("user") User user); +// XML文件 + +``` +### 3.5 多个参数类型 +```java +// java接口 +User queryByIdAndName(@Param("id") Integer id, @Param("name") String name); +// XML文件 + +``` +## 4.XML文件编写示例 +合理地使用空格和缩进来增强可读性,各类型sql语句示例如下 +```sql + + + -- 新增语句 + + insert into user (id, name) + values (1, 'z3'); + + + -- 删除语句 + + delete from user + where name = #{name} + and id = #{id} + + + -- 修改语句 + + update user + set name = #{name} + where id = #{id} + + + -- 查询语句 + + + -- sql片段 + + id, + name + + -- 引用 + + + -- resultMap + + + + + -- 引用 + + + -- 条件判断 + + name = #{name} + + + -- 子查询 + + +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/overview.md new file mode 100644 index 00000000000..ed4cde6e9c7 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/overview.md @@ -0,0 +1,19 @@ +--- +title: 总览 +sidebar_position: 0 +--- +为了规范 Linkis 的社区开发环境,提高 Linkis 后续版本开发迭代的产出质量,规范 Linkis 的整个开发设计流程,强烈建议各位 Contributor 遵守以下开发规范: + +- [License 须知](license.md) +- [编程规范](programming-specification.md) +- [日志规范](log.md) +- [异常规范](exception-catch.md) +- [接口规范](api.md) +- [并发规范](concurrent.md) +- [路径规范](path-usage.md) +- [测试规范](unit-test.md) +- [版本和新特性规范](version-feature-specifications.md) + +**说明**:Linkis1.0 初始版本的开发规范较为精简,后续会随着 Linkis 的版本迭代不断补充和完善,欢迎各位 Contributor 提出自己的见解和意见。 + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/path-usage.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/path-usage.md new file mode 100644 index 00000000000..b697edcbb84 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/path-usage.md @@ -0,0 +1,13 @@ +--- +title: 路径规范 +sidebar_position: 6 +--- + +请注意:Linkis 提供了统一的 Storage模块,所以在使用路径或在配置文件中配置路径时,必须遵守 Linkis 路径规范。 + +1. 【**强制**】使用文件路径时不管是本地,hdfs,http都必须带有schema信息。其中: + - 本地文件 的 Scheme 头为:file:///; + - HDFS 的 Scheme 头为:hdfs:///; + - http 的 Scheme 头为:http:///。 + +2. 路径中不应该存在特殊字符,尽量英文,下划线,数字进行组合。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/programming-specification.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/programming-specification.md new file mode 100644 index 00000000000..04795eff836 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/programming-specification.md @@ -0,0 +1,102 @@ +--- +title: 编程规约 +sidebar_position: 1 +--- +## 1. 命名规约 +1. 【**强制**】不要用中文拼音和看不懂的缩写 +2. 基本的Java命名规范可以参考[命名规范](https://alibaba.github.io/Alibaba-Java-Coding-Guidelines/#naming-conventions) +3. 【约束】在linkis中有scalastyle风格配置文件,如果不符合规范的需要按照scalastyle的风格进行命名 +4. 【**强制**】配置文件命令、启动命名、进程命名、配置的key等也需要遵守命名规范,规范如下: + +|分类| 风格| 规范| 例子| +|:---- |:--- |:--- |:--- | +|配置文件|小写'-'分隔| linkis-分类层级(ps/cg/mg)-服务名.propertis| linkis-cg-linkismanager.properties| +|启停脚本|小写'-'分隔| linkis-分类层级-服务名| linkis-cg-linkismanager| +|模块目录|小写'-'分隔| 模块目录必须在对应的分类层级下面,并以模块名为子目录| linkis-public-enhancements/linkis-bml| +|进程命名|驼峰命名| 以Linkis开头服务名结尾| LinkisBMLApplication| +|配置Key命名|小写'.'分隔| linkis+模块名+keyName| linkis.bml.hdfs.prefix| + +## 2. 注释规约 +1. 【**强制**】类、类属性、接口方法必须加注释,且注释必须使用 Javadoc 规范,使用`/**内容*/`格式。 + +示例: +```java +/** Wrap the communication between Bml service */ +public class BmlAppServiceImpl implements BmlAppService { + /** Bml client */ + private BmlClient client; +} +``` +2. 【**强制**】所有的类都不要添加创建者。Linkis项目已捐献给Apache,无须添加作者信息。 + +3. 【**强制**】所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。 + +4. 【**强制**】方法内部单行注释,在被注释语句上方另起一行,使用 // 注释。方法内部多行注释使用 /* */ 注释,注意与代码对齐。 + +示例: +```java + // Store the reflection relation between parameter variable like 'T' and type like + Map typeVariableReflect = new HashMap<>(); +``` +5. 【**强制**】所有的枚举类型字段必须要有注释,说明每个数据项的用途。 + +示例: +```java +/** + * 节点监控状态信息 + * to monitor node status info + */ +public enum NodeHealthy { + + /** + * 状态正常 + * healthy status + */ + Healthy, + + /** + * EM自己标识自己为UnHealthy 或者manager把他标识为UnHealthy 处理引擎状态不正常, + * manager主动要求所有的engine强制退出(engine自杀) + * EM identifies itself as UnHealthy or + * The manager marks it as abnormal in the status of UnHealthy processing engine. + * The manager requests all engines to withdraw forcibly (engine suicide). + */ + UnHealthy, + + /** + * 引擎处于告警状态,但是可以接受任务 + * The engine is in the alarm state, but can accept tasks + */ + WARN, + + /** + * 存量可用状态,可以接受任务。当EM状态最近n次心跳没有上报,但是已经启动的Engine还是正常的可以接受任务 + * The stock is available and can accept tasks. When the EM status is not reported for the last n heartbeats, + * the Engine that has been started is still normal and can accept tasks + */ + StockAvailable, + + /** + * 存量不可用状态,不可以接受任务。(超过n+1没上报心跳)或者(EM自己判断,但是服务正常的情况), + * 但是如果往上面提交任务会出现error失败情况 EM处于StockUnavailable时, + * manager主动要求所有的engine非强制退出,manager需要将EM标识为UnHealthy。 + * 如果StockUnavailable状态如果超过n分钟,则发送IMS告警 + * The stock is not available. Tasks cannot be accepted + */ + StockUnavailable; +} +``` +6. 【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。 +7. 【推荐】在类中删除未使用的任何字段、方法、内部类;在方法中删除未使用的任何参数声明与内部变量。 +8. 【参考】谨慎注释掉代码。在上方详细说明,而不是简单地注释掉。如果无用,则删除。代码被注释掉有两种可能性:1)后续会恢复此段代码逻辑。2)永久不用。前者如果没有备注信息,难以知晓注释动机。后者建议直接删掉即可,假如需要查阅历史代码,登录代码仓库即可。 + +示例: +```java + public static final CommonVars TUNING_CLASS = + CommonVars.apply( + "wds.linkis.cs.ha.class", "org.apache.linkis.cs.highavailable.DefaultContextHAManager"); + // 应该删除如下注释代码 + // public static final CommonVars TUNING_CLASS = + // CommonVars.apply("wds.linkis.cs.ha.class","org.apache.linkis.cs.persistence.ProxyMethodA"); +``` +9. 【参考】对于注释的要求:第一、能够准确反映设计思想和代码逻辑;第二、能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看的,使其能够快速接替自己的工作。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/release-notes.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/release-notes.md new file mode 100644 index 00000000000..f79192ef99c --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/release-notes.md @@ -0,0 +1,42 @@ +--- +title: Release-Notes 编写规范 +sidebar_position: 9 +--- +每次版本发布前,需要由发布经理或则开发者,整理好本次版本的release-notes,来简要地描述了新版本更新中包含的特定更改。 + +为保持统一和方便编写,制定如下规范: +- 需要有版本的总结,几句话总结性的描述本版本的核心主要变动点 +- 按变化的功能点 以 新特性/增强点/修复功能/其他 四大类进行分类罗列 +- 包含致谢栏:有参与本此版本贡献的同学,除了issue/pr外,以及任何参与到此次版本讨论/社群答疑/意见建议的同学 +- 每条note的规范:`[服务名缩写-L1 maven module名][Linkis-pr/issues序号] 本次变动简要描述信息,能通过描述信息,大体知道这个功能的变化` `[服务名缩写-L1 maven module名]`作为一个标签,示例如下 +- 同一类别(新特性/增强点/修复功能/其他)下, 服务名相同的放在一起,按pr/issues序号升序排列 +- 需要有对应的英文文档 + +``` +服务名缩写:此pr的变动,在代码层面上,主要归属的服务对应的服务名缩写 +比如某pr是对JDBC引擎做了bug修复,在代码层面上,它是linkis-cg-engineconn 服务下的JDBC模块 +EG:[EC-Jdbc][[Linkis-1851]](https://github.com/apache/linkis/issues/1851) 修复jdbc引擎,一次任务执行中存在多条sql语句时无法正常执行的问题 +若 L1 maven module 不存在,或则是整个服务级别的调整,下级模块可以不写,比如Entrance +``` + +## 常见的notes 标签 +```html +linkis-mg-eureka Eureka +linkis-mg-gateway Gataway +linkis-cg-linkismanager LM +linkis-cg-engineconnplugin ECP +linkis-cg-engineconnmanager ECM +linkis-cg-engineconn EC +linkis-cg-entrance Entrance +linkis-ps-publicservice PS +linkis-ps-cs CS +linkis-ps-metadatamanager MDM +linkis-ps-data-source-query DSQ + +Web管理台 Web +安装 Install +安装-脚本 Install-Scripts +安装-SQL Install-Sql +安装-Web Install-Web +公共模块 Common +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/unit-test.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/unit-test.md new file mode 100644 index 00000000000..7e486ddcd23 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/unit-test.md @@ -0,0 +1,12 @@ +--- +title: 测试规约 +sidebar_position: 7 +--- + +1. 【**强制**】工具类和服务内部接口一定要有测试样例。 +2. 【**强制**】单元测试需要能够自动化(通过 mvn编译即可触发)、独立性(单元测试用例间不可相互调用)、可重复执行(可以多次执行,结果一样)。 +3. 【**强制**】一个测试用例应该只测试一个方法。 +4. 【**强制**】测试用例异常不可以catch,需要向上抛出。 +5. 【**强制**】单元测试代码必须写在如下工程目录:src/test/java or scala,不允许写在其他录下。 +6. 【推荐】单元测试需要考虑边界条件,如日期需要考虑月末和2月。 +7. 【推荐】对于数据库相关的单元测试,要考虑数据回滚。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/version-feature-specifications.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/version-feature-specifications.md new file mode 100644 index 00000000000..f1f441b5874 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/development-specification/version-feature-specifications.md @@ -0,0 +1,26 @@ +--- +title: 版本和新特性规范 +sidebar_position: 8 +--- + +## 1. 新增版本规范 +当您有新的版本需要时,需要遵循以下步骤: +1. 【强制】新版本一定需要组织PMC成员和开发者进行讨论,需要记录会议纪要发送邮件列表 +2. 【强制】新版本的特性列表范围,需要发起邮件投票.需要3+ PMC成员同意且同意票大于反对票 +3. 【强制】版本投票通过后,需要在GitHub建立对应的版本[Project](https://github.com/apache/linkis/projects) +4. 【强制】每个特性需要单独发送邮件列表,说明设计原因、设计思路 +5. 【强制】涉及到安装、数据库、配置修改的也需要发送邮件列表 +6. 【推荐】一个特性对应一个issue对应一个PR +7. 【强制】每个版本需要保证CICD通过、测试案例通过才可以发布版本 +8. 【约束】每个版本需要有对应的Leader,leader需要管理相关的Issue和PR,并拉会讨论、积极回复邮件、确认方案、追踪进度等 + + +## 2. 新加特性规范 +当您有新特性的新增时,需要遵循以下步骤: +1. 【强制】新特性需要发送邮件进行投票,并附上设计原因,设计思路 +2. 【强制】需要在GitHub对应的版本中新添加特性[Project](https://github.com/apache/linkis/projects) +3. 【强制】涉及到安装、数据库、配置修改的也需要发送邮件列表 +4. 【强制】新的特性一定要新增文档 +5. 【强制】新加特性需要新增对应的单元测试,[单元测试规范](https://linkis.apache.org/community/development-specification/unit_test) +6. 【推荐】一个特性对应一个issue对应一个PR + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/directory-structure.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/directory-structure.md new file mode 100644 index 00000000000..1d2bc407415 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/directory-structure.md @@ -0,0 +1,296 @@ +--- +title: 目录结构 +sidebar_position: 2.0 +--- + +> Linkis代码层级目录结构,以及安装包目录结构和部署后的目录结构说明,如果想详细了解各个模块,请查看[Linkis的相关架构设计](architecture/overview.md) + +## 1. 源码目录结构 + +```html +├── docs +│   ├── configuration //linkis所有模块的配置项文档 +│   ├── errorcode //linkis所有模块的错误码文档 +├── linkis-commons //核心抽象,里面放有所有的公用模块 +│   ├── linkis-common //通用模块,内置很多通用工具类 +│   ├── linkis-hadoop-common +│   ├── linkis-httpclient //Java SDK顶层接口 对httpclient的进一步封装 +│   ├── linkis-module // linkis的服务顶层公用模块 涉及到服务启动时的参数和服务初始化 统一的Restful处理 登录态校验等 +│   ├── linkis-mybatis //SpringCloud的Mybatis模块 +│   ├── linkis-protocol //服务请求/响应的一些接口和实体类 +│   ├── linkis-rpc //RPC模块,基于Feign实现的复杂双向通信 +│   ├── linkis-scheduler //通用调度模块 +│   ├── linkis-storage //文件操作工具集 +├── linkis-computation-governance //计算治理服务 +│   ├── linkis-client //Java SDK,用户通过Client可直接访问Linkis +│   ├── linkis-computation-governance-common +│   ├── linkis-engineconn +│   ├── linkis-engineconn-manager +│   ├── linkis-entrance //通用底层entrance模块 +│   ├── linkis-jdbc-driver //可以类似jdbc sdk方式连接使用linkis +│   ├── linkis-manager +├── linkis-dist //编译打包最后阶段步骤 整合所有lib包和安装部署脚本配置等 +│   ├── bin +│   │   ├── checkEnv.sh +│   │   ├── common.sh +│   │   └── install.sh //安装脚本 +│   ├── deploy-config +│   │   ├── db.sh //数据库配置 +│   │   └── linkis-env.sh //linkis 启动相关配置 +│   ├── docker +│   │   └── scripts +│   ├── helm +│   │   ├── charts +│   │   ├── scripts +│   │   ├── README_CN.md +│   │   └── README.md +│   ├── package +│   │   ├── bin +│   │   ├── conf +│   │   ├── db +│   │   └── sbin +│   ├── release-docs +│   │   ├── licenses +│   │   ├── LICENSE +│   │   └── NOTICE +│   ├── src +│   └── pom.xml +├── linkis-engineconn-plugins // 引擎 +│   ├── elasticsearch +│   ├── flink +│   ├── hive +│   ├── io_file +│   ├── jdbc +│   ├── openlookeng +│   ├── pipeline +│   ├── presto +│   ├── python +│   ├── seatunnel +│   ├── shell +│   ├── spark +│   ├── sqoop +├── linkis-extensions // 扩展功能增强插件模块 +│   ├── linkis-io-file-client // 对linkis-storage的功能扩展 +├── linkis-orchestrator //服务的编排 +│   ├── linkis-code-orchestrator +│   ├── linkis-computation-orchestrator +│   ├── linkis-orchestrator-core +├── linkis-public-enhancements //公共增强服务 +│   ├── linkis-basedata-manager +│   ├── linkis-bml // 物料库 +│   ├── linkis-configuration +│   ├── linkis-context-service //统一上下文 +│   ├── linkis-datasource //数据源服务 +│   ├── linkis-error-code +│   ├── linkis-instance-label +│   ├── linkis-jobhistory +│   ├── linkis-ps-common-lock +│   ├── linkis-script-dev +│   ├── linkis-udf +│   ├── linkis-variable +├── linkis-spring-cloud-services //微服务治理 +│   ├── linkis-service-discovery +│   ├── linkis-service-gateway //网关Gateway +├── linkis-web //linkis的管理台代码 +│   ├── release-docs +│   │   ├── licenses +│   │   └── LICENSE +│   ├── src +│   ├── config.sh +│   ├── install.sh +│   ├── package.json +│   ├── pom.xml +│   └── vue.config.js +├── tool +│   ├── dependencies +│   │   ├── known-dependencies.txt +│   │   └── regenerate_konwn_dependencies_txt.sh +│   ├── code-style-idea.xml +│   ├── license-header +│   └── modify_license.sh +├── CONTRIBUTING_CN.md +├── CONTRIBUTING.md +├── linkis-tree.txt +├── mvnw +├── mvnw.cmd +├── pom.xml +├── README_CN.md +├── README.md +└── scalastyle-config.xml + +``` + +## 2. 安装包目录结构 + +> Linkis安装包解压后的目录结构 + +下载官方发布的[编译完整包](https://linkis.apache.org/zh-CN/download/main),解压后的目录结构如下: +```html + +├── bin +│   ├── checkEnv.sh ── 环境变量检测 +│   ├── common.sh ── 部分公共shell函数 +│   └── install.sh ── Linkis安装的主脚本 +├── deploy-config +│ ├── db.sh //数据库连接配置 +│ └── linkis-env.sh //相关环境配置信息 +├── docker +├── helm +├── licenses +├── linkis-package //微服务相关的启动配置文件,依赖,脚本,linkis-cli等 +│ ├── bin +│ ├── conf +│ ├── db +│ ├── lib +│ └── sbin +├── NOTICE +├── LICENSE +├── README_CN.md +└── README.md + +``` + + +## 3. 部署后的目录结构 + +安装后`${LINKIS_HOME}`目录结构 + +```html +├── bin ── linkis-cli 用于向Linkis提交任务的Shell命令行程序 +│   ├── linkis-cli +│   ├── linkis-cli-hive +│   ├── linkis-cli-pre +│   ├── linkis-cli-spark-sql +│   ├── linkis-cli-spark-submit +│   └── linkis-cli-sqoop +├── conf 配置目录 +│   ├── application-eureka.yml +│   ├── application-linkis.yml ── 微服务通用yml +│   ├── linkis-cg-engineconnmanager.properties +│   ├── linkis-cg-engineplugin.properties +│   ├── linkis-cg-entrance.properties +│   ├── linkis-cg-linkismanager.properties +│   │── linkis-cli +│   │ ├── linkis-cli.properties +│   │ └── log4j2.xml +│   ├── linkis-env.sh ── linkis 环境变量配置 +│   ├── linkis-mg-gateway.properties +│   ├── linkis.properties ── linkis 服务的全局配合,所有微服务启动都会加载使用 +│   ├── linkis-ps-publicservice.properties +│   ├── log4j2.xml +├── db 数据库DML和DDL文件目录 +│   ├── linkis_ddl.sql ── 数据库表定义SQL +│   ├── linkis_dml.sql ── 数据库表初始化SQL +│   └── module ── 包含各个微服务的DML和DDL文件 +│   └── upgrade ── 针对每个版本 增量DML/DDL +├── lib lib目录 +│   ├── linkis-commons ── 公共依赖包 大多服务启动时(linkis-mg-gateway除外) -cp 路径参数 都会加载这个目录 +│   ├── linkis-computation-governance ──计算治理模块的lib目录 +│   ├── linkis-engineconn-plugins ──所有引擎插件的lib目录 +│   ├── linkis-public-enhancements ──公共增强服务的lib目录 +│   └── linkis-spring-cloud-services ──SpringCloud的lib目录 +├── logs 日志目录 +│ ├── linkis-cg-engineconnmanager-gc.log +│ ├── linkis-cg-engineconnmanager.log +│ ├── linkis-cg-engineconnmanager.out +│ ├── linkis-cg-engineplugin-gc.log +│ ├── linkis-cg-engineplugin.log +│ ├── linkis-cg-engineplugin.out +│ ├── linkis-cg-entrance-gc.log +│ ├── linkis-cg-entrance.log +│ ├── linkis-cg-entrance.out +│ ├── linkis-cg-linkismanager-gc.log +│ ├── linkis-cg-linkismanager.log +│ ├── linkis-cg-linkismanager.out +│ ├── linkis-cli +│ │   ├── linkis-client.hadoop.log.20220409162400037523664 +│ ├── linkis-mg-eureka-gc.log +│ ├── linkis-mg-eureka.log +│ ├── linkis-mg-eureka.out +│ ├── linkis-mg-gateway-gc.log +│ ├── linkis-mg-gateway.log +│ ├── linkis-mg-gateway.out +│ ├── linkis-ps-publicservice-gc.log +│ ├── linkis-ps-publicservice.log +│ └── linkis-ps-publicservice.out +├── pid 所有微服务的进程ID +│   ├── linkis_cg-engineconnmanager.pid ──引擎管理器微服务 +│   ├── linkis_cg-engineconnplugin.pid ──引擎插件微服务 +│   ├── linkis_cg-entrance.pid ──引擎入口微服务 +│   ├── linkis_cg-linkismanager.pid ──linkis管理器微服务 +│   ├── linkis_mg-eureka.pid ──eureka微服务 +│   ├── linkis_mg-gateway.pid ──gateway微服务 +│   └── linkis_ps-publicservice.pid ──公共微服务 +└── sbin 微服务启停脚本目录 +     ├── ext ──各个微服务的启停脚本目录 +     ├── linkis-daemon.sh ── 快捷启停、重启单个微服务脚本 +  ├── linkis-start-all.sh ── 一键启动全部微服务脚本 + └── linkis-stop-all.sh ── 一键停止全部微服务脚本 + +``` + +### 3.1 配置项修改 + +在执行完Linkis安装后,所有配置项位于conf目录下, +如果需要进行配置项修改,修改配置`${LINKIS_HOME}/conf/*properties`文件后,重启对应的服务, +如:`sh sbin/linkis-daemon.sh start ps-publicservice`。 +如果修改的是公共配置文件`application-eureka.yml/application-linkis.yml/linkis.properties`,需要重启所有服务`sh sbin/linkis-start-all.sh` + + + + +### 3.2 微服务启停 + +所有微服务名称如下: + ``` +├── linkis-cg-engineconnmanager 引擎管理服务 +├── linkis-cg-engineplugin 引擎插件管理服务 +├── linkis-cg-entrance 计算治理入口服务 +├── linkis-cg-linkismanager 计算治理管理服务 +├── linkis-mg-eureka 微服务注册中心服务 +├── linkis-mg-gateway Linkis网关服务 +├── linkis-ps-publicservice 公共服务 + ``` + +**微服务简称**: + + | 简称 | 英文全称 | 中文全称 | + |------|-------------------------|------------| + | cg | Computation Governance | 计算治理 | + | mg | Microservice Covernance | 微服务治理 | + | ps | Public Enhancement Service | 公共增强服务 | + + + +``` +# 一次性启动所有微服务: + + sh linkis-start-all.sh + +# 一次性关停所有微服务 + + sh linkis-stop-all.sh + +# 启动单个微服务(服务名需要去掉linkis前缀如:mg-eureka) + + sh linkis-daemon.sh start service-name + + 例如: sh linkis-daemon.sh start mg-eureka + +# 关闭单个微服务 + + sh linkis-daemon.sh stop service-name + + 例如: sh linkis-daemon.sh stop mg-eureka + +# 重启单个微服务 + + sh linkis-daemon.sh restart service-name + + 例如: sh linkis-daemon.sh restart mg-eureka +# 查看单个微服务的状态 + + sh linkis-daemon.sh status service-name + + 例如: sh linkis-daemon.sh status mg-eureka +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/c-debug.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/c-debug.png new file mode 100644 index 00000000000..d5edce7fe24 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/c-debug.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/c-port.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/c-port.png new file mode 100644 index 00000000000..2c0a8cb420f Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/c-port.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/debug.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/debug.png new file mode 100644 index 00000000000..4c0a9e39e4e Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/debug.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-0.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-0.png new file mode 100644 index 00000000000..3ebe85fe283 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-0.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-1.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-1.png new file mode 100644 index 00000000000..3ebe85fe283 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-1.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-2.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-2.png new file mode 100644 index 00000000000..95ad650c167 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/images/test-2.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/new-engine-conn.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/new-engine-conn.md new file mode 100644 index 00000000000..0af601bc4a5 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/new-engine-conn.md @@ -0,0 +1,477 @@ +--- +title: 如何实现新引擎 +sidebar_position: 8.0 +--- + +## 1. Linkis新引擎功能代码实现 + +实现一个新的引擎其实就是实现一个新的EngineConnPlugin(ECP)引擎插件。具体步骤如下: + +### 1.1 新建一个maven模块,并引入ECP的maven依赖 + +![maven依赖](/Images-zh/EngineConnNew/engine_jdbc_dependency.png) + +```xml + + org.apache.linkis + linkis-engineconn-plugin-core + ${linkis.version} + + +``` + +### 1.2 实现ECP的主要接口 + +- **EngineConnPlugin:** 启动EngineConn时,先找到对应的EngineConnPlugin类,以此为入口,获取其它核心接口的实现,是必须实现的主要接口。 + +- **EngineConnFactory:** 实现如何启动一个引擎连接器,和如何启动一个引擎执行器的逻辑,是必须实现的接口。 + - 实现createEngineConn方法:返回一个EngineConn对象,其中,getEngine返回一个封装了与底层引擎连接信息的对象,同时包含Engine类型信息。 + - 对于只支持单一计算场景的引擎,继承SingleExecutorEngineConnFactory,实现createExecutor,返回对应的Executor。 + - 对于支持多计算场景的引擎,需要继承MultiExecutorEngineConnFactory,并为每种计算类型实现一个ExecutorFactory。EngineConnPlugin会通过反射获取所有的ExecutorFactory,根据实际情况返回对应的Executor。 +- **EngineConnResourceFactory:** 用于限定启动一个引擎所需要的资源,引擎启动前,将以此为依 据 向 Linkis Manager 申 请 资 源。非必须,默认可以使用GenericEngineResourceFactory。 +- **EngineLaunchBuilder:** 用于封装EngineConnManager可以解析成启动命令的必要信息。非必须,可以直接继承JavaProcessEngineConnLaunchBuilder。 + +### 1.3 实现引擎Executor执行器逻辑 + +Executor为执行器,作为真正的计算场景执行器,是实际的计算逻辑执行单元,也是对引擎各种具体能力的抽象,提供加锁、访问状态、获取日志等多种不同的服务。并根据实际的使用需要,Linkis默认提供以下的派生Executor基类,其类名和主要作用如下: + +- **SensibleExecutor:** + - Executor存在多种状态,允许Executor切换状态 + - Executor切换状态后,允许做通知等操作 +- **YarnExecutor:** 指Yarn类型的引擎,能够获取得到applicationId和applicationURL和队列。 +- **ResourceExecutor:** 指引擎具备资源动态变化的能力,配合提供requestExpectedResource方法,用于每次希望更改资源时,先向RM申请新的资源;而resourceUpdate方法,用于每次引擎实际使用资源发生变化时,向RM汇报资源情况。 +- **AccessibleExecutor:** 是一个非常重要的Executor基类。如果用户的Executor继承了该基类,则表示该Engine是可以被访问的。这里需区分SensibleExecutor的state()和 AccessibleExecutor 的 getEngineStatus()方法:state()用于获取引擎状态,getEngineStatus()会获取引擎的状态、负载、并发等基础指标Metric数据。 +- 同时,如果继承了 AccessibleExecutor,会触发Engine 进程实例化多个EngineReceiver方法。EngineReceiver用于处理Entrance、EM和LinkisMaster的RPC请求,使得该引擎变成了一个可被访问的引擎,用户如果有特殊的RPC需求,可以通过实现RPCService接口,进而实现与AccessibleExecutor通信。 +- **ExecutableExecutor:** 是一个常驻型的Executor基类,常驻型的Executor包含:生产中心的Streaming应用、提交给Schedulis后指定要以独立模式运行的脚步、业务用户的业务应用等。 +- **StreamingExecutor:** Streaming为流式应用,继承自ExecutableExecutor,需具备诊断、do checkpoint、采集作业信息、监控告警的能力。 +- **ComputationExecutor:** 是常用的交互式引擎Executor,处理交互式执行任务,并且具备状态查询、任务kill等交互式能力。 +- **ConcurrentComputationExecutor:** 用户并发引擎Executor,常用于JDBC类型引擎,执行脚本时,由管理员账户拉起引擎实例,所有用户共享引擎实例。 + +## 2. 以JDBC引擎为例详解新引擎的实现步骤 + +本章节以JDBC引擎举例,详解新引擎的实现过程,包括引擎代码的编译、安装、数据库配置,管理台引擎标签适配,以及Scripts中新引擎脚本类型扩展和工作流新引擎的任务节点扩展等。 + +### 2.1 并发引擎设置默认启动用户 + +JDBC引擎中的核心类`JDBCEngineConnExecutor`继承的抽象类是`ConcurrentComputationExecutor`,计算类引擎中的核心类`XXXEngineConnExecutor`继承的抽象类是`ComputationExecutor`。这导致两者最大的一个区别是:JDBC引擎实例由管理员用户启动,被所有用户共享,以提高机器资源利用率;而计算引擎类型的脚本在提交时,每个用户下会启动一个引擎实例,用户间引擎实例互相隔离。这个在此处暂不细说,因为无论是并发引擎还是计算引擎,下文提到的额外修改流程应是一致的。 + +相应的,如果你新增的引擎是并发引擎,那么你需要关注下这个类:AMConfiguration.scala,如果你新增的引擎是计算类引擎,则可忽略。 + +```scala +object AMConfiguration { + // 如果你的引擎是多用户并发引擎,那么这个配置项需要关注下 + val MULTI_USER_ENGINE_TYPES = CommonVars("wds.linkis.multi.user.engine.types", "jdbc,ck,es,io_file,appconn") + + private def getDefaultMultiEngineUser(): String = { + // 此处应该是为了设置并发引擎拉起时的启动用户,默认jvmUser即是引擎服务Java进程的启动用户 + val jvmUser = Utils.getJvmUser + s"""{jdbc:"$jvmUser", presto: "$jvmUser" es: "$jvmUser", ck:"$jvmUser", appconn:"$jvmUser", io_file:"root"}""" + } +} +``` + +### 2.2 新引擎类型扩展 + +实现`ComputationSingleExecutorEngineConnFactory`接口的类`JDBCEngineConnFactory`中,下面两个方法需要实现: + +```scala +override protected def getEngineConnType: EngineType = EngineType.JDBC + +override protected def getRunType: RunType = RunType.JDBC +``` + +因此需要在EngineType和RunType中增加JDBC对应的变量。 + +```scala +// EngineType.scala中类似已存在引擎的变量定义,增加JDBC相关变量或代码 +object EngineType extends Enumeration with Logging { + val JDBC = Value("jdbc") +} + +def mapStringToEngineType(str: String): EngineType = str match { + case _ if JDBC.toString.equalsIgnoreCase(str) => JDBC +} + +// RunType.scla中 +object RunType extends Enumeration { + val JDBC = Value("jdbc") +} +``` + +### 2.3 JDBC引擎标签中的版本号设置 + +```scala +// 在LabelCommonConfig中增加JDBC的version配置 +public class LabelCommonConfig { + public final static CommonVars JDBC_ENGINE_VERSION = CommonVars.apply("wds.linkis.jdbc.engine.version", "4"); +} + +// 在EngineTypeLabelCreator的init方法中补充jdbc的匹配逻辑 +// 如果这一步不做,代码提交到引擎上时,引擎标签信息中会缺少版本号 +public class EngineTypeLabelCreator { + private static void init() { + defaultVersion.put(EngineType.JDBC().toString(), LabelCommonConfig.JDBC_ENGINE_VERSION.getValue()); + } +} +``` + +### 2.4 允许脚本编辑器打开的脚本文件类型 + +关注配置项:wds.linkis.storage.file.type + +```scala +object LinkisStorageConf{ + val FILE_TYPE = CommonVars("wds.linkis.storage.file.type", "dolphin,sql,scala,py,hql,python,out,log,text,sh,jdbc,ngql,psql,fql").getValue +} +``` + +### 2.5 配置JDBC脚本变量存储和解析 + +如果这个操作不做,JDBC的脚本中变量不能被正常存储和解析,脚本中直接使用${变量}时代码会执行失败! + +![变量解析](/Images-zh/EngineConnNew/variable_resolution.png) + +```scala +// 通过CodeAndRunTypeUtils工具类中的CODE_TYPE_AND_RUN_TYPE_RELATION变量来维护codeType和runType间的对应关系 +val CODE_TYPE_AND_RUN_TYPE_RELATION = CommonVars("wds.linkis.codeType.runType.relation", "sql=>sql|hql|jdbc|hive|psql|fql,python=>python|py|pyspark,java=>java,scala=>scala,shell=>sh|shell") +``` + +参考PR:https://github.com/apache/linkis/pull/2047 + +### 2.6 Linkis管理员台界面引擎管理器中加入JDBC引擎文字提示或图标 + +linkis-web/src/dss/module/resourceSimple/engine.vue + +```js +methods: { + calssifyName(params) { + switch (params) { + case 'jdbc': + return 'JDBC'; + ...... + } + } + // 图标过滤 + supportIcon(item) { + const supportTypes = [ + ...... + { rule: 'jdbc', logo: 'fi-jdbc' }, + ]; + } +} +``` + + + +最终呈现给用户的效果: + +![JDBC类型引擎](/Images-zh/EngineConnNew/jdbc_engine_view.png) + +### 2.7 JDBC引擎的编译打包和安装部署 + +JDBC引擎模块编译的示例命令如下: + +```shell +cd /linkis-project/linkis-engineconn-pluginsengineconn-plugins/jdbc + +mvn clean install -DskipTests +``` + +编译完整项目时,新增引擎默认不会加到最终的tar.gz压缩包中,如果需要,请修改如下文件: + +linkis-dist/src/main/assembly/distribution.xml + +```xml + + + ...... + + + ../linkis-engineconn-plugins/jdbc/target/out/ + + linkis-package/lib/linkis-engineconn-plugins/ + + **/* + + + +``` + +然后对在项目根目录运行编译命令: + +```shell +mvn clean install -DskipTests +``` + +编译成功后在linkis-dist/target/apache-linkis-1.x.x-bin.tar.gz和linkis-engineconn-plugins/jdbc/target/目录下找到out.zip。 + +上传out.zip文件到Linkis的部署节点,解压缩到Linkis安装目录/lib/linkis-engineconn-plugins/下面: + +![引擎安装](/Images-zh/EngineConnNew/engine_set_up.png) + +解压后别忘记删除out.zip,至此引擎编译和安装完成。 + +### 2.8 JDBC引擎数据库配置 + +在管理台选择添加引擎 + +![添加引擎](/Images-zh/EngineConnNew/add_engine_conf.png) + + + +如果您希望在管理台支持引擎参数配置,可以按照JDBC引擎SQL示例修改数据库。 + +此处以JDBC引擎为例,引擎安装完之后,要想运行新的引擎代码,还需对引擎进行数据库配置,以JDBC引擎为例,按照你自己实现的新引擎的情况,请按需修改。 + +SQL参考如下: + +```sql +SET @JDBC_LABEL="jdbc-4"; + +SET @JDBC_ALL=CONCAT('*-*,',@JDBC_LABEL); +SET @JDBC_IDE=CONCAT('*-IDE,',@JDBC_LABEL); +SET @JDBC_NODE=CONCAT('*-nodeexecution,',@JDBC_LABEL); + +-- JDBC +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', '范围:1-20,单位:个', 'jdbc引擎最大并发数', '2', 'NumInterval', '[1,20]', '0', '0', '1', '队列资源', 'jdbc'); + +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.driver', '取值范围:对应JDBC驱动名称', 'jdbc驱动名称','', 'None', '', '0', '0', '1', '数据源配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.url', '例如:jdbc:hive2://127.0.0.1:10000', 'jdbc连接地址', 'jdbc:hive2://127.0.0.1:10000', 'None', '', '0', '0', '1', '数据源配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.version', '取值范围:jdbc3,jdbc4', 'jdbc版本','jdbc4', 'OFT', '[\"jdbc3\",\"jdbc4\"]', '0', '0', '1', '数据源配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.max', '范围:1-20,单位:个', 'jdbc引擎最大连接数', '10', 'NumInterval', '[1,20]', '0', '0', '1', '数据源配置', 'jdbc'); + +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.auth.type', '取值范围:SIMPLE,USERNAME,KERBEROS', 'jdbc认证方式', 'USERNAME', 'OFT', '[\"SIMPLE\",\"USERNAME\",\"KERBEROS\"]', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.username', 'username', '数据库连接用户名', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.password', 'password', '数据库连接密码', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.principal', '例如:hadoop/host@KDC.COM', '用户principal', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.keytab.location', '例如:/data/keytab/hadoop.keytab', '用户keytab文件路径', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.proxy.user.property', '例如:hive.server2.proxy.user', '用户代理配置', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); + +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.cores', '取值范围:1-8,单位:个', 'jdbc引擎初始化核心个数', '1', 'NumInterval', '[1,8]', '0', '0', '1', 'jdbc引擎设置', 'jdbc'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', '取值范围:1-8,单位:G', 'jdbc引擎初始化内存大小', '1g', 'Regex', '^([1-8])(G|g)$', '0', '0', '1', 'jdbc引擎设置', 'jdbc'); + +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@JDBC_ALL, 'OPTIONAL', 2, now(), now()); + +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) + (select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'jdbc' and label_value = @JDBC_ALL); + +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@JDBC_IDE, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@JDBC_NODE, 'OPTIONAL', 2, now(), now()); + + + +select @label_id := id from linkis_cg_manager_label where `label_value` = @JDBC_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @JDBC_NODE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + + +-- jdbc default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) + (select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @JDBC_ALL); +``` + +如果想重置引擎的数据库配置数据,参考文件如下,请按需进行修改使用: + +```sql +-- 清除jdbc引擎的初始化数据 +SET @JDBC_LABEL="jdbc-4"; + +SET @JDBC_ALL=CONCAT('*-*,',@JDBC_LABEL); +SET @JDBC_IDE=CONCAT('*-IDE,',@JDBC_LABEL); +SET @JDBC_NODE=CONCAT('*-nodeexecution,',@JDBC_LABEL); + +delete from `linkis_ps_configuration_config_value` where `config_label_id` in + (select `relation`.`engine_type_label_id` AS `config_label_id` FROM `linkis_ps_configuration_key_engine_relation` relation INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @JDBC_ALL); + + +delete from `linkis_ps_configuration_key_engine_relation` +where `engine_type_label_id` in + (select label.id FROM `linkis_ps_configuration_config_key` config + INNER JOIN `linkis_cg_manager_label` label + ON config.engine_conn_type = 'jdbc' and label_value = @JDBC_ALL); + + +delete from `linkis_ps_configuration_category` +where `label_id` in (select id from `linkis_cg_manager_label` where `label_value` in(@JDBC_IDE, @JDBC_NODE)); + + +delete from `linkis_ps_configuration_config_key` where `engine_conn_type` = 'jdbc'; + +delete from `linkis_cg_manager_label` where `label_value` in (@JDBC_ALL, @JDBC_IDE, @JDBC_NODE); + +``` + +最终的效果: + +![JDBC引擎](/Images-zh/EngineConnNew/jdbc_engine_conf_detail.png) + +这样配置完之后,linkis-cli以及Scripts提交引擎脚本时,才能正确匹配到引擎的标签信息和数据源的连接信息,然后才能拉起你新加的引擎。 + +### 2.9 DSS Scripts中新增JDBC脚本类型以及图标等信息 + +如果你使用到了DSS的Scripts功能,还需要对dss项目中web的前端文件进行一些小小的改动,改动的目的是为了在Scripts中支持新建、打开、执行JDBC引擎脚本类型,以及实现引擎对应的图标、字体等。 + +#### 2.9.1 scriptis.js + +web/src/common/config/scriptis.js + +```js +{ + rule: /\.jdbc$/i, + lang: 'hql', + executable: true, + application: 'jdbc', + runType: 'jdbc', + ext: '.jdbc', + scriptType: 'jdbc', + abbr: 'jdbc', + logo: 'fi-jdbc', + color: '#444444', + isCanBeNew: true, + label: 'JDBC', + isCanBeOpen: true +}, +``` + +#### 2.9.2 脚本复制支持 + +web/src/apps/scriptis/module/workSidebar/workSidebar.vue + +```js +copyName() { + let typeArr = ['......', 'jdbc'] +} +``` + +#### 2.9.3 logo与字体配色 + +web/src/apps/scriptis/module/workbench/title.vue + +```js + data() { + return { + isHover: false, + iconColor: { + 'fi-jdbc': '#444444', + }, + }; + }, +``` + +web/src/apps/scriptis/module/workbench/modal.js + +```js +let logoList = [ + { rule: /\.jdbc$/i, logo: 'fi-jdbc' }, +]; +``` + +web/src/components/tree/support.js + +```js +export const supportTypes = [ + // 这里大概没用到 + { rule: /\.jdbc$/i, logo: 'fi-jdbc' }, +] +``` + +引擎图标展示 + +web/src/dss/module/resourceSimple/engine.vue + +```js +methods: { + calssifyName(params) { + switch (params) { + case 'jdbc': + return 'JDBC'; + ...... + } + } + // 图标过滤 + supportIcon(item) { + const supportTypes = [ + ...... + { rule: 'jdbc', logo: 'fi-jdbc' }, + ]; + } +} +``` + +web/src/dss/assets/projectIconFont/iconfont.css + +```css +.fi-jdbc:before { + content: "\e75e"; +} +``` + +此处控制的应该是: + +![引擎图标](/Images-zh/EngineConnNew/jdbc_engine_logo.png) + + + +找一个引擎图标的svg文件 + +web/src/components/svgIcon/svg/fi-jdbc.svg + +如果新引擎后续需要贡献社区,那么新引擎对应的svg图标、字体等需要确认其所属的开源协议,或获取其版权许可。 + +### 2.10 DSS的工作流适配 + +最终达成的效果: + +![工作流适配](/Images-zh/EngineConnNew/jdbc_job_flow.png) + +在dss_workflow_node表中保存新加JDBC引擎的定义数据,参考SQL: + +```sql +# 引擎任务节点基本信息定义 +insert into `dss_workflow_node` (`id`, `name`, `appconn_name`, `node_type`, `jump_url`, `support_jump`, `submit_to_scheduler`, `enable_copy`, `should_creation_before_node`, `icon`) values('18','jdbc','-1','linkis.jdbc.jdbc',NULL,'1','1','1','0','svg文件'); + +# svg文件对应新引擎任务节点图标 + +# 引擎任务节点分类划分 +insert into `dss_workflow_node_to_group`(`node_id`,`group_id`) values (18, 2); + +# 引擎任务节点的基本信息(参数属性)绑定 +INSERT INTO `dss_workflow_node_to_ui`(`workflow_node_id`,`ui_id`) VALUES (18,45); + +# 在dss_workflow_node_ui表中定义了引擎任务节点相关的基本信息,然后以表单的形式在上图右侧中展示,你可以为新引擎扩充其他基础信息,然后自动被右侧表单渲染。 +``` + +web/src/apps/workflows/service/nodeType.js + +```js +import jdbc from '../module/process/images/newIcon/jdbc.svg'; + +const NODETYPE = { + ...... + JDBC: 'linkis.jdbc.jdbc', +} + +const ext = { + ...... + [NODETYPE.JDBC]: 'jdbc', +} + +const NODEICON = { + [NODETYPE.JDBC]: { + icon: jdbc, + class: {'jdbc': true} + }, +} +``` + +在web/src/apps/workflows/module/process/images/newIcon/目录下增加新引擎的图标 + +web/src/apps/workflows/module/process/images/newIcon/jdbc + +同样贡献社区时,请考虑svg文件的lincese或版权。 + +## 3. 本章小结 + +上述内容记录了新引擎的实现流程,以及额外需要做的一些引擎配置。目前,一个新引擎的扩展流程还是比较繁琐的,希望能在后续版本中,优化新引擎的扩展、以及安装等过程。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/new-microservice.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/new-microservice.md new file mode 100644 index 00000000000..378b7a3dfd3 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/new-microservice.md @@ -0,0 +1,381 @@ +--- +title: 如何实现新的微服务 +sidebar_position: 9.0 +--- + +> 这篇文章介绍如何基于现有的Linkis微服务架构下,在本地开发调试一个新的微服务以及部署,方便有需要新增微服务的二次开发的同学参考。 + +思维导图: + +![思维导图](/Images-zh/deployment/microservice/thinking.png) + + +## 1. 新的微服务开发 + +> 本文以新增微服务`linkis-new-microservice`为示例,进行介绍。 如何在IDEA中创建和注册一个属于linkis新的微服务 + +**软件要求** +- jdk1.8 +- maven3.5+ + +### 1.1 新建子模块 + +**注意**:在什么模块下新建子模块,这个并不是固定的因情况而定,一般按服务组来划分确认,这里只是举例子。 + +- linkis-public-enhancements模块下 右键 + +![new-module](/Images-zh/deployment/microservice/new-module.png) + +- 选择maven点击Nex下一步 + +![maven-module](/Images-zh/deployment/microservice/maven-module.png) + +- 输入模块名点击Finsh + +![name-module](/Images-zh/deployment/microservice/name-module.png) + +- 创建成功 + +![created-successfully](/Images-zh/deployment/microservice/created-successfully.png) + +#### 1.1.1 修改linkis-new-microservice模块的pom.xml文件 + +**path**: linkis-public-enhancements/linkis-new-microservice/pom.xml + +``` +## 添加linkis的公共依赖模块和 mybatis模块依赖(如果不涉及数据库操作可以不添加mybatis) + + org.apache.linkis + linkis-module + ${project.version} + + + org.ow2.asm + asm + + + + + + org.apache.linkis + linkis-mybatis + ${project.version} + +``` + + +#### 1.1.2 新增服务对应的配置文件 + +> 配置文件按 linkis-服务名.properties来命名,统一放在`linkis-dist/package/conf/`目录下,服务启动时候会加载linkis.properties 通用配置文件以及linkis-服务名.properties配置文件 + +新增`linkis-new-microservice.properties`配置文件 + +**path**: linkis-dist/package/conf/linkis-new-microservice.properties + +``` properties +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +## 如不需提供接口Api则无需添加此配置 +##restful +wds.linkis.server.restful.scan.packages=org.apache.linkis.newmicroservice.server.restful + +## mybatis 数据操作项目的配置 +wds.linkis.server.mybatis.mapperLocations=classpath*:org/apache/linkis/newmicroservice/server/dao/mapper/*.xml +wds.linkis.server.mybatis.typeAliasesPackage=org.apache.linkis.newmicroservice.server.domain +wds.linkis.server.mybatis.BasePackage=org.apache.linkis.newmicroservice.server.dao + + +##切勿与其他服务的端口相同 +spring.server.port=9208 + +``` + + +#### 1.1.4 开启调试模式 + +> 方便进行接口的调式,无需进行登陆态的验证 + +**path**: linkis-dist/package/conf/linkis.properties + +![test-mode](/Images-zh/deployment/microservice/test-mode.png) + +``` properties +wds.linkis.test.mode=true # 打开测试模式 +wds.linkis.test.user=hadoop # 指定测试模式下,所有请求都代理给哪个用户 + +``` + + +### 1.2 代码开发 + +> 为方便大家学习,现以创建一个简单的API接口为示例。 + +#### 1.2.1 新建接口类 + +![new-microservice](/Images-zh/deployment/microservice/new-microservice.png) + +``` java +package org.apache.linkis.newmicroservice.server.restful; + + +import io.swagger.annotations.ApiOperation; +import org.apache.linkis.server.Message; +import org.springframework.web.bind.annotation.*; + +import io.swagger.annotations.Api; + +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "newmicroservice") +@RestController +@RequestMapping(path = "/newmicroservice") +public class NewMicroservice { + + + @ApiOperation(value = "establish", httpMethod = "GET") + @RequestMapping(path = "establish", method = RequestMethod.GET) + public Message list() { + Map<String,String> map=new HashMap<>(); + map.put("NewMicroservice","Hello! This is a new microservice I registered(这是我注册的一个新的微服务)"); + return Message.ok("").data("map", map); + } + +} +``` + +#### 1.2.2 新建启动类 + +![maven-module](/Images-zh/deployment/microservice/start-up.png) + +``` java + +package org.apache.linkis.newmicroservice.server; + +import org.apache.linkis.LinkisBaseServerApp; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class LinkisNewMicroserviceApplication { + + private static final Log logger = LogFactory.getLog(LinkisNewMicroserviceApplication.class); + + public static void main(String[] args) throws ReflectiveOperationException { + logger.info("Start to running LinkisNewmicroserviceApplication"); + LinkisBaseServerApp.main(args); + } +} +``` + +### 1.3 启动eureka服务 + +> 这一步骤的具体指引在 [调试指引](../development/debug) 文档中已有写 可直接访问,这里就不在过多介绍 + + +### 1.4 本地启动新微服务 + +> 设置linkis-new-microservice的启动Application + +![commissioning-service](/Images-zh/deployment/microservice/commissioning-service.png) + +参数解释: + +```shell +[Service Name] +linkis-new-microservice + +[Module Name] +linkis-new-microservice + +[VM Opitons] +-DserviceName=linkis-new-microservice -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.newmicroservice.server.LinkisNewmicroserviceApplication + +[Add provided scope to classpath] +通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。 +``` + +> 上述设置完成之后,可直接运行此Application。运行成功后打开浏览器输入eureka注册中心的url + +``` text + http://ip:port/ +``` + +![new-service](/Images-zh/deployment/microservice/new-service.png) + +> 当eureka注册中心出现linkis-new-microservice服务即为本地注册新的微服务成功。 + +### 1.5 Postman 进行接口调试 + +**URL**: http://ip:port/api/rest_j/v1/newmicroservice/establish + +![postman-test](/Images-zh/deployment/microservice/postman-test.png) + + + +## 2. 打包部署 +> 打包部署主要有有两个阶段 第一步是模块通过maven打包后 会将模块所需要的依赖 打包到模块对应的target目录下 linkis-new-microservice/target/out/lib。 +> 第二步是 组装完整的最终部署安装包时,需要将` linkis-new-microservice/target/out/lib` 自动拷贝至 `linkis-dist/target/apache-linkis-x.x.x-bin/linkis-package/lib`下 + +### 2.1 修改新服务下的distribution.xml + +**path**: linkis-public-enhancements/linkis-new-microservice/src/main/assembly/distribution.xml + +![new-distribution](/Images-zh/deployment/microservice/new-distribution.png) + +> 由于需要排除的依赖比较多这里只贴部分代码 + +``` xml + + antlr:antlr:jar + aopalliance:aopalliance:jar + com.fasterxml.jackson.core:jackson-annotations:jar + com.fasterxml.jackson.core:jackson-core:jar + +``` + +> 这里解释下为什么需要加`excludes`,因为服务启动脚本 linkis-dist/package/sbin/ext/linkis-common-start 中一般会默认加载通用的lib + +![common-start](/Images-zh/deployment/microservice/common-start.png) + +> 所以在打包服务依赖时候,可以排除已有的lib包.详细可以参考linkis-computation-governance/linkis-entrance/src/main/assembly/distribution.xml + + +### 2.2 修改linkis-dist下的distribution.xml + +**path**: linkis-dist/src/main/assembly/distribution.xml + + +> 添加fileSet 配置,改配置主要是控制编译打包时的能输出linkis-new-microservice服务包 + +![fileset](/Images-zh/deployment/microservice/fileset.png) + +> 这里只贴出来需要新增的配置内容。 + +``` xml + + + ../linkis-public-enhancements/linkis-new-microservice/target/out/lib + + + linkis-package/lib/linkis-public-enhancements/linkis-new-microservice + + + **/* + + + +``` + +### 2.3 服务的运行配置脚本 + +![new-configuration](/Images-zh/deployment/microservice/new-configuration.png) + +``` text + +#!/usr/bin/env bash +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# description: manager start cmd +# +# Modified for Linkis 1.0.0 + + +export SERVER_SUFFIX="linkis-public-enhancements/linkis-new-microservice" + + +export SERVER_CLASS=org.apache.linkis.newmicroservice.server.LinkisNewMicroserviceApplication + +#export DEBUG_PORT= + +export COMMON_START_BIN=$LINKIS_HOME/sbin/ext/linkis-common-start +if [[ ! -f "${COMMON_START_BIN}" ]]; then + echo "The $COMMON_START_BIN does not exist!" + exit 1 +else + sh $COMMON_START_BIN +fi + +``` + + +### 2.4 linkis-start-all.sh 配置修改 + +**path**: linkis-dist/package/sbin/linkis-start-all.sh + +![start-script](/Images-zh/deployment/microservice/start-script.png) + +> 这里只贴出来需要新增的配置内容。 + +``` text + ## 启动脚本 + #linkis-new-microservice + SERVER_NAME="new-microservice" + startApp +``` + +![detection-script](/Images-zh/deployment/microservice/detection-script.png) + +> 这里只贴出来需要新增的配置内容。 + +``` text + ##检测脚本 + #linkis-new-microservice + SERVER_NAME="new-microservice" + checkServer +``` + +### 2.5 linkis-stop-all.sh 配置修改 + +**path**:linkis-dist/package/sbin/linkis-stop-all.sh + +![stop-script](/Images-zh/deployment/microservice/stop-script.png) + +> 这里只贴出来需要新增的配置内容。 + +``` text + ## 停止脚本 + #linkis-new-microservice + export SERVER_NAME="new-microservice" + stopApp +``` + +### 2.6 安装包准备 + +> 这一步骤的具体指引在 [后端编译](../development/build) 文档中已有写 可直接访问,这里就不在过多介绍 + +### 2.7 服务器部署 + +> 这里为单机部署做示例,而该步骤的具体指引在 [单机部署](../deployment/deploy-quick) 文档中已有写 可直接访问,这里就不在过多介绍 +当安装部署成功后可直接在浏览器中访问eureka注册中心,看中心是否已经成功注册linkis-new-microservice服务,如注册成功即为创建新的微服务成功。 + +![new-service](/Images-zh/deployment/microservice/new-service.png) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/swwager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/swwager.md new file mode 100644 index 00000000000..9b570a3f7af --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/swwager.md @@ -0,0 +1,261 @@ +--- +title: Swagger 注解使用 +sidebar_position: 10.0 +--- + +## 1. Swagger注解的作用域 +| API| 作用范围 | 使用位置 | +| -------- | -------- | ----- | +|@Api|协议集描述|用于controller类上| +|@ApiOperation|协议描述|用在controller的方法上| +|@ApiImplicitParams|非对象参数集|用在controller的方法上| +|@ApiImplicitParam|非对象参数描述|用在@ApiImplicitParams的方法里边| +|@ApiResponses|Response集|用在controller的方法上| +|@ApiResponse|Response|用在 @ApiResponses里边| +|@ApiModel|描述返回对象的意义| 用在返回对象类上| +|@ApiModelProperty|对象属性|用在出入参数对象的字段上| +|@ApiParam|协议描述|用在方法、参数、类的字段上| + +## 2. @Api +使用位置即用在类上,对请求类进行描述。标识一个Controller类是Swagger文档类。 + +### 2.1 注解的属性 + +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|String|""|描述,无实际意义。| +|tags|String[]|""|分组| +|basePath|String|""|基本路径| +|protocols|String|int|请求协议| +|authorizations|Authorization[]|@Authorization(value = "")|高级特性认证时的配置| +|hidden|boolean|false|是否隐藏(不显示,默认为false)| + + +### 2.2 属性value、tags二者的区别 + +value属性作用在类和作用在方法上都用于描述; + +tags属性作用在类和作用在方法上都用于分组,但分组的效果区别很大: + +tags作用在类上时,会对全局的方法分组,即根据tags属性值复制多份,此时方法上的tags值无效,方法上tags配或不配效果都一样。 + +tags作用在方法上时,会根据当前类的所有方法的tags值做分组,粒度更细。 + +### 2.3 使用方法 +注意:java和scala在@Api注解上使用的区别 + +```java +*java +@Api(tags = "Swagger测试相关接口") +@RestController + +*scala +@Api(tags = Array("Swagger测试相关接口")) +@RestController +``` + + + +## 3. @ApiOperation +用在方法上,对请求方法进行描述。 +### 3.1 注解的属性 + +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|String|""|描述| +|notes|String|""| 详细描述| +|tags|String[]|""|分组| +|response|Class|Void.class|响应参数类型| +|responseReference|String[]|""|指定对响应类型的引用,本地/远程引用,并将覆盖任何其它指定的response()类| +|httpMethod|String|""|http请求方式,如:GET、HEAD、POST、PUT、DELETE、OPTION、SPATCH| +|hidden|boolean|false|是否隐藏(不显示)默认为false| +|code|int|200|http的状态码| +|extensions|Extension[]|@Extension(properties = @ExtensionProperty(name = "", value = "")|扩展属性| + +### 3.2 使用方法 + +```java +@GetMapping("test1") +@ApiOperation(value = "test1接口",notes = "test1接口详细描述") +public ApiResult test1(@RequestParam String aa, @RequestParam String bb, @RequestParam String cc) { + return ApiUtil.success("success"); +} +``` + +## 4. @ApiImplicitParams + +常用在方法上,对请求参数列表进行描述。 +其中的value属性可包含多个@ApiImplicitParam,对每个参加进行具体的描述。 + +### 4.1 注解的属性 +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|String|""|描述| + +## 5. @ApiImplicitParams + +用在方法上,对请求参数进行描述。当需要对多个参数进行描述时,作为@ApiImplicitParams的属性使用。 + +### 5.1 注解的属性 +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|String|""|描述| +|name|String|""|参数说明| +|defaultValue|String|""|默认值| +|allowableValues|String|""|参数允许值| +|required|boolean|false|是否必填,默认false| +|access|String|""|参数过滤| +|allowMultiple|boolean|false|参数是否可以通过多次出现来接受多个值,默认不允许| +|dataType|String|""|参数的数据类型,可以使类名或原始数据类型| +|dataTypeClass|Class|Void.class|参数的数据类型,如果提供则覆盖 dataType| +|paramType|String|""|参数类型,有效值为 path, query, body, header, form| +|example|String|""|非body类型的参数示例| +|examples|Example|@Example(value = @ExampleProperty(mediaType = “”, value = “”))|body类型的参数示例| +|type|String|""|添加覆盖检测到的类型的功能| +|format|String|""|添加提供自定义format格式的功能| +|readOnly|boolean|false|添加被指定为只读的功能| + +### 5.2 使用方法 + +```java +@GetMapping("test1") +@ApiOperation(value = "test1接口",notes = "test1接口详细描述") +@ApiImplicitParams(value = { + @ApiImplicitParam(name = "aa",value = "aa的说明",defaultValue = "1",allowableValues = "1,2,3",required = true), + @ApiImplicitParam(name = "bb",value = "bb的说明",defaultValue = "1",allowableValues = "1,2,3",required = true), + @ApiImplicitParam(name = "cc",value = "cc的说明",defaultValue = "2",allowableValues = "1,2,3",required = true), + +}) +``` + +## 6. @ApiParam + +用在方法、参数、类的字段上,对请求参数进行描述。 + +### 6.1 注解的属性 +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|String|""|描述| +|name|String|""|参数说明| +|defaultValue|String|""|默认值| +|allowableValues|String|""|参数允许值| +|required|boolean|false|是否必填,默认false| +|access|String|""|参数过滤| +|allowMultiple|boolean|false|参数是否可以通过多次出现来接受多个值,默认不允许| +|dataType|String|""|参数的数据类型,可以使类名或原始数据类型| +|dataTypeClass|Class|Void.class|参数的数据类型,如果提供则覆盖 dataType| +|paramType|String|""|参数类型,有效值为 path, query, body, header, form| +|example|String|""|非body类型的参数示例| +|examples|Example|@Example(value = @ExampleProperty(mediaType = “”, value = “”))|body类型的参数示例| +|type|String|""|添加覆盖检测到的类型的功能| +|format|String|""|添加提供自定义format格式的功能| +|readOnly|boolean|false|添加被指定为只读的功能| + +### 6.2 使用方法 + +```java +@GetMapping("test2") +@ApiOperation(value = "test2接口",notes = "test2接口详细描述") +public ApiResult test2(@ApiParam(value = "aa的说明") @RequestParam String aa, @ApiParam(value = "bb的说明") @RequestParam String bb) { + return ApiUtil.success(new TestRes()); +} +``` +## 7. @ApiModel + +用在类上,对请求、响应类,实体类进行描述。 + +### 7.1 注解的属性 +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|String|""| 为提供模型的替代名称,默认情况下,使用类名| +|description|String|""|类的描述| +|parent|Class parent|Void.class|为模型提供父类以允许描述继承关系| +|discriminatory|String|""|支持模型继承和多态,使用鉴别器的字段的名称,可以断言需要使用哪个子类型| +|subTypes|boolean|false|是否必填,默认false| +|access|Class parent|Void.class| 从此模型继承的子类型数组| +|reference|boolean|false|指定对应类型定义的引用,覆盖指定的任何其他元数据| + +## 8 @ApiModelProperty + +用在类上,对请求、响应类,实体类进行描述。 + +### 8.1 注解的属性 +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|String|""|属性说明| +|name|String|""|覆盖属性的名称| +|allowableValues|String|""|参数允许值| +|access|String|""|过滤属性| +|required|boolean|false|是否必填,默认false| +|dataType|String|""|参数的数据类型,可以使类名或原始数据类型| +|hidden|boolean|false| 是否隐藏| +|readOnly|String|""|添加被指定为只读的功能| +|reference|String|""|指定对应类型定义的引用,覆盖指定的任何其他元数据| +|allowEmptyValue|boolean|false|允许传空值| +|example|String|""|属性的示例值| + +### 8.2 使用方法 + +注意:java和scala在@ApiModelProperty注解上的使用的区别 + +```java +*java实体类 +@Data +@ApiModel(description = "测试请求类") +public class TestReq { + + @ApiModelProperty(value = "用户ID",required = true) + private Long userId; + @ApiModelProperty(value = "用户名",example = "张三") +} + +*scala实体类 +@Data +@ApiModel(description = "测试响应类") +public class TestRes { + @(ApiModelProperty @field)("用户ID") + private Long userId; + @(ApiModelProperty @field)("用户名") +} +``` + + +## 9. @ApiResponses + +用在方法、类上,对响应状态码列表进行描述。 + +### 9.1 注解的属性 +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|value|ApiResponse[]|""|响应状态码列表的描述| + +## 10. @ApiResponse + +用在方法上,对响应状态码进行描述。一般作为@ApiResponses的属性使用。 + +### 10.1 注解的属性 +| 属性名称 | 属性类型 | 属性默认值 | 属性描述 | +| -------- | -------- | ----- |----- | +|code|int|""|响应的HTTP状态码| +|message|String|""|响应的描述| +|response|Class|Void.class|用于描述消息有效负载的可选响应类,对应于响应消息对象的 schema 字段| +|reference|String|""|指定对响应类型的引用,指定的应用可以使本地引用,也可以是远程引用,将按原样使用,并将覆盖任何指定的response()类| +|responseHeaders|ResponseHeader[]|@ResponseHeader(name = "", response = Void.class)|可能响应的header列表| +|responseContainer|String|""|声明响应的容器,有效值为List,Set,Map,任何其他值都将被忽略| + + +### 10.2 使用方法 + +```java +@GetMapping("test2") +@ApiOperation(value = "test2接口",notes = "test2接口详细描述") +@ApiResponses(value = { + @ApiResponse(code = 200, message = "请求成功", responseHeaders = {@ResponseHeader(name = "header1", description = "header1的描述",response = String.class)}), + @ApiResponse(code = 401, message = "没有权限"), + @ApiResponse(code = 403, message = "禁止访问") +}) +public ApiResult test2(@ApiParam(value = "aa的说明") @RequestParam String aa, @ApiParam(value = "bb的说明") @RequestParam String bb) { + return ApiUtil.success(new TestRes()); +} + +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/_category_.json new file mode 100644 index 00000000000..f565b1d581f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "表结构", + "position": 13 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/all.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/all.md new file mode 100644 index 00000000000..e3d78b25c0f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/all.md @@ -0,0 +1,1782 @@ +--- +title: 库表结构 +sidebar_position: 1 +--- + +## 1. linkis_cg_ec_resource_info_record + +> 历史引擎信息记录表 ec 为`engine conn` 缩写 ecm为 engineconn manager 服务缩写 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_value` | ec 的label标签 stringValue 如 `userCreator, engineType`->`hadoop-LINKISCLI,shell-1`| varchar(255) | | NO | | | +| 3 | `create_user` | ec 的创建用户| varchar(128) | | NO | | | +| 4 | `service_instance` | ec 实例信息 如 bdpdev01dss02:19756| varchar(128) | | YES | | | +| 5 | `ecm_instance` | ecm 实例信息 如bdpdev01dss02:9102 | varchar(128) | | YES | | | +| 6 | `ticket_id` | ec 的 ticket id | varchar(100) | MUL | NO | | | +| 7 | `log_dir_suffix` | ec 日志log所在的路径 | varchar(128) | | YES | | | +| 8 | `request_times` | 资源请求次数 | int(8) | | YES | | | +| 9 | `request_resource` | 请求的资源 | varchar(1020) | | YES | | | +| 10 | `used_times` | 资源使用次数 | int(8) | | YES | | | +| 11 | `used_resource` | 使用的资源信息 | varchar(1020) | | YES | | | +| 12 | `release_times` | 释放资源次数 | int(8) | | YES | | | +| 13 | `released_resource` | 释放的资源 | varchar(1020) | | YES | | | +| 14 | `release_time` | 释放的时间 | datetime | | YES | | | +| 15 | `used_time` | 使用时间 | datetime | | YES | | | +| 16 | `create_time` | 创建时间| datetime | | YES | | CURRENT_TIMESTAMP | + + +**示例数据** + +| id | label_value | create_user | service_instance | ecm_instance | ticket_id | status | log_dir_suffix | request_times | request_resource | used_times | used_resource | release_times | released_resource | release_time | used_time | create_time | +| ---: | --- | --- | --- | --- | --- | --- | --- | ---: | --- | ---: | --- | ---: | --- | --- | --- | --- | +| 1 | hadoop-LINKISCLI,shell-1 | hadoop | bdpdev01dss02:19756 | bdpdev01dss02:9102 | fc0d442d-7e18-49f6-a01e-a4f4685f0155 | ShuttingDown | hadoop/20221025/shell/fc0d442d-7e18-49f6-a01e-a4f4685f0155/logs | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 2022-10-25 17:55:41 | 2022-10-25 17:53:09 | 2022-10-25 17:52:56 | +| 2 | hadoop-LINKISCLI,hive-2.3.3 | hadoop | bdpdev01dss02:20903 | bdpdev01dss02:9102 | 63ea31dc-65b1-42c4-8963-5fe4468f0ae0 | ShuttingDown | hadoop/20221025/hive/63ea31dc-65b1-42c4-8963-5fe4468f0ae0/logs | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 2022-10-25 17:55:52 | 2022-10-25 17:54:36 | 2022-10-25 17:54:20 | +| 3 | hadoop-LINKISCLI,python-python2 | hadoop | bdpdev01dss02:21320 | bdpdev01dss02:9102 | 3f8a4f73-fdbb-407e-ae1b-0b14b9d08bcf | ShuttingDown | hadoop/20221025/python/3f8a4f73-fdbb-407e-ae1b-0b14b9d08bcf/logs | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 1 | {"instance":1,"memory":"1024.0 MB","cpu":1} | 2022-10-25 17:57:41 | 2022-10-25 17:55:55 | 2022-10-25 17:55:44 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `idx_tid` | 将`ticket_id` 列设置为普通索引 | INDEX | `ticket_id` | +| 2 | `uniq_tid_lv` | 将`ticket_id`,`label_value`列设置为唯一索引 | UNIQUE KEY | `ticket_id`,`label_value` | + + + +## 2. linkis_cg_engine_conn_plugin_bml_resources + +> 引擎物料存储信息表 主要用于引擎实例启动时,根据对应的物料资源的进行下载,以及进行引擎物料刷新时会使用到。 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | Primary key | bigint(20) | PRI | NO | auto_increment | | +| 2 | `engine_conn_type` |引擎名 如 hive | varchar(100) | | NO | | | +| 3 | `version` | 物料版本 | varchar(100) | | YES | | | +| 4 | `file_name` | 文件名 conf.zip/lib.zip | varchar(255) | | YES | | | +| 5 | `file_size` | 大小 byte | bigint(20) | | NO | | 0 | +| 6 | `last_modified` |最新修改时间| bigint(20) | | YES | | | +| 7 | `bml_resource_id` | bml物料id | varchar(100) | | NO | | | +| 8 | `bml_resource_version` | bml物料版本 | varchar(200) | | NO | | | +| 9 | `create_time` | created time | datetime | | NO | | CURRENT_TIMESTAMP | +| 10 | `last_update_time` | updated time | datetime | | NO | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | engine_conn_type | version | file_name | file_size | last_modified | bml_resource_id | bml_resource_version | create_time | last_update_time | +| ---: | --- | --- | --- | ---: | ---: | --- | --- | --- | --- | +| 3 | hive | 2.3.3 | conf.zip | 2363 | 1666683401000 | 8f9879b4-9950-43c9-8eca-5f570211e784 | v000001 | 2022-10-25 15:42:08 | 2022-10-25 15:42:08 | +| 4 | hive | 2.3.3 | lib.zip | 106319116 | 1666683401000 | ac77aa15-e873-4f5f-9ed1-17435cad390f | v000001 | 2022-10-25 15:42:13 | 2022-10-25 15:42:13 | +| 5 | elasticsearch | 7.6.2 | conf.zip | 1981 | 1666683401000 | f17874ca-54fa-4153-8edb-a4d31268847b | v000001 | 2022-10-25 15:42:14 | 2022-10-25 15:42:14 | +| 6 | elasticsearch | 7.6.2 | lib.zip | 15935016 | 1666683401000 | 2f340471-a495-4b93-a197-b8eb362d04bb | v000001 | 2022-10-25 15:42:15 | 2022-10-25 15:42:15 | + + + +## 3. linkis_cg_manager_engine_em + +>引擎实例engine conn 和归属的ecm(engine conn manager)实例的关系表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `engine_instance` | ec 实例信息 | varchar(128) | | YES | | | +| 3 | `em_instance` | ecm 实例信息 | varchar(128) | | YES | | | +| 4 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | engine_instance | em_instance | update_time | create_time | +| ---: | --- | --- | --- | --- | +| 223 | localhost110003:10394 | localhost110003:9102 | 2022-11-12 23:30:09 | 2022-11-12 23:30:09 | +| 224 | localhost110003:33483 | localhost110003:9102 | 2022-11-12 23:30:48 | 2022-11-12 23:30:48 | +| 226 | localhost110003:19782 | localhost110003:9102 | 2022-11-13 01:48:05 | 2022-11-13 01:48:05 | + + + +## 4. linkis_cg_manager_label + +> 标签记录表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_key` | 标签 label | varchar(32) | MUL | NO | | | +| 3 | `label_value` | 标签值 json格式 | varchar(255) | | NO | | | +| 4 | `label_feature` | | varchar(16) | | NO | | | +| 5 | `label_value_size` | 标签存储的元素个数 | int(20) | | NO | | | +| 6 | `update_time` | | datetime | | NO | | CURRENT_TIMESTAMP | +| 7 | `create_time` | | datetime | | NO | | CURRENT_TIMESTAMP | + + +**示例数据** + +| id | label_key | label_value | label_feature | label_value_size | update_time | create_time | +| ---: | --- | --- | --- | ---: | --- | --- | +| 19 | combined_userCreator_engineType | *-nodeexecution,python-python2 | OPTIONAL | 2 | 2021-06-08 20:25:28 | 2021-06-08 20:25:28 | +| 21 | serverAlias | {"alias":"linkis-cg-engineconnmanager"} | OPTIONAL | 1 | 2021-06-08 20:27:07 | 2021-06-08 20:27:07 | +| 24 | combined_userCreator_engineType | {"creator":"IDE","user":"hadoop","engineType":"hive","version":"2.3.3"} | OPTIONAL | 4 | 2021-06-08 20:42:00 | 2021-06-08 20:42:00 | +| 26 | userCreator | {"creator":"IDE","user":"hadoop"} | OPTIONAL | 2 | 2021-06-08 20:42:07 | 2021-06-08 20:42:07 | +| 27 | engineType | {"engineType":"hive","version":"2.3.3"} | OPTIONAL | 2 | 2021-06-08 20:42:07 | 2021-06-08 20:42:07 | +| 28 | serverAlias | {"alias":"EngineConn"} | OPTIONAL | 1 | 2021-06-08 20:42:07 | 2021-06-08 20:42:07 | +| 29 | codeType | {"codeType":"hql"} | OPTIONAL | 1 | 2021-06-08 20:42:16 | 2021-06-08 20:42:16 | +| 30 | combined_userCreator_engineType | {"creator":"IDE","user":"root","engineType":"io_file","version":"1.0"} | OPTIONAL | 4 | 2021-06-08 20:50:47 | 2021-06-08 20:50:47 | +| 32 | userCreator | {"creator":"IDE","user":"root"} | OPTIONAL | 2 | 2021-06-08 20:50:52 | 2021-06-08 20:50:52 | +| 33 | concurrentEngineConn | {} | OPTIONAL | 0 | 2021-06-08 20:50:52 | 2021-06-08 20:50:52 | +| 34 | engineType | {"engineType":"io_file","version":"1.0"} | OPTIONAL | 2 | 2021-06-08 20:50:52 | 2021-06-08 20:50:52 | +| 35 | codeType | {"codeType":"io_file"} | OPTIONAL | 1 | 2021-06-08 20:50:59 | 2021-06-08 20:50:59 | +| 36 | combined_userCreator_engineType | johnnwang-*,*-* | OPTIONAL | 2 | 2021-06-08 22:07:07 | 2021-06-08 22:07:07 | +| 37 | combined_userCreator_engineType | {"creator":"IDE","user":"johnnwang","engineType":"flink","version":"1.11.1"} | OPTIONAL | 4 | 2021-06-08 22:07:20 | 2021-06-08 22:07:20 | +| 39 | userCreator | {"creator":"IDE","user":"johnnwang"} | OPTIONAL | 2 | 2021-06-08 22:07:26 | 2021-06-08 22:07:26 | +| 40 | engineType | {"engineType":"flink","version":"1.11.1"} | OPTIONAL | 2 | 2021-06-08 22:07:26 | 2021-06-08 22:07:26 | +| 41 | combined_userCreator_engineType | {"creator":"IDE","user":"johnnwang","engineType":"spark","version":"2.4.3"} | OPTIONAL | 4 | 2021-06-08 22:07:37 | 2021-06-08 22:07:37 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_lk_lv` | 将`label_key`,`label_value` 列设置为唯一索引 | UNIQUE KEY | `label_key`,`label_value` | + + + + +## 5. linkis_cg_manager_label_resource + +> 标签id 和资源id 的关联关系表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_id` | linkis_cg_manager_label的id | int(20) | UNI | YES | | | +| 3 | `resource_id` | linkis_cg_manager_linkis_resources对应的id | int(20) | | YES | | | +| 4 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | label_id | resource_id | update_time | create_time | +| ---: | ---: | ---: | --- | --- | +| 14217 | 13266 | 14218 | 2022-11-12 23:09:36 | 2022-11-12 23:09:36 | +| 14218 | 24 | 14219 | 2022-11-12 23:30:09 | 2022-11-12 23:30:09 | +| 14219 | 13267 | 14220 | 2022-11-12 23:30:09 | 2022-11-12 23:30:09 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_label_id` | 将`label_id` 列设置为唯一索引 | UNIQUE KEY | `label_id` | + + + + +## 6. linkis_cg_manager_label_service_instance + +>引擎实例engine conn/ecm(engine conn manager)实例 标签记录表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_id` | linkis_cg_manager_label的id | int(20) | MUL | YES | | | +| 3 | `service_instance` | 实例信息 | varchar(128) | | YES | | | +| 4 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + + +**示例数据** + +| id | label_id | service_instance | update_time | create_time | +| ---: | ---: | --- | --- | --- | +| 200 | 94 | bdpdev01dss02:33755 | 2022-11-14 17:11:26 | 2022-11-14 17:11:26 | +| 201 | 105 | bdpdev01dss02:9102 | 2022-11-15 14:54:56 | 2022-11-15 14:54:56 | +| 202 | 23 | bdpdev01dss02:9102 | 2022-11-15 14:54:56 | 2022-11-15 14:54:56 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `idx_lid_instance` | 将`label_id`,`service_instance` 列设置为普通索引 | INDEX | `label_id`,`service_instance` | + + + +## 7. linkis_cg_manager_label_user + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `username` | | varchar(255) | | YES | | | +| 3 | `label_id` | | int(20) | | YES | | | +| 4 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + + +## 8. linkis_cg_manager_label_value_relation + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_value_key` | | varchar(255) | MUL | NO | | | +| 3 | `label_value_content` | | varchar(255) | | YES | | | +| 4 | `label_id` | | int(20) | | YES | | | +| 5 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 6 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_lvk_lid` | 将`label_value_key`,`label_id` 列设置为唯一索引 | UNIQUE KEY | `label_value_key`,`label_id` | + + + +**示例数据** + +| label_value_key | label_value_content | label_id | update_time | create_time | +| --- | --- | ---: | --- | --- | +| creator | IDE | 7589 | 2022-05-16 19:31:13 | 2022-05-16 19:31:13 | +| user | owenxu | 7589 | 2022-05-16 19:31:13 | 2022-05-16 19:31:13 | +| creator | mide | 7511 | 2022-05-12 10:40:27 | 2022-05-12 10:40:27 | +| user | davidhua | 7511 | 2022-05-12 10:40:27 | 2022-05-12 10:40:27 | + + +## 9. linkis_cg_manager_linkis_resources + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `max_resource` | | varchar(1020) | | YES | | | +| 3 | `min_resource` | | varchar(1020) | | YES | | | +| 4 | `used_resource` | | varchar(1020) | | YES | | | +| 5 | `left_resource` | | varchar(1020) | | YES | | | +| 6 | `expected_resource` | | varchar(1020) | | YES | | | +| 7 | `locked_resource` | | varchar(1020) | | YES | | | +| 8 | `resourceType` | | varchar(255) | | YES | | | +| 9 | `ticketId` | | varchar(255) | | YES | | | +| 10 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 11 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 12 | `updator` | | varchar(255) | | YES | | | +| 13 | `creator` | | varchar(255) | | YES | | | + +**示例数据** + +| id | max_resource | min_resource | used_resource | left_resource | expected_resource | locked_resource | resourceType | ticketId | update_time | create_time | updator | creator | +| ---: | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 14219 | {"memory":21474836480,"cores":10,"instance":10} | {"memory":0,"cores":0,"instance":0} | {"memory":1073741824,"cores":1,"instance":1} | {"memory":20401094656,"cores":9,"instance":9} | \N | {"memory":0,"cores":0,"instance":0} | LoadInstance | \N | \N | 2022-11-12 23:30:09 | hadoop-IDE,hive-2.3.3 | hadoop-IDE,hive-2.3.3 | +| 14220 | {"memory":1073741824,"cores":1,"instance":1} | {"memory":1073741824,"cores":1,"instance":1} | {"memory":1073741824,"cores":1,"instance":1} | {"memory":0,"cores":0,"instance":0} | \N | {"memory":0,"cores":0,"instance":0} | LoadInstance | 24f8c8a8-d481-4976-a11a-5765f81d9795 | \N | 2022-11-12 23:30:09 | hadoop-IDE,hive-2.3.3 | hadoop-IDE,hive-2.3.3 | +| 14221 | {"DriverAndYarnResource":{"loadInstanceResource":{"memory":21474836480,"cores":10,"instances":5},"yarnResource":{"queueMemory":322122547200,"queueCores":150,"queueInstances":30,"queueName":"dws","applicationId":""}}} | {"DriverAndYarnResource":{"loadInstanceResource":{"memory":0,"cores":0,"instances":0},"yarnResource":{"queueMemory":0,"queueCores":0,"queueInstances":0,"queueName":"default","applicationId":""}}} | {"DriverAndYarnResource":{"loadInstanceResource":{"memory":1073741824,"cores":1,"instances":1},"yarnResource":{"queueMemory":6442450944,"queueCores":4,"queueInstances":0,"queueName":"dws","applicationId":""}}} | {"DriverAndYarnResource":{"loadInstanceResource":{"memory":20401094656,"cores":9,"instances":4},"yarnResource":{"queueMemory":315680096256,"queueCores":146,"queueInstances":30,"queueName":"dws","applicationId":""}}} | \N | {"DriverAndYarnResource":{"loadInstanceResource":{"memory":0,"cores":0,"instances":0},"yarnResource":{"queueMemory":0,"queueCores":0,"queueInstances":0,"queueName":"dws","applicationId":""}}} | DriverAndYarn | \N | \N | 2022-11-12 23:30:47 | hadoop-IDE,spark-2.4.3 | hadoop-IDE,spark-2.4.3 | + + +## 10. linkis_cg_manager_lock + +> 通用的用于实现分布式锁 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `lock_object` | | varchar(255) | UNI | YES | | | +| 3 | `time_out` | | longtext | | YES | | | +| 4 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + + +## 11. linkis_cg_manager_metrics_history + +//todo 可以移除? + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `instance_status` | | int(20) | | YES | | | +| 3 | `overload` | | varchar(255) | | YES | | | +| 4 | `heartbeat_msg` | | varchar(255) | | YES | | | +| 5 | `healthy_status` | | int(20) | | YES | | | +| 6 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 7 | `creator` | | varchar(255) | | YES | | | +| 8 | `ticketID` | | varchar(255) | | YES | | | +| 9 | `serviceName` | | varchar(255) | | YES | | | +| 10 | `instance` | | varchar(255) | | YES | | | + + +## 12. linkis_cg_manager_service_instance + +> 引擎服务实例/引擎资源管理服务实例 信息表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `instance` | 实例信息 localhost110004:9102| varchar(128) | UNI | YES | | | +| 3 | `name` | 服务名 linkis-cg-engineconnmanager/linkis-cg-engineconn | varchar(32) | | YES | | | +| 4 | `owner` | 服务实例的启动用户| varchar(32) | | YES | | | +| 5 | `mark` | //todo | varchar(32) | | YES | | | +| 6 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 7 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 8 | `updator` | | varchar(32) | | YES | | | +| 9 | `creator` | | varchar(32) | | YES | | | + +**示例数据** + +| id | instance | name | owner | mark | update_time | create_time | updator | creator | +| ---: | --- | --- | --- | --- | --- | --- | --- | --- | +| 121637 | localhost110004:9102 | linkis-cg-engineconnmanager | hadoop | process | 2022-11-08 09:52:08 | 2022-11-08 09:52:08 | hadoop | hadoop | +| 121640 | localhost110002:9102 | linkis-cg-engineconnmanager | hadoop | process | 2022-11-08 09:52:16 | 2022-11-08 09:52:16 | hadoop | hadoop | +| 121686 | gz.xg.localhost110001.webank:35932 | linkis-cg-engineconn | neiljianliu | process | 2022-11-08 10:40:39 | 2022-11-08 10:40:23 | neiljianliu | neiljianliu | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_instance` | 将`instance` 列设置为唯一索引 | UNIQUE KEY | `instance` | + + + +## 13. linkis_cg_manager_service_instance_metrics + +> 引擎服务实例/引擎资源管理服务的内存等信息 指标表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `instance` | 实例| varchar(128) | PRI | NO | | | +| 2 | `instance_status` |状态 | int(11) | | YES | | | +| 3 | `overload` | 资源过载情况 | varchar(255) | | YES | | | +| 4 | `heartbeat_msg` | 心跳信息| text | | YES | | | +| 5 | `healthy_status` | 心跳状态| varchar(255) | | YES | | | +| 6 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 7 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + +**示例数据** + +| instance | instance_status | overload | heartbeat_msg | healthy_status | update_time | create_time | +| --- | ---: | --- | --- | --- | --- | --- | +| localhost110003:9102 | 5 | {"maxMemory":67385790464,"usedMemory":3662913536,"systemCPUUsed":null,"systemLeftMemory":63722876928} | | {"nodeHealthy":"Healthy","msg":""} | 2022-11-16 14:29:56 | 2022-11-15 15:59:17 | +| localhost110004:10781 | 1 | {"maxMemory":1073741824,"usedMemory":175014896,"systemCPUUsed":6.29,"systemLeftMemory":2746556416} | \N | {"nodeHealthy":"Healthy","msg":""} | 2022-11-16 14:30:18 | 2022-11-16 11:53:48 | +| localhost110004:12845 | 1 | {"maxMemory":1073741824,"usedMemory":104839664,"systemCPUUsed":6.29,"systemLeftMemory":2800877568} | \N | {"nodeHealthy":"Healthy","msg":""} | 2022-11-16 14:30:17 | 2022-11-16 12:03:20 | + + +## 14. linkis_cg_rm_external_resource_provider + +> 资源扩展信息配置表 目前主要用于yarn资源信息的配置 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(10) | PRI | NO | auto_increment | | +| 2 | `resource_type` | 资源类型 Yarn| varchar(32) | | NO | | | +| 3 | `name` | 名称| varchar(32) | | NO | | | +| 4 | `labels` | 标签| varchar(32) | | YES | | | +| 5 | `config` | 连接信息 | text | | NO | | | + + +```scala +//默认使用的为default 通过配置项wds.linkis.rm.default.yarn.cluster.name 控制 + val DEFAULT_YARN_CLUSTER_NAME = CommonVars("wds.linkis.rm.default.yarn.cluster.name", "default") + val DEFAULT_YARN_TYPE = CommonVars("wds.linkis.rm.default.yarn.cluster.type", "Yarn") +``` + +**示例数据** + +| id | resource_type | name | labels | config | +| ---: | --- | --- | --- | --- | +| 1 | Yarn | sit | \N | {"rmWebAddress": "http://127.0.0.1:8088","hadoopVersion": "2.7.2","authorEnable":true,"user":"hadoop","pwd":"123456"} | +| 2 | Yarn | DEV | \N | {"rmWebAddress": "http://127.0.0.1:8088","hadoopVersion": "2.7.2","authorEnable":true,"user":"hadoop","pwd":"123456"} | +| 3 | Yarn | PROD | \N | {"rmWebAddress": "http://127.0.0.1:8088","hadoopVersion": "2.7.2","authorEnable":true,"user":"hadoop","pwd":"123456"} | + + + + +## 15. linkis_cg_rm_resource_action_record + + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_value` | | varchar(100) | MUL | NO | | | +| 3 | `ticket_id` | | varchar(100) | | NO | | | +| 4 | `request_times` | | int(8) | | YES | | | +| 5 | `request_resource_all` | | varchar(100) | | YES | | | +| 6 | `used_times` | | int(8) | | YES | | | +| 7 | `used_resource_all` | | varchar(100) | | YES | | | +| 8 | `release_times` | | int(8) | | YES | | | +| 9 | `release_resource_all` | | varchar(100) | | YES | | | +| 10 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 11 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | label_value | ticket_id | request_times | request_resource_all | used_times | used_resource_all | release_times | release_resource_all | update_time | create_time | +| ---: | --- | --- | ---: | --- | ---: | --- | ---: | --- | --- | --- | +| 6 | leebai-IDE,hive-2.3.3 | 0dff1547-6867-4e5c-8baa-4bb561d586e3 | 1 | {"memory":1073741824,"cores":2,"instance":1} | 0 | {"memory":0,"cores":0,"instance":0} | 0 | {"memory":0,"cores":0,"instance":0} | 2021-12-30 19:29:21 | 2021-12-30 19:29:21 | +| 7 | hadoop-Schedulis,spark-2.4.3 | e3a1aeeb-c04a-44cb-a94b-d84e54e55185 | 1 | {"memory":2147483648,"cores":1,"instance":1} | 0 | {"memory":0,"cores":0,"instance":0} | 0 | {"memory":0,"cores":0,"instance":0} | 2021-12-30 19:47:37 | 2021-12-30 19:47:37 | + + + + + +## 16. linkis_mg_gateway_auth_token + +> gateway 的token方式认证的 token令牌信息记录表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `token_name` | token 名 | varchar(128) | UNI | NO | | | +| 3 | `legal_users` | 合法可使用用户 * 为所有| text | | YES | | | +| 4 | `legal_hosts` | 合法可请求的源ip * 为所有 | text | | YES | | | +| 5 | `business_owner` | 业务归属方 | varchar(32) | | YES | | | +| 6 | `create_time` | | date | | YES | | | +| 7 | `update_time` | | date | | YES | | | +| 8 | `elapse_day` | 过期天数 -1 为永久有效| bigint(20) | | YES | | | +| 9 | `update_by` | | varchar(32) | | YES | | | + + +**示例数据** + +| id | token_name | legal_users | legal_hosts | business_owner | create_time | update_time | elapse_day | update_by | +| ---: | --- | --- | --- | --- | --- | --- | ---: | --- | +| 2 | BML-AUTH | * | * | BDP | 2021-09-15 | 2021-09-15 | -1 | LINKIS | +| 3 | WS-AUTH | * | * | BDP | 2021-09-15 | 2021-09-15 | -1 | LINKIS | +| 4 | dss-AUTH | * | * | BDP | 2021-09-15 | 2021-09-15 | -1 | LINKIS | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_token_name` | 将`token_name` 列设置为唯一索引 | UNIQUE KEY | `token_name` | + + + +## 17. linkis_ps_bml_project + +> bml 物料管理工程项目记录 主要提供给dss 工程空间的项目列表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(10) | PRI | NO | auto_increment | | +| 2 | `name` | 项目名| varchar(128) | UNI | YES | | | +| 3 | `system` | 使用系统 | varchar(64) | | NO | | dss | +| 4 | `source` | | varchar(1024) | | YES | | | +| 5 | `description` | | varchar(1024) | | YES | | | +| 6 | `creator` | | varchar(128) | | NO | | | +| 7 | `enabled` | | tinyint(4) | | YES | | 1 | +| 8 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | name | system | source | description | creator | enabled | create_time | +| ---: | --- | --- | --- | --- | --- | ---: | --- | +| 2524 | metabase_test_ywz_1234 | dss | \N | jinyangrao 在bml创建的工程 | jinyangrao | 1 | 2022-11-16 09:36:58 | +| 2523 | metabase_test_tjg_345 | dss | \N | jinyangrao 在bml创建的工程 | jinyangrao | 1 | 2022-11-16 09:11:08 | +| 2522 | test_1114_54_copynull | dss | \N | stacyyan 在bml创建的工程 | stacyyan | 1 | 2022-11-15 10:44:27 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_name` | 将`name` 列设置为唯一索引 | UNIQUE KEY | `name` | + + + +## 18. linkis_ps_bml_project_resource + +> bml项目和对应的资源id关系表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(10) | PRI | NO | auto_increment | | +| 2 | `project_id` | 项目id | int(10) | | NO | | | +| 3 | `resource_id` | 资源存储的resource id | varchar(128) | | YES | | | + + +**示例数据** + +| id | project_id | resource_id | +| ---: | ---: | --- | +| 1 | 1 | 103cb0cc-e12b-4c2e-b8de-a8f58ad17d75 | +| 2 | 1 | 86bcd05d-4ed9-46be-ab26-d8a76433138b | +| 3 | 1 | 01697abe-7658-4d3f-b49b-bac4c809a7ba | + + + +## 19. linkis_ps_bml_project_user + +> bml项目和用户关系表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(10) | PRI | NO | auto_increment | | +| 2 | `project_id` | 项目id | int(10) | | NO | | | +| 3 | `username` | | varchar(64) | MUL | YES | | | +| 4 | `priv` | rwx 421 权限值为7。8为管理员,可以授权其他用户| int(10) | | NO | | 7 | +| 5 | `creator` | 创建者 | varchar(128) | | NO | | | +| 6 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 7 | `expire_time` | | datetime | | YES | | | + + +**示例数据** + +| id | project_id | username | priv | creator | create_time | expire_time | +| ---: | ---: | --- | ---: | --- | --- | --- | +| 22 | 21 | jianfuzhang | 7 | jianfuzhang | 2021-05-10 15:20:48 | \N | +| 23 | 22 | neiljianliu | 7 | neiljianliu | 2021-05-10 15:26:23 | \N | +| 24 | 22 | jianfuzhang | 5 | neiljianliu | 2021-05-10 15:26:23 | \N | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_name_pid` | 将`username`, `project_id` 列设置为唯一索引 | UNIQUE KEY | `username`, `project_id` | + + + +## 20. linkis_ps_bml_resources + +> bml 物料资源存储信息表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | Primary key | bigint(20) | PRI | NO | auto_increment | | +| 2 | `resource_id` | 资源的 uuid | varchar(50) | | NO | | | +| 3 | `is_private` | 资源是否私有,0表示私有,1表示公共 | tinyint(1) | | YES | | 0 | +| 4 | `resource_header` | 分类,0表示未分类,1表示分类 | tinyint(1) | | YES | | 0 | +| 5 | `downloaded_file_name` | 下载时的文件名 | varchar(200) | | YES | | | +| 6 | `sys` | 归属系统 | varchar(100) | | NO | | | +| 7 | `create_time` | 创建时间 | datetime | | NO | | CURRENT_TIMESTAMP | +| 8 | `owner` | 资源所有则 | varchar(200) | | NO | | | +| 9 | `is_expire` | 是否过期,0表示未过期,1表示过期| tinyint(1) | | YES | | 0 | +| 10 | `expire_type` | 到期类型,date指的是在指定的日期到期,TIME指的是时间| varchar(50) | | YES | | | +| 11 | `expire_time` | 过期时间,默认一天 | varchar(50) | | YES | | | +| 12 | `max_version` | 默认为10,表示保留最新的10个版本 | int(20) | | YES | | 10 | +| 13 | `update_time` | Updated time | datetime | | NO | | CURRENT_TIMESTAMP | +| 14 | `updator` | updator | varchar(50) | | YES | | | +| 15 | `enable_flag` | 状态,1:正常,0:冻结 | tinyint(1) | | NO | | 1 | + +**示例数据** + +| id | resource_id | is_private | resource_header | downloaded_file_name | sys | create_time | owner | is_expire | expire_type | expire_time | max_version | update_time | updator | enable_flag | +| ---: | --- | ---: | ---: | --- | --- | --- | --- | ---: | --- | --- | ---: | --- | --- | ---: | +| 332800 | 72eac098-0d71-42c9-962c-e9580ac5ac0b | 1 | \N | 72eac098-0d71-42c9-962c-e9580ac5ac0b | WTSS | 2022-07-27 09:47:06 | hadoop | 0 | \N | \N | 10 | 2022-07-27 09:47:06 | \N | 1 | +| 398336 | 273611e6-e1be-480e-8556-c2534910e855 | 1 | \N | 273611e6-e1be-480e-8556-c2534910e855 | WTSS | 2022-07-29 06:31:44 | hadoop | 0 | \N | \N | 10 | 2022-07-29 06:31:44 | \N | 1 | +| 463872 | a111ab00-bafd-4341-a17b-ab9101970abd | 1 | \N | a111ab00-bafd-4341-a17b-ab9101970abd | WTSS | 2022-08-03 06:18:32 | hadoop | 0 | \N | \N | 10 | 2022-08-03 06:18:32 | \N | 1 | + + +## 21. linkis_ps_bml_resources_permission + + // todo 未使用? + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | Primary key | bigint(20) | PRI | NO | auto_increment | | +| 2 | `resource_id` | Resource uuid | varchar(50) | | NO | | | +| 3 | `permission` | permission | varchar(10) | | NO | | | +| 4 | `create_time` | created time | datetime | | NO | | CURRENT_TIMESTAMP | +| 5 | `system` | creator | varchar(50) | | YES | | dss | +| 6 | `update_time` | updated time | datetime | | NO | | CURRENT_TIMESTAMP | +| 7 | `updator` | updator | varchar(50) | | NO | | | + + +## 22. linkis_ps_bml_resources_task + +> bml 物料资源操作记录表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `resource_id` | 资源uuid | varchar(50) | | YES | | | +| 3 | `version` | 当前操作的资源版本号 | varchar(20) | | YES | | | +| 4 | `operation` |操作类型。 上传 = 0,更新 = 1 | varchar(20) | | NO | | | +| 5 | `state` | 任务当前状态:Schduled, Running, Succeed, Failed,Cancelled | varchar(20) | | NO | | Schduled | +| 6 | `submit_user` | 作业提交用户名 | varchar(20) | | NO | | | +| 7 | `system` | 系统名称 如: wtss | varchar(20) | | YES | | dss | +| 8 | `instance` | 提供服务的实例| varchar(128) | | NO | | | +| 9 | `client_ip` | 请求方ip | varchar(50) | | YES | | | +| 10 | `extra_params` | 附加关键信息。 比如批量删除的资源ID和版本,资源下的所有版本都被删除 | text | | YES | | | +| 11 | `err_msg` | 任务失败信息。e.getMessage | varchar(2000) | | YES | | | +| 12 | `start_time` | 开始时间 | datetime | | NO | | CURRENT_TIMESTAMP | +| 13 | `end_time` | 结束时间 | datetime | | YES | | | +| 14 | `last_update_time` | 最后更新时间 | datetime | | NO | | | + +**示例数据** + +| id | resource_id | version | operation | state | submit_user | system | instance | client_ip | extra_params | err_msg | start_time | end_time | last_update_time | +| ---: | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 183039 | 873513f8-9ad0-4473-b7b9-1cc2500abab7 | \N | copyResource | success | stacyyan | \N | localhost11ide01:9107 | 127.0.0.1 | \N | \N | 2022-03-24 20:11:18 | 2022-03-24 20:11:19 | 2022-03-24 20:11:19 | +| 259846 | 7ae110d2-5649-4c57-9e4c-b48bb62f3382 | \N | deleteResource | success | stacyyan | WTSS | localhost11ide01:9107 | 127.0.0.1 | delete resourceId:7ae110d2-5649-4c57-9e4c-b48bb62f3382, and delete versions is :v000001 | \N | 2022-06-01 14:38:42 | 2022-06-01 14:38:43 | 2022-06-01 14:38:43 | +| 12551 | 8678bbd5-cfc7-411b-a838-1b145dab8473 | \N | deleteResource | success | neiljianliu | WTSS | localhost11ide01:9107 | 127.0.0.1 | delete resourceId:8678bbd5-cfc7-411b-a838-1b145dab8473, and delete versions is :v000001 | \N | 2021-07-16 14:47:15 | 2021-07-16 14:47:15 | 2021-07-16 14:47:15 | +| 36360 | eadc8908-e00c-4604-ab30-6671f33e753e | \N | deleteResource | success | neiljianliu | WTSS | localhost11ide01:9107 | 127.0.0.1 | delete resourceId:eadc8908-e00c-4604-ab30-6671f33e753e, and delete versions is :v000001 | \N | 2021-10-26 17:46:15 | 2021-10-26 17:46:15 | 2021-10-26 17:46:15 | +| 549888 | dfbd7603-d513-413a-b491-d79a62a25407 | v000001 | upload | success | hadoop | dss | localhost11ide01:9107 | 127.0.0.1 | \N | \N | 2022-07-29 00:26:43 | 2022-07-29 00:26:43 | 2022-07-29 00:26:43 | +| 51775 | ba304c46-ab63-404e-b2aa-69f522ef3baa | v000004 | rollbackVersion | success | johnnwang | \N | localhost11ide01:9107 | 127.0.0.1 | \N | \N | 2021-11-27 17:04:28 | 2021-11-27 17:04:28 | 2021-11-27 17:04:28 | +| 28 | d07d8636-5415-418f-9aff-dde1b3a69569 | v000005 | update | success | hadoop | WTSS | localhost11ide01:9107 | 127.0.0.1 | \N | \N | 2021-04-29 14:24:36 | 2021-04-29 14:24:36 | 2021-04-29 14:24:36 | + + +## 23. linkis_ps_bml_resources_version + +>资源和对应的版本信息关联表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | Primary key | bigint(20) | PRI | NO | auto_increment | | +| 2 | `resource_id` | 资源uuid | varchar(50) | MUL | NO | | | +| 3 | `file_md5` | 文件的md5摘要 | varchar(32) | | NO | | | +| 4 | `version` | 资源版本(v 后面加五位数字) | varchar(20) | | NO | | | +| 5 | `size` | 文件大小 | int(10) | | NO | | | +| 6 | `start_byte` | 开始字节 | bigint(20) unsigned | | NO | | 0 | +| 7 | `end_byte` | 结束字节 | bigint(20) unsigned | | NO | | 0 | +| 8 | `resource` | 资源内容(文件信息包括路径和文件名) | varchar(2000) | | NO | | | +| 9 | `description` | 说明 | varchar(2000) | | YES | | | +| 10 | `start_time` | 开始时间 | datetime | | NO | | CURRENT_TIMESTAMP | +| 11 | `end_time` | 停止时间 | datetime | | NO | | CURRENT_TIMESTAMP | +| 12 | `client_ip` | 客户端ip | varchar(200) | | NO | | | +| 13 | `updator` | updator | varchar(50) | | YES | | | +| 14 | `enable_flag` | 状态,1:正常,0:冻结| tinyint(1) | | NO | | 1 | + + +**示例数据** + +| id | resource_id | file_md5 | version | size | start_byte | end_byte | resource | description | start_time | end_time | client_ip | updator | enable_flag | +| ---: | --- | --- | --- | ---: | ---: | ---: | --- | --- | --- | --- | --- | --- | ---: | +| 1 | 863846e2-bd31-49ba-babe-9a2b96616d71 | b8fd956fd8f83d09d203bf9e4b40543f | v000001 | 1668 | 1 | 1668 | hdfs:///apps-data/hadoop/bml/20210429/863846e2-bd31-49ba-babe-9a2b96616d71 | \N | 2021-04-29 12:21:07 | 2021-04-29 12:21:07 | 127.0.0.1 | \N | 1 | +| 2 | 9d39cb8e-1447-46d5-a11d-b597b2e3200f | 46bf4ff26651c448efb85ffa9c54907f | v000001 | 58965932 | 1 | 58965932 | hdfs:///apps-data/hadoop/bml/20210429/9d39cb8e-1447-46d5-a11d-b597b2e3200f | \N | 2021-04-29 12:21:10 | 2021-04-29 12:21:10 | 127.0.0.1 | \N | 1 | +| 3 | bc620bfd-d3f4-4fa5-84f7-1c484fac2241 | 8e13ba687fa1ee04e113bff50290a5c6 | v000001 | 1745 | 1 | 1745 | hdfs:///apps-data/hadoop/bml/20210429/bc620bfd-d3f4-4fa5-84f7-1c484fac2241 | \N | 2021-04-29 12:21:14 | 2021-04-29 12:21:14 | 127.0.0.1 | \N | 1 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_rid_version` | 将`resource_id`, `version` 列设置为唯一索引 | UNIQUE KEY | `resource_id`, `version` | + + + +## 24. linkis_ps_common_lock + +> 通用的用于实现分布式锁 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `lock_object` | | varchar(255) | UNI | YES | | | +| 3 | `time_out` | | longtext | | YES | | | +| 4 | `update_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | + + +## 25. linkis_ps_configuration_category + +> 参数配置目录树表 对应于管理台的`参数配置页面` + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_id` | linkis_cg_manager_label 标签的id | int(20) | UNI | NO | | | +| 3 | `level` | 1为应用类型级别 2 为引擎类型级别 | int(20) | | NO | | | +| 4 | `description` | | varchar(200) | | YES | | | +| 5 | `tag` | | varchar(200) | | YES | | | +| 6 | `update_time` | | datetime | | NO | | CURRENT_TIMESTAMP | +| 7 | `create_time` | | datetime | | NO | | CURRENT_TIMESTAMP | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_lock_object` | 将`lock_object` 列设置为唯一索引 | UNIQUE KEY | `lock_object` | + + +**示例数据** + +| id | label_id | level | description | tag | update_time | create_time | +| ---: | ---: | ---: | --- | --- | --- | --- | +| 101 | 46586 | 1 | | \N | 2021-08-19 20:07:09 | 2021-08-19 20:07:09 | +| 102 | 46587 | 2 | | \N | 2021-08-19 20:07:20 | 2021-08-19 20:07:20 | +| 103 | 47340 | 1 | | \N | 2021-08-23 10:50:02 | 2021-08-23 10:50:02 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_label_id` | 将`label_id` 列设置为唯一索引 | UNIQUE INDEX | `label_id` | + + + +## 26. linkis_ps_configuration_config_key + +> 引擎相关参数的配置表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `key` | 配置项的key 如 spark.executor.instances | varchar(50) | | YES | | | +| 3 | `description` | 描述 | varchar(200) | | YES | | | +| 4 | `name` | 名称 | varchar(50) | | YES | | | +| 5 | `default_value` | 当用户未进行设置时,使用默认值 | varchar(200) | | YES | | | +| 6 | `validate_type` | 验证类型,以下之一:None、NumInterval、FloatInterval、Include、Regex、OPF、Custom Rules| varchar(50) | | YES | | | +| 7 | `validate_range` | 验证范围 | varchar(50) | | YES | | | +| 8 | `engine_conn_type` | 引擎类型,如 spark、hive 等| varchar(50) | | YES | | | +| 9 | `is_hidden` | 是否对用户隐藏。 如果设置为 1(true),则用户不能修改,但仍然可以在后端使用 | tinyint(1) | | YES | | | +| 10 | `is_advanced` | 是否为高级参数。 如果设置为 1(true),参数将仅在用户选择【显示高级参数】时显示 | tinyint(1) | | YES | | | +| 11 | `level` | 前端显示排序的依据。 级别越高,参数优先显示| tinyint(1) | | YES | | | +| 12 | `treeName` | 配置项的engineType的子目录分类 | varchar(20) | | YES | | | + + +**示例数据** + +| id | key | description | name | default_value | validate_type | validate_range | engine_conn_type | is_hidden | is_advanced | level | treeName | +| ---: | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | --- | +| 1 | wds.linkis.rm.yarnqueue | yarn队列名 | yarn队列名 | default | None | \N | \N | 0 | 0 | 1 | 队列资源 | +| 2 | wds.linkis.rm.yarnqueue.instance.max | 取值范围:1-128,单位:个 | yarn队列实例最大个数 | 30 | Regex | ^(?:[1-9]\d?|[1234]\d{2}|200)$ | \N | 1 | 0 | 1 | 队列资源 | +| 3 | wds.linkis.rm.yarnqueue.cores.max | 取值范围:1-1500,单位:个 | 队列CPU使用上限 | 150 | Regex | ^(?:[1-9]\d{0,2}|1[0-4]\d{2}|1500)$ | \N | 0 | 0 | 1 | 队列资源 | +| 4 | wds.linkis.rm.yarnqueue.memory.max | 取值范围:1-5000,单位:G | 队列内存使用上限 | 300G | Regex | ^([1-9]\d{0,2}|[1-4]\d{3}|5000)(G|g)$ | \N | 0 | 0 | 1 | 队列资源 | + + +## 27. linkis_ps_configuration_config_value + +> 参数配置项key对应的配置值表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `config_key_id` | linkis_ps_configuration_config_key的id | bigint(20) | MUL | YES | | | +| 3 | `config_value` | 设置的值 | varchar(200) | | YES | | | +| 4 | `config_label_id` | 对应的linkis_cg_manager_label 的id | int(20) | | YES | | | +| 5 | `update_time` | | datetime | | NO | | CURRENT_TIMESTAMP | +| 6 | `create_time` | | datetime | | NO | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | config_key_id | config_value | config_label_id | update_time | create_time | +| ---: | ---: | --- | ---: | --- | --- | +| 57 | 1 | dws | 25716 | 2022-04-08 16:35:37 | 2021-06-08 16:07:49 | +| 61 | 30 | python2 | 30819 | 2022-07-04 11:17:25 | 2021-06-08 16:35:23 | +| 62 | 1 | dws | 519 | 2022-11-07 19:13:29 | 2021-06-08 17:19:44 | +| 64 | 19 | python2 | 3300 | 2022-08-09 17:38:15 | 2021-06-08 20:15:04 | +| 65 | 5 | 50G | 1348 | 2022-05-16 15:39:44 | 2021-06-10 17:55:11 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_kid_lid` | 将 `config_key_id`, `config_label_id` 列设置为唯一索引 | UNIQUE INDEX | `config_key_id`, `config_label_id` | + + + +## 28. linkis_ps_configuration_key_engine_relation + +>配置项和引擎的关联关系,设置引擎配置参数模板 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `config_key_id` | config key id | bigint(20) | MUL | NO | | | +| 3 | `engine_type_label_id` | 对应的linkis_cg_manager_label 的id | bigint(20) | | NO | | | + + +**示例数据** + +| id | config_key_id | engine_type_label_id | +| ---: | ---: | ---: | +| 1 | 1 | 5 | +| 73 | 1 | 46586 | +| 80 | 1 | 47340 | +| 2 | 2 | 5 | +| 74 | 2 | 46586 | +| 81 | 2 | 47340 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_kid_lid` | 将`config_key_id`, `engine_type_label_id` 列设置为唯一索引 | UNIQUE INDEX | `config_key_id`, `engine_type_label_id` | + + + +## 29. linkis_ps_cs_context_history + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `context_id` | | int(11) | | YES | | | +| 3 | `source` | | text | | YES | | | +| 4 | `context_type` | | varchar(32) | | YES | | | +| 5 | `history_json` | | text | | YES | | | +| 6 | `keyword` | | varchar(255) | MUL | YES | | | +| 7 | `update_time` | update unix timestamp | datetime | | NO | | CURRENT_TIMESTAMP | +| 8 | `create_time` | create time | datetime | | NO | | CURRENT_TIMESTAMP | +| 9 | `access_time` | last access time | datetime | | NO | | CURRENT_TIMESTAMP | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `idx_keyword` | 将`keyword` 列设置为普通索引 | INDEX | `keyword` | + + + + +## 30. linkis_ps_cs_context_id + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `user` | | varchar(32) | | YES | | | +| 3 | `application` | | varchar(32) | | YES | | | +| 4 | `source` | | varchar(255) | | YES | | | +| 5 | `expire_type` | | varchar(32) | | YES | | | +| 6 | `expire_time` | | datetime | | YES | | | +| 7 | `instance` | | varchar(128) | MUL | YES | | | +| 8 | `backup_instance` | | varchar(255) | MUL | YES | | | +| 9 | `update_time` | update unix timestamp | datetime | | NO | | CURRENT_TIMESTAMP | +| 10 | `create_time` | create time | datetime | | NO | | CURRENT_TIMESTAMP | +| 11 | `access_time` | last access time | datetime | | NO | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | user | application | source | expire_type | expire_time | instance | backup_instance | update_time | create_time | access_time | +| ---: | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 62131 | jinyangrao | \N | {"className":"org.apache.linkis.cs.common.entity.source.LinkisHAWorkFlowContextID","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | \N | \N | cs_1_dev | cs_1_dev | 2022-11-16 14:48:58 | 2022-11-16 14:48:58 | 2022-11-16 14:48:58 | +| 62126 | alexwu | \N | {"className":"org.apache.linkis.cs.common.entity.source.LinkisHAWorkFlowContextID","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | \N | \N | cs_1_dev | cs_1_dev | 2022-11-16 14:45:49 | 2022-11-16 14:45:49 | 2022-11-16 14:45:49 | +| 62122 | stacyyan | \N | {"className":"org.apache.linkis.cs.common.entity.source.LinkisHAWorkFlowContextID","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | \N | \N | cs_2_dev | cs_1_dev | 2022-11-16 14:43:54 | 2022-11-16 14:43:54 | 2022-11-16 14:43:54 | +| 62120 | alexwu | \N | {"className":"org.apache.linkis.cs.common.entity.source.LinkisHAWorkFlowContextID","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | \N | \N | cs_2_dev | cs_1_dev | 2022-11-16 14:32:16 | 2022-11-16 14:32:16 | 2022-11-16 14:32:16 | + + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `idx_instance` | 将`instance` 列设置为普通索引 | INDEX | `instance` | +| 2 | `idx_backup_instance` | 将`backup_instance` 列设置为普通索引 | INDEX | `backup_instance` | +| 3 | `idx_instance_bin` | 将`instance`(128),`backup_instance` 列设置为普通索引 | INDEX | `instance`(128),`backup_instance` | + + + +## 31. linkis_ps_cs_context_listener + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `listener_source` | | varchar(255) | | YES | | | +| 3 | `context_id` | | int(11) | | YES | | | +| 4 | `update_time` | update unix timestamp | datetime | | NO | | CURRENT_TIMESTAMP | +| 5 | `create_time` | create time | datetime | | NO | | CURRENT_TIMESTAMP | +| 6 | `access_time` | last access time | datetime | | NO | | CURRENT_TIMESTAMP | + + +## 32. linkis_ps_cs_context_map + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `key` | | varchar(128) | MUL | YES | | | +| 3 | `context_scope` | | varchar(32) | | YES | | | +| 4 | `context_type` | | varchar(32) | | YES | | | +| 5 | `props` | | text | | YES | | | +| 6 | `value` | | mediumtext | | YES | | | +| 7 | `context_id` | | int(11) | | YES | | | +| 8 | `keywords` | | varchar(255) | MUL | YES | | | +| 9 | `update_time` | update unix timestamp | datetime | | NO | | CURRENT_TIMESTAMP | +| 10 | `create_time` | create time | datetime | | NO | | CURRENT_TIMESTAMP | +| 11 | `access_time` | last access time | datetime | | NO | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | key | context_scope | context_type | props | value | context_id | keywords | update_time | create_time | access_time | +| ---: | --- | --- | --- | --- | --- | ---: | --- | --- | --- | --- | +| 45 | node.sql_1742.jobID | PUBLIC | DATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisJobData","value":"{\"jobID\":3735}"} | 1 | ["node.sql_1742.jobID"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 51 | node.widget_1508.jobID | PUBLIC | DATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisJobData","value":"{\"jobID\":5167}"} | 1 | ["node.widget_1508.jobID"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 170 | node.display_3009.jobID | PUBLIC | DATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisJobData","value":"{\"jobID\":3738}"} | 1 | ["node.display_3009.jobID"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 172 | node.dashboard_7941.jobID | PUBLIC | DATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisJobData","value":"{\"jobID\":3740}"} | 1 | ["node.dashboard_7941.jobID"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 166 | node.sql_1742.table.cs_tmp_sql_1742_rs1 | PUBLIC | METADATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"CSTable","value":"{\"name\":\"cs_tmp_sql_1742_rs1\",\"alias\":null,\"creator\":\"jianfuzhang\",\"comment\":\"cs temp table\",\"createTime\":\"2021-05-15T19:18:05+0800\",\"productName\":null,\"projectName\":null,\"usage\":null,\"lifecycle\":null,\"useWay\":null,\"isImport\":false,\"modelLevel\":null,\"isExternalUse\":true,\"isPartitionTable\":false,\"isAvailable\":true,\"isView\":true,\"location\":\"hdfs:///tmp/linkis/jianfuzhang/linkis/20210515_191700/nodeexecution/3735/_0.dolphin\",\"columns\":[{\"name\":\"id\",\"alias\":null,\"type\":\"int\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"name\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"sex\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"age\",\"alias\":null,\"type\":\"int\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"class\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"lesson\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"city\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"teacher\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"score\",\"alias\":null,\"type\":\"double\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"fee\",\"alias\":null,\"type\":\"double\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"birthday\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"exam_date\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null}],\"partitions\":null,\"db\":null}"} | 1 | ["cs_tmp_sql_1742_rs1","hdfs:///tmp/linkis/jianfuzhang/linkis/20210515_191700/nodeexecution/3735/_0.dolphin","node.sql_1742.table.cs_tmp_sql_1742_rs1"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 1744 | node.widget_1508.table.cs_tmp_widget_1508_rs1 | PUBLIC | METADATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"CSTable","value":"{\"name\":\"cs_tmp_widget_1508_rs1\",\"alias\":null,\"creator\":\"jianfuzhang\",\"comment\":\"cs temp table\",\"createTime\":\"2021-05-18T11:38:47+0800\",\"productName\":null,\"projectName\":null,\"usage\":null,\"lifecycle\":null,\"useWay\":null,\"isImport\":false,\"modelLevel\":null,\"isExternalUse\":true,\"isPartitionTable\":false,\"isAvailable\":true,\"isView\":true,\"location\":\"hdfs:///tmp/linkis/jianfuzhang/linkis/20210518_113844/nodeexecution/5167/_0.dolphin\",\"columns\":[{\"name\":\"birthday\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null}],\"partitions\":null,\"db\":null}"} | 1 | ["hdfs:///tmp/linkis/jianfuzhang/linkis/20210518_113844/nodeexecution/5167/_0.dolphin","cs_tmp_widget_1508_rs1","node.widget_1508.table.cs_tmp_widget_1508_rs1"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 173 | flow.variable.user.to.proxy | PUBLIC | OBJECT | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisVariable","value":"{\"key\":\"user.to.proxy\",\"value\":\"jianfuzhang\"}"} | 1 | ["user.to.proxy","flow.variable.user.to.proxy"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 174 | flow.infos | PUBLIC | OBJECT | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"CSFlowInfos","value":"{\"infos\":{\"parent\":\"null\",\"id_nodeName\":{\"3c72ebe1-6fa1-4093-9da6-c3d8b0fe26f1\":\"sql_1742\",\"a1dfd377-32a1-4b34-b70c-7123a9890bd8\":\"widget_1508\",\"fa7334ed-5811-48a4-9a26-7498e83348dd\":\"display_3009\",\"c5cc7633-a3ef-42dc-8103-550ca4a3d3ce\":\"dashboard_7941\"},\"edges\":[{\"source\":\"3c72ebe1-6fa1-4093-9da6-c3d8b0fe26f1\",\"target\":\"a1dfd377-32a1-4b34-b70c-7123a9890bd8\",\"sourceLocation\":\"bottom\",\"targetLocation\":\"top\"},{\"source\":\"a1dfd377-32a1-4b34-b70c-7123a9890bd8\",\"target\":\"fa7334ed-5811-48a4-9a26-7498e83348dd\",\"sourceLocation\":\"bottom\",\"targetLocation\":\"top\"},{\"source\":\"fa7334ed-5811-48a4-9a26-7498e83348dd\",\"target\":\"c5cc7633-a3ef-42dc-8103-550ca4a3d3ce\",\"sourceLocation\":\"bottom\",\"targetLocation\":\"top\"}]}}"} | 1 | ["flow.infos"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 42 | node.sql_1742.resource.3c72ebe1-6fa1-4093-9da6-c3d8b0fe26f1.sql | PUBLIC | RESOURCE | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"linkisBMLResource","value":"{\"resourceId\":\"850d6dc7-4489-4b06-90f4-1d2b5b65d0b7\",\"version\":\"v000001\",\"isPrivate\":null,\"resourceHeader\":null,\"downloadedFileName\":\"3c72ebe1-6fa1-4093-9da6-c3d8b0fe26f1.sql\",\"sys\":null,\"createTime\":null,\"isExpire\":null,\"expireType\":null,\"expireTime\":null,\"updateTime\":null,\"updator\":null,\"maxVersion\":null,\"user\":null,\"system\":null,\"enableFlag\":null}"} | 1 | ["v000001","3c72ebe1-6fa1-4093-9da6-c3d8b0fe26f1.sql","850d6dc7-4489-4b06-90f4-1d2b5b65d0b7","node.sql_1742.resource.3c72ebe1-6fa1-4093-9da6-c3d8b0fe26f1.sql"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 79 | flow.infos | PUBLIC | RESOURCE | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"CSFlowInfos","value":"{\"infos\":{\"parent\":\"flow2\",\"id_nodeName\":{\"90a6ee94-4bd6-47d9-a536-f92660c4c051\":\"sql\",\"90a6ee94-4bd6-47d9-a536-f92660c4c052\":\"hql\"},\"edges\":[{\"sourceLocation\":\"bottom\",\"source\":\"sql \",\"targetLocation\":\"top\",\"target\":\"hql\"}]}}"} | 2 | ["flow.infos"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 199 | node.sql_3999.jobID | PUBLIC | DATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisJobData","value":"{\"jobID\":344064}"} | 3 | ["node.sql_3999.jobID"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 210 | node.widget_654.jobID | PUBLIC | DATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisJobData","value":"{\"jobID\":3808}"} | 3 | ["node.widget_654.jobID"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 31327 | node.sql_3999.table.cs_tmp_sql_3999_rs1 | PUBLIC | METADATA | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"CSTable","value":"{\"name\":\"cs_tmp_sql_3999_rs1\",\"alias\":null,\"creator\":\"hadoop\",\"comment\":\"cs temp table\",\"createTime\":\"2021-07-28T17:55:56+0800\",\"productName\":null,\"projectName\":null,\"usage\":null,\"lifecycle\":null,\"useWay\":null,\"isImport\":false,\"modelLevel\":null,\"isExternalUse\":true,\"isPartitionTable\":false,\"isAvailable\":true,\"isView\":true,\"location\":\"hdfs:///apps-data/hadoop/linkis/20210728_175555/nodeexecution/344064/_0.dolphin\",\"columns\":[{\"name\":\"database\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"tableName\",\"alias\":null,\"type\":\"string\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null},{\"name\":\"isTemporary\",\"alias\":null,\"type\":\"boolean\",\"comment\":null,\"express\":null,\"rule\":null,\"isPrimary\":null,\"length\":null}],\"partitions\":null,\"db\":null}"} | 3 | ["node.sql_3999.table.cs_tmp_sql_3999_rs1","hdfs:///apps-data/hadoop/linkis/20210728_175555/nodeexecution/344064/_0.dolphin","cs_tmp_sql_3999_rs1"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 31325 | flow.variable.user.to.proxy | PUBLIC | OBJECT | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"LinkisVariable","value":"{\"key\":\"user.to.proxy\",\"value\":\"alexyang\"}"} | 3 | ["user.to.proxy","flow.variable.user.to.proxy"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | +| 31326 | flow.infos | PUBLIC | OBJECT | {"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKeyValue","subs":[{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextKey","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]},{"className":"com.webank.wedatasphere.linkis.cs.common.entity.source.CommonContextValue","subs":[],"fieldNames":[],"fieldValues":[],"fieldTypes":[]}],"fieldNames":[],"fieldValues":[],"fieldTypes":[]} | {"type":"CSFlowInfos","value":"{\"infos\":{\"parent\":\"null\",\"id_nodeName\":{\"b08c3f5e-f5d7-4209-866b-f4f963196b3d\":\"sql_3999\",\"4b9b446b-304d-451f-90b6-67d9ad5d3e49\":\"widget_654\"},\"edges\":[{\"source\":\"b08c3f5e-f5d7-4209-866b-f4f963196b3d\",\"target\":\"4b9b446b-304d-451f-90b6-67d9ad5d3e49\",\"sourceLocation\":\"right\",\"targetLocation\":\"left\"}]}}"} | 3 | ["flow.infos"] | 2022-06-01 11:38:30 | 2022-06-01 11:38:32 | 2022-06-06 15:37:42 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_key_cid_ctype` | 将`key`,`context_id`,`context_type`列设置为唯一索引 | UNIQUE INDEX | `key`,`context_id`,`context_type` | +| 2 | `idx_keywords` | 将`keywords`列设置为普通索引 | INDEX | `keywords` | + + +## 33. linkis_ps_cs_context_map_listener + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `listener_source` | | varchar(255) | | YES | | | +| 3 | `key_id` | | int(11) | | YES | | | +| 4 | `update_time` | update unix timestamp | datetime | | NO | | CURRENT_TIMESTAMP | +| 5 | `create_time` | create time | datetime | | NO | | CURRENT_TIMESTAMP | +| 6 | `access_time` | last access time | datetime | | NO | | CURRENT_TIMESTAMP | + + + +## 34. linkis_ps_datasource_access + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `table_id` | | bigint(20) | | NO | | | +| 3 | `visitor` | | varchar(16) | | NO | | | +| 4 | `fields` | | varchar(255) | | YES | | | +| 5 | `application_id` | | int(4) | | NO | | | +| 6 | `access_time` | | datetime | | NO | | | + + +## 35. linkis_ps_datasource_field + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `table_id` | | bigint(20) | | NO | | | +| 3 | `name` | | varchar(64) | | NO | | | +| 4 | `alias` | | varchar(64) | | YES | | | +| 5 | `type` | | varchar(64) | | NO | | | +| 6 | `comment` | | varchar(255) | | YES | | | +| 7 | `express` | | varchar(255) | | YES | | | +| 8 | `rule` | | varchar(128) | | YES | | | +| 9 | `is_partition_field` | | tinyint(1) | | NO | | | +| 10 | `is_primary` | | tinyint(1) | | NO | | | +| 11 | `length` | | int(11) | | YES | | | + + +**示例数据** + +| id | table_id | name | alias | type | comment | express | rule | is_partition_field | is_primary | length | mode_info | +| ---: | ---: | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | --- | +| 4396 | 216 | ds | | string | | \N | \N | 1 | 0 | 8 | \N | +| 4395 | 216 | b | | string | | \N | | 0 | 0 | \N | \N | +| 4394 | 216 | a | | string | | \N | | 0 | 0 | \N | \N | +| 4393 | 215 | ds | | string | | \N | \N | 1 | 0 | 8 | \N | +| 4392 | 215 | col_3 | | string | | | | 0 | 0 | \N | \N | +| 4391 | 215 | col_2 | | string | | | | 0 | 0 | \N | \N | +| 4390 | 215 | col_1 | | string | | | | 0 | 0 | \N | \N | + + + +## 36. linkis_ps_datasource_import + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `table_id` | | bigint(20) | | NO | | | +| 3 | `import_type` | | int(4) | | NO | | | +| 4 | `args` | | varchar(255) | | NO | | | + + +**示例数据** + +| id | table_id | import_type | args | +| ---: | ---: | ---: | --- | +| 94 | 215 | 1 | {"exportPath":"/mnt/bdap/stacyyan/aa/aaa125.csv","type":"share","separator":",","chartset":"utf-8","quote":"","isHasHeader":"false"} | +| 93 | 214 | 0 | {"database":"stacyyan_ind","table":"00153d26da1a11eb8c30813d0f05b1af1"} | +| 92 | 213 | 2 | {"exportPath":"/mnt/bdap/stacyyan/aa/studentInfo.xlsx","type":"share","isHasHeader":"false"} | +| 88 | 170 | 1 | {"exportPath":"/mnt/bdap/janicegong/file测试/上传文件/orc.csv","type":"share","separator":",","chartset":"utf-8","quote":"","isHasHeader":"false"} | +| 87 | 169 | 1 | {"exportPath":"/mnt/bdap/johnnwang/test1_hql__1652150994191.csv","type":"share","separator":",","chartset":"utf-8","quote":"","isHasHeader":"false"} | + + + +## 37. linkis_ps_datasource_lineage + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `table_id` | | bigint(20) | | YES | | | +| 3 | `source_table` | | varchar(64) | | YES | | | +| 4 | `update_time` | | datetime | | YES | | | + +**示例数据** + +| id | table_id | source_table | update_time | +| ---: | ---: | --- | --- | +| 40 | 214 | stacyyan_ind.00153d26da1a11eb8c30813d0f05b1af1 | 2022-11-08 21:14:41 | +| 39 | 162 | janicegong_ind.aa | 2022-09-04 17:28:46 | +| 38 | 156 | jin_ind.test_0902j | 2022-09-02 19:47:20 | + + + +## 38. linkis_ps_datasource_table + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(255) | PRI | NO | auto_increment | | +| 2 | `database` | | varchar(64) | MUL | NO | | | +| 3 | `name` | | varchar(64) | | NO | | | +| 4 | `alias` | | varchar(64) | | YES | | | +| 5 | `creator` | | varchar(16) | | NO | | | +| 6 | `comment` | | varchar(255) | | YES | | | +| 7 | `create_time` | | datetime | | NO | | | +| 8 | `product_name` | | varchar(64) | | YES | | | +| 9 | `project_name` | | varchar(255) | | YES | | | +| 10 | `usage` | | varchar(128) | | YES | | | +| 11 | `lifecycle` | | int(4) | | NO | | | +| 12 | `use_way` | | int(4) | | NO | | | +| 13 | `is_import` | | tinyint(1) | | NO | | | +| 14 | `model_level` | | int(4) | | NO | | | +| 15 | `is_external_use` | | tinyint(1) | | NO | | | +| 16 | `is_partition_table` | | tinyint(1) | | NO | | | +| 17 | `is_available` | | tinyint(1) | | NO | | | + + +**示例数据** + +| id | database | name | alias | creator | comment | create_time | product_name | project_name | usage | lifecycle | use_way | is_import | model_level | is_external_use | is_partition_table | is_available | +| ---: | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 216 | stacyyan_ind | aa_1109 | 表别名_1109 | stacyyan | | 2022-11-09 16:15:03 | | | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | +| 215 | jin_ind | test_1109aaa | test_1109aaa | stacyyan | | 2022-11-09 09:51:41 | | | | 0 | 0 | 1 | 0 | 0 | 1 | 1 | +| 214 | stacyyan_ind | test_1108ar | test_1108ar | stacyyan | | 2022-11-08 21:14:41 | | | | 0 | 0 | 1 | 0 | 0 | 1 | 1 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_db_name` | 将`database`,`name` 列设置为唯一索引 | UNIQUE INDEX |`database`,`name` | + + + +## 39. linkis_ps_datasource_table_info + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `table_id` | | bigint(20) | | NO | | | +| 3 | `table_last_update_time` | | datetime | | NO | | | +| 4 | `row_num` | | bigint(20) | | NO | | | +| 5 | `file_num` | | int(11) | | NO | | | +| 6 | `table_size` | | varchar(32) | | NO | | | +| 7 | `partitions_num` | | int(11) | | NO | | | +| 8 | `update_time` | | datetime | | NO | | | +| 9 | `field_num` | | int(11) | | NO | | | + + +## 40. linkis_ps_dm_datasource + +> 配置的数据源信息表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `datasource_name` | 数据源名称 | varchar(255) | | NO | | | +| 3 | `datasource_desc` | 数据源描述 | varchar(255) | | YES | | | +| 4 | `datasource_type_id` |数据源类型ID linkis_ps_dm_datasource_type对应的id | int(11) | | NO | | | +| 5 | `create_identify` |标识 | varchar(255) | | YES | | | +| 6 | `create_system` | 创建数据源的系统 | varchar(255) | | YES | | | +| 7 | `parameter` | 数据源参数,注意 不做存储,实体类parameter字段通过linkis_ps_dm_datasource_version的parameter获取 | varchar(255) | | YES | | | +| 8 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 9 | `modify_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 10 | `create_user` | | varchar(255) | | YES | | | +| 11 | `modify_user` | | varchar(255) | | YES | | | +| 12 | `labels` | 数据源标签 | varchar(255) | | YES | | | +| 13 | `version_id` | 数据源版本ID | int(11) | | YES | | | +| 14 | `expire` | 数据源是否过期 | tinyint(1) | | YES | | 0 | +| 15 | `published_version_id` |数据源发布版本号 | int(11) | | YES | | | + + +**示例数据** + +| id | datasource_name | datasource_desc | datasource_type_id | create_identify | create_system | parameter | create_time | modify_time | create_user | modify_user | labels | version_id | expire | published_version_id | +| ---: | --- | --- | ---: | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | +| 243 | mongodb_test_20221020101428 | create | 6 | \N | Linkis | {"dataSourceTypeId":"6","host":"127.0.0.1","port":"20500","params":"{\"connectTimeout\":\"100\"}","database":"dpvcs-dev","username":"dpvcsopr","password":"dpvcsopr"} | 2022-10-20 10:14:36 | 2022-10-20 10:14:36 | janicegong | \N | auto_test20220801 | 2 | 0 | 1 | +| 244 | elasticsearch_test__20221020101428 | create | 7 | \N | Linkis | {"dataSourceTypeId":"7","username":"test","password":"123456","elasticUrls":"[\"http://127.0.0.1:9101\"]"} | 2022-10-20 10:14:38 | 2022-10-20 10:14:38 | janicegong | \N | auto_test20220801 | 2 | 1 | 1 | +| 245 | mysql_test_1027 | mysql | 1 | | MYSQL | {"host":"127.0.0.1","port":"15304","params":"{\"tinyInt1isBit\":\"false\"}","username":"test","password":"123456"} | 2022-10-27 20:35:05 | 2022-10-27 20:35:05 | stacyyan | \N | demo,勿删 | 1 | 0 | 1 | +| 246 | hive_test_sit | demo,勿删 | 4 | | HIVE | {"envId":"2"} | 2022-10-27 20:35:55 | 2022-10-27 20:35:55 | stacyyan | \N | | 1 | 0 | 1 | + + + +## 41. linkis_ps_dm_datasource_env + +> 数据源环境信息 主要用户hive类型数据源的配置 通过hive集群环境进行数据源连接配置的选择 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `env_name` | 环境名| varchar(32) | | NO | | | +| 3 | `env_desc` | 环境描述 | varchar(255) | | YES | | | +| 4 | `datasource_type_id` | 数据源类型ID linkis_ps_dm_datasource_type对应的id | int(11) | | NO | | | +| 5 | `parameter` | 数据源环境参数| varchar(255) | | YES | | | +| 6 | `create_time` | | datetime | | NO | | CURRENT_TIMESTAMP | +| 7 | `create_user` | | varchar(255) | | YES | | | +| 8 | `modify_time` | | datetime | | NO | | CURRENT_TIMESTAMP | +| 9 | `modify_user` | | varchar(255) | | YES | | | + + +**示例数据** + +| id | env_name | env_desc | datasource_type_id | parameter | create_time | create_user | modify_time | modify_user | +| ---: | --- | --- | ---: | --- | --- | --- | --- | --- | +| 1 | BDP-UAT | BDP-UAT测试环境 | 4 | {"uris":"thrift://localhost100001:9083", "hadoopConf":{"hive.metastore.execute.setugi":"true"}} | 2022-04-12 22:34:11 | \N | 2022-04-12 22:34:11 | \N | +| 2 | BDAP-UAT | BDAP-UAT测试环境 | 4 | {"uris":"thrift://localhost110001:9083", "hadoopConf":{"hive.metastore.execute.setugi":"true"}} | 2022-04-12 22:34:11 | \N | 2022-04-12 22:34:11 | \N | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_env_name` | 将`env_name` 列设置为唯一索引 | UNIQUE KEY | `env_name` | +| 2 | `uniq_name_dtid` | 将`env_name`, `datasource_type_id` 列设置为唯一索引 | UNIQUE INDEX | `env_name`, `datasource_type_id` | + + + +## 42. linkis_ps_dm_datasource_type + +> 数据源类型表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `name` | 数据源类型名称 | varchar(32) | | NO | | | +| 3 | `description` | 数据源类型描述 | varchar(255) | | YES | | | +| 4 | `option` | 数据源所属类型| varchar(32) | | YES | | | +| 5 | `classifier` | 数据源类型分类词 | varchar(32) | | NO | | | +| 6 | `icon` | 数据源图片显示路径| varchar(255) | | YES | | | +| 7 | `layers` | 数据源类型层次 | int(3) | | NO | | | + +**示例数据** + +| id | name | description | option | classifier | icon | layers | +| ---: | --- | --- | --- | --- | --- | ---: | +| 1 | mysql | mysql数据库 | mysql数据库 | 关系型数据库(Relational DB) | | 3 | +| 2 | kafka | kafka | kafka | 消息队列(Message DB) | | 2 | +| 3 | presto | presto SQL | presto | 大数据存储(BigData) | | 3 | +| 4 | hive | hive数据库 | hive | 大数据存储(BigData) | | 3 | +| 6 | mongodb | mongodb 数据源 | mongodb | 半结构化数据库 | \N | 3 | +| 7 | elasticsearch | ES description | es无结构存储 | 分布式全文索引 | \N | 3 | +| 8 | oracle | This is oracle datasource | oracle关系型数据库 | 关系型数据库 | \N | 3 | + + + + +## 43. linkis_ps_dm_datasource_type_key + +> 不同数据源类型所需要进行配置的参数 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `data_source_type_id` | 数据源类型ID linkis_ps_dm_datasource_type对应的id | int(11) | | NO | | | +| 3 | `key` | 数据源参数key值| varchar(32) | | NO | | | +| 4 | `name` | 数据源参数名称 用于前端展示 | varchar(32) | | NO | | | +| 5 | `name_en` | 数据源参数名称 英文 用于前端展示 | varchar(32) | | NO | | | +| 6 | `default_value` | 数据源参数默认值 | varchar(50) | | YES | | | +| 7 | `value_type` | 数据源参数类型 | varchar(50) | | NO | | | +| 8 | `scope` | 数据源参数范围 一般未使用到 | varchar(50) | | YES | | | +| 9 | `require` | 数据源参数是否必须 | tinyint(1) | | YES | | 0 | +| 10 | `description` | 数据源参数描述 用于前端展示| varchar(200) | | YES | | | +| 11 | `description_en` | 数据源参数描述 英文 用于前端展示| varchar(200) | | YES | | | +| 12 | `value_regex` | 数据源参数正则| varchar(200) | | YES | | | +| 13 | `ref_id` | | bigint(20) | | YES | | | +| 14 | `ref_value` | | varchar(50) | | YES | | | +| 15 | `data_source` |数据来源 可以从是一个接口获取 | varchar(200) | | YES | | | +| 16 | `update_time` | | datetime | | NO | | CURRENT_TIMESTAMP | +| 17 | `create_time` | | datetime | | NO | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | data_source_type_id | key | name | default_value | value_type | scope | require | description | value_regex | ref_id | ref_value | data_source | update_time | create_time | +| ---: | ---: | --- | --- | --- | --- | --- | ---: | --- | --- | ---: | --- | --- | --- | --- | +| 1 | 1 | host | Host | \N | TEXT | \N | 1 | mysql Host | \N | \N | \N | \N | 2022-04-12 22:34:11 | 2022-04-12 22:34:11 | +| 2 | 1 | port | 端口 | \N | TEXT | \N | 1 | 端口 | \N | \N | \N | \N | 2022-04-12 22:34:11 | 2022-04-12 22:34:11 | +| 3 | 1 | params | 连接参数 | \N | TEXT | \N | 0 | 输入JSON格式: {"param":"value"} | \N | \N | \N | \N | 2022-04-12 22:34:11 | 2022-04-12 22:34:11 | +| 4 | 1 | username | 用户名 | \N | TEXT | \N | 1 | 用户名 | ^[0-9A-Za-z_-]+$ | \N | \N | \N | 2022-04-12 22:34:11 | 2022-04-12 22:34:11 | +| 5 | 1 | password | 密码 | \N | PASSWORD | \N | 1 | 密码 | | \N | \N | \N | 2022-04-12 22:34:11 | 2022-04-12 22:34:11 | +| 6 | 4 | envId | 集群环境 | \N | SELECT | \N | 1 | 集群环境 | \N | \N | \N | /data-source-manager/env-list/all/type/4 | 2022-04-12 22:34:11 | 2022-04-12 22:34:11 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_dstid_key` | 将`data_source_type_id`, `key` 列设置为唯一索引 | UNIQUE KEY | `data_source_type_id`, `key` | + + + +## 44. linkis_ps_dm_datasource_version + +> 数据源版本信息表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `version_id` | 数据源版本ID | int(11) | PRI | NO | auto_increment | | +| 2 | `datasource_id` | 数据源ID linkis_ps_dm_datasourc 对应的id | int(11) | PRI | NO | | | +| 3 | `parameter` | 数据源该版本参数 | varchar(2048) | | YES | | | +| 4 | `comment` | | varchar(255) | | YES | | | +| 5 | `create_time` | | datetime | | YES | | CURRENT_TIMESTAMP | +| 6 | `create_user` | | varchar(255) | | YES | | | + + +**示例数据** + +| version_id | datasource_id | parameter | comment | create_time | create_user | +| ---: | ---: | --- | --- | --- | --- | +| 1 | 41 | {"envId":"2"} | 初始化版本 | 2022-05-25 12:26:44 | neiljianliu | +| 1 | 42 | {"password":"1234123213","subSystem":"","port":"123","appid":null,"host":"123","authType":null,"objectid":null,"username":"123","mkPrivate":null,"timestamp":null} | qualitis | 2022-05-27 19:56:41 | allenzhou | +| 1 | 43 | {"host":"333","port":"333","username":"333","password":"1234123213"} | 初始化版本 | 2022-05-30 12:31:42 | janicegong | + + + +## 45. linkis_ps_error_code + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `error_code` | | varchar(50) | | NO | | | +| 3 | `error_desc` | | varchar(1024) | | NO | | | +| 4 | `error_regex` | | varchar(1024) | | YES | | | +| 5 | `error_type` | | int(3) | | YES | | 0 | + + +**示例数据** + +| id | error_code | error_desc | error_regex | error_type | +| ---: | --- | --- | --- | ---: | +| 1 | 01001 | 您的任务没有路由到后台ECM,请联系管理员 | The em of labels | 0 | +| 2 | 01002 | Linkis服务负载过高,请联系管理员扩容 | Unexpected end of file from server | 0 | +| 3 | 01003 | Linkis服务负载过高,请联系管理员扩容 | failed to ask linkis Manager Can be retried SocketTimeoutException | 0 | +| 4 | 01004 | 引擎在启动时被Kill,请联系管理员 | [0-9]+ Killed | 0 | + +## 46. linkis_ps_instance_info + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(11) | PRI | NO | auto_increment | | +| 2 | `instance` | structure like ${host\|machine}:${port} | varchar(128) | UNI | YES | | | +| 3 | `name` | equal application name in registry | varchar(128) | | YES | | | +| 4 | `update_time` | update unix timestamp | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | create unix timestamp | datetime | | YES | | CURRENT_TIMESTAMP | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_instance` | 将`instance` 列设置为唯一索引 | UNIQUE KEY | `instance` | + + + +## 47. linkis_ps_instance_label + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_key` | string key | varchar(32) | MUL | NO | | | +| 3 | `label_value` | string value | varchar(255) | | NO | | | +| 4 | `label_feature` | store the feature of label, but it may be redundant | varchar(16) | | NO | | | +| 5 | `label_value_size` | size of key -> value map | int(20) | | NO | | | +| 6 | `update_time` | update unix timestamp | datetime | | NO | | CURRENT_TIMESTAMP | +| 7 | `create_time` | update unix timestamp | datetime | | NO | | CURRENT_TIMESTAMP | + + +**示例数据** + +| id | label_key | label_value | label_feature | label_value_size | update_time | create_time | +| ---: | --- | --- | --- | ---: | --- | --- | +| 68 | route | offline | OPTIONAL | 0 | 2022-11-15 12:51:48 | 2022-11-08 21:58:36 | +| 64 | route | cs_1_dev | OPTIONAL | 0 | 2022-11-08 09:51:26 | 2022-02-16 17:28:31 | +| 5 | route | cs_2_dev | OPTIONAL | 0 | 2022-11-08 09:51:23 | 2021-05-26 14:46:00 | +| 58 | route | auto_test | OPTIONAL | 0 | 2022-11-04 16:51:04 | 2021-09-08 14:19:23 | +| 67 | route | cs_1_dev1 | OPTIONAL | 0 | 2022-10-31 15:58:07 | 2022-10-31 15:58:07 | +| 66 | route | et1 | OPTIONAL | 0 | 2022-08-07 21:39:55 | 2022-08-07 21:39:55 | +| 65 | route | test114 | OPTIONAL | 0 | 2022-07-05 00:18:52 | 2022-07-05 00:18:52 | +| 39 | route | test | OPTIONAL | 0 | 2022-06-28 13:24:19 | 2021-08-02 15:30:03 | +| 62 | route | gjy_test | OPTIONAL | 0 | 2022-02-24 19:25:11 | 2022-01-05 17:27:46 | +| 6 | route | cs_3_dev | OPTIONAL | 0 | 2022-02-17 14:20:33 | 2021-05-26 14:57:12 | +| 63 | route | test_A | OPTIONAL | 0 | 2022-01-06 15:04:35 | 2022-01-06 15:04:35 | +| 61 | userCreator | auto-test | OPTIONAL | 2 | 2021-12-22 14:36:33 | 2021-12-22 14:36:33 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_lk_lv` | 将`label_key`,`label_value` 列设置为唯一索引 | UNIQUE KEY | `label_key`,`label_value` | + + + +**示例数据** + +| id | instance | name | update_time | create_time | +| ---: | --- | --- | --- | --- | +| 1527 | localhost110004:8008 | visualis-prod | 2022-06-28 14:14:36 | 2022-06-28 14:14:36 | +| 1537 | localhost110004:9008 | visualis-dev | 2022-06-30 15:39:19 | 2022-06-30 15:39:18 | +| 1702 | localhost110004:9108 | linkis-ps-cs | 2022-11-08 09:51:23 | 2022-11-08 09:51:23 | + + +## 48. linkis_ps_instance_label_relation + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_id` | id reference linkis_ps_instance_label -> id | int(20) | MUL | YES | | | +| 3 | `service_instance` | structure like ${host\|machine}:${port} | varchar(128) | | NO | | | +| 4 | `update_time` | update unix timestamp | datetime | | YES | | CURRENT_TIMESTAMP | +| 5 | `create_time` | create unix timestamp | datetime | | YES | | CURRENT_TIMESTAMP | + +**示例数据** + +| id | label_id | service_instance | update_time | create_time | +| ---: | ---: | --- | --- | --- | +| 562 | 2 | localhost110002:9108 | 2022-02-14 11:58:57 | 2022-02-14 11:58:57 | +| 875 | 5 | localhost110004:9108 | 2022-11-08 09:51:23 | 2022-11-08 09:51:23 | +| 876 | 64 | localhost11ide01:9108 | 2022-11-08 09:51:26 | 2022-11-08 09:51:26 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_lid_instance` | 将`label_id`,`service_instance` 列设置为唯一索引 | UNIQUE KEY | `label_id`,`service_instance` | + + + +## 49. linkis_ps_instance_label_value_relation + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `label_value_key` | value key | varchar(255) | MUL | NO | | | +| 3 | `label_value_content` | value content | varchar(255) | | YES | | | +| 4 | `label_id` | id reference linkis_ps_instance_label -> id | int(20) | | YES | | | +| 5 | `update_time` | update unix timestamp | datetime | | YES | | CURRENT_TIMESTAMP | +| 6 | `create_time` | create unix timestamp | datetime | | YES | | CURRENT_TIMESTAMP | + +**示例数据** + +| label_value_key | label_value_content | label_id | update_time | create_time | +| --- | --- | ---: | --- | --- | +| creator | test | 61 | 2021-12-22 14:36:33 | 2021-12-22 14:36:33 | +| user | auto | 61 | 2021-12-22 14:36:33 | 2021-12-22 14:36:33 | +| creator | a | 50 | 2021-08-03 19:40:48 | 2021-08-03 19:40:48 | +| user | a | 50 | 2021-08-03 19:40:48 | 2021-08-03 19:40:48 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_lvk_lid` | 将`label_value_key`,`label_id` 列设置为唯一索引 | UNIQUE KEY | `label_value_key`,`label_id` | + + + +## 50. linkis_ps_job_history_detail + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | Primary Key, auto increment | bigint(20) | PRI | NO | auto_increment | | +| 2 | `job_history_id` | ID of JobHistory | bigint(20) | | NO | | | +| 3 | `result_location` | File path of the resultsets | varchar(500) | | YES | | | +| 4 | `execution_content` | The script code or other execution content executed by this Job | text | | YES | | | +| 5 | `result_array_size` | size of result array | int(4) | | YES | | 0 | +| 6 | `job_group_info` | Job group info/path | text | | YES | | | +| 7 | `created_time` | Creation time | datetime(3) | | YES | | CURRENT_TIMESTAMP(3) | +| 8 | `updated_time` | Update time | datetime(3) | | YES | | CURRENT_TIMESTAMP(3) | +| 9 | `status` | status | varchar(32) | | YES | | | +| 10 | `priority` | order of subjob | int(4) | | YES | | 0 | + +**示例数据** + +| id | job_history_id | result_location | execution_content | result_array_size | job_group_info | created_time | updated_time | status | priority | +| ---: | ---: | --- | --- | ---: | --- | --- | --- | --- | ---: | +| 1700001 | 1561337 | hdfs:///apps-data/neiljianliu/linkis/20211225_201252/nodeexecution/1561337 | select * from default.dwc_vsbi_students_demo limit 5000 | 1 | | 2021-12-25 20:12:52 | 2021-12-25 20:12:54 | Succeed | 0 | +| 1700002 | 1561339 | \N | {"configuration":{},"variable":{"user.to.proxy":"neiljianliu","run_date":"20211224"},"run_date":"20211224","labels":{"labels":"{\"route\":\"prod\"}"}} | \N | | 2021-12-25 20:15:51 | 2021-12-25 20:15:52 | Failed | 0 | +| 1700003 | 1561338 | hdfs:///apps-data/neiljianliu/linkis/20211225_201551/nodeexecution/1561338 | {"config":"","description":"","id":380.0,"model":"","name":"view_3142","projectId":864.0,"roles":"","source":{"id":318.0,"name":"hiveDataSource"},"sourceId":318.0,"sql":"","variable":""} | 1 | | 2021-12-25 20:15:51 | 2021-12-25 20:15:55 | Succeed | 0 | +| 1700004 | 1561340 | hdfs:///apps-data/neiljianliu/linkis/20211225_201552/nodeexecution/1561340 | select * from default.dwc_vsbi_students_demo limit 5000 | 1 | | 2021-12-25 20:15:52 | 2021-12-25 20:15:54 | Succeed | 0 | +| 1700005 | 1561341 | hdfs:///apps-data/neiljianliu/linkis/20211225_201852/nodeexecution/1561341 | {"config":"","description":"","id":380.0,"model":"","name":"view_3142","projectId":864.0,"roles":"","source":{"id":318.0,"name":"hiveDataSource"},"sourceId":318.0,"sql":"","variable":""} | 1 | | 2021-12-25 20:18:52 | 2021-12-25 20:18:56 | Succeed | 0 | +| 1700006 | 1561342 | \N | {"configuration":{},"variable":{"user.to.proxy":"neiljianliu","run_date":"20211224"},"run_date":"20211224","labels":{"labels":"{\"route\":\"prod\"}"}} | \N | | 2021-12-25 20:18:52 | 2021-12-25 20:18:52 | Failed | 0 | + + + + + +## 51. linkis_ps_job_history_group_history + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | Primary Key, auto increment | bigint(20) | PRI | NO | auto_increment | | +| 2 | `job_req_id` | job execId | varchar(64) | | YES | | | +| 3 | `submit_user` | who submitted this Job | varchar(50) | MUL | YES | | | +| 4 | `execute_user` | who actually executed this Job | varchar(50) | | YES | | | +| 5 | `source` | job source | text | | YES | | | +| 6 | `labels` | job labels | text | | YES | | | +| 7 | `params` | job params | text | | YES | | | +| 8 | `progress` | Job execution progress | varchar(32) | | YES | | | +| 9 | `status` | Script execution status, must be one of the following: Inited, WaitForRetry, Scheduled, Running, Succeed, Failed, Cancelled, Timeout | varchar(50) | | YES | | | +| 10 | `log_path` | File path of the job log | varchar(200) | | YES | | | +| 11 | `error_code` | Error code. Generated when the execution of the script fails | int(11) | | YES | | | +| 12 | `error_desc` | Execution description. Generated when the execution of script fails | varchar(1000) | | YES | | | +| 13 | `created_time` | Creation time | datetime(3) | MUL | YES | | CURRENT_TIMESTAMP(3) | +| 14 | `updated_time` | Update time | datetime(3) | | YES | | CURRENT_TIMESTAMP(3) | +| 15 | `instances` | Entrance instances | varchar(250) | | YES | | | +| 16 | `metrics` | Job Metrics | text | | YES | | | +| 17 | `engine_type` | Engine type | varchar(32) | | YES | | | +| 18 | `execution_code` | Job origin code or code path | text | | YES | | | +| 19 | `result_location` | File path of the resultsets | varchar(500) | | YES | | | + + +**示例数据** + +| id | job_req_id | submit_user | execute_user | source | labels | params | progress | status | log_path | error_code | error_desc | created_time | updated_time | instances | metrics | engine_type | execution_code | result_location | +| ---: | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---: | --- | --- | --- | --- | --- | --- | --- | --- | +| 3400407 | nodeexecution_owenxu_spark_29 | owenxu | owenxu | {"nodeName":"sql_9024","requestIP":"127.0.0.1","projectName":"testpubauthority","flowName":"test01"} | {"codeType":"sql","engineType":"spark-2.4.3","userCreator":"owenxu-nodeexecution"} | {"configuration":{"runtime":{"nodeName":"sql_9024","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"+PHsmq+A1AkWQ3olJILCuFspWs9RflbL2HLiVea4FcQ\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","wds.dss.workflow.submit.user":"owenxu","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"owenxu\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"testpubauthority\\\",\\\"flow\\\":\\\"test01\\\",\\\"contextId\\\":\\\"8-8--cs_1_devcs_1_dev58211\\\",\\\"version\\\":\\\"v000003\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","nodeType":"sql","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/owenxu/linkis/2022-11-16/155518/nodeexecution/3400407","source":{"nodeName":"sql_9024","projectName":"testpubauthority","flowName":"test01","requestIP":"127.0.0.1"},"jobId":"3400407","job":{"#rt_rs_store_path":"hdfs:///apps-data/owenxu/linkis/2022-11-16/155518/nodeexecution/3400407"}},"startup":{"jobId":"3400407"}},"variable":{"user.to.proxy":"owenxu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"owenxu-schedulis","codeType":"sql","engineType":"spark-2.4.3","labels":"{\"route\":\"prod\"}"}} | 1.0 | Succeed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/owenxu/3400407.log | 0 | | 2022-11-16 15:55:18.000 | 2022-11-16 15:55:20.387 | localhost11ide01:9205 | {"scheduleTime":"2022-11-16T15:55:19+0800","timeToOrchestrator":"2022-11-16T15:55:19+0800","engineconnMap":{"gz.xg.localhost110001.webank:27735":{"engineInstance":"gz.xg.localhost110001.webank:27735","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400407_otJobId_astJob_647_codeExec_647","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_647"}},"submitTime":"2022-11-16T15:55:18+0800","yarnResource":{},"completeTime":"2022-11-16T15:55:20+0800"} | spark | select 1| hdfs:///apps-data/owenxu/linkis/2022-11-16/155518/nodeexecution/3400407 | +| 3400406 | nodeexecution_johnnwang_spark_42 | johnnwang | johnnwang | {"nodeName":"sql_2947","requestIP":"127.0.0.1","projectName":"hmh0901","flowName":"flow001"} | {"codeType":"sql","engineType":"spark-2.4.3","userCreator":"johnnwang-nodeexecution"} | {"configuration":{"startup":{"spark.executor.memory":"3G","spark.driver.memory":"3G","spark.executor.cores":"2","spark.executor.instances":"2","wds.linkis.rm.yarnqueue":"dws","ReuseEngine":"true","jobId":"3400406"},"runtime":{"nodeName":"sql_2947","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"Lg76z9Wq/bjKI3Kp1nTKBNZnRJ6dDz3v5E4e2cL2cD4\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","wds.dss.workflow.submit.user":"johnnwang","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"johnnwang\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"hmh0901\\\",\\\"flow\\\":\\\"flow001\\\",\\\"contextId\\\":\\\"8-8--cs_1_devcs_1_dev61373\\\",\\\"version\\\":\\\"v000005\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","nodeType":"sql","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/johnnwang/linkis/2022-11-16/155217/nodeexecution/3400406","source":{"nodeName":"sql_2947","projectName":"hmh0901","flowName":"flow001","requestIP":"127.0.0.1"},"jobId":"3400406","job":{"#rt_rs_store_path":"hdfs:///apps-data/johnnwang/linkis/2022-11-16/155217/nodeexecution/3400406"}}},"variable":{"user.to.proxy":"johnnwang","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"johnnwang-schedulis","codeType":"sql","engineType":"spark-2.4.3","labels":"{\"route\":\"prod\"}"}} | 1.0 | Succeed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/johnnwang/3400406.log | 0 | | 2022-11-16 15:52:17.000 | 2022-11-16 15:52:19.328 | localhost11ide01:9205 | {"scheduleTime":"2022-11-16T15:52:17+0800","timeToOrchestrator":"2022-11-16T15:52:17+0800","engineconnMap":{"gz.xg.localhost110001.webank:35637":{"engineInstance":"gz.xg.localhost110001.webank:35637","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400406_otJobId_astJob_646_codeExec_646","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_646"}},"submitTime":"2022-11-16T15:52:17+0800","yarnResource":{},"completeTime":"2022-11-16T15:52:19+0800"} | spark | show tables;| hdfs:///apps-data/johnnwang/linkis/2022-11-16/155217/nodeexecution/3400406 | +| 3400405 | nodeexecution_johnnwang_appconn_42 | johnnwang | johnnwang | {"nodeName":"sqoop_6588","requestIP":"127.0.0.1","projectName":"hmh0901","flowName":"flow001"} | {"codeType":"exchangis.sqoop","engineType":"appconn-1","userCreator":"johnnwang-nodeexecution"} | {"configuration":{"runtime":{"nodeName":"sqoop_6588","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"Lg76z9Wq/bjKI3Kp1nTKBNZnRJ6dDz3vupd1m5IsFA0\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","variables":{"user.to.proxy":"johnnwang","run_today_h":"2022111615","run_date":"20221115"},"wds.dss.workflow.submit.user":"johnnwang","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"johnnwang\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"hmh0901\\\",\\\"flow\\\":\\\"flow001\\\",\\\"contextId\\\":\\\"8-8--cs_1_devcs_1_dev61373\\\",\\\"version\\\":\\\"v000005\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","nodeType":"exchangis.sqoop","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/johnnwang/linkis/2022-11-16/155217/nodeexecution/3400405","source":{"nodeName":"sqoop_6588","projectName":"hmh0901","flowName":"flow001","requestIP":"127.0.0.1"},"jobId":"3400405","job":{"#rt_rs_store_path":"hdfs:///apps-data/johnnwang/linkis/2022-11-16/155217/nodeexecution/3400405"}},"startup":{"jobId":"3400405"}},"variable":{"user.to.proxy":"johnnwang","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"johnnwang-schedulis","codeType":"exchangis.sqoop","engineType":"appconn-1","labels":"{\"route\":\"prod\"}"}} | 1.0 | Failed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/johnnwang/3400405.log | \N | 21304, Task(codeExec_645) status not succeed,is Failed | 2022-11-16 15:52:17.000 | 2022-11-16 15:52:18.475 | localhost11ide01:9205 | {"scheduleTime":"2022-11-16T15:52:17+0800","timeToOrchestrator":"2022-11-16T15:52:17+0800","engineconnMap":{"localhost110004:10781":{"engineInstance":"localhost110004:10781","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400405_otJobId_astJob_645_codeExec_645","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_645"}},"submitTime":"2022-11-16T15:52:17+0800","yarnResource":{},"completeTime":"2022-11-16T15:52:18+0800"} | appconn | {"id":5924} | hdfs:///apps-data/johnnwang/linkis/2022-11-16/155217/nodeexecution/3400405 | +| 3400404 | nodeexecution_allenlliu_shell_25 | allenlliu | allenlliu | {"nodeName":"shell_4441","requestIP":"127.0.0.1","projectName":"mytest_xq_0032","flowName":"test_workflow001"} | {"codeType":"shell","engineType":"shell-1","userCreator":"allenlliu-nodeexecution"} | {"configuration":{"runtime":{"nodeName":"shell_4441","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"y4h8zre1zbG7a5OlwX8oULazMLTJJpelCaiwk84RsEk\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","wds.dss.workflow.submit.user":"allenlliu","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"allenlliu\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"mytest_xq_0032\\\",\\\"flow\\\":\\\"test_workflow001\\\",\\\"contextId\\\":\\\"8-8--cs_2_devcs_2_dev10489\\\",\\\"version\\\":\\\"v000009\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","nodeType":"sh","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155217/nodeexecution/3400404","source":{"nodeName":"shell_4441","projectName":"mytest_xq_0032","flowName":"test_workflow001","requestIP":"127.0.0.1"},"jobId":"3400404","job":{"#rt_rs_store_path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155217/nodeexecution/3400404"}},"startup":{"jobId":"3400404"}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"allenlliu-schedulis","codeType":"shell","engineType":"shell-1","labels":"{\"route\":\"prod\"}"}} | 1.0 | Succeed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/allenlliu/3400404.log | 0 | | 2022-11-16 15:52:17.000 | 2022-11-16 15:52:18.359 | localhost110002:9205 | {"scheduleTime":"2022-11-16T15:52:17+0800","timeToOrchestrator":"2022-11-16T15:52:17+0800","engineconnMap":{"localhost110004:14499":{"engineInstance":"localhost110004:14499","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400404_otJobId_astJob_532_codeExec_532","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_532"}},"submitTime":"2022-11-16T15:52:17+0800","yarnResource":{},"completeTime":"2022-11-16T15:52:18+0800"} | shell | echo 'hello'| hdfs:///apps-data/allenlliu/linkis/2022-11-16/155217/nodeexecution/3400404 | +| 3400403 | nodeexecution_allenlliu_appconn_111 | allenlliu | allenlliu | {"nodeName":"datachecker_90101_copy_copy","requestIP":"127.0.0.1","projectName":"mytest_xq_0032","flowName":"test_workflow001"} | {"codeType":"datachecker","engineType":"appconn-1","userCreator":"allenlliu-nodeexecution"} | {"configuration":{"startup":{"ReuseEngine":"true","jobId":"3400403"},"runtime":{"max.check.hours":"1","nodeName":"datachecker_90101_copy_copy","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"y4h8zre1zbG7a5OlwX8oUNZnRJ6dDz3vcFfovQF97E8\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","variables":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"wds.dss.workflow.submit.user":"allenlliu","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"allenlliu\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"mytest_xq_0032\\\",\\\"flow\\\":\\\"test_workflow001\\\",\\\"contextId\\\":\\\"8-8--cs_2_devcs_2_dev10489\\\",\\\"version\\\":\\\"v000009\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","check.object":"allenlliu_ind.a","nodeType":"datachecker","source.type":"hivedb","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155217/nodeexecution/3400403","source":{"nodeName":"datachecker_90101_copy_copy","projectName":"mytest_xq_0032","flowName":"test_workflow001","requestIP":"127.0.0.1"},"jobId":"3400403","job":{"#rt_rs_store_path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155217/nodeexecution/3400403"}}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"allenlliu-schedulis","codeType":"datachecker","engineType":"appconn-1","labels":"{\"route\":\"prod\"}"}} | 1.0 | Succeed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/allenlliu/3400403.log | 0 | | 2022-11-16 15:52:17.000 | 2022-11-16 15:52:18.060 | localhost11ide01:9205 | {"scheduleTime":"2022-11-16T15:52:17+0800","timeToOrchestrator":"2022-11-16T15:52:17+0800","engineconnMap":{"localhost110004:10781":{"engineInstance":"localhost110004:10781","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400403_otJobId_astJob_644_codeExec_644","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_644"}},"submitTime":"2022-11-16T15:52:17+0800","yarnResource":{},"completeTime":"2022-11-16T15:52:18+0800"} | appconn | {"configuration":{"startup":{"ReuseEngine":"true"},"runtime":{"max.check.hours":"1","check.object":"allenlliu_ind.a","source.type":"hivedb"}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"labels":"{\"route\":\"prod\"}"}} | hdfs:///apps-data/allenlliu/linkis/2022-11-16/155217/nodeexecution/3400403 | +| 3400402 | nodeexecution_allenlliu_spark_32 | allenlliu | allenlliu | {"nodeName":"sql_3520","requestIP":"127.0.0.1","projectName":"mytest_xq_0032","flowName":"test_workflow001"} | {"codeType":"sql","engineType":"spark-2.4.3","userCreator":"allenlliu-nodeexecution"} | {"configuration":{"runtime":{"nodeName":"sql_3520","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"y4h8zre1zbG7a5OlwX8oULazMLTJJpelslfPQ0jh9bw\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","wds.dss.workflow.submit.user":"allenlliu","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"allenlliu\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"mytest_xq_0032\\\",\\\"flow\\\":\\\"test_workflow001\\\",\\\"contextId\\\":\\\"8-8--cs_2_devcs_2_dev10489\\\",\\\"version\\\":\\\"v000009\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","nodeType":"sql","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400402","source":{"nodeName":"sql_3520","projectName":"mytest_xq_0032","flowName":"test_workflow001","requestIP":"127.0.0.1"},"jobId":"3400402","job":{"#rt_rs_store_path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400402"}},"startup":{"jobId":"3400402"}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"allenlliu-schedulis","codeType":"sql","engineType":"spark-2.4.3","labels":"{\"route\":\"prod\"}"}} | 1.0 | Succeed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/allenlliu/3400402.log | 0 | | 2022-11-16 15:52:16.000 | 2022-11-16 15:52:18.436 | localhost110002:9205 | {"scheduleTime":"2022-11-16T15:52:17+0800","timeToOrchestrator":"2022-11-16T15:52:17+0800","engineconnMap":{"localhost110004:25145":{"engineInstance":"localhost110004:25145","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400402_otJobId_astJob_531_codeExec_531","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_531"}},"submitTime":"2022-11-16T15:52:16+0800","yarnResource":{},"completeTime":"2022-11-16T15:52:18+0800"} | spark | show tables| hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400402 | +| 3400401 | nodeexecution_allenlliu_appconn_85 | allenlliu | allenlliu | {"nodeName":"datachecker_90101","requestIP":"127.0.0.1","projectName":"mytest_xq_0032","flowName":"test_workflow001"} | {"codeType":"datachecker","engineType":"appconn-1","userCreator":"allenlliu-nodeexecution"} | {"configuration":{"startup":{"ReuseEngine":"true","jobId":"3400401"},"runtime":{"max.check.hours":"1","nodeName":"datachecker_90101","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"y4h8zre1zbG7a5OlwX8oULazMLTJJpelHY1ioj7PF6w\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","variables":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"wds.dss.workflow.submit.user":"allenlliu","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"allenlliu\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"mytest_xq_0032\\\",\\\"flow\\\":\\\"test_workflow001\\\",\\\"contextId\\\":\\\"8-8--cs_2_devcs_2_dev10489\\\",\\\"version\\\":\\\"v000009\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","check.object":"allenlliu_ind.a","nodeType":"datachecker","source.type":"hivedb","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400401","source":{"nodeName":"datachecker_90101","projectName":"mytest_xq_0032","flowName":"test_workflow001","requestIP":"127.0.0.1"},"jobId":"3400401","job":{"#rt_rs_store_path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400401"}}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"allenlliu-schedulis","codeType":"datachecker","engineType":"appconn-1","labels":"{\"route\":\"prod\"}"}} | 1.0 | Succeed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/allenlliu/3400401.log | 0 | | 2022-11-16 15:52:16.000 | 2022-11-16 15:52:17.718 | localhost110002:9205 | {"scheduleTime":"2022-11-16T15:52:17+0800","timeToOrchestrator":"2022-11-16T15:52:17+0800","engineconnMap":{"localhost110004:10781":{"engineInstance":"localhost110004:10781","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400401_otJobId_astJob_530_codeExec_530","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_530"}},"submitTime":"2022-11-16T15:52:16+0800","yarnResource":{},"completeTime":"2022-11-16T15:52:17+0800"} | appconn | {"configuration":{"startup":{"ReuseEngine":"true"},"runtime":{"max.check.hours":"1","check.object":"allenlliu_ind.a","source.type":"hivedb"}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"labels":"{\"route\":\"prod\"}"}} | hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400401 | +| 3400400 | nodeexecution_allenlliu_appconn_110 | allenlliu | allenlliu | {"nodeName":"datachecker_90101_copy","requestIP":"127.0.0.1","projectName":"mytest_xq_0032","flowName":"test_workflow001"} | {"codeType":"datachecker","engineType":"appconn-1","userCreator":"allenlliu-nodeexecution"} | {"configuration":{"startup":{"ReuseEngine":"true","jobId":"3400400"},"runtime":{"max.check.hours":"1","nodeName":"datachecker_90101_copy","workspace":"{\"workspaceId\":224,\"workspaceName\":\"bdapWorkspace\",\"cookies\":{\"linkis_user_session_ticket_id_v1\":\"y4h8zre1zbG7a5OlwX8oULazMLTJJpelBtBXO2lr2rM\u003d\",\"dataworkcloud_inner_request\":\"true\",\"workspaceName\":\"bdapWorkspace\",\"workspaceId\":\"224\"},\"dssUrl\":\"http://localhost11ide01:9001\"}","variables":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"wds.dss.workflow.submit.user":"allenlliu","contextID":"{\"type\":\"HAWorkFlowContextID\",\"value\":\"{\\\"instance\\\":null,\\\"backupInstance\\\":null,\\\"user\\\":\\\"allenlliu\\\",\\\"workspace\\\":\\\"bdapWorkspace\\\",\\\"project\\\":\\\"mytest_xq_0032\\\",\\\"flow\\\":\\\"test_workflow001\\\",\\\"contextId\\\":\\\"8-8--cs_2_devcs_2_dev10489\\\",\\\"version\\\":\\\"v000009\\\",\\\"env\\\":\\\"BDAP_DEV\\\"}\"}","check.object":"allenlliu_ind.a","nodeType":"datachecker","source.type":"hivedb","labels":"{\"route\":\"prod\"}","wds.linkis.resultSet.store.path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400400","source":{"nodeName":"datachecker_90101_copy","projectName":"mytest_xq_0032","flowName":"test_workflow001","requestIP":"127.0.0.1"},"jobId":"3400400","job":{"#rt_rs_store_path":"hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400400"}}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"userCreator":"allenlliu-schedulis","codeType":"datachecker","engineType":"appconn-1","labels":"{\"route\":\"prod\"}"}} | 1.0 | Succeed | hdfs:///appcom/logs/linkis/log/2022-11-16/nodeexecution/allenlliu/3400400.log | 0 | | 2022-11-16 15:52:16.000 | 2022-11-16 15:52:17.736 | localhost11ide01:9205 | {"scheduleTime":"2022-11-16T15:52:17+0800","timeToOrchestrator":"2022-11-16T15:52:17+0800","engineconnMap":{"localhost110004:10781":{"engineInstance":"localhost110004:10781","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400400_otJobId_astJob_643_codeExec_643","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_643"}},"submitTime":"2022-11-16T15:52:16+0800","yarnResource":{},"completeTime":"2022-11-16T15:52:17+0800"} | appconn | {"configuration":{"startup":{"ReuseEngine":"true"},"runtime":{"max.check.hours":"1","check.object":"allenlliu_ind.a","source.type":"hivedb"}},"variable":{"user.to.proxy":"allenlliu","run_today_h":"2022111615","run_date":"20221115"},"run_today_h":"2022111615","run_date":"20221115","labels":{"labels":"{\"route\":\"prod\"}"}} | hdfs:///apps-data/allenlliu/linkis/2022-11-16/155216/nodeexecution/3400400 | +| 3400399 | IDE_connorliuyude_spark_1 | connorliuyude | connorliuyude | {"DSS-Scriptis":"import_to_connorliuyude_qml.peter_100w_1000_a_1668585127900.scala","requestIP":"127.0.0.1"} | {"codeType":"scala","engineType":"spark-2.4.3","userCreator":"connorliuyude-IDE"} | {"configuration":{"special":{},"runtime":{"args":"","env":[],"wds.linkis.resultSet.store.path":"hdfs:///apps-data/connorliuyude/linkis/2022-11-16/155208/IDE/3400399","source":{"DSS-Scriptis":"import_to_connorliuyude_qml.peter_100w_1000_a_1668585127900.scala","requestIP":"127.0.0.1"},"jobId":"3400399","job":{"#rt_rs_store_path":"hdfs:///apps-data/connorliuyude/linkis/2022-11-16/155208/IDE/3400399"}},"startup":{"jobId":"3400399"}},"variable":{}} | 0.7191358 | Running | hdfs:///appcom/logs/linkis/log/2022-11-16/IDE/connorliuyude/3400399.log | \N | \N | 2022-11-16 15:52:08.000 | 2022-11-16 15:55:38.556 | localhost11ide01:9205 | {"scheduleTime":"2022-11-16T15:52:09+0800","timeToOrchestrator":"2022-11-16T15:52:09+0800","engineconnMap":{"gz.xg.localhost110001.webank:33228":{"engineInstance":"gz.xg.localhost110001.webank:33228","taskClassname":"CodeLogicalUnitExecTask","idInfo":"TaskID_3400399_otJobId_astJob_642_codeExec_642","taskName":"CodeLogicalUnitExecTask","execId":"codeExec_642"}},"submitTime":"2022-11-16T15:52:08+0800","yarnResource":{"application_1662051718074_332612":{"queueMemory":107374182400,"queueCores":20,"queueInstances":0,"jobStatus":"COMPLETED","queue":"queue_0701_01"}}} | spark | val source = """{"path":"/apps-data/connorliuyude/peter_100w_1000_a.csv","pathType":"hdfs","encoding":"utf-8","fieldDelimiter":",","hasHeader":true,"sheet":"","quote":"","escapeQuotes":false}""" val destination = """hdfs:///tmp/bdp-ide/connorliuyude/executionCode/20221116/_bgservice;454023#74026""" org.apache.linkis.engineplugin.spark.imexport.LoadData.loadDataToTableByFile(spark,destination,source) | hdfs:///apps-data/connorliuyude/linkis/2022-11-16/155208/IDE/3400399 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `idx_created_time` | 将`created_time` 列设置为普通索引 | INDEX | `created_time` | +| 2 | `idx_submit_user` | 将`submit_user` 列设置为普通索引 | INDEX | `submit_user` | + + +## 52. linkis_ps_resources_download_history + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | primary key | bigint(20) | PRI | NO | auto_increment | | +| 2 | `start_time` | start time | datetime | | NO | | CURRENT_TIMESTAMP | +| 3 | `end_time` | stop time | datetime | | NO | | CURRENT_TIMESTAMP | +| 4 | `client_ip` | client ip | varchar(200) | | NO | | | +| 5 | `state` | Download status, 0 download successful, 1 download failed | tinyint(1) | | NO | | | +| 6 | `resource_id` | | varchar(50) | | NO | | | +| 7 | `version` | | varchar(20) | | NO | | | +| 8 | `downloader` | Downloader | varchar(50) | | NO | | | + + +**示例数据** + +| id | start_time | end_time | client_ip | state | resource_id | version | downloader | +| ---: | --- | --- | --- | ---: | --- | --- | --- | +| 1859617 | 2022-11-16 15:56:17 | 2022-11-16 15:56:18 | 127.0.0.1 | 0 | 11b8ca20-3437-4f31-a808-915a6f016a87 | v000001 | owenxu | +| 1859614 | 2022-11-16 15:55:18 | 2022-11-16 15:55:18 | 127.0.0.1 | 0 | 836ba735-3a46-4303-8e9f-c4276a356386 | v000001 | owenxu | +| 1859613 | 2022-11-16 15:53:06 | 2022-11-16 15:53:07 | 127.0.0.1 | 0 | cb407155-242b-4303-8365-1da6256a01e3 | v000173 | hadoop | +| 1859612 | 2022-11-16 15:52:17 | 2022-11-16 15:52:17 | 127.0.0.1 | 0 | 665fe5ce-fdc6-4b9a-ab08-955e48b1f8d4 | v000001 | owenxu | + + +## 53. linkis_ps_udf + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `create_user` | | varchar(50) | | NO | | | +| 3 | `udf_name` | | varchar(255) | | NO | | | +| 4 | `udf_type` | | int(11) | | YES | | 0 | +| 5 | `path` | Path of the referenced function | varchar(255) | | YES | | | +| 6 | `register_format` | | varchar(255) | | YES | | | +| 7 | `use_format` | | varchar(255) | | YES | | | +| 8 | `description` | | varchar(255) | | YES | | | +| 9 | `is_expire` | | bit(1) | | YES | | | +| 10 | `is_shared` | | bit(1) | | YES | | | +| 11 | `tree_id` | | bigint(20) | | NO | | | +| 12 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 13 | `update_time` | | timestamp | | NO | | CURRENT_TIMESTAMP | + + +**示例数据** + +| id | create_user | udf_name | udf_type | path | register_format | use_format | description | is_expire | is_shared | tree_id | create_time | update_time | +| ---: | --- | --- | ---: | --- | --- | --- | --- | ---: | ---: | ---: | --- | --- | +| 204 | neiljianliu | jar_udf | 0 | /mnt/bdap/neiljianliu/zy_test/Wbjar_1.0.0.jar | create temporary function jar_udf as "com.webank.bdp.mask.udf.BdpBankCardNoFirstEightMask" | String jar_udf(String) | | 0 | 0 | 145 | 2021-11-09 09:52:31 | 2021-11-09 09:52:31 | +| 205 | neiljianliu | jar_udf1 | 0 | /mnt/bdap/neiljianliu/zy_test/Wbjar_1.1.jar | create temporary function jar_udf1 as "com.webank.bdp.mask.udf.BdpBankCardNoFirstEightMask" | String jar_udf1(String) | | 0 | 0 | 145 | 2021-11-09 09:43:28 | 2021-11-09 09:43:28 | + + + + +## 54. linkis_ps_udf_baseinfo + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `create_user` | | varchar(50) | | NO | | | +| 3 | `udf_name` | | varchar(255) | | NO | | | +| 4 | `udf_type` | | int(11) | | YES | | 0 | +| 5 | `tree_id` | | bigint(20) | | NO | | | +| 6 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 7 | `update_time` | | timestamp | | NO | | CURRENT_TIMESTAMP | +| 8 | `sys` | source system | varchar(255) | | NO | | ide | +| 9 | `cluster_name` | | varchar(255) | | NO | | | +| 10 | `is_expire` | | bit(1) | | YES | | | +| 11 | `is_shared` | | bit(1) | | YES | | | + + +**示例数据** + +| id | create_user | udf_name | udf_type | tree_id | create_time | update_time | sys | cluster_name | is_expire | is_shared | +| ---: | --- | --- | ---: | ---: | --- | --- | --- | --- | ---: | ---: | +| 318 | neiljianliu | h01 | 3 | 1370 | 2022-08-08 19:39:39 | 2021-11-04 20:36:46 | IDE | all | 0 | 1 | +| 321 | neiljianliu | h14 | 1 | 1331 | 2021-11-01 23:28:25 | 2021-10-29 10:39:08 | IDE | all | 0 | 0 | +| 324 | stacyyan | udf_jar_834 | 0 | 133 | 2021-10-29 11:28:10 | 2021-10-29 11:28:10 | ide | all | 0 | 0 | + +## 55. linkis_ps_udf_manager + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `user_name` | | varchar(20) | | YES | | | + +**示例数据** + +| id | user_name | +| ---: | --- | +| 1 | stacyyan | +| 2 | johnnwang | +| 3 | neiljianliu | + + + + +## 56. linkis_ps_udf_shared_group + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | | bigint(20) | | NO | | | +| 3 | `shared_group` | | varchar(50) | | NO | | | + +**示例数据** + +| id | udf_id | user_name | +| ---: | ---: | --- | +| 1 | 36 | jianfuzhang | +| 2 | 36 | stacyyan | +| 3 | 38 | shanhuang | +| 4 | 38 | stacyyan | + + + + +## 57. linkis_ps_udf_shared_info + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | | bigint(20) | | NO | | | +| 3 | `user_name` | | varchar(50) | | NO | | | + + +## 58. linkis_ps_udf_shared_user + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | | bigint(20) | | NO | | | +| 3 | `user_name` | | varchar(50) | | NO | | | + +**示例数据** + +| id | udf_id | user_name | +| ---: | ---: | --- | +| 63 | 117 | jianfuzhang | +| 64 | 119 | neiljianliu | +| 65 | 119 | johnnwang | +| 66 | 126 | jianfuzhang | + + + +## 59. linkis_ps_udf_tree + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `parent` | | bigint(20) | | NO | | | +| 3 | `name` | Category name of the function. It would be displayed in the front-end | varchar(100) | | YES | | | +| 4 | `user_name` | | varchar(50) | | NO | | | +| 5 | `description` | | varchar(255) | | YES | | | +| 6 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 7 | `update_time` | | timestamp | | NO | | CURRENT_TIMESTAMP | +| 8 | `category` | Used to distinguish between udf and function | varchar(50) | | YES | | | + + +**示例数据** + +| id | parent | name | user_name | description | create_time | update_time | category | +| ---: | ---: | --- | --- | --- | --- | --- | --- | +| 21 | -1 | 系统函数 | sys | | 2021-04-29 19:22:07 | 2021-04-29 19:22:07 | function | +| 22 | -1 | BDAP函数 | bdp | | 2021-04-29 19:22:07 | 2021-04-29 19:22:07 | function | +| 23 | -1 | 共享函数 | share | | 2021-04-29 19:22:07 | 2021-04-29 19:22:07 | function | +| 24 | -1 | 个人函数 | jianfuzhang | | 2021-04-29 19:22:07 | 2021-04-29 19:22:07 | function | +| 25 | -1 | 个人函数 | hduser05 | | 2021-04-30 10:15:14 | 2021-04-30 10:15:14 | udf | +| 26 | -1 | 系统函数 | sys | | 2021-04-30 11:21:13 | 2021-04-30 11:21:13 | udf | +| 27 | -1 | BDAP函数 | bdp | | 2021-04-30 11:21:13 | 2021-04-30 11:21:13 | udf | +| 28 | -1 | 共享函数 | share | | 2021-04-30 11:21:13 | 2021-04-30 11:21:13 | udf | +| 29 | -1 | 个人函数 | alexyang | | 2021-05-06 20:41:48 | 2021-05-06 20:41:48 | function | +| 30 | -1 | 个人函数 | johnnwang | | 2021-05-06 21:47:52 | 2021-05-06 21:47:52 | udf | +| 1587 | -1 | 个人函数 | aronlv | | 2022-11-15 10:47:27 | 2022-11-15 10:47:27 | udf | +| 1586 | -1 | 个人函数 | aronlv | | 2022-11-15 10:47:26 | 2022-11-15 10:47:26 | function | +| 1585 | -1 | 个人函数 | jackyxxie | | 2022-11-14 14:59:44 | 2022-11-14 14:59:44 | udf | +| 1584 | 36 | 自定义分类1 | stacyyan | | 2022-11-11 17:10:56 | 2022-11-11 17:10:56 | udf | +| 1583 | -1 | 个人函数 | alvinzhou | | 2022-11-09 11:23:04 | 2022-11-09 11:23:04 | function | +| 1582 | 36 | qualitis自定义分类 | stacyyan | | 2022-11-08 16:22:31 | 2022-11-08 16:22:31 | udf | +| 1581 | 36 | qualitis测试 | stacyyan | | 2022-11-07 12:21:30 | 2022-11-07 12:21:30 | udf | +| 1580 | 29 | fun自动化测试 | alexyang | | 2022-11-04 19:16:29 | 2022-11-04 19:16:29 | function | +| 1579 | 20 | udf自动化测试 | alexyang | | 2022-11-04 19:16:25 | 2022-11-04 19:16:25 | udf | +| 1578 | 20 | 测试 | alexyang | | 2022-11-01 11:05:46 | 2022-11-01 11:05:46 | udf | +| 1577 | -1 | 个人函数 | jeromepeng | | 2022-10-31 10:54:33 | 2022-10-31 10:54:33 | function | +| 1576 | -1 | 个人函数 | jeromepeng | | 2022-10-31 10:54:31 | 2022-10-31 10:54:31 | udf | + + +## 60. linkis_ps_udf_user_load + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | | bigint(20) | | NO | | | +| 3 | `user_name` | | varchar(50) | | NO | | | + +**示例数据** + +| udf_id | user_name | +| ---: | --- | +| 34 | johnnwang | +| 53 | johnnwang | +| 34 | neiljianliu | +| 109 | stacyyan | +| 110 | stacyyan | + + + + + +## 61. linkis_ps_udf_user_load_info + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | | int(11) | | NO | | | +| 3 | `user_name` | | varchar(50) | | NO | | | + + +**示例数据** + +| id | udf_id | user_name | +| ---: | ---: | --- | +| 1 | 13 | hadoop | +| 2 | 14 | bob | +| 3 | 18 | testuser | + + + +## 62. linkis_ps_udf_version + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | | bigint(20) | | NO | | | +| 3 | `path` | Source path for uploading files | varchar(255) | | NO | | | +| 4 | `bml_resource_id` | | varchar(50) | | NO | | | +| 5 | `bml_resource_version` | | varchar(20) | | NO | | | +| 6 | `is_published` | is published | bit(1) | | YES | | | +| 7 | `register_format` | | varchar(255) | | YES | | | +| 8 | `use_format` | | varchar(255) | | YES | | | +| 9 | `description` | version desc | varchar(255) | | NO | | | +| 10 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 11 | `md5` | | varchar(100) | | YES | | | + +**示例数据** + +| id | udf_id | path | bml_resource_id | bml_resource_version | is_published | register_format | use_format | description | create_time | md5 | +| ---: | ---: | --- | --- | --- | ---: | --- | --- | --- | --- | --- | +| 80 | 34 | file:///mnt/bdap/johnnwang/wds_functions1_0_0.jar | aee4698a-0aad-4dfe-9e3c-0d2c674c81f9 | v000001 | 0 | create temporary function cf_charcount_s as "com.webank.wedatasphere.willink.bdp.udf.CountTotalCharInStr" | int cf_charcount_s(string,string) | | 2021-10-20 16:50:57 | \N | +| 93 | 34 | file:///mnt/bdap/johnnwang/wds_functions1_0_0.jar | aee4698a-0aad-4dfe-9e3c-0d2c674c81f9 | v000002 | 1 | create temporary function cf_charcount_s as "com.webank.wedatasphere.willink.bdp.udf.CountTotalCharInStr" | int cf_charcount_s(string,string) | | 2021-10-20 18:53:59 | \N | +| 205 | 96 | file:///mnt/bdap/stacyyan/tm_client_1.6_cp.jar | 759c6179-060e-4c61-9ff9-8f6e18d0efaf | v000001 | 0 | create temporary function udf_jar_834 as "com.webank.bdp.mask.udf.BdpBankCardNoFirstEightMask" | udf_jar_834() | | 2021-10-23 16:57:00 | \N | +| 250 | 109 | file:///mnt/bdap/stacyyan/scala系统函数调用.scala | 4519f563-ac8a-48a3-a487-36b0d629bc59 | v000001 | 0 | \N | String aadfdff() | | 2021-10-25 16:56:04 | \N | +| 251 | 110 | file:///mnt/bdap/stacyyan/scala系统函数调用.scala | e0caa4a5-754e-4517-9d0d-5610c7712d82 | v000001 | 0 | \N | String df78() | | 2021-10-25 16:56:28 | \N | +| 257 | 116 | file:///mnt/bdap/udf/udf_pyspark_011621477729461.py | 2917d57a-0078-455f-8eda-45d18d90adb3 | v000001 | 1 | udf.register("udf_hello_0518",hello) | String udf_hello_0518(String) | aaaad | 2021-10-25 17:31:43 | \N | + + +## 63. linkis_ps_variable_key + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `key` | Key of the global variable | varchar(50) | | YES | | | +| 3 | `description` | Reserved word | varchar(200) | | YES | | | +| 4 | `name` | Reserved word | varchar(50) | | YES | | | +| 5 | `application_id` | Reserved word | bigint(20) | MUL | YES | | | +| 6 | `default_value` | Reserved word | varchar(200) | | YES | | | +| 7 | `value_type` | Reserved word | varchar(50) | | YES | | | +| 8 | `value_regex` | Reserved word | varchar(100) | | YES | | | + +**示例数据** + +| id | key | description | name | application_id | default_value | value_type | value_regex | +| ---: | --- | --- | --- | ---: | --- | --- | --- | +| 1 | di_marw_warn_flow_dcn_d | \N | \N | -1 | \N | \N | \N | +| 2 | table_a | \N | \N | -1 | \N | \N | \N | +| 3 | table_a | \N | \N | -1 | \N | \N | \N | +| 4 | aaaa | \N | \N | -1 | \N | \N | \N | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `idx_aid` | 将`application_id` 列设置为普通索引 | INDEX | `application_id` | + + + +## 64. linkis_ps_variable_key_user + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `application_id` | Reserved word | bigint(20) | MUL | YES | | | +| 3 | `key_id` | | bigint(20) | MUL | YES | | | +| 4 | `user_name` | | varchar(50) | | YES | | | +| 5 | `value` | Value of the global variable | varchar(200) | | YES | | | + + +**示例数据** + +| id | application_id | key_id | user_name | value | +| ---: | ---: | ---: | --- | --- | +| 1 | -1 | 1 | neiljianliu | d | +| 2 | -1 | 2 | stacyyan | student | +| 3 | -1 | 3 | jianfuzhang | a_01 | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `idx_key_id` | 将`key_id` 列设置为普通索引 | INDEX | `key_id` | +| 2 | `uniq_aid_kid_uname` | 将`application_id`,`key_id`,`user_name` 列设置为普通索引 | INDEX | `application_id`,`key_id`,`user_name` | +| 3 | `idx_aid` | 将`application_id` 列设置为普通索引 | INDEX | `application_id` | + +## 65.linkis_cg_user_ip_config + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `user` | | varchar(50) | NO | | | | +| 3 | `creator` | | varchar(50) | NO | | | | +| 4 | `ip_list` | | text | NO | | | | +| 5 | `create_time` | | datetime |NO | | | | +| 6 | `update_time` | | datetime |NO | | | | +| 7 | `desc` | | varchar(100) |NO | | | | +| 8 | `bussiness_user` | | varchar(50) |NO | | | | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uniq_user_creator` | 将`user`,`creator` 列设置为唯一索引 | UNIQUE KEY | `user`,`creator` | + + +## 66.linkis_cg_tenant_label_config + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | +| 1 | `id` | | int(20) | PRI | NO | auto_increment | | +| 2 | `user` | | varchar(50) | NO | | | | +| 3 | `creator` | | varchar(50) | NO | | | | +| 4 | `tenant_value` | | varchar(128) | NO | | | | +| 5 | `create_time` | | datetime |NO | | | | +| 6 | `update_time` | | datetime |NO | | | | +| 7 | `desc` | | varchar(100) |NO | | | | +| 8 | `bussiness_user` | | varchar(50) |NO | | | | + +**索引说明** + +| 序号 | 名称 | 描述 | 类型 | 字段 | +| :--: | :--: | :--: | :--: | :--: | +| 1 | `uin_user_creator` | 将`user`,`creator` 列设置为唯一索引 | UNIQUE KEY | `user`,`creator` | + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/udf-table.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/udf-table.md new file mode 100644 index 00000000000..e7f88fbd95e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/development/table/udf-table.md @@ -0,0 +1,99 @@ +--- +title: UDF 表结构 +sidebar_position: 2 +--- + +## 1.linkis_ps_udf_baseinfo + +udf函数的基本信息表,存储udf名称/类型等基础信息 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | 主键自增id | bigint(20) | PRI | NO | auto_increment | | +| 2 | `create_user` | 创建用户 | varchar(50) | | NO | | | +| 3 | `udf_name` | udf名称 | varchar(255) | | NO | | | +| 4 | `udf_type` | udf类型 | int(11) | | YES | | 0 | +| 5 | `tree_id` | linkis_ps_udf_tree的id | bigint(20) | | NO | | | +| 6 | `create_time` | 创建时间 | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 7 | `update_time` | 更新时间 | timestamp | | NO | | CURRENT_TIMESTAMP | +| 8 | `sys` | source system | varchar(255) | | NO | | ide | +| 9 | `cluster_name` | 集群名 ,暂时未使用到,默认都是all | varchar(255) | | NO | | | +| 10 | `is_expire` | 是否过期 | bit(1) | | YES | | | +| 11 | `is_shared` | 是否被分享 | bit(1) | | YES | | | + + +udf_type +``` +udf_type 0:udf函数-通用 +udf_type 2: udf函数-spark + +udf_type 3:自定义函数-python函数 +udf_type 4:自定义函数-scala 函数 +``` + +## 2.linkis_ps_udf_manager + +udf函数的管理员用户表,具有共享权限,只有udf管理员 前端才有共享的入口 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `user_name` | | varchar(20) | | YES | | | + +## 3.linkis_ps_udf_shared_info + +udf共享的记录表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | linkis_ps_udf_baseinfo的id | bigint(20) | | NO | | | +| 3 | `user_name` | 共享使用的用户名 | varchar(50) | | NO | | | + +## 4.linkis_ps_udf_tree + +udf分类的树形层级记录表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `parent` | 父级分类 | bigint(20) | | NO | | | +| 3 | `name` | 函数的分类名称 | varchar(100) | | YES | | | +| 4 | `user_name` | 用户名 | varchar(50) | | NO | | | +| 5 | `description` | 描述信息 | varchar(255) | | YES | | | +| 6 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 7 | `update_time` | | timestamp | | NO | | CURRENT_TIMESTAMP | +| 8 | `category` | 类别区分 udf / function | varchar(50) | | YES | | | + +## 5.linkis_ps_udf_user_load + +udf是否默认加载的配置 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | linkis_ps_udf_baseinfo的id | int(11) | | NO | | | +| 3 | `user_name` | 归属用户 | varchar(50) | | NO | | | + +## 6.linkis_ps_udf_version + +udf的版本信息表 + +| 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | linkis_ps_udf_baseinfo的id | bigint(20) | | NO | | | +| 3 | `path` | 上传的脚本/jar包的文件本地路径 | varchar(255) | | NO | | | +| 4 | `bml_resource_id` | bml中的物料资源id | varchar(50) | | NO | | | +| 5 | `bml_resource_version` | bml物料版本 | varchar(20) | | NO | | | +| 6 | `is_published` | 是否发布 | bit(1) | | YES | | | +| 7 | `register_format` | 注册格式 | varchar(255) | | YES | | | +| 8 | `use_format` | 使用格式 | varchar(255) | | YES | | | +| 9 | `description` | 版本描述 | varchar(255) | | NO | | | +| 10 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 11 | `md5` | | varchar(100) | | YES | | | + + +## ER图 + +![image](/Images-zh/table/udf.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/_category_.json new file mode 100644 index 00000000000..d8d839fbfd6 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "引擎使用", + "position": 5 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/elasticsearch.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/elasticsearch.md new file mode 100644 index 00000000000..935b17429b6 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/elasticsearch.md @@ -0,0 +1,243 @@ +--- +title: ElasticSearch +sidebar_position: 10 +--- + +本文主要介绍在 `Linkis` 中,`ElasticSearch` 引擎连接器的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 引擎连接器安装 + +如果您希望在您的 `Linkis` 服务上使用 `ElasticSearch` 引擎连接器,您需要安装 `ElasticSearch` 服务并保证服务可用。 + +### 1.2 服务验证 +通过如下命令验证 `ElasticSearch` 引擎连接器服务是否可用,如服务已开启用户验证则需要增加 `--user username:password` +``` +curl [--user username:password] http://ip:port/_cluster/healty?pretty +``` +输出如下内容代表 `ElasticSearch` 服务可用,注意集群 `status` 为 `green` +```json +{ + "cluster_name" : "docker-cluster", + "status" : "green", + "timed_out" : false, + "number_of_nodes" : 1, + "number_of_data_nodes" : 1, + "active_primary_shards" : 7, + "active_shards" : 7, + "relocating_shards" : 0, + "initializing_shards" : 0, + "unassigned_shards" : 0, + "delayed_unassigned_shards" : 0, + "number_of_pending_tasks" : 0, + "number_of_in_flight_fetch" : 0, + "task_max_waiting_in_queue_millis" : 0, + "active_shards_percent_as_number" : 100.0 +} +``` +## 2. 引擎连接器安装 + +### 2.1 引擎连接器准备(二选一)[非默认引擎连接器](./overview.md) + +方式一:直接下载引擎连接器包 + +[Linkis 引擎连接器下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎连接器(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/elasticsearch/ +mvn clean install +# 编译出来的引擎连接器包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/elasticsearch/target/out/ +``` + +[EngineConnPlugin 引擎连接器安装](../deployment/install-engineconn.md) + +### 2.2 引擎连接器的上传和加载 + +将 2.1 中的引擎连接器包上传到服务器的引擎连接器目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── elasticsearch +│   ├── dist +│   │   └── 7.6.2 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 7.6.2 +``` +### 2.3 引擎连接器刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎连接器 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎连接器是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的`last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到linkis的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3.引擎连接器使用 + +### 3.1 通过 `Linkis-cli` 提交任务 +**`-codeType` 参数说明** +- `essql`:通过 `SQL` 脚本的方式执行 `ElasticSearch` 引擎连接器任务 +- `esjson`:通过 `JSON` 脚本的方式执行 `ElasticSearch` 引擎连接器任务 + +**`essql` 方式示例** + +**注意:** 使用这种形式, `ElasticSearch` 服务必须安装SQL插件,安装方式参考:https://github.com/NLPchina/elasticsearch-sql#elasticsearch-762 +```shell + sh ./bin/linkis-cli -submitUser hadoop \ + -engineType elasticsearch-7.6.2 -codeType essql \ + -code '{"sql": "select * from kibana_sample_data_ecommerce limit 10' \ + -runtimeMap linkis.es.http.method=GET \ + -runtimeMap linkis.es.http.endpoint=/_sql \ + -runtimeMap linkis.es.datasource=hadoop \ + -runtimeMap linkis.es.cluster=127.0.0.1:9200 +``` + +**`esjson` 方式示例** +```shell +sh ./bin/linkis-cli -submitUser hadoop \ +-engineType elasticsearch-7.6.2 -codeType esjson \ +-code '{"query": {"match": {"order_id": "584677"}}}' \ +-runtimeMap linkis.es.http.method=GET \ +-runtimeMap linkis.es.http.endpoint=/kibana_sample_data_ecommerce/_search \ +-runtimeMap linkis.es.datasource=hadoop \ +-runtimeMap linkis.es.cluster=127.0.0.1:9200 +``` + +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +## 4. 引擎连接器配置说明 + +### 4.1 默认配置说明 + +| 配置 | 默认值 |是否必须 | 说明 | +| ------------------------ | ------------------- | ---|---------------------------------------- | +| linkis.es.cluster | 127.0.0.1:9200 |是 | ElasticSearch 集群,多个节点使用逗号分隔 | +| linkis.es.datasource | hadoop |是 | ElasticSearch datasource | +| linkis.es.username | 无 |否 | ElasticSearch 集群用户名 | +| linkis.es.password | 无 |否 | ElasticSearch 集群密码 | +| linkis.es.auth.cache | false |否 | 客户端是否缓存认证 | +| linkis.es.sniffer.enable | false |否 | 客户端是否开启 sniffer | +| linkis.es.http.method | GET |否 | 调用方式 | +| linkis.es.http.endpoint | /_search |否 | JSON 脚本调用的 Endpoint | +| linkis.es.sql.endpoint | /_sql |否 | SQL 脚本调用的 Endpoint | +| linkis.es.sql.format | {"query":"%s"} |否| SQL 脚本调用的模板,%s 替换成 SQL 作为请求体请求Es 集群 | +| linkis.es.headers.* | 无 |否| 客户端 Headers 配置 | +| linkis.engineconn.concurrent.limit | 100|否 | 引擎连接器最大并发 | + +### 4.2 配置修改 +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.2.1 管理台配置 + +![](./images/es-manage.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE -submitUser hadoop \ +-engineType elasticsearch-7.6.2 -codeType esjson \ +-code '{"query": {"match": {"order_id": "584677"}}}' \ +-runtimeMap linkis.es.http.method=GET \ +-runtimeMap linkis.es.http.endpoint=/kibana_sample_data_ecommerce/_search +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "select * from kibana_sample_data_ecommerce limit 10;", "runType": "essql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.es.cluster":"http://127.0.0.1:9200", + "linkis.es.datasource":"hadoop", + "linkis.es.username":"", + "linkis.es.password":"" + } + } + }, + "labels": { + "engineType": "elasticsearch-7.6.2", + "userCreator": "hadoop-IDE" + } +} +``` + +#### 4.2.3 文件配置 +通过修改目录 `${LINKIS_HOME}/lib/linkis-engineconn-plugins/elasticsearch/dist/7.6.2/conf/` 中的 `linkis-engineconn.properties` 文件进行配置,如下图: + +![](./images/es-config.png) + +### 4.3 引擎连接器相关数据表 + +`Linkis` 是通过引擎连接器标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎连接器的配置参数的key和默认values +linkis_cg_manager_label:插入引擎连接器label如:elasticsearch-7.6.2 +linkis_ps_configuration_category: 插入引擎连接器的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎连接器需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎连接器的关联关系 +``` + +表中与引擎连接器相关的初始数据如下 + +```sql +-- set variable +SET @ENGINE_LABEL="elasticsearch-7.6.2"; +SET @ENGINE_ALL=CONCAT('*-*,',@ENGINE_LABEL); +SET @ENGINE_IDE=CONCAT('*-IDE,',@ENGINE_LABEL); +SET @ENGINE_NAME="elasticsearch"; + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from `linkis_cg_manager_label` where label_value = @ENGINE_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.cluster', '例如:http://127.0.0.1:9200', '连接地址', 'http://127.0.0.1:9200', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.datasource', '连接别名', '连接别名', 'hadoop', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.username', 'username', 'ES集群用户名', '无', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.password', 'password', 'ES集群密码', '无', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.auth.cache', '客户端是否缓存认证', '客户端是否缓存认证', 'false', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.sniffer.enable', '客户端是否开启 sniffer', '客户端是否开启 sniffer', 'false', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.http.method', '调用方式', 'HTTP请求方式', 'GET', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.http.endpoint', '/_search', 'JSON 脚本调用的 Endpoint', '/_search', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.sql.endpoint', '/_sql', 'SQL 脚本调用的 Endpoint', '/_sql', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.sql.format', 'SQL 脚本调用的模板,%s 替换成 SQL 作为请求体请求Es 集群', '请求体', '{"query":"%s"}', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.headers.*', '客户端 Headers 配置', '客户端 Headers 配置', '无', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.engineconn.concurrent.limit', '引擎连接器最大并发', '引擎连接器最大并发', '100', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as config_key_id, label.id AS engine_type_label_id FROM `linkis_ps_configuration_config_key` config +INNER JOIN `linkis_cg_manager_label` label ON config.engine_conn_type = @ENGINE_NAME and label_value = @ENGINE_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select relation.config_key_id AS config_key_id, '' AS config_value, relation.engine_type_label_id AS config_label_id FROM `linkis_ps_configuration_key_engine_relation` relation +INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @ENGINE_ALL); + +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/flink.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/flink.md new file mode 100644 index 00000000000..30059bf68dd --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/flink.md @@ -0,0 +1,191 @@ +--- +title: Flink +sidebar_position: 6 +--- + +# Flink 引擎使用文档 + +本文主要介绍在 `Linkis` 中,`flink` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 引擎环境配置 + +如果您希望在您的服务器上使用 `Flink` 引擎,您需要保证以下的环境变量已经设置正确并且引擎的启动用户是有这些环境变量的。 + +### 1.2 引擎验证 + +强烈建议您在执行 `Flink` 任务之前,检查下执行用户的这些环境变量。具体方式是 +``` +sudo su - ${username} +echo ${JAVA_HOME} +echo ${FLINK_HOME} +``` + +| 环境变量名 | 环境变量内容 | 备注 | +|-----------------|----------------|----------------------------------------| +| JAVA_HOME | JDK安装路径 | 必须 | +| HADOOP_HOME | Hadoop安装路径 | 必须 | +| HADOOP_CONF_DIR | Hadoop配置路径 | Linkis启动Flink引擎采用的Flink on yarn的模式,所以需要yarn的支持。 | +| FLINK_HOME | Flink安装路径 | 必须 | +| FLINK_CONF_DIR | Flink配置路径 | 必须,如 ${FLINK_HOME}/conf | +| FLINK_LIB_DIR | Flink包路径 | 必须,${FLINK_HOME}/lib | + + +## 2. 引擎插件安装 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/flink/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/flink/target/out/ +``` + +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎插件包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── flink +│   ├── dist +│   │   └── 1.12.2 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 1.12.2 +``` +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的 `last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到linkis的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + + +## 3. Flink引擎的使用 + +`Linkis` 的 `Flink` 引擎是通过 `flink on yarn` 的方式进行启动的,所以需要指定用户使用的队列,如下图所示。 + +![yarn](./images/yarn-conf.png) + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +sh ./bin/linkis-cli -engineType flink-1.12.2 \ +-codeType sql -code "show tables" \ +-submitUser hadoop -proxyUser hadoop +``` + +更多 `Linkis-Cli` 命令参数参考: [`Linkis-Cli` 使用](../user-guide/linkiscli-manual.md) + +### 3.2 通过 `ComputationEngineConn` 提交任务 + +`FlinkSQL` 可以支持多种数据源,例如 `binlog` , `kafka` , `hive` 等,如果您想要在 `Flink` 代码中使用这些数据源,您需要将这些 `connector` 的插件 `jar` 包放置到 `Flink` 引擎的 `lib` 中,并重启下 `Linkis` 的 `EnginePlugin` 服务。如你想要在您的 `FlinkSQL` 中使用 `binlog` 作为数据源,那么您需要将 `flink-connector-mysql-cdc-1.1.1.jar` 放置到 `Flink` 引擎的 `lib` 中。 + +为了方便大家进行采样调试,我们在 `Scriptis` 新增了 `fql` 的脚本类型,专门用于执行 `FlinkSQL` 。但是需要保证您的 `DSS` 已经升级到 `DSS1.0.0` 。升级到 `DSS1.0.0` 之后,您可以直接进入 `Scriptis` ,新建 `fql` 脚本进行编辑和执行。 + +`FlinkSQL` 的编写示例,以 `binlog` 为例 +```sql +CREATE TABLE mysql_binlog ( + id INT NOT NULL, + name STRING, + age INT +) WITH ( + 'connector' = 'mysql-cdc', + 'hostname' = 'ip', + 'port' = 'port', + 'username' = 'username', + 'password' = 'password', + 'database-name' = 'dbname', + 'table-name' = 'tablename', + 'debezium.snapshot.locking.mode' = 'none' --建议添加,不然会要求锁表 +); +select * from mysql_binlog where id > 10; +``` +在 `Scriptis` 中使用 `select` 语法进行调试的时候,`Flink` 引擎会有一个自动 `cancel` 的机制,即到了指定的时间或者采样的行数到了指定的数量,`Flink` 引擎将会主动将任务 `cancel` ,并且将已经获取到的结果集持久化,然后前端会调用打开结果集的接口将结果集在前端进行展示。 + +### 3.3 通过 `OnceEngineConn` 提交任务 + +`OnceEngineConn` 的使用方式是用于正式启动 `Flink` 的流式应用,具体的是通过 `LinkisManagerClient` 调用 `LinkisManager` `的createEngineConn` 的接口,并将代码发给创建的 `Flink` 引擎,然后 `Flink` 引擎就开始执行,此方式可以被其他系统进行调用,比如 `Streamis` 。 `Client` 的使用方式也很简单,首先新建一个 `maven` 项目,或者在您的项目中引入以下的依赖。 +```xml + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` +然后新建 `scala` 测试文件,点击执行,就完成了从一个 `binlog` 数据进行解析并插入到另一个 `mysql` 数据库的表中。但是需要注意的是,您必须要在 `maven` 项目中新建一个 `resources` 目录,放置一个 `linkis.properties` 文件,并指定 `linkis` 的 `gateway` 地址和 `api` 版本,如 +```properties +wds.linkis.server.version=v1 +wds.linkis.gateway.url=http://ip:9001/ +``` +```java +object OnceJobTest { + def main(args: Array[String]): Unit = { + val sql = """CREATE TABLE mysql_binlog ( + | id INT NOT NULL, + | name STRING, + | age INT + |) WITH ( + | 'connector' = 'mysql-cdc', + | 'hostname' = 'ip', + | 'port' = 'port', + | 'username' = '${username}', + | 'password' = '${password}', + | 'database-name' = '${database}', + | 'table-name' = '${tablename}', + | 'debezium.snapshot.locking.mode' = 'none' + |); + |CREATE TABLE sink_table ( + | id INT NOT NULL, + | name STRING, + | age INT, + | primary key(id) not enforced + |) WITH ( + | 'connector' = 'jdbc', + | 'url' = 'jdbc:mysql://${ip}:port/${database}', + | 'table-name' = '${tablename}', + | 'driver' = 'com.mysql.jdbc.Driver', + | 'username' = '${username}', + | 'password' = '${password}' + |); + |INSERT INTO sink_table SELECT id, name, age FROM mysql_binlog; + |""".stripMargin + val onceJob = SimpleOnceJob.builder().setCreateService("Flink-Test").addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY, "flink-1.12.2") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY, "hadoop-Streamis").addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY, "once") + .addStartupParam(Configuration.IS_TEST_MODE.key, true) + // .addStartupParam("label." + LabelKeyConstant.CODE_TYPE_KEY, "sql") + .setMaxSubmitTime(300000) + .addExecuteUser("hadoop").addJobContent("runType", "sql").addJobContent("code", sql).addSource("jobName", "OnceJobTest") + .build() + onceJob.submit() + println(onceJob.getId) + onceJob.waitForCompleted() + System.exit(0) + } +} +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/hive.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/hive.md new file mode 100644 index 00000000000..e5783c2f15e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/hive.md @@ -0,0 +1,290 @@ +--- +title: Hive +sidebar_position: 2 +--- + +本文主要介绍在 `Linkis` 中, `Hive` 引擎连接器的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 擎使用前的环境配置 + +如果您希望在您的服务器上使用 `Hive` 引擎连接器,您需要保证以下的环境变量已经设置正确并且引擎连接器的启动用户是有这些环境变量的。 + +强烈建议您在执行 `Hive` 任务之前,检查下执行用户的这些环境变量。 + +| 环境变量名 | 环境变量内容 | 备注 | +|-----------------|----------------|------| +| JAVA_HOME | JDK安装路径 | 必须 | +| HADOOP_HOME | Hadoop安装路径 | 必须 | +| HADOOP_CONF_DIR | Hadoop配置路径 | 必须 | +| HIVE_CONF_DIR | Hive配置路径 | 必须 | + +### 1.1 环境验证 +``` +# 链接hive +bin/hive + +# 测试命令 +show databases; + +# 能够链接成功,并正常输出数据库信息代表环境配置成功 +hive (default)> show databases; +OK +databases_name +default +``` + +## 2. 引擎插件安装 [默认引擎](./overview.md) + +`linkis` 发布的二进制安装包中默认包含了 `Hive` 引擎插件,用户无需额外安装。 + +`Hive` 的版本是支持 `Hive1.x` 和` Hive2.x` ,默认是支持 `Hive on MapReduce` ,如果您想改成 `Hive on Tez` ,需要您按照此 `PR` 进行一下修改。 + + + +默认支持的 `Hive` 版本是 3.1.3 ,如果您想修改 `Hive` 的版本,您可以找到 `linkis-engineplugin-hive` 模块,修改 `` 标签,然后单独编译此模块即可 + +[EngineConnPlugin引擎插件安装](../deployment/install-engineconn.md) + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +sh ./bin/linkis-cli -engineType hive-3.1.3 \ +-codeType hql -code "show databases" \ +-submitUser hadoop -proxyUser hadoop +``` + +更多 `Linkis-Cli` 命令参数参考: [`Linkis-Cli` 使用](../user-guide/linkiscli-manual.md) + +### 3.2 通过Linkis SDK提交任务 + +`Linkis` 提供了 `Java` 和 `Scala` 的 `SDK` 向 `Linkis` 服务端提交任务。具体可以参考 [JAVA SDK Manual](../user-guide/sdk-manual.md)。对于 `Hive` 任务你只需要修改 `Demo` 中的 `EngineConnType` 和 `CodeType` 参数即可: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "hive-3.1.3"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "hql"); // required codeType +``` + +## 4. 引擎连接器配置说明 + +### 4.1 默认配置说明 +| 配置 | 默认值 |是否必须 | 说明 | +| ------------------------ | ------------------- | ---|---------------------------------------- | +| wds.linkis.rm.instance | 10 |否 | 引擎连接器最大并发数 | +| wds.linkis.engineconn.java.driver.memory | 1g |否 | 引擎连接器初始化内存大小 | +| wds.linkis.engineconn.max.free.time | 1h |否 | 引擎连接器空闲退出时间 | + +### 4.2 队列资源配置 +`Hive` 的 `MapReduce` 任务是需要用到 `yarn` 的资源,所以需要设置队列。 + +![yarn](./images/yarn-conf.png) + +### 4.3 配置修改 +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.3.1 管理台配置 + +![hive](./images/hive-config.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType hive-3.1.3 -codeType hql \ +-code "show databases" \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.3.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "show databases;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.rm.instance":"10" + } + } + }, + "labels": { + "engineType": "hive-3.1.3", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.4 引擎连接器相关数据表 + +`Linkis` 是通过引擎连接器标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎连接器的配置参数的key和默认values +linkis_cg_manager_label:插入引擎连接器标签如:hive-3.1.3 +linkis_ps_configuration_category: 插入引擎连接器的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎连接器需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎连接器的关联关系 +``` + +表中与引擎连接器相关的初始数据如下 + +```sql +-- set variable +SET @HIVE_LABEL="hive-3.1.3"; +SET @HIVE_ALL=CONCAT('*-*,',@HIVE_LABEL); +SET @HIVE_IDE=CONCAT('*-IDE,',@HIVE_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @HIVE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @HIVE_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @HIVE_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', '范围:1-20,单位:个', 'hive引擎连接器最大并发数', '10', 'NumInterval', '[1,20]', '0', '0', '1', '队列资源', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', '取值范围:1-10,单位:G', 'hive引擎连接器初始化内存大小','1g', 'Regex', '^([1-9]|10)(G|g)$', '0', '0', '1', 'hive引擎连接器设置', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('hive.client.java.opts', 'hive客户端进程参数', 'hive引擎连接器启动时jvm参数','', 'None', NULL, '1', '1', '1', 'hive引擎连接器设置', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('mapred.reduce.tasks', '范围:-1-10000,单位:个', 'reduce数', '-1', 'NumInterval', '[-1,10000]', '0', '1', '1', 'hive资源设置', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.max.free.time', '取值范围:3m,15m,30m,1h,2h', '引擎连接器空闲退出时间','1h', 'OFT', '[\"1h\",\"2h\",\"30m\",\"15m\",\"3m\"]', '0', '0', '1', 'hive引擎连接器设置', 'hive'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'hive' and label_value = @HIVE_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @HIVE_ALL); +``` + +## 5. Hive修改日志展示 +默认的日志界面是不显示 `application_id` 以及 `task` 完成数量的,用户可以根据需要输出该日志 +引擎连接器内的 `log4j2-engineconn.xml/log4j2.xml` 配置文件中需要修改的代码块如下 +1. `appenders` 组件下需要添加 +```xml + + + +``` +2. `root` 组件下需要添加 +```xml + +``` +3. `loggers` 组件下需要添加 +```xml + + + +``` +进行如上相关修改后日志可以增加任务 `task` 进度信息,显示为如下样式 +``` +2022-04-08 11:06:50.228 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Status: Running (Executing on YARN cluster with App id application_1631114297082_432445) +2022-04-08 11:06:50.248 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: -/- Reducer 2: 0/1 +2022-04-08 11:06:52.417 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 0/1 Reducer 2: 0/1 +2022-04-08 11:06:55.060 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 0(+1)/1 Reducer 2: 0/1 +2022-04-08 11:06:57.495 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 1/1 Reducer 2: 0(+1)/1 +2022-04-08 11:06:57.899 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 1/1 Reducer 2: 1/1 +``` + +完整 `xml` 配置文件范例如下: +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/check-seatunnel.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/check-seatunnel.png new file mode 100644 index 00000000000..982c227195b Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/check-seatunnel.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/datasourceconntest.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/datasourceconntest.png new file mode 100644 index 00000000000..9b1308a10ba Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/datasourceconntest.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/datasourcemanage.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/datasourcemanage.png new file mode 100644 index 00000000000..f59d64c7483 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/datasourcemanage.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/es-config.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/es-config.png new file mode 100644 index 00000000000..d06c2b878ba Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/es-config.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/es-manage.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/es-manage.png new file mode 100644 index 00000000000..f4a4616a528 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/es-manage.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/historical_information.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/historical_information.png new file mode 100644 index 00000000000..6c10cd71b7c Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/historical_information.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/hive-config.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/hive-config.png new file mode 100644 index 00000000000..9e57ec2ebfc Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/hive-config.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/hive-run.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/hive-run.png new file mode 100644 index 00000000000..287b1abfdef Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/hive-run.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/jdbc-config.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/jdbc-config.png new file mode 100644 index 00000000000..2977040d148 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/jdbc-config.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/jdbc-run.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/jdbc-run.png new file mode 100644 index 00000000000..fe51598b235 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/jdbc-run.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/job_state.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/job_state.png new file mode 100644 index 00000000000..cadf1d1cd90 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/job_state.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/muti-data-source-usage.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/muti-data-source-usage.png new file mode 100644 index 00000000000..cc017a53935 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/muti-data-source-usage.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/new_pipeline_script.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/new_pipeline_script.png new file mode 100644 index 00000000000..8a1b59ce29e Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/new_pipeline_script.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/openlookeng-config.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/openlookeng-config.png new file mode 100644 index 00000000000..00abce5093a Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/openlookeng-config.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/pipeline-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/pipeline-conf.png new file mode 100644 index 00000000000..325efe24c84 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/pipeline-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-console.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-console.png new file mode 100644 index 00000000000..d3a92de1a57 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-console.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-file.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-file.png new file mode 100644 index 00000000000..49c00b99656 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-file.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-psql.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-psql.png new file mode 100644 index 00000000000..505f0a7a8c1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/presto-psql.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/pyspakr-run.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/pyspakr-run.png new file mode 100644 index 00000000000..c80c85bae00 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/pyspakr-run.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-conf.png new file mode 100644 index 00000000000..3417af1c1e1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-config.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-config.png new file mode 100644 index 00000000000..acfb69a6482 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-config.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-run.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-run.png new file mode 100644 index 00000000000..65467afca15 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/python-run.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/queue-set.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/queue-set.png new file mode 100644 index 00000000000..78fc0f3e6a4 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/queue-set.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/scala-run.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/scala-run.png new file mode 100644 index 00000000000..7c01aadcdf8 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/scala-run.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/shell-run.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/shell-run.png new file mode 100644 index 00000000000..734bdb22dce Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/shell-run.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/spark-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/spark-conf.png new file mode 100644 index 00000000000..d452a3f4ad8 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/spark-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/sparksql-run.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/sparksql-run.png new file mode 100644 index 00000000000..f0b1d1bcaf2 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/sparksql-run.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/to_write.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/to_write.png new file mode 100644 index 00000000000..e75ab0638e4 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/to_write.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/trino-config.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/trino-config.png new file mode 100644 index 00000000000..0f7cc9c94ac Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/trino-config.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/workflow.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/workflow.png new file mode 100644 index 00000000000..3a5919f2594 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/workflow.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/yarn-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/yarn-conf.png new file mode 100644 index 00000000000..15256381f92 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/images/yarn-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/impala.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/impala.md new file mode 100644 index 00000000000..4ba63a71f51 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/impala.md @@ -0,0 +1,219 @@ +--- +title: Impala +sidebar_position: 12 +--- + +本文主要介绍在 `Linkis` 中,`Impala` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 + +### 1.1 环境安装 + +如果您希望在您的服务器上使用 Impala 引擎,您需要准备 Impala 服务并提供连接信息,如 Impala 集群的连接地址、SASL用户名和密码等 + +### 1.2 环境验证 + +执行 impala-shell 命令得到如下输出代表 impala 服务可用。 +``` +[root@8f43473645b1 /]# impala-shell +Starting Impala Shell without Kerberos authentication +Connected to 8f43473645b1:21000 +Server version: impalad version 2.12.0-cdh5.15.0 RELEASE (build 23f574543323301846b41fa5433690df32efe085) +*********************************************************************************** +Welcome to the Impala shell. +(Impala Shell v2.12.0-cdh5.15.0 (23f5745) built on Thu May 24 04:07:31 PDT 2018) + +When pretty-printing is disabled, you can use the '--output_delimiter' flag to set +the delimiter for fields in the same row. The default is ','. +*********************************************************************************** +[8f43473645b1:21000] > +``` + +## 2. 引擎插件部署 + +编译 `Impala` 引擎之前需要进行 `Linkis` 项目全量编译 , `Linkis` 默认发布的安装部署包中默认不包含此引擎插件。 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/impala/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/impala/target/out/ +``` +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── impala +│   ├── dist +│   │   └── 3.4.0 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 3.4.0 +``` + +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的`last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到 `linkis` 的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +sh ./bin/linkis-cli -submitUser impala \ +-engineType impala-3.4.0 -code 'show databases;' \ +-runtimeMap linkis.es.http.method=GET \ +-runtimeMap linkis.impala.servers=127.0.0.1:21050 +``` + +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +## 4. 引擎配置说明 + +### 4.1 默认配置说明 + +| 配置 | 默认值 | 说明 | 是否必须 | +| -------------------------------------- | --------------------- | ------------------------------------------- | -------- | +| linkis.impala.default.limit | 5000 | 是 | 查询的结果集返回条数限制 | +| linkis.impala.engine.user | ${HDFS_ROOT_USER} | 是 | 默认引擎启动用户 | +| linkis.impala.user.isolation.mode | false | 是 | 以多用户模式启动引擎 | +| linkis.impala.servers | 127.0.0.1:21050 | 是 | Impala服务器地址,','分隔 | +| linkis.impala.maxConnections | 10 | 是 | 对每台Impala服务器的连接数上限 | +| linkis.impala.ssl.enable | false | 是 | 是否启用SSL连接 | +| linkis.impala.ssl.keystore.type | JKS | 否 | SSL Keystore类型 | +| linkis.impala.ssl.keystore | null | 否 | SSL Keystore路径 | +| linkis.impala.ssl.keystore.password | null | 否 | SSL Keystore密码 | +| linkis.impala.ssl.truststore.type | JKS | 否 | SSL Truststore类型 | +| linkis.impala.ssl.truststore | null | 否 | SSL Truststore路径 | +| linkis.impala.ssl.truststore.password | null | 否 | SSL Truststore密码 | +| linkis.impala.sasl.enable | false | 是 | 是否启用SASL认证 | +| linkis.impala.sasl.mechanism | PLAIN | 否 | SASL Mechanism | +| linkis.impala.sasl.authorizationId | null | 否 | SASL AuthorizationId | +| linkis.impala.sasl.protocol | LDAP | 否 | SASL Protocol | +| linkis.impala.sasl.properties | null | 否 | SASL Properties: key1=value1,key2=value2 | +| linkis.impala.sasl.username | ${impala.engine.user}| 否 | SASL Username | +| linkis.impala.sasl.password | null | 否 | SASL Password | +| linkis.impala.sasl.password.cmd | null | 否 | SASL Password获取命令 | +| linkis.impala.heartbeat.seconds | 1 | 是 | 任务状态更新间隔 | +| linkis.impala.query.timeout.seconds | 0 | 否 | 任务执行超时时间 | +| linkis.impala.query.batchSize | 1000 | 是 | 结果集获取批次大小 | +| linkis.impala.query.options | null | 否 | 查询提交参数: key1=value1,key2=value2 | + +### 4.2 配置修改 + +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.2.1 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "show databases;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.impala.servers"="127.0.0.1:21050" + } + } + }, + "labels": { + "engineType": "impala-3.4.0", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:impala-3.4.0 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + + +```sql +-- set variable +SET @ENGINE_LABEL="impala-3.4.0"; +SET @ENGINE_IDE=CONCAT('*-IDE,',@ENGINE_LABEL); +SET @ENGINE_ALL=CONCAT('*-*,',@ENGINE_LABEL); +SET @ENGINE_NAME="impala"; + +-- add impala engine to IDE +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_IDE, 'OPTIONAL', 2, now(), now()); +select @label_id := id from `linkis_cg_manager_label` where label_value = @ENGINE_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- insert configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.default.limit', '查询的结果集返回条数限制', '结果集条数限制', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.engine.user', '默认引擎启动用户', '默认启动用户', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.user.isolation.mode', '以多用户模式启动引擎', '多用户模式', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.servers', 'Impala服务器地址', '服务地址', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.maxConnections ', '对每台Impala服务器的连接数上限', '最大连接数', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.enable', '是否启用SSL连接', '启用SSL', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.keystore.type', 'SSL Keystore类型', 'SSL Keystore类型', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.keystore', 'SSL Keystore路径', 'SSL Keystore路径', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.keystore.password', 'SSL Keystore密码', 'SSL Keystore密码', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.truststore.type', 'SSL Truststore类型', 'SSL Truststore类型', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.truststore', 'SSL Truststore路径', 'SSL Truststore路径', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.truststore.password', 'SSL Truststore密码', 'SSL Truststore密码', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.enable', '是否启用SASL认证', '启用SASL', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.mechanism', 'SASL Mechanism', 'SASL Mechanism', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.authorizationId', 'SASL AuthorizationId', 'SASL AuthorizationId', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.protocol', 'SASL Protocol', 'SASL Protocol', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.properties', 'SASL Properties: key1=value1,key2=value2', 'SASL Properties', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.username', 'SASL Username', 'SASL Username', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.password', 'SASL Password', 'SASL Password', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.password.cmd', 'SASL Password获取命令', 'SASL Password获取命令', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.heartbeat.seconds', '任务状态更新间隔', '任务状态更新间隔', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.query.timeout.seconds', '任务执行超时时间', '任务执行超时时间', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.query.batchSize', '结果集获取批次大小', '结果集获取批次大小', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.query.options', '查询提交参数: key1=value1,key2=value2', '查询提交参数', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +-- impala engine -* +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as config_key_id, label.id AS engine_type_label_id FROM `linkis_ps_configuration_config_key` config +INNER JOIN `linkis_cg_manager_label` label ON config.engine_conn_type = @ENGINE_NAME and label_value = @ENGINE_ALL); +-- impala engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select relation.config_key_id AS config_key_id, '' AS config_value, relation.engine_type_label_id AS config_label_id FROM `linkis_ps_configuration_key_engine_relation` relation +INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @ENGINE_ALL); +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/jdbc.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/jdbc.md new file mode 100644 index 00000000000..4f870aa120f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/jdbc.md @@ -0,0 +1,275 @@ +--- +title: JDBC +sidebar_position: 5 +--- + +本文主要介绍在 `Linkis` 中, `JDBC` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 环境安装 + +如果您希望在您的服务器上使用 `JDBC` 引擎,您需要准备 `JDBC` 连接信息,如 `MySQL` 数据库的连接地址、用户名和密码等 + +### 1.2 环境验证(以 `Mysql` 为例) +``` +mysql -uroot -P 3306 -h 127.0.0.1 -p 123456 +``` +输出如下信息代表 `JDBC` 连接信息可用 +``` +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 9 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> +``` + +## 2. 引擎插件安装 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/jdbc/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/jdbc/target/out/ +``` + +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎插件包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── jdbc +│   ├── dist +│   │   └── 4 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 4 +``` + +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 + +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的 `last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到 `linkis` 的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +sh ./bin/linkis-cli -engineType jdbc-4 \ +-codeType jdbc -code "show tables" \ +-submitUser hadoop -proxyUser hadoop \ +-runtimeMap wds.linkis.jdbc.connect.url=jdbc:mysql://127.0.0.1:3306/linkis_db \ +-runtimeMap wds.linkis.jdbc.driver=com.mysql.jdbc.Driver \ +-runtimeMap wds.linkis.jdbc.username=test \ +-runtimeMap wds.linkis.jdbc.password=123456 +``` + +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +### 3.2 通过 `Linkis SDK` 提交任务 + +`Linkis` 提供了 `Java` 和 `Scala` 的 `SDK` 向 `Linkis` 服务端提交任务。具体可以参考 [JAVA SDK Manual](../user-guide/sdk-manual.md)。对于 `JDBC` 任务您只需要修改 `Demo` 中的 `EngineConnType` 和 `CodeType` 参数即可: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "jdbc-4"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "jdbc"); // required codeType +``` + +### 3.3 多数据源支持 +从 `Linkis 1.2.0` 开始,提供了 `JDBC` 引擎多数据源的支持,我们首先可以在控制台管理不同的数据源。地址:登陆管理台-->数据源管理-->新增数据源 + +![](./images/datasourcemanage.png) + +图3-3 数据源管理 + +![](./images/datasourceconntest.png) + +图3-4 数据源连接测试 + +数据源添加完成之后,就可以使用 `JDBC` 引擎的多数据源切换功能,有两种方式: +1、 通过接口参数指定数据源名称参数 +参数示例: +```json +{ + "executionContent": { + "code": "show databases", + "runType": "jdbc" + }, + "params": { + "variable": {}, + "configuration": { + "startup": {}, + "runtime": { + "wds.linkis.engine.runtime.datasource": "test_mysql" + } + } + }, + "source": { + "scriptPath": "" + }, + "labels": { + "engineType": "jdbc-4", + "userCreator": "hadoop-IDE" + } +} +``` + +参数:`wds.linkis.engine.runtime.datasource` 为固定名称的配置,不要随意修改名称定义 + +2、 通过 `DSS` 的 `Scripts` 代码提交入口下拉筛选需要提交的数据源,如下图: +![](./images/muti-data-source-usage.png) +当前 `dss-1.1.0` 还暂不支持下拉选择数据源名称, `PR` 在开发中,可以等后续发版或关注相关 `PR` : +(https://github.com/WeBankFinTech/DataSphereStudio/issues/940) + + +多数据源的功能说明: + +1)在之前的版本中, `JDBC` 引擎对数据源的支持不够完善,尤其是搭配 `Scripts` 使用的时候, `JDBC` 脚本类型只能绑定控制台的一套 `JDBC` 引擎参数, +当我们有多数据源的切换需求时,只能修改 `JDBC` 引擎的连接参数,比较麻烦。 + +2)配合数据源管理,我们引入 `JDBC` 引擎的多数据源切换功能,可以实现只设置数据源名称,就可把作业提交到不同的 `JDBC` 服务之上,普通用户不需要 +维护数据源的连接信息,避免了配置繁琐,也满足了数据源连接密码等配置的安全性需要。 + +3)多数据源管理中设置的数据源,只有发布之后,并且没有过期的数据源才能被 `JDBC` 引擎加载到,否则会反馈给用户不同类型的异常提示。 + +4) `JDBC` 引擎参数的加载优先级为:任务提交传参 > 选择数据源的参数 > 控制台JDBC引擎的参数 + + +## 4. 引擎配置说明 + +### 4.1 默认配置说明 + +| 配置 | 默认值 |是否必须 | 说明 | +| ------------------------ | ------------------- | ---|---------------------------------------- | +| wds.linkis.jdbc.connect.url | jdbc:mysql://127.0.0.1:10000 |是 | jdbc连接地址 | +| wds.linkis.jdbc.driver | 无 |是 | jdbc连接驱动 | +| wds.linkis.jdbc.username | 无 |是 | 数据库连接用户名 | +| wds.linknis.jdbc.password | 无 |是 | 数据库链接密码 | +| wds.linkis.jdbc.connect.max | 10 |否 | jdbc引擎最大连接数 | +| wds.linkis.jdbc.version | jdbc4 |否 | jdbc版本 | + +### 4.2 配置修改 +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + + +#### 4.2.1 管理台配置 + +![jdbc](./images/jdbc-config.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType jdbc-4 -codeType jdbc \ +-code "show tables" \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "show databases;", "runType": "jdbc"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.jdbc.connect.url":"jdbc:mysql://127.0.0.1:3306/test", + "wds.linkis.jdbc.driver":"com.mysql.jdbc.Driver", + "wds.linkis.jdbc.username":"test", + "wds.linkis.jdbc.password":"test23" + } + } + }, + "labels": { + "engineType": "jdbc-4", + "userCreator": "hadoop-IDE" + } +} +``` +### 4.3 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:jdbc-4 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + +```sql +-- set variable +SET @JDBC_LABEL="jdbc-4"; +SET @JDBC_ALL=CONCAT('*-*,',@JDBC_LABEL); +SET @JDBC_IDE=CONCAT('*-IDE,',@JDBC_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @JDBC_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @JDBC_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @JDBC_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.url', '例如:jdbc:mysql://127.0.0.1:10000', 'jdbc连接地址', 'jdbc:mysql://127.0.0.1:10000', 'Regex', '^\\s*jdbc:\\w+://([^:]+)(:\\d+)(/[^\\?]+)?(\\?\\S*)?$', '0', '0', '1', '数据源配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.driver', '例如:com.mysql.jdbc.Driver', 'jdbc连接驱动', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.version', '取值范围:jdbc3,jdbc4', 'jdbc版本','jdbc4', 'OFT', '[\"jdbc3\",\"jdbc4\"]', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.username', 'username', '数据库连接用户名', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.password', 'password', '数据库连接密码', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.max', '范围:1-20,单位:个', 'jdbc引擎最大连接数', '10', 'NumInterval', '[1,20]', '0', '0', '1', '数据源配置', 'jdbc'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'jdbc' and label_value = @JDBC_ALL); + +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @JDBC_ALL); +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/openlookeng.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/openlookeng.md new file mode 100644 index 00000000000..8ab7a50fb48 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/openlookeng.md @@ -0,0 +1,210 @@ +--- +title: openLooKeng +sidebar_position: 7 +--- + +本文主要介绍在 `Linkis` `中,openLooKeng` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 环境安装 + +如果您希望部署使用 `openLooKeng` 引擎,您需要准备一套可用的 `openLooKeng` 环境。 + +### 1.2 服务验证 + +```shell +# 准备 hetu-cli +wget https://download.openlookeng.io/1.5.0/hetu-cli-1.5.0-executable.jar +mv hetu-cli-1.5.0-executable.jar hetu-cli +chmod +x hetu-cli + +# 链接服务 +./hetu-cli --server 127.0.0.1:9090 --catalog tpcds --schema default + +# 执行查询语句 +lk:default> select d_date_sk, d_date_id, d_date, d_month_seq from tpcds.sf1.date_dim order by d_date limit 5; + +# 得到如下输出代表服务可用 + d_date_sk | d_date_id | d_date | d_month_seq +-----------+------------------+------------+------------- + 2415022 | AAAAAAAAOKJNECAA | 1900-01-02 | 0 + 2415023 | AAAAAAAAPKJNECAA | 1900-01-03 | 0 + 2415024 | AAAAAAAAALJNECAA | 1900-01-04 | 0 + 2415025 | AAAAAAAABLJNECAA | 1900-01-05 | 0 + 2415026 | AAAAAAAACLJNECAA | 1900-01-06 | 0 +(5 rows) + +Query 20221110_043803_00011_m9gmv, FINISHED, 1 node +Splits: 33 total, 33 done (100.00%) +0:00 [73K rows, 0B] [86.8K rows/s, 0B/s] +``` + +## 2. 引擎插件安装 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +${linkis_code_dir}/linkis-enginepconn-pugins/engineconn-plugins/openlookeng/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/openlookeng/target/out/ +``` +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎插件包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── openlookeng +│   ├── dist +│   │   └── 1.5.0 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 1.5.0 +``` + +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的 `last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到 `linkis` 的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +sh ./bin/linkis-cli -engineType openlookeng-1.5.0 \ +-codeType sql -code 'select * from tpcds.sf1.date_dim;' \ +-submitUser hadoop -proxyUser hadoop \ +-runtimeMap linkis.openlookeng.url=http://127.0.0.1:8080 +``` + +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +### 3.2 通过 `Linkis SDK` 提交任务 + +`Linkis` 提供了 `Java` 和 `Scala` 的 `SDK` 向 `Linkis` 服务端提交任务。具体可以参考 [JAVA SDK Manual](../user-guide/sdk-manual.md)。对于 `JDBC` 任务您只需要修改 `Demo` 中的 `EngineConnType` 和 `CodeType` 参数即可: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "openlookeng-1.5.0"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "sql"); // required codeType +``` + +## 4. 引擎配置说明 + +### 4.1 默认配置说明 +| 配置 | 默认值 |是否必须 | 说明 | +| ------------------------ | ------------------- | ---|---------------------------------------- | +| linkis.openlookeng.url | http://127.0.0.1:8080 |是 | 链接地址 | +| linkis.openlookeng.catalog | system |是 | catalog | +| linkis.openlookeng.source | global |否 | source | + +### 4.2 配置修改 +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.2.1 管理台配置 + +![](./images/openlookeng-config.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType openlookeng-1.5.0 -codeType sql \ +-code 'select * from tpcds.sf1.date_dim;' \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "select * from tpcds.sf1.date_dim;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.openlookeng.url":"http://127.0.0.1:9090" + } + } + }, + "labels": { + "engineType": "openlookeng-1.5.0", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:openlookeng-1.5.0 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + +```sql +-- set variable +SET @OPENLOOKENG_LABEL="openlookeng-1.5.0"; +SET @OPENLOOKENG_ALL=CONCAT('*-*,',@OPENLOOKENG_LABEL); +SET @OPENLOOKENG_IDE=CONCAT('*-IDE,',@OPENLOOKENG_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @OPENLOOKENG_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @OPENLOOKENG_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @OPENLOOKENG_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.url', '例如:http://127.0.0.1:8080', '连接地址', 'http://127.0.0.1:8080', 'Regex', '^\\s*http://([^:]+)(:\\d+)(/[^\\?]+)?(\\?\\S*)?$', 'openlookeng', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.catalog', 'catalog', 'catalog', 'system', 'None', '', 'openlookeng', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.source', 'source', 'source', 'global', 'None', '', 'openlookeng', 0, 0, 1, '数据源配置'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'openlookeng' and label_value = @OPENLOOKENG_ALL); + +-- openlookeng default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @OPENLOOKENG_ALL); + +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/overview.md new file mode 100644 index 00000000000..5d99947915c --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/overview.md @@ -0,0 +1,27 @@ +--- +title: 总览 +sidebar_position: 0 +--- +## 1. 概述 +`Linkis` 作为一款功能强大的计算中间件,可以方便的对接不同的计算引擎,通过屏蔽不同计算引擎的使用细节,并向上提供了一套统一的使用接口, +使得部署和应用 `Linkis` 的大数据平台的运维成本大大降低,目前, `Linkis` 已经对接了几款主流的计算引擎,基本上涵盖了上生产上对数据的需求, +为了提供更好的可拓展性, `Linkis` 同时提供了接入新引擎的相关接口,可以利用该接口接入新的计算引擎。 + +引擎是提供给用户数据处理和分析能力的组件,目前已经接入 `Linkis` 的引擎,有主流的大数据计算引擎 `Spark` 、 `Hive` 、 `Presto` 等,也有 `python` 、 `Shell` 这些脚本处理数据能力的引擎。 +`DataSphereStudio` 作为对接了 `Linkis` 的一站式数据操作平台,用户可以方便的在 `DataSphereStudio` 中使用 `Linkis` 支持的引擎完成交互式数据分析任务和工作流任务。 + +支持引擎及版本信息如下: + +| 引擎 | 默认引擎 | 默认版本 | +|-------------| -- | ---- | +| [Spark](./spark.md) | 是 | 3.2.1 | +| [Hive](./hive.md) | 是 | 3.1.3 | +| [Python](./python.md) | 是 | python2 | +| [Shell](./shell.md) | 是 | 1 | +| [JDBC](./jdbc.md) | 否 | 4 | +| [Flink](./flink.md) | 否 | 1.12.2 | +| [openLooKeng](./openlookeng.md) | 否 | 1.5.0 | +| [Pipeline](./pipeline.md) | 否 | 1 | +| [Presto](./presto.md) | 否 | 0.234 | +| [Sqoop](./sqoop.md) | 否 | 1.4.6 | +| [Elasticsearch](./elasticsearch.md) | 否 | 7.6.2 | diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/pipeline.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/pipeline.md new file mode 100644 index 00000000000..09237e0bc21 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/pipeline.md @@ -0,0 +1,175 @@ +--- +title: Pipeline +sidebar_position: 9 +--- +`Pipeline` 主要是用来对文件进行导入和导出的。本文主要介绍在 `Linkis` 中, `Pipeline` 引擎插件的安装、使用和配置。 + +## 1. 引擎插件安装 + +### 1.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/pipeline/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/pipeline/target/out/ +``` +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 1.2 引擎插件的上传和加载 + +将 1.1 中的引擎插件包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── pipeline +│   ├── dist +│   │   └── 1 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 1 +``` +### 1.3 引擎刷新 + +#### 1.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 1.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的 `last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到linkis的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 2 引擎的使用 + +因为 `Pipeline` 引擎主要用来导入导出文件为主,现在我们假设从A向B导入文件为介绍案例 + +### 2.1 通过 `Linkis-cli` 提交任务 + +```shell +sh bin/linkis-cli -submitUser hadoop \ +-engineType pipeline-1 -codeType pipeline \ +-code "from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv" +``` +`from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv` 该内容 2.3 有解释 + +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +## 3. 引擎配置说明 + +### 3.1 默认配置说明 + +| 配置 | 默认值 |是否必须 | 说明 | +| ------------------------ | ------------------- | ---|---------------------------------------- | +| pipeline.output.mold | csv |否 |结果集导出类型 | +| pipeline.field.split | , |否 | csv分隔符 | +| pipeline.output.charset | gbk |否 | 结果集导出字符集 | +| pipeline.output.isoverwrite | true |否 | 是否覆写 | +| wds.linkis.rm.instance | 3 |否 | pipeline引擎最大并发数 | +| pipeline.output.shuffle.null.type | NULL |否 | 空值替换 | +| wds.linkis.engineconn.java.driver.memory | 2g |否 | pipeline引擎初始化内存大小 | + +### 4.2 配置修改 +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.2.1 管理台配置 + +![](./images/pipeline-conf.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh bin/linkis-cli -creator IDE \ +-submitUser hadoop \ +-engineType pipeline-1 \ +-codeType pipeline \ +-code "from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv" +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv", "runType": "pipeline"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "pipeline.output.mold":"csv", + "pipeline.output.charset":"gbk" + } + } + }, + "labels": { + "engineType": "pipeline-1", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:pipeline-1 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + +```sql +-- set variable +SET @PIPELINE_LABEL="pipeline-1"; +SET @PIPELINE_ALL=CONCAT('*-*,',@PIPELINE_LABEL); +SET @PIPELINE_IDE=CONCAT('*-IDE,',@PIPELINE_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PIPELINE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PIPELINE_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @PIPELINE_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.mold', '取值范围:csv或excel', '结果集导出类型','csv', 'OFT', '[\"csv\",\"excel\"]', '0', '0', '1', 'pipeline引擎设置', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.field.split', '取值范围:,或\\t', 'csv分隔符',',', 'OFT', '[\",\",\"\\\\t\"]', '0', '0', '1', 'pipeline引擎设置', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.charset', '取值范围:utf-8或gbk', '结果集导出字符集','gbk', 'OFT', '[\"utf-8\",\"gbk\"]', '0', '0', '1', 'pipeline引擎设置', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.isoverwrite', '取值范围:true或false', '是否覆写','true', 'OFT', '[\"true\",\"false\"]', '0', '0', '1', 'pipeline引擎设置', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', '范围:1-3,单位:个', 'pipeline引擎最大并发数','3', 'NumInterval', '[1,3]', '0', '0', '1', 'pipeline引擎设置', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', '取值范围:1-10,单位:G', 'pipeline引擎初始化内存大小','2g', 'Regex', '^([1-9]|10)(G|g)$', '0', '0', '1', 'pipeline资源设置', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.shuffle.null.type', '取值范围:NULL或者BLANK', '空值替换','NULL', 'OFT', '[\"NULL\",\"BLANK\"]', '0', '0', '1', 'pipeline引擎设置', 'pipeline'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'pipeline' and label_value = @PIPELINE_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @PIPELINE_ALL); + +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/presto.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/presto.md new file mode 100644 index 00000000000..8238033d976 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/presto.md @@ -0,0 +1,228 @@ +--- +title: Presto +sidebar_position: 11 +--- + +本文主要介绍在 `Linkis` 中,`Presto` 引擎插件的安装、使用和配置。 + + +## 1. 前置工作 + +### 1.1 引擎安装 + +如果您希望在您的 `Linkis` 服务上使用 `Presto` 引擎,您需要安装 `Presto` 服务并保证服务可用。 + +### 1.2 服务验证 + +```shell +# 准备 presto-cli +wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.234/presto-cli-0.234-executable.jar +mv presto-cli-0.234-executable.jar presto-cli +chmod +x presto-cli + +# 执行任务 +./presto-cli --server localhost:8082 --execute 'show tables from system.jdbc' + +# 得到如下输出代表服务可用 +"attributes" +"catalogs" +"columns" +"procedure_columns" +"procedures" +"pseudo_columns" +"schemas" +"super_tables" +"super_types" +"table_types" +"tables" +"types" +"udts" +``` + +## 2. 引擎插件部署 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/presto/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/presto/target/out/ +``` +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── presto +│   ├── dist +│   │   └── 0.234 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 0.234 +``` + +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的`last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到 `linkis` 的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell + sh ./bin/linkis-cli -engineType presto-0.234 \ + -codeType psql -code 'show tables;' \ + -submitUser hadoop -proxyUser hadoop +``` + +如果管理台,任务接口,配置文件,均未配置(配置方式见 4.2 )时可在 `Linkis-cli` 客户端中通过 `-runtimeMap` 属性进行配置 + +```shell +sh ./bin/linkis-cli -engineType presto-0.234 \ +-codeType tsql -code 'show tables;' \ +-runtimeMap wds.linkis.presto.url=http://127.0.0.1:8080 \ +-runtimeMap wds.linkis.presto.catalog=hive \ +-runtimeMap wds.linkis.presto.schema=default \ +-submitUser hadoop -proxyUser hadoop +``` + +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +## 4. 引擎配置说明 + +### 4.1 默认配置说明 + +| 配置 | 默认值 | 说明 | 是否必须 | +| -------------------------------------- | --------------------- | ------------------------------------------- | -------- | +| wds.linkis.presto.url | http://127.0.0.1:8080 | Presto 集群连接 | true | +| wds.linkis.presto.username | default | Presto 集群用户名 | false | +| wds.linkis.presto.password | 无 | Presto 集群密码 | false | +| wds.linkis.presto.catalog | system | 查询的 Catalog | true | +| wds.linkis.presto.schema | 无 | 查询的 Schema | true | +| wds.linkis.presto.source | global | 查询使用的 source | false | +| presto.session.query_max_total_memory | 8GB | 查询使用最大的内存 | false | +| wds.linkis.presto.http.connectTimeout | 60 | Presto 客户端的 connect timeout(单位:秒) | false | +| wds.linkis.presto.http.readTimeout | 60 | Presto 客户端的 read timeout(单位:秒) | false | +| wds.linkis.engineconn.concurrent.limit | 100 | Presto 引擎最大并发数 | false | + +### 4.2 配置修改 + +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.2.1 管理台配置 + +![](./images/presto-console.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType presto-0.234 -codeType tsql \ +-code 'show tables;' \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "show teblas;", "runType": "psql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.presto.url":"http://127.0.0.1:9090", + "wds.linkis.presto.catalog ":"hive", + "wds.linkis.presto.schema ":"default", + "wds.linkis.presto.source ":"" + } + } + }, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.sql"}, + "labels": { + "engineType": "presto-0.234", + "userCreator": "hadoop-IDE" + } +} +``` + +#### 4.2.3 文件配置 +通过修改目录 `install path/lib/linkis-engineconn-plugins/presto/dist/0.234/conf/` 中的 `linkis-engineconn.properties` 文件进行配置,如下图: + +![](./images/presto-file.png) + +### 4.3 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:presto-0.234 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + + +```sql +-- set variable +SET @PRESTO_LABEL="presto-0.234"; +SET @PRESTO_ALL=CONCAT('*-*,',@PRESTO_LABEL); +SET @PRESTO_IDE=CONCAT('*-IDE,',@PRESTO_LABEL); +SET @PRESTO_NAME="presto"; + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@PRESTO_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@PRESTO_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from `linkis_cg_manager_label` where `label_value` = @PRESTO_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.url', 'Presto 集群连接', 'presto连接地址', 'http://127.0.0.1:8080', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.catalog', '查询的 Catalog ', 'presto连接的catalog', 'hive', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.schema', '查询的 Schema ', '数据库连接schema', '', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.source', '查询使用的 source ', '数据库连接source', '', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = @PRESTO_NAME and label_value = @PRESTO_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @PRESTO_ALL); +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/python.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/python.md new file mode 100644 index 00000000000..86e4a9847e2 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/python.md @@ -0,0 +1,182 @@ +--- +title: Python +sidebar_position: 3 +--- + +本文主要介绍在 `Linkis` 中, `Python` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 环境安装 + +如果您希望在您的服务器上使用 `Python` 引擎,您需要保证用户的 `PATH` 中是有 `Python` 的执行目录和执行权限。 + +### 1.2 环境验证 +``` +python --version +``` +正常输出 `Python` 版本信息代表 `Python` 环境可用 +``` +Python 3.6.0 +``` + +## 2. 引擎插件安装 [默认引擎](./overview.md) + +`Linkis` 发布的二进制安装包中默认包含了 `Python` 引擎插件,用户无需额外安装。 + +[EngineConnPlugin引擎插件安装](../deployment/install-engineconn.md) + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +sh ./bin/linkis-cli -engineType python-python2 \ +-codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop +``` +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +### 3.2 通过 `Linkis SDK` 提交任务 + +`Linkis` 提供了 `Java` 和 `Scala` 的 `SDK` 向 `Linkis` 服务端提交任务。 具体可以参考 [JAVA SDK Manual](../user-guide/sdk-manual.md)。对于 `Python` 任务您只需要修改 `EngineConnType` 和 `CodeType` 参数即可。 + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "python-python2"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "python"); // required codeType +``` + +## 4. 引擎配置说明 + +### 4.1 配置修改 +`Python` 引擎插件支持 `Python2` 和 `Python3` ,您可以简单更改配置就可以完成 `Python` 版本的切换,不需要重新编译 `Python` 的引擎版本。 `Python` 引擎支持多种配置修改方式,具体操作如下。 + +#### 4.1.1 通过命令参数显示指定(仅当前命令生效) + +```shell +#1:cli的方式提交任务进行版本切换,命令末端设置版本 python.version=python3 (python3:创建软连接时生成文件的名称,可自定义命名) +sh ./bin/linkis-cli -engineType python-python2 \ +-codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop \ +-confMap python.version=python3 + +#2:cli的方式提交任务进行版本切换,命令设置加入版本路径 python.version=/usr/bin/python (/usr/bin/python:创建软连接时生成文件的路径) +sh ./bin/linkis-cli -engineType python-python2 \ +-codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop \ +-confMap python.version=/usr/bin/python + +``` + +#### 4.1.2 管理台配置 + +![](./images/python-config.png) + +注意: 修改IDE标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE -engineType \ +python-python2 -codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop \ +-confMap python.version=python3 +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "print(\"hello\")", "runType": "python"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "python.version":"python2", + "wds.linkis.engineconn.max.free.time":"1h" + } + } + }, + "labels": { + "engineType": "python-python2", + "userCreator": "IDE" + } +} +``` + +#### 4.2.3 文件配置 +通过修改目录 `${LINKIS_HOME}/lib/linkis-engineconn-plugins/python/dist/python2/conf/` 中的 `linkis-engineconn.properties` 文件进行配置,如下图: + +![](./images/python-conf.png) + +### 4.3 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:python-python2 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + +```sql +-- set variable +SET @PYTHON_LABEL="python-python2"; +SET @PYTHON_ALL=CONCAT('*-*,',@PYTHON_LABEL); +SET @PYTHON_IDE=CONCAT('*-IDE,',@PYTHON_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PYTHON_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PYTHON_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @PYTHON_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.client.memory.max', '取值范围:1-100,单位:G', 'python驱动器内存使用上限', '20G', 'Regex', '^([1-9]\\d{0,1}|100)(G|g)$', '0', '0', '1', '队列资源', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.client.core.max', '取值范围:1-128,单位:个', 'python驱动器核心个数上限', '10', 'Regex', '^(?:[1-9]\\d?|[1234]\\d{2}|128)$', '0', '0', '1', '队列资源', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', '范围:1-20,单位:个', 'python引擎最大并发数', '10', 'NumInterval', '[1,20]', '0', '0', '1', '队列资源', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', '取值范围:1-2,单位:G', 'python引擎初始化内存大小', '1g', 'Regex', '^([1-2])(G|g)$', '0', '0', '1', 'python引擎设置', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('python.version', '取值范围:python2,python3', 'python版本','python2', 'OFT', '[\"python3\",\"python2\"]', '0', '0', '1', 'python引擎设置', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.max.free.time', '取值范围:3m,15m,30m,1h,2h', '引擎空闲退出时间','1h', 'OFT', '[\"1h\",\"2h\",\"30m\",\"15m\",\"3m\"]', '0', '0', '1', 'python引擎设置', 'python'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'python' and label_value = @PYTHON_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @PYTHON_ALL); +``` + + +### 4.4 其他python样例代码 + +```python +import pandas as pd + +data = {'name': ['aaaaaa', 'bbbbbb', 'cccccc'], 'pay': [4000, 5000, 6000]} +frame = pd.DataFrame(data) +show.show(frame) + + +print('new reuslt') + +from matplotlib import pyplot as plt + +x=[4,8,10] +y=[12,16,6] +x2=[6,9,11] +y2=[6,15,7] +plt.bar(x,y,color='r',align='center') +plt.bar(x2,y2,color='g',align='center') +plt.show() + +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/seatunnel.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/seatunnel.md new file mode 100644 index 00000000000..15322ae414a --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/seatunnel.md @@ -0,0 +1,254 @@ +--- +title: Seatunnel +sidebar_position: 13 +--- + +本文主要介绍在 `Linkis` 中,`Seatunnel` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 + +### 1.1 引擎安装 + +如果您希望在您的 `Linkis` 服务上使用 `Seatunnel` 引擎,您需要安装 `Seatunnel` 引擎。而且 `Seatunnel` 是依赖 `Spark` 或 `Flink` 环境,使用 `linkis-seatunnel` 引擎前,强烈建议本地跑通 `Seatunnel` 环境。 + +`Seatunnel 2.1.2` 下载地址:https://dlcdn.apache.org/incubator/seatunnel/2.1.2/apache-seatunnel-incubating-2.1.2-bin.tar.gz + +| 环境变量名称 | 环境变量内容 | 是否需要 | +|-----------------|----------------|----------------------------------------| +| JAVA_HOME | JDK安装路径 | 需要 | +| SEATUNNEL_HOME | Seatunnel安装路径 | 需要 | +|SPARK_HOME| Spark安装路径 | Seatunnel执行基于Spark就需要 | +|FLINK_HOME| Flink安装路径 | Seatunnel执行基于Flink就需要 | + +表1-1 环境配置清单 + +| Linkis变量名称 | 变量内容 | 是否必须 | +| --------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------ | +| wds.linkis.engine.seatunnel.plugin.home | Seatunnel安装路径 | 是 | + +### 1.2 引擎环境验证 + +以执行 `Spark` 任务为例 + +```shell +cd $SEATUNNEL_HOME +./bin/start-seatunnel-spark.sh --master local[4] --deploy-mode client --config ./config/spark.batch.conf.template +``` +输出结果如下: + +![](./images/check-seatunnel.png) + +## 2. 引擎插件部署 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/seatunnel/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/seatunnel/target/out/ +``` +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── seatunnel +│   ├── dist +│   │   └── 2.1.2 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 2.1.2 +``` + +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的`last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到 `linkis` 的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + + +```shell +sh ./bin/linkis-cli --mode once -code 'test' -engineType seatunnel-2.1.2 -codeType sspark -labelMap userCreator=hadoop-seatunnel -labelMap engineConnMode=once -jobContentMap code='env { + spark.app.name = "SeaTunnel" + spark.executor.instances = 2 + spark.executor.cores = 1 + spark.executor.memory = "1g" + } + source { + Fake { + result_table_name = "my_dataset" + } + } + transform {} + sink {Console {}}' -jobContentMap master=local[4] -jobContentMap deploy-mode=client -sourceMap jobName=OnceJobTest -submitUser hadoop -proxyUser hadoop +``` + +### 3.2 通过 OnceEngineConn 提交任务 + +OnceEngineConn 通过 LinkisManagerClient 调用 LinkisManager 的 createEngineConn 接口,并将代码发送到创建的 Seatunnel 引擎,然后 Seatunnel 引擎开始执行。 Client 的使用也非常简单,首先创建一个新的 maven 项目,或者在项目中引入以下依赖项 + +```xml + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` + +**示例代码** +```java +package org.apache.linkis.computation.client; +import org.apache.linkis.common.conf.Configuration; +import org.apache.linkis.computation.client.once.simple.SubmittableSimpleOnceJob; +import org.apache.linkis.computation.client.utils.LabelKeyUtils; +public class SeatunnelOnceJobTest { + public static void main(String[] args) { + LinkisJobClient.config().setDefaultServerUrl("http://ip:9001"); + String code = + "\n" + + "env {\n" + + " spark.app.name = \"SeaTunnel\"\n" + + " spark.executor.instances = 2\n" + + " spark.executor.cores = 1\n" + + " spark.executor.memory = \"1g\"\n" + + "}\n" + + "\n" + + "source {\n" + + " Fake {\n" + + " result_table_name = \"my_dataset\"\n" + + " }\n" + + "\n" + + "}\n" + + "\n" + + "transform {\n" + + "}\n" + + "\n" + + "sink {\n" + + " Console {}\n" + + "}"; + SubmittableSimpleOnceJob onceJob = + LinkisJobClient.once() + .simple() + .builder() + .setCreateService("seatunnel-Test") + .setMaxSubmitTime(300000) + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY(), "seatunnel-2.1.2") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY(), "hadoop-seatunnel") + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY(), "once") + .addStartupParam(Configuration.IS_TEST_MODE().key(), true) + .addExecuteUser("hadoop") + .addJobContent("runType", "sspark") + .addJobContent("code", code) + .addJobContent("master", "local[4]") + .addJobContent("deploy-mode", "client") + .addSource("jobName", "OnceJobTest") + .build(); + onceJob.submit(); + System.out.println(onceJob.getId()); + onceJob.waitForCompleted(); + System.out.println(onceJob.getStatus()); + LinkisJobMetrics jobMetrics = onceJob.getJobMetrics(); + System.out.println(jobMetrics.getMetrics()); + } +} +``` +## 4. 引擎配置说明 + +### 4.1 默认配置说明 + +| 配置 | 默认值 | 说明 | 是否必须 | +| -------------------------------------- | --------------------- | ------------------------------------------- | -------- | +| wds.linkis.engine.seatunnel.plugin.home | /opt/linkis/seatunnel | Seatunnel安装路径 | true | +### 4.2 配置修改 + +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.2.1 客户端配置参数 + +```shell +sh ./bin/linkis-cli --mode once -code 'test' \ +-engineType seatunnel-2.1.2 -codeType sspark \ +-labelMap userCreator=hadoop-seatunnel -labelMap engineConnMode=once \ +-jobContentMap code='env { + spark.app.name = "SeaTunnel" + spark.executor.instances = 2 + spark.executor.cores = 1 + spark.executor.memory = "1g" + } + source { + Fake { + result_table_name = "my_dataset" + } + } + transform {} + sink {Console {}}' -jobContentMap master=local[4] \ + -jobContentMap deploy-mode=client \ + -sourceMap jobName=OnceJobTest \ + -runtimeMap wds.linkis.engine.seatunnel.plugin.home=/opt/linkis/seatunnel \ + -submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": 'env { + spark.app.name = "SeaTunnel" + spark.executor.instances = 2 + spark.executor.cores = 1 + spark.executor.memory = "1g" + } + source { + Fake { + result_table_name = "my_dataset" + } + } + transform {} + sink {Console {}}', + "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.engine.seatunnel.plugin.home":"/opt/linkis/seatunnel" + } + } + }, + "labels": { + "engineType": "seatunnel-2.1.2", + "userCreator": "hadoop-IDE" + } +} +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/shell.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/shell.md new file mode 100644 index 00000000000..650540bba52 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/shell.md @@ -0,0 +1,55 @@ +--- +title: Shell +sidebar_position: 4 +--- + +本文主要介绍在 `Linkis` 中, `Shell` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 + +### 1.1 环境安装 +如果您希望在您的服务器上使用 `Shell` 引擎,您需要保证用户的 `PATH` 中是有 `bash` 的执行目录和执行权限。 + +### 1.2 环境验证 +``` +echo $SHELL +``` +输出如下信息代表shell环境可用 +``` +/bin/bash +``` +或 +``` +/bin/sh +``` + +## 2. 引擎插件安装 [默认引擎](./overview.md) + +`Linkis` 发布的二进制安装包中默认包含了 `Shell` 引擎插件,用户无需额外安装。 + +[EngineConnPlugin引擎插件安装](../deployment/install-engineconn.md) + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +sh ./bin/linkis-cli -engineType shell-1 \ +-codeType shell -code "echo \"hello\" " \ +-submitUser hadoop -proxyUser hadoop +``` +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +### 3.2 通过Linkis SDK提交任务 + +`Linkis` 提供了 `Java` 和 `Scala` 的 `SDK` 向 `Linkis` 服务端提交任务。具体可以参考 [JAVA SDK Manual](../user-guide/sdk-manual.md)。 对于 `Shell` 任务您只需要修改 `Demo` 中的 `EngineConnType` 和 `CodeType` 参数即可: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "shell-1"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "shell"); // required codeType +``` +## 4. 引擎配置说明 + +`Shell` 引擎一般可以设置引擎 `JVM` 的最大内存。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/spark.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/spark.md new file mode 100644 index 00000000000..0ff552df319 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/spark.md @@ -0,0 +1,287 @@ +--- +title: Spark +sidebar_position: 1 +--- + +本文主要介绍在 `Linkis` 中, `Spark` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 引擎安装 + +如果您希望在您的服务器上使用 `Spark` 引擎,您需要保证以下的环境变量已经设置正确并且引擎的启动用户是有这些环境变量的。 + +强烈建议您在执行 `Spark` 任务之前,检查下执行用户的这些环境变量。 + +| 环境变量名 | 环境变量内容 | 备注 | +|-----------------|----------------|----------------------------------------| +| JAVA_HOME | JDK安装路径 | 必须 | +| HADOOP_HOME | Hadoop安装路径 | 必须 | +| HADOOP_CONF_DIR | Hadoop配置路径 | 必须 | +| HIVE_CONF_DIR | Hive配置路径 | 必须 | +| SPARK_HOME | Spark安装路径 | 必须 | +| SPARK_CONF_DIR | Spark配置路径 | 必须 | +| python | python | 建议使用anaconda的python作为默认python | + +### 1.2 环境验证 +通过 `pyspark` 验证 `Spark` 是否安装成功 +``` +pyspark + +#进入pyspark虚拟环境后,出现spark的logo则说明环境安装成功 +Welcome to + ____ __ + / __/__ ___ _____/ /__ + _\ \/ _ \/ _ `/ __/ '_/ + /__ / .__/\_,_/_/ /_/\_\ version 3.2.1 + /_/ + +Using Python version 2.7.13 (default, Sep 30 2017 18:12:43) +SparkSession available as 'spark'. +``` + +## 2. 引擎插件安装 [默认引擎](./overview.md) + +`Linkis` 发布的二进制安装包中默认包含了 `Spark` 引擎插件,用户无需额外安装。 + +理论上 `Linkis` 支持的 `Spark2.x` 以上的所有版本。默认支持的版本为 `Spark3.2.1` 。如果您想使用其他的 `Spark` 版本,如 `Spark2.1.0` ,则您仅仅需要将插件 `Spark` 的版本进行修改,然后进行编译即可。具体的,您可以找到 `linkis-engineplugin-spark` 模块,将 `maven` 依赖中 `` 标签的值改成 2.1.0 ,然后单独编译此模块即可。 + +[EngineConnPlugin引擎插件安装](../deployment/install-engineconn.md) + +## 3. 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell +# codeType对应关系 py-->pyspark sql-->sparkSQL scala-->Spark scala +sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType sql -code "show databases" -submitUser hadoop -proxyUser hadoop + +# 可以在提交参数通过-confMap wds.linkis.yarnqueue=dws 来指定yarn 队列 +sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType sql -confMap wds.linkis.yarnqueue=dws -code "show databases" -submitUser hadoop -proxyUser hadoop +``` +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +### 3.2 通过 `Linkis SDK` 提交任务 + +`Linkis` 提供了 `Java` 和 `Scala` 的 `SDK` 向 `Linkis` 服务端提交任务。具体可以参考 [JAVA SDK Manual](../user-guide/sdk-manual.md)。对于 `Spark` 任务你只需要修改 `Demo` 中的 `EngineConnType` 和 `CodeType` 参数即可: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-3.2.1"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "sql"); // required codeType py,sql,scala +``` + +Spark还支持提交Scala代码和Pyspark代码: +````java + +//scala +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "scala"); +code: +val df=spark.sql("show tables") +show(df) +//pyspark +/labels.put(LabelKeyConstant.CODE_TYPE_KEY, "py"); +code: +df=spark.sql("show tables") +show(df) +```` + +### 3.3 通过提交jar包执行任务 + +通过 `OnceEngineConn` 提交任务(通过 spark-submit 提交 jar 包执行任务),提交方式参考 `org.apache.linkis.computation.client.SparkOnceJobTest` + +```java +public class SparkOnceJobTest { + + public static void main(String[] args) { + + LinkisJobClient.config().setDefaultServerUrl("http://127.0.0.1:9001"); + + String submitUser = "linkis"; + String engineType = "spark"; + + SubmittableSimpleOnceJob onceJob = + // region + LinkisJobClient.once().simple().builder() + .setCreateService("Spark-Test") + .setMaxSubmitTime(300000) + .setDescription("SparkTestDescription") + .addExecuteUser(submitUser) + .addJobContent("runType", "jar") + .addJobContent("spark.app.main.class", "org.apache.spark.examples.JavaWordCount") + // 提交的jar包获取的参数 + .addJobContent("spark.app.args", "hdfs:///tmp/test_word_count.txt") // WordCount 测试文件 + .addLabel("engineType", engineType + "-2.4.7") + .addLabel("userCreator", submitUser + "-IDE") + .addLabel("engineConnMode", "once") + .addStartupParam("spark.app.name", "spark-submit-jar-test-linkis") // yarn上展示的 Application Name + .addStartupParam("spark.executor.memory", "1g") + .addStartupParam("spark.driver.memory", "1g") + .addStartupParam("spark.executor.cores", "1") + .addStartupParam("spark.executor.instance", "1") + .addStartupParam("spark.app.resource", "hdfs:///tmp/spark/spark-examples_2.11-2.3.0.2.6.5.0-292.jar") + .addSource("jobName", "OnceJobTest") + .build(); + // endregion + onceJob.submit(); + onceJob.waitForCompleted(); // 网络临时不通会导致异常,建议后期修改 SDK,现阶段使用,需要做异常处理 + // 网络临时不通会导致异常,建议后期修改 SDK,现阶段使用,需要做异常处理 + onceJob.waitForCompleted(); + } +} +``` + +### 3.4 通过 Restful API 提交任务 + +运行脚本类型包括 `sql`、`scala`、`python`、`data_calc(格式为json)`。 + +[任务提交执行Restful API文档](../api/linkis-task-operator.md) + +```http request +POST /api/rest_j/v1/entrance/submit +Content-Type: application/json +Token-Code: dss-AUTH +Token-User: linkis + +{ + "executionContent": { + // 脚本内容,可以是sql,python,scala,json + "code": "show databases", + // 运行的脚本类型 sql, py(pyspark), scala, data_calc + "runType": "sql" + }, + "params": { + "variable": { + }, + "configuration": { + // spark 启动参数,非必填 + "startup": { + "spark.executor.memory": "1g", + "spark.driver.memory": "1g", + "spark.executor.cores": "1", + "spark.executor.instances": 1 + } + } + }, + "source": { + // 非必填,file:/// 或者 hdfs:/// + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + // 格式为:引擎类型-版本 + "engineType": "spark-3.2.1", + // userCreator: linkis 为用户名。IDE 是系统名,在 Linkis 后台管理。 + "userCreator": "linkis-IDE" + } +} +``` + +## 4.引擎配置说明 + +### 4.1 默认配置说明 +| 配置 | 默认值 |是否必须 | 说明 | +| ------------------------ | ------------------- | ---|---------------------------------------- | +| wds.linkis.rm.instance | 10 |否 | 引擎最大并发数 | +| spark.executor.cores | 1 |否 | spark执行器核心个数 | +| spark.driver.memory | 1g |否 | spark执行器实例最大并发数 | +| spark.executor.memory | 1g |否 | spark执行器内存大小 | +| wds.linkis.engineconn.max.free.time | 1h |否 | 引擎空闲退出时间 | +| spark.python.version | python2 |否 | python版本 | + +### 4.2 队列资源配置 +因为 `Spark` 任务的执行需要队列的资源,须要设置自己能够执行的队列。 + +![yarn](./images/yarn-conf.png) + + +### 4.3 配置修改 +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.3.1 管理台配置 +用户可以进行自定义的设置,比如 `Spark` 会话 `executor` 个数和 `executor` 的内存。这些参数是为了用户能够更加自由地设置自己的 `spark` 的参数,另外 `Spark` 其他参数也可以进行修改,比如的 `pyspark` 的 `python` 版本等。 +![spark](./images/spark-conf.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType spark-3.2.1 -codeType sql \ +-code "show databases" \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.3.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "show databases;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.rm.instance":"10" + } + } + }, + "labels": { + "engineType": "spark-3.2.1", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.4 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:spark-3.2.1 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + +```sql +-- set variable +SET @SPARK_LABEL="spark-3.2.1"; +SET @SPARK_ALL=CONCAT('*-*,',@SPARK_LABEL); +SET @SPARK_IDE=CONCAT('*-IDE,',@SPARK_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @SPARK_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @SPARK_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @SPARK_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', '范围:1-20,单位:个', 'spark引擎最大并发数', '10', 'NumInterval', '[1,20]', '0', '0', '1', '队列资源', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.executor.instances', '取值范围:1-40,单位:个', 'spark执行器实例最大并发数', '1', 'NumInterval', '[1,40]', '0', '0', '2', 'spark资源设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.executor.cores', '取值范围:1-8,单位:个', 'spark执行器核心个数', '1', 'NumInterval', '[1,8]', '0', '0', '1','spark资源设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.executor.memory', '取值范围:1-15,单位:G', 'spark执行器内存大小', '1g', 'Regex', '^([1-9]|1[0-5])(G|g)$', '0', '0', '3', 'spark资源设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.driver.cores', '取值范围:只能取1,单位:个', 'spark驱动器核心个数', '1', 'NumInterval', '[1,1]', '0', '1', '1', 'spark资源设置','spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.driver.memory', '取值范围:1-15,单位:G', 'spark驱动器内存大小','1g', 'Regex', '^([1-9]|1[0-5])(G|g)$', '0', '0', '1', 'spark资源设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.max.free.time', '取值范围:3m,15m,30m,1h,2h', '引擎空闲退出时间','1h', 'OFT', '[\"1h\",\"2h\",\"30m\",\"15m\",\"3m\"]', '0', '0', '1', 'spark引擎设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.pd.addresses', NULL, NULL, 'pd0:2379', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.addr', NULL, NULL, 'tidb', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.password', NULL, NULL, NULL, 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.port', NULL, NULL, '4000', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.user', NULL, NULL, 'root', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.python.version', '取值范围:python2,python3', 'python版本','python2', 'OFT', '[\"python3\",\"python2\"]', '0', '0', '1', 'spark引擎设置', 'spark'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'spark' and label.label_value = @SPARK_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @SPARK_ALL); + +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/sqoop.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/sqoop.md new file mode 100644 index 00000000000..9cbc69f5319 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/sqoop.md @@ -0,0 +1,473 @@ +--- +title: Sqoop +sidebar_position: 8 +--- + +本文主要介绍在 `Linkis` 中, `Sqoop` 引擎插件的安装、使用和配置。 + +## 1. 前置工作 +### 1.1 环境安装 + +`Sqoop` 引擎主要依赖 `Hadoop` 基础环境,如果该节点需要部署 `Sqoop` 引擎,需要部署 `Hadoop` 客户端环境,以及[下载](https://archive.apache.org/dist/sqoop/)安装 `Sqoop` 客户端。 + +### 1.2 环境验证 +在执行 `Sqoop` 任务之前,先在该节点使用原生的 `Sqoop` 执行测试任务,以检测该节点环境是否正常。 +```shell script +#验证sqoop环境是否可用 参考示例:将hdfs的/user/hive/warehouse/hadoop/test_linkis_sqoop文件数据导入到mysql表 test_sqoop中 + +sqoop export \ +--connect jdbc:mysql://127.0.0.1/test \ +--username test \ +--password test123\ +--table test_sqoop \ +--columns user_id,user_code,user_name,email,status \ +--export-dir /user/hive/warehouse/hadoop/test_linkis_sqoop \ +--update-mode allowinsert \ +--verbose ; +``` + +| 环境变量名 | 环境变量内容 | 备注 | +|-----------------|----------------|----------------------------------------| +| JAVA_HOME | JDK安装路径 | 必须 | +| HADOOP_HOME | Hadoop安装路径 | 必须 | +| HADOOP_CONF_DIR | Hadoop配置路径 | 必须 | +| SQOOP_HOME | Sqoop安装路径 | 必须 | +| SQOOP_CONF_DIR | Sqoop配置路径 | 非必须 | +| HCAT_HOME | HCAT配置路径 | 非必须 | +| HBASE_HOME | HBASE配置路径 | 非必须 | + + +| Linkis系统参数 | 参数 | 备注 | +| --------------------------- | ------------------------------- | ------------------------------------------------------------ | +| wds.linkis.hadoop.site.xml | 设置sqoop加载hadoop参数文件位置 | 一般不需要单独配置,默认值"core-site.xml;hdfs-site.xml;yarn-site.xml;mapred-site.xml" | +| sqoop.fetch.status.interval | 设置获取sqoop执行状态的间隔时间 | 一般不需要单独配置,默认值为5s | + + +## 2. 引擎插件部署 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/sqoop/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/sqoop/target/out/ +``` + +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── sqoop +│   ├── dist +│   │   └── 1.4.6 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 1.4.6 +``` + +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的 `last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到 `linkis` 的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 +#### 3.1.1 `hdfs` 文件导出到 `mysql` + +```shell +sh linkis-cli-sqoop export \ +-D mapreduce.job.queuename=ide \ +--connect jdbc:mysql://127.0.0.1:9600/testdb \ +--username password@123 \ +--password password@123 \ +--table test_sqoop_01_copy \ +--columns user_id,user_code,user_name,email,status \ +--export-dir /user/hive/warehouse/hadoop/test_linkis_sqoop_2 \ +--update-mode allowinsert --verbose ; +``` + +#### 3.1.2 `mysql` 数据导入到 `hive` 库 +```shell script +`mysql` 导入到 `hive` 库 `linkis_test_ind.test_import_sqoop_1` ,表 `test_import_sqoop_1` 不存在 需要添加参数 `--create-hive-table` + +sh linkis-cli-sqoop import -D mapreduce.job.queuename=dws \ +--connect jdbc:mysql://127.0.0.1:3306/casion_test \ +--username hadoop \ +--password password@123 \ +--table test_sqoop_01 \ +--columns user_id,user_code,user_name,email,status \ +--fields-terminated-by ',' \ +--hive-import --create-hive-table \ +--hive-database casionxia_ind \ +--hive-table test_import_sqoop_1 \ +--hive-drop-import-delims \ +--delete-target-dir \ +--input-null-non-string '\\N' \ +--input-null-string '\\N' \ +--verbose ; + + +`mysql` 导入到 `hive` 库 `linkis_test_ind.test_import_sqoop_1` ,表 `test_import_sqoop_1` 存在 移除参数 `--create-hive-table ` + +sh linkis-cli-sqoop import -D mapreduce.job.queuename=dws \ +--connect jdbc:mysql://127.0.0.1:9600/testdb \ +--username testdb \ +--password password@123 \ +--table test_sqoop_01 \ +--columns user_id,user_code,user_name,email,status \ +--fields-terminated-by ',' \ +--hive-import \ +--hive-database linkis_test_ind \ +--hive-table test_import_sqoop_1 \ +--hive-overwrite \ +--hive-drop-import-delims \ +--delete-target-dir \ +--input-null-non-string '\\N' \ +--input-null-string '\\N' \ +--verbose ; + +``` + +### 3.2 通过 OnceEngineConn 提交任务 + +`OnceEngineConn` 的使用方式是通过 `LinkisManagerClient` 调用 `LinkisManager` 的 `createEngineConn` 的接口,并将代码发给创建的 `Sqoop` 引擎,然后 `Sqoop` 引擎就开始执行,此方式可以被其他系统进行调用,比如 `Exchangis` 。 `Client` 的使用方式也很简单,首先新建一个 `maven` 项目,或者在您的项目中引入以下的依赖 +```xml + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` +**测试用例:** + +```java + +import java.util.concurrent.TimeUnit + +import java.util + +import org.apache.linkis.computation.client.LinkisJobBuilder +import org.apache.linkis.computation.client.once.simple.{SimpleOnceJob, SimpleOnceJobBuilder, SubmittableSimpleOnceJob} +import org.apache.linkis.computation.client.operator.impl.{EngineConnLogOperator, EngineConnMetricsOperator, EngineConnProgressOperator} +import org.apache.linkis.computation.client.utils.LabelKeyUtils + +import scala.collection.JavaConverters._ + +object SqoopOnceJobTest extends App { + LinkisJobBuilder.setDefaultServerUrl("http://127.0.0.1:9001") + val logPath = "C:\\Users\\resources\\log4j.properties" + System.setProperty("log4j.configurationFile", logPath) + val startUpMap = new util.HashMap[String, Any] + startUpMap.put("wds.linkis.engineconn.java.driver.memory", "1g") + val builder = SimpleOnceJob.builder().setCreateService("Linkis-Client") + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY, "sqoop-1.4.6") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY, "Client") + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY, "once") + .setStartupParams(startUpMap) + .setMaxSubmitTime(30000) + .addExecuteUser("freeuser") + val onceJob = importJob(builder) + val time = System.currentTimeMillis() + onceJob.submit() + + println(onceJob.getId) + val logOperator = onceJob.getOperator(EngineConnLogOperator.OPERATOR_NAME).asInstanceOf[EngineConnLogOperator] + println(onceJob.getECMServiceInstance) + logOperator.setFromLine(0) + logOperator.setECMServiceInstance(onceJob.getECMServiceInstance) + logOperator.setEngineConnType("sqoop") + logOperator.setIgnoreKeywords("[main],[SpringContextShutdownHook]") + var progressOperator = onceJob.getOperator(EngineConnProgressOperator.OPERATOR_NAME).asInstanceOf[EngineConnProgressOperator] + var metricOperator = onceJob.getOperator(EngineConnMetricsOperator.OPERATOR_NAME).asInstanceOf[EngineConnMetricsOperator] + var end = false + var rowBefore = 1 + while (!end || rowBefore > 0){ + if(onceJob.isCompleted) { + end = true + metricOperator = null + } + logOperator.setPageSize(100) + Utils.tryQuietly{ + val logs = logOperator.apply() + logs.logs.asScala.foreach( log => { + println(log) + }) + rowBefore = logs.logs.size + } + Thread.sleep(3000) + Option(metricOperator).foreach( operator => { + if (!onceJob.isCompleted){ + println(s"Metric监控: ${operator.apply()}") + println(s"进度: ${progressOperator.apply()}") + } + }) + } + onceJob.isCompleted + onceJob.waitForCompleted() + println(onceJob.getStatus) + println(TimeUnit.SECONDS.convert(System.currentTimeMillis() - time, TimeUnit.MILLISECONDS) + "s") + System.exit(0) + + + def importJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue_10") + .addJobContent("sqoop.mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://127.0.0.1:3306/exchangis") + .addJobContent("sqoop.args.username", "free") + .addJobContent("sqoop.args.password", "testpwd") + .addJobContent("sqoop.args.query", "select id as order_number, sno as time from" + + " exchangis where sno =1 and $CONDITIONS") + .addJobContent("sqoop.args.hcatalog.database", "freedb") + .addJobContent("sqoop.args.hcatalog.table", "zy_test") + .addJobContent("sqoop.args.hcatalog.partition.keys", "month") + .addJobContent("sqoop.args.hcatalog.partition.values", "3") + .addJobContent("sqoop.args.num.mappers", "1") + .build() + } + + def exportJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue1") + .addJobContent("sqoop.mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://127.0.0.1:3306/exchangis") + .addJobContent("sqoop.args.query", "select id as order, sno as great_time from" + + " exchangis_table where sno =1 and $CONDITIONS") + .addJobContent("sqoop.args.hcatalog.database", "hadoop") + .addJobContent("sqoop.args.hcatalog.table", "partition_33") + .addJobContent("sqoop.args.hcatalog.partition.keys", "month") + .addJobContent("sqoop.args.hcatalog.partition.values", "4") + .addJobContent("sqoop.args.num.mappers", "1") + .build() + } +``` + + +## 4 引擎配置说明 +### 4.1 默认配置说明 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| | sqoop.mode | import/export/… | +| -Dmapreduce.job.queuename | sqoop.env.mapreduce.job.queuename | | +| \--connect | sqoop.args.connect | Specify JDBC connect string | +| \--connection-manager | sqoop.args.connection.manager | Specify connection manager class name | +| \--connection-param-file | sqoop.args.connection.param.file | Specify connection parameters file | +| \--driver | sqoop.args.driver | Manually specify JDBC driver class to use | +| \--hadoop-home | sqoop.args.hadoop.home | Override $HADOOP\_MAPRED\_HOME\_ARG | +| \--hadoop-mapred-home | sqoop.args.hadoop.mapred.home | Override $HADOOP\_MAPRED\_HOME\_ARG | +| \--help | sqoop.args.help | Print usage instructions | +| \-P | | Read password from console | +| \--password | sqoop.args.password | Set authentication password | +| \--password-alias | sqoop.args.password.alias | Credential provider password alias | +| \--password-file | sqoop.args.password.file | Set authentication password file path | +| \--relaxed-isolation | sqoop.args.relaxed.isolation | Use read-uncommitted isolation for imports | +| \--skip-dist-cache | sqoop.args.skip.dist.cache | Skip copying jars to distributed cache | +| \--username | sqoop.args.username | Set authentication username | +| \--verbose | sqoop.args.verbose | Print more information while working | +| | | | +### 4.2 导入导出参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--batch | sqoop.args.batch |  Indicates underlying statements to be executed in batch mode | +| \--call | sqoop.args.call | Populate the table using this stored procedure (one call  per row) | +| \--clear-staging-table | sqoop.args.clear.staging.table | Indicates that any data in staging table can be deleted | +| \--columns | sqoop.args.columns | Columns to export to table | +| \--direct | sqoop.args.direct | Use direct export fast path | +| \--export-dir | sqoop.args.export.dir | HDFS source path for the export | +| \-m,--num-mappers | sqoop.args.num.mappers | Use 'n' map tasks to export in parallel | +| \--mapreduce-job-name | sqoop.args.mapreduce.job.name | Set name for generated mapreduce job | +| \--staging-table | sqoop.args.staging.table | Intermediate staging  table | +| \--table | sqoop.args.table | Table to populate | +| \--update-key | sqoop.args.update.key | Update records by specified key column | +| \--update-mode | sqoop.args.update.mode | Specifies how updates are  performed  when new   rows are  found with non-matching keys in database | +| \--validate | sqoop.args.validate | Validate the copy using the configured validator | +| \--validation-failurehandler | sqoop.args.validation.failurehandler | Validate the  copy using the configured validator | +| \--validation-threshold | sqoop.args.validation.threshold |  Fully qualified class name for ValidationThreshold | +| \--validator | sqoop.args.validator | Fully qualified class name for the Validator | +| | | | +### 4.3 导入控制参数 +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--append | sqoop.args.append | Imports data in append mode | +| \--as-avrodatafile | sqoop.args.as.avrodatafile | Imports data to Avro data files | +| \--as-parquetfile | sqoop.args.as.parquetfile | Imports data to Parquet files | +| \--as-sequencefile | sqoop.args.as.sequencefile | Imports data to SequenceFiles | +| \--as-textfile | sqoop.args.as.textfile | Imports data as plain text (default) | +| \--autoreset-to-one-mapper | sqoop.args.autoreset.to.one.mapper | Reset the number of mappers to one mapper if no split key available | +| \--boundary-query | sqoop.args.boundary.query | Set boundary query for retrieving max and min value of the primary key | +| \--case-insensitive | sqoop.args.case.insensitive | Data Base is case insensitive, split where condition transfrom to lower case! | +| \--columns | sqoop.args.columns | Columns to import from table | +| \--compression-codec | sqoop.args.compression.codec | Compression codec to use for import | +| \--delete-target-dir | sqoop.args.delete.target.dir | Imports data in delete mode | +| \--direct | sqoop.args.direct | Use direct import fast path | +| \--direct-split-size | sqoop.args.direct.split.size | Split the input stream every 'n' bytes when importing in direct mode | +| \-e,--query | sqoop.args.query | Import results of SQL 'statement' | +| \--fetch-size | sqoop.args.fetch.size | Set number 'n' of rows to fetch from the database when more rows are needed | +| \--inline-lob-limit | sqoop.args.inline.lob.limit | Set the maximum size for an inline LOB | +| \-m,--num-mappers | sqoop.args.num.mappers | Use 'n' map tasks to import in parallel | +| \--mapreduce-job-name | sqoop.args.mapreduce.job.name | Set name for generated mapreduce job | +| \--merge-key | sqoop.args.merge.key | Key column to use to join results | +| \--split-by | sqoop.args.split.by | Column of the table used to split work units | +| \--table | sqoop.args.table | Table to read | +| \--target-dir | sqoop.args.target.dir | HDFS plain table destination | +| \--validate | sqoop.args.validate | Validate the copy using the configured validator | +| \--validation-failurehandler | sqoop.args.validation.failurehandler | Fully qualified class name for ValidationFa ilureHandler | +| \--validation-threshold | sqoop.args.validation.threshold | Fully qualified class name for ValidationTh reshold | +| \--validator | sqoop.args.validator | Fully qualified class name for the Validator | +| \--warehouse-dir | sqoop.args.warehouse.dir | HDFS parent for table destination | +| \--where | sqoop.args.where | WHERE clause to use during import | +| \-z,--compress | sqoop.args.compress | Enable compression | +| | | | + +### 4.4 增量导入参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--check-column | sqoop.args.check.column | Source column to check for incremental change | +| \--incremental | sqoop.args.incremental | Define an incremental import of type 'append' or 'lastmodified' | +| \--last-value | sqoop.args.last.value | Last imported value in the incremental check column | +| | | | + +### 4.5 输出行格式化参数 +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--enclosed-by | sqoop.args.enclosed.by | Sets a required field enclosing character | +| \--escaped-by | sqoop.args.escaped.by | Sets the escape character | +| \--fields-terminated-by | sqoop.args.fields.terminated.by | Sets the field separator character | +| \--lines-terminated-by | sqoop.args.lines.terminated.by | Sets the end-of-line character | +| \--mysql-delimiters | sqoop.args.mysql.delimiters | Uses MySQL's default delimiter set: fields: , lines: \\n escaped-by: \\ optionally-enclosed-by: ' | +| \--optionally-enclosed-by | sqoop.args.optionally.enclosed.by | Sets a field enclosing character | +| | | | + +### 4.6 输入解析参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--input-enclosed-by | sqoop.args.input.enclosed.by | Sets a required field encloser | +| \--input-escaped-by | sqoop.args.input.escaped.by | Sets the input escape character | +| \--input-fields-terminated-by | sqoop.args.input.fields.terminated.by | Sets the input field separator | +| \--input-lines-terminated-by | sqoop.args.input.lines.terminated.by | Sets the input end-of-line char | +| \--input-optionally-enclosed-by | sqoop.args.input.optionally.enclosed.by | Sets a field enclosing character | +| | | | + + ### 4.7 Hive 参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--create-hive-table | sqoop.args.create.hive.table | Fail if the target hive table exists | +| \--hive-database | sqoop.args.hive.database | Sets the database name to use when importing to hive | +| \--hive-delims-replacement | sqoop.args.hive.delims.replacement | Replace Hive record \\0x01 and row delimiters (\\n\\r) from imported string fields with user-defined string | +| \--hive-drop-import-delims | sqoop.args.hive.drop.import.delims | Drop Hive record \\0x01 and row delimiters (\\n\\r) from imported string fields | +| \--hive-home | sqoop.args.hive.home | Override $HIVE\_HOME | +| \--hive-import | sqoop.args.hive.import | Import tables into Hive (Uses Hive's default delimiters if none are set.) | +| \--hive-overwrite | sqoop.args.hive.overwrite | Overwrite existing data in the Hive table | +| \--hive-partition-key | sqoop.args.hive.partition.key | Sets the partition key to use when importing to hive | +| \--hive-partition-value | sqoop.args.hive.partition.value | Sets the partition value to use when importing to hive | +| \--hive-table | sqoop.args.hive.table | Sets the table name to use when importing to hive | +| \--map-column-hive | sqoop.args.map.column.hive | Override mapping for specific column to hive types. | + + +### 4.8 HBase 参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--column-family | sqoop.args.column.family | Sets the target column family for the import | +| \--hbase-bulkload | sqoop.args.hbase.bulkload | Enables HBase bulk loading | +| \--hbase-create-table | sqoop.args.hbase.create.table | If specified, create missing HBase tables | +| \--hbase-row-key | sqoop.args.hbase.row.key | Specifies which input column to use as the row key | +| \--hbase-table | sqoop.args.hbase.table | Import to in HBase | +| | | | + +### 4.9 HCatalog 参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--hcatalog-database | sqoop.args.hcatalog.database | HCatalog database name | +| \--hcatalog-home | sqoop.args.hcatalog.home | Override $HCAT\_HOME | +| \--hcatalog-partition-keys | sqoop.args.hcatalog.partition.keys | Sets the partition keys to use when importing to hive | +| \--hcatalog-partition-values | sqoop.args.hcatalog.partition.values | Sets the partition values to use when importing to hive | +| \--hcatalog-table | sqoop.args.hcatalog.table | HCatalog table name | +| \--hive-home | sqoop.args.hive.home | Override $HIVE\_HOME | +| \--hive-partition-key | sqoop.args.hive.partition.key | Sets the partition key to use when importing to hive | +| \--hive-partition-value | sqoop.args.hive.partition.value | Sets the partition value to use when importing to hive | +| \--map-column-hive | sqoop.args.map.column.hive | Override mapping for specific column to hive types. | +| | | | +| HCatalog import specific options: | | | +| \--create-hcatalog-table | sqoop.args.create.hcatalog.table | Create HCatalog before import | +| \--hcatalog-storage-stanza | sqoop.args.hcatalog.storage.stanza | HCatalog storage stanza for table creation | +| | | +### 4.10 Accumulo 参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--accumulo-batch-size | sqoop.args.accumulo.batch.size | Batch size in bytes | +| \--accumulo-column-family | sqoop.args.accumulo.column.family | Sets the target column family for the import | +| \--accumulo-create-table | sqoop.args.accumulo.create.table | If specified, create missing Accumulo tables | +| \--accumulo-instance | sqoop.args.accumulo.instance | Accumulo instance name. | +| \--accumulo-max-latency | sqoop.args.accumulo.max.latency | Max write latency in milliseconds | +| \--accumulo-password | sqoop.args.accumulo.password | Accumulo password. | +| \--accumulo-row-key | sqoop.args.accumulo.row.key | Specifies which input column to use as the row key | +| \--accumulo-table | sqoop.args.accumulo.table | Import to in Accumulo | +| \--accumulo-user | sqoop.args.accumulo.user | Accumulo user name. | +| \--accumulo-visibility | sqoop.args.accumulo.visibility | Visibility token to be applied to all rows imported | +| \--accumulo-zookeepers | sqoop.args.accumulo.zookeepers | Comma-separated list of zookeepers (host:port) | +| | | | + +### 4.11 代码生成参数 + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \--bindir | sqoop.args.bindir | Output directory for compiled objects | +| \--class-name | sqoop.args.class.name | Sets the generated class name. This overrides --package-name. When combined with --jar-file, sets the input class. | +| \--input-null-non-string | sqoop.args.input.null.non.string | Input null non-string representation | +| \--input-null-string | sqoop.args.input.null.string | Input null string representation | +| \--jar-file | sqoop.args.jar.file | Disable code generation; use specified jar | +| \--map-column-java | sqoop.args.map.column.java | Override mapping for specific columns to java types | +| \--null-non-string | sqoop.args.null.non.string | Null non-string representation | +| \--null-string | sqoop.args.null.string | Null string representation | +| \--outdir | sqoop.args.outdir | Output directory for generated code | +| \--package-name | sqoop.args.package.name | Put auto-generated classes in this package | +| | | | +### 4.12 通用 Hadoop 命令行参数 +>must preceed any tool-specific arguments,Generic options supported are + +| 参数 | key | 说明 | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| \-conf | sqoop.args.conf | specify an application configuration file | +| \-D | sqoop.args.D | use value for given property | +| \-fs | sqoop.args.fs | specify a namenode | +| \-jt | sqoop.args.jt | specify a ResourceManager | +| \-files | sqoop.args.files | specify comma separated files to be copied to the map reduce cluster | +| \-libjars | sqoop.args.libjars | specify comma separated jar files to include in the classpath. | +| \-archives | sqoop.args.archives | specify comma separated archives to be unarchived on the compute machines. | \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/trino.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/trino.md new file mode 100644 index 00000000000..37a9036b513 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/engine-usage/trino.md @@ -0,0 +1,243 @@ +--- +title: Trino +sidebar_position: 12 +--- + +本文主要介绍在 `Linkis` 中,`Trino` 引擎插件的安装、使用和配置。 + + +## 1. 前置工作 + +### 1.1 引擎安装 + +如果您希望在您的 `Linkis` 服务上使用 `Trino` 引擎,您需要安装 `Trino` 服务并保证服务可用。 + +### 1.2 服务验证 + +```shell +# 准备 trino-cli +wget https://repo1.maven.org/maven2/io/trino/trino-cli/374/trino-cli-374-executable.jar +mv trino-cli-374-executable.jar trino-cli +chmod +x trino-cli + +# 执行任务 +./trino-cli --server localhost:8080 --execute 'show tables from system.jdbc' + +# 得到如下输出代表服务可用 +"attributes" +"catalogs" +"columns" +"procedure_columns" +"procedures" +"pseudo_columns" +"schemas" +"super_tables" +"super_types" +"table_types" +"tables" +"types" +"udts" +``` + +## 2. 引擎插件部署 + +### 2.1 引擎插件准备(二选一)[非默认引擎](./overview.md) + +方式一:直接下载引擎插件包 + +[Linkis 引擎插件下载](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +方式二:单独编译引擎插件(需要有 `maven` 环境) + +``` +# 编译 +cd ${linkis_code_dir}/linkis-engineconn-plugins/trino/ +mvn clean install +# 编译出来的引擎插件包,位于如下目录中 +${linkis_code_dir}/linkis-engineconn-plugins/trino/target/out/ +``` +[EngineConnPlugin 引擎插件安装](../deployment/install-engineconn.md) + +### 2.2 引擎插件的上传和加载 + +将 2.1 中的引擎包上传到服务器的引擎目录下 +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +上传后目录结构如下所示 +``` +linkis-engineconn-plugins/ +├── trino +│   ├── dist +│   │   └── 371 +│   │   ├── conf +│   │   └── lib +│   └── plugin +│   └── 371 +``` + +### 2.3 引擎刷新 + +#### 2.3.1 重启刷新 +通过重启 `linkis-cg-linkismanager` 服务刷新引擎 +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 检查引擎是否刷新成功 +可以查看数据库中的 `linkis_engine_conn_plugin_bml_resources` 这张表的`last_update_time` 是否为触发刷新的时间。 + +```sql +#登陆到 `linkis` 的数据库 +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3 引擎的使用 + +### 3.1 通过 `Linkis-cli` 提交任务 + +```shell + sh ./bin/linkis-cli -submitUser hadoop \ + -engineType trino-371 -codeType sql \ + -code 'select * from system.jdbc.schemas limit 10' \ + -runtimeMap linkis.trino.url=http://127.0.0.1:8080 +``` + +如果管理台,任务接口,配置文件,均未配置(配置方式见 4.2 )时可在 `Linkis-cli` 客户端中通过 `-runtimeMap` 属性进行配置 + +```shell +sh ./bin/linkis-cli -engineType trino-371 \ +-codeType sql -code 'select * from system.jdbc.schemas limit 10;' \ +-runtimeMap linkis.trino.urll=http://127.0.0.1:8080 \ +-runtimeMap linkis.trino.catalog=hive \ +-runtimeMap linkis.trino.schema=default \ +-submitUser hadoop -proxyUser hadoop +``` + +更多 `Linkis-Cli` 命令参数参考: [Linkis-Cli 使用](../user-guide/linkiscli-manual.md) + +## 4. 引擎配置说明 + +### 4.1 默认配置说明 + +| 配置 | 默认值 | 说明 | 是否必须 | +| -------------------------------------- | --------------------- | ------------------------------------------- | -------- | +| linkis.trino.url | http://127.0.0.1:8080 | Trino 集群连接 URL | true | +| linkis.trino.default.limit | 5000 | 否 | 结果集条数限制 | +| linkis.trino.http.connectTimeout | 60 | 否 | 连接超时时间(秒) | +| linkis.trino.http.readTimeout | 60 | 否 | 传输超时时间(秒)| +| linkis.trino.resultSet.cache.max | 512k | 否 | 结果集缓冲区 | +| linkis.trino.user | null | 否 | 用户名 | +| linkis.trino.password | null | 否 | 密码 | +| linkis.trino.passwordCmd | null | 否 | 密码回调命令 | +| linkis.trino.catalog | system | 否 | Catalog | +| linkis.trino.schema | null | 否 | Schema | +| linkis.trino.ssl.insecured | false | 否 | 验证SSL证书 | +| linkis.engineconn.concurrent.limit | 100 | 否 | 引擎最大并发数 | +| linkis.trino.ssl.key.store | null | 否 | keystore路径 | +| linkis.trino.ssl.keystore.password | null | 否 | keystore密码 | +| linkis.trino.ssl.keystore.type | null | 否 | keystore类型 | +| linkis.trino.ssl.truststore | null | 否 | truststore | +| linkis.trino.ss..truststore.type | null | 否 | trustore类型 | +| linkis.trino.ssl.truststore.password | null | 否 | truststore密码 | + +### 4.2 配置修改 + +如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置 + +#### 4.2.1 管理台配置 + +![](./images/trino-config.png) + +注意: 修改 `IDE` 标签下的配置后需要指定 `-creator IDE` 才会生效(其它标签类似),如: + +```shell +sh ./bin/linkis-cli -creator IDE -submitUser hadoop \ + -engineType trino-371 -codeType sql \ + -code 'select * from system.jdbc.schemas limit 10' \ + -runtimeMap linkis.trino.url=http://127.0.0.1:8080 +``` + +#### 4.2.2 任务接口配置 +提交任务接口,通过参数 `params.configuration.runtime` 进行配置 + +```shell +http 请求参数示例 +{ + "executionContent": {"code": "select * from system.jdbc.schemas limit 10;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.trino.url":"http://127.0.0.1:8080", + "linkis.trino.catalog ":"hive", + "linkis.trino.schema ":"default" + } + } + }, + "labels": { + "engineType": "trino-371", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 引擎相关数据表 + +`Linkis` 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。 + +``` +linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values +linkis_cg_manager_label:插入引擎label如:trino-375 +linkis_ps_configuration_category: 插入引擎的目录关联关系 +linkis_ps_configuration_config_value: 插入引擎需要展示的配置 +linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系 +``` + +表中与引擎相关的初始数据如下 + + +```sql +-- set variable +SET @TRINO_LABEL="trino-371"; +SET @TRINO_IDE=CONCAT('*-IDE,',@TRINO_LABEL); +SET @TRINO_ALL=CONCAT('*-*,',@TRINO_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @TRINO_IDE, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @TRINO_ALL, 'OPTIONAL', 2, now(), now()); +select @label_id := id from `linkis_cg_manager_label` where label_value = @TRINO_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.default.limit', '查询的结果集返回条数限制', '结果集条数限制', '5000', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.http.connectTimeout', '连接Trino服务器的超时时间', '连接超时时间(秒)', '60', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.http.readTimeout', '等待Trino服务器返回数据的超时时间', '传输超时时间(秒)', '60', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.resultSet.cache.max', 'Trino结果集缓冲区大小', '结果集缓冲区', '512k', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.url', 'Trino服务器URL', 'Trino服务器URL', 'http://127.0.0.1:9401', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.user', '用于连接Trino查询服务的用户名', '用户名', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.password', '用于连接Trino查询服务的密码', '密码', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.passwordCmd', '用于连接Trino查询服务的密码回调命令', '密码回调命令', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.catalog', '连接Trino查询时使用的catalog', 'Catalog', 'system', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.schema', '连接Trino查询服务的默认schema', 'Schema', '', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.insecured', '是否忽略服务器的SSL证书', '验证SSL证书', 'false', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.engineconn.concurrent.limit', '引擎最大并发', '引擎最大并发', '100', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.keystore', 'Trino服务器SSL keystore路径', 'keystore路径', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.keystore.type', 'Trino服务器SSL keystore类型', 'keystore类型', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.keystore.password', 'Trino服务器SSL keystore密码', 'keystore密码', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.truststore', 'Trino服务器SSL truststore路径', 'truststore路径', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.truststore.type', 'Trino服务器SSL truststore类型', 'truststore类型', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.truststore.password', 'Trino服务器SSL truststore密码', 'truststore密码', 'null', 'None', '', 'trino', 0, 0, 1, '数据源配置'); + + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as config_key_id, label.id AS engine_type_label_id FROM `linkis_ps_configuration_config_key` config +INNER JOIN `linkis_cg_manager_label` label ON config.engine_conn_type = 'trino' and label_value = @TRINO_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select relation.config_key_id AS config_key_id, '' AS config_value, relation.engine_type_label_id AS config_label_id FROM `linkis_ps_configuration_key_engine_relation` relation +INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @TRINO_ALL); +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/_category_.json new file mode 100644 index 00000000000..c862e6a30c2 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "版本特性", + "position": 1.5 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/base-engine-compatibilty.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/base-engine-compatibilty.md new file mode 100644 index 00000000000..83229cbe6b4 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/base-engine-compatibilty.md @@ -0,0 +1,75 @@ +--- +title: 基础引擎依赖性、兼容性、默认版本优化 +sidebar_position: 0.2 +--- + +## 1. 需求背景 +1. 低版本 linkis 需要通过修改代码来适配不同的 Hive、Spark 等版本,因为兼容性问题,编译可能会失败,可以减少这些基础引擎的兼容性问题。 +2. Hadoop、Hive、Spark 3.x 已经很成熟,并且低版本的引擎可能有潜在的风险点,社区很多用户默认使用 3.x 版本,因此考虑将 Linkis 默认编译的版本修改为 3.x 。 + +## 2. 使用说明 + +## 2.1 默认版本调整说明 + +Linkis 1.4.0 将 Hadoop、Hive、Spark 默认版本修改为 3.x,具体版本分别为 Hadoop 3.3.4、Hive 3.1.3、Spark 3.2.1 。 + +## 2.2 不同版本适配 + +不同的hive版本的编译,我们只需要指定`-D=xxx`就可以了,比如: +``` +mvn clean install package -Dhive.version=2.3.3 +``` +不同版本的spark编译,我们也只需要指定`-D=xxx`就可以了,常用的使用场景如下: +``` +#spark3+hadoop3 +mvn install package + +#spark3+hadoop2 +mvn install package -Phadoop-2.7 + +#spark2+hadoop2 +mvn install package -Pspark-2.4 -Phadoop-2.7 + +#spark2+ hadoop3 +mvn install package -Pspark-2.4 +``` +## 3. 注意事项 +1. 默认版本编译时,基础版本为:hadoop3.3.4 + hive3.1.3 + spark3.2.1 +``` +mvn install package +``` +由于默认基础引擎的默认版本升级,`spark-3.2`、`hadoop-3.3`和`spark-2.4-hadoop-3.3` profile被移除,新增profile `hadoop-2.7` and `spark-2.4`。 + +2. spark的子版本可以通过`-Dspark.version=xxx` 来指定,系统默认使用的 scala 版本为 2.12.17,可适配 spark 3.x 版本 。如需编译 spark 2.x,需要使用 scala 2.11 版本。可通过 -Pspark-2.4 参数,或者 -Dspark.version=2.xx -Dscala.version=2.11.12 -Dscala.binary.version=2.11 编译。 + +3. hadoop的子版本可以通过`-Dhadoop.version=xxx` 来指定 + +举个例子 : +``` +mvn install package -Pspark-3.2 -Phadoop-3.3 -Dspark.version=3.1.3 +``` + +4. hive 2.x 版本需要依赖 jersey,hive EC 默认编译时未添加 jersey依赖,可通过如下指引编译。 + +**编译 hive 2.3.3 版本** + +编译 hive EC 时默认添加了指定 2.3.3 版本时激活添加 jersey 依赖的 profile,用户可通过指定 -Dhive.version=2.3.3 参数编译 + +**编译其它 hive 2.x 版本** + +修改 linkis-engineconn-plugins/hive/pom.xml 文件,将 2.3.3 修改为用户编译版本,如 2.1.0 +```xml + + hive-jersey-dependencies + + + hive.version + + 2.1.0 + + + ... + +``` +编译时添加 -Dhive.version=2.1.0 参数。 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/datasource-generate-sql.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/datasource-generate-sql.md new file mode 100644 index 00000000000..1750237fdee --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/datasource-generate-sql.md @@ -0,0 +1,149 @@ +--- +title: 根据数据源生成SQL +sidebar_position: 0.5 +--- + +## 1. 背景 +根据数据源信息生成 SparkSQL 和 JdbcSQL,包含DDL、DML、DQL。 + +## 2. 使用说明 +### 生成SparkSQL + +接口地址:/api/rest_j/v1/metadataQuery/getSparkSql + +请求方式:GET + +请求数据类型:application/x-www-form-urlencoded + +请求参数: + +| 参数名 | 说明 | 是否必须 | 数据类型 | +|------------------------------|-------|-----|--| +| `dataSourceName` | 数据源名称 | 是 | String | +| `system` | 系统名称 | 是 | String | +| `database` | 数据库名称 | 是 | String | +| `table` | 表名称 | 是 | String | + +响应示例: + +```json +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "sparkSql": { + "ddl": "CREATE TEMPORARY TABLE test USING org.apache.spark.sql.jdbc OPTIONS ( url 'jdbc:mysql://localhost:3306/test', dbtable 'test', user 'root', password 'password')", + "dml": "INSERT INTO test SELECT * FROM ${resultTable}", + "dql": "SELECT id,name FROM test" + } + } +} +``` +目前支持jdbc、kafka、elasticsearch、mongo 数据源,可以根据SparkSQLDDL注册 spark table 进行查询 + +### 生成JdbcSQL + +接口地址:/api/rest_j/v1/metadataQuery/getJdbcSql + +请求方式:GET + +请求数据类型:application/x-www-form-urlencoded + +请求参数: + +| 参数名 | 说明 | 是否必须 | 数据类型 | +|------------------------------|-------|-----|--| +| `dataSourceName` | 数据源名称 | 是 | String | +| `system` | 系统名称 | 是 | String | +| `database` | 数据库名称 | 是 | String | +| `table` | 表名称 | 是 | String | + +响应示例: + +```json +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "jdbcSql": { + "ddl": "CREATE TABLE `test` (\n\t `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '列名是id',\n\t `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '列名是name',\n\t PRIMARY KEY (`id`)\n\t) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", + "dml": "INSERT INTO test SELECT * FROM ${resultTable}", + "dql": "SELECT id,name FROM test" + } + } +} +``` + +目前支持 JDBC 数据源,如:mysql、oracle、postgres等,JdbcSQLDDL可以用于前端展示。 + +## 3. 注意事项 +1. 需要先注册数据源 + +## 4. 实现原理 +### 生成SparkSQL实现原理 +定义DDL_SQL_TEMPLATE,获取数据源信息进行替换 +```java + public static final String JDBC_DDL_SQL_TEMPLATE = + "CREATE TEMPORARY TABLE %s " + + "USING org.apache.spark.sql.jdbc " + + "OPTIONS (" + + " url '%s'," + + " dbtable '%s'," + + " user '%s'," + + " password '%s'" + + ")"; +``` + +### 生成JdbcSQL实现原理 +根据表schema信息拼接DDL +```java +public String generateJdbcDdlSql(String database, String table) { + StringBuilder ddl = new StringBuilder(); + ddl.append("CREATE TABLE ").append(String.format("%s.%s", database, table)).append(" ("); + + try { + List < MetaColumnInfo > columns = getColumns(database, table); + if (CollectionUtils.isNotEmpty(columns)) { + for (MetaColumnInfo column: columns) { + ddl.append("\n\t").append(column.getName()).append(" ").append(column.getType()); + if (column.getLength() > 0) { + ddl.append("(").append(column.getLength()).append(")"); + } + if (!column.isNullable()) { + ddl.append(" NOT NULL"); + } + ddl.append(","); + } + String primaryKeys = + columns.stream() + .filter(MetaColumnInfo::isPrimaryKey) + .map(MetaColumnInfo::getName) + .collect(Collectors.joining(", ")); + if (StringUtils.isNotBlank(primaryKeys)) { + ddl.append(String.format("\n\tPRIMARY KEY (%s),", primaryKeys)); + } + ddl.deleteCharAt(ddl.length() - 1); + } + } catch (Exception e) { + LOG.warn("Fail to get Sql columns(获取字段列表失败)"); + } + + ddl.append("\n)"); + + return ddl.toString(); +} +``` + +部分数据源支持直接获取DDL + +**mysql** +```sql +SHOW CREATE TABLE 'table' +``` + +**oracle** +```sql +SELECT DBMS_METADATA.GET_DDL('TABLE', 'table', 'database') AS DDL FROM DUAL +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/hive-engine-support-concurrent.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/hive-engine-support-concurrent.md new file mode 100644 index 00000000000..a07ebba71c9 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/hive-engine-support-concurrent.md @@ -0,0 +1,24 @@ +--- +title: hive engine支持并发,支持复用 +sidebar_position: 0.3 +--- + +## 1. 需求背景 +hiveEngineConn支持并发,减少启动hive引擎的资源消耗,提高引擎复用率。 + +## 2. 使用说明 +首先,在linkis-engineconn-plugins/hive/src/main/resources目录下修改linkis-engineconn.properties文件, +并将linkis.hive.engineconn.concurrent.support设置为true。 +``` +# 支持并行执行 +wds.linkis.engineconn.support.parallelism=true + +# 并发数限制,默认为 10 +linkis.hive.engineconn.concurrent.limit=10 +``` + +提交一个hive任务,当第一个任务完成后,再提交另一个任务。您可以看到hive引擎已被重用。 + +配置修改后重启 cg-linkismanager 服务,或通过 [引擎刷新接口](../api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md) 使配置生效。 +## 3. 注意事项 +1、等待第一个hive任务执行成功后,再提交第二个hive任务。初次同时提交多个任务可能由于暂无可用的 EC 导致启动多个 EC。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/other.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/other.md new file mode 100644 index 00000000000..db4ddc1c284 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/other.md @@ -0,0 +1,29 @@ +--- +title: 其它特性说明 +sidebar_position: 0.6 +--- + +## 1. ECM 重启时不 kill EC +当ECM重新启动时,可以选择不杀死引擎,而是可以接管现有的存活引擎。使引擎连接管理器 (ECM) 服务无状态。 + +## 2. 移除 json4s 依赖 +spark 不同版本依赖不同的json4s版本,不利于spark多版本的支持,我们需要减少这个json4s依赖,从linkis中移除了json4s. +比如: spark2.4 需要json4s v3.5.3, spark3.2需要json4s v3.7.0-M11。 + +## 3. EngineConn模块定义依赖引擎版本 +引擎的版本定义默认在 `EngineConn`中,一旦相关版本变更,需要修改多处,我们可以把相关的版本定义统一放到顶层pom文件中。编译指定引擎模块时,需要在项目根目录编译,并使用`-pl`来编译具体的引擎模块,比如: +``` +mvn install package -pl linkis-engineconn-plugins/spark -Dspark.version=3.2.1 +``` +引擎的版本可以通过mvn编译-D参数来指定,比如 -Dspark.version=xxx 、 -Dpresto.version=0.235 +目前所有的底层引擎版本新都已经移到顶层pom文件中,编译指定引擎模块时,需要在项目根目录编译,并使用`-pl`来编译具体的引擎模块。 + +## 4. Linkis 主版本号修改说明 + +Linkis 从 1.3.2 版本后将不再按小版本升级,下一个版本为 1.4.0,再往后升级时版本号为1.5.0,1.6.0 以此类推。当遇到某个发布版本有重大缺陷需要修复时会拉取小版本修复缺陷,如 1.4.1 。 + + +## 5. LInkis 代码提交主分支说明 + +Linkis 1.3.2 及之前版本修改代码默认是合并到 dev 分支。实际上 Apache Linkis 的开发社区很活跃,对于新开发的需求或修复功能都会提交到 dev 分支,但是用户访问 Linkis 代码库的时候默认显示的是 master 分支。由于我们一个季度才会发布一个新版本,从 master 分支来看显得社区活跃的不高。因此我们决定从 1.4.0 版本开始,将开发者提交的代码默认合并到 master 分支。 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/overview.md new file mode 100644 index 00000000000..2755345ad75 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/overview.md @@ -0,0 +1,33 @@ +--- +title: 版本总览 +sidebar_position: 0.1 +--- + +- [基础引擎依赖性、兼容性、默认版本优化](./base-engine-compatibilty.md) +- [Hive 引擎连接器支持并发任务](./hive-engine-support-concurrent.md) +- [支持更多的数据源](../user-guide/datasource-manual#31-jdbc-数据源) +- [Spark ETL 功能增强](./spark-etl.md) +- [根据数据源生成SQL](./datasource-generate-sql.md) +- [linkis-storage 支持 S3 文件系统(实验版本)](../deployment/deploy-quick#343-s3-模式) +- [增加 postgresql 数据库支持(实验版本)](../deployment/deploy-quick#22-配置数据库信息) +- [增加 impala 引擎支持(实验版本)](../engine-usage/impala.md) +- [其它特性说明](./other.md) +- [版本的 Release-Notes](/download/release-notes-1.4.0) + +## 参数变化 + +| 模块名(服务名)| 类型 | 参数名 | 默认值 | 描述 | +| ----------- | ----- | -------------------------------------------------------- | ---------------- | ------------------------------------------------------- | +| mg-eureka | 新增 | eureka.instance.metadata-map.linkis.app.version | ${linkis.app.version} | Eureka元数据上报Linkis应用版本信息| +| mg-eureka | 新增 | eureka.instance.metadata-map.linkis.conf.version | 无 | Eureka元数据上报Linkis服务版本信息 | +| mg-eureka | 修改 | eureka.client.registry-fetch-interval-seconds | 8 | Eureka Client拉取服务注册信息间隔时间(秒) | +| mg-eureka | 新增 | eureka.instance.lease-renewal-interval-in-seconds | 4 | eureka client发送心跳给server端的频率(秒)| +| mg-eureka | 新增 | eureka.instance.lease-expiration-duration-in-seconds | 12 | eureka 等待下一次心跳的超时时间(秒)| +| EC-shell | 修改 | wds.linkis.engineconn.support.parallelism | true | 是否开启 shell 任务并行执行| +| EC-shell | 修改 | linkis.engineconn.shell.concurrent.limit | 15 | shell 任务并发数 | +| Entrance | 修改 | linkis.entrance.auto.clean.dirty.data.enable | true | 启动时是否清理脏数据 | + + + +## 数据库表变化 +详细见代码仓库(https://github.com/apache/linkis) 对应分支中的升级schema`db/upgrade/1.4.0_schema`文件 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/spark-etl.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/spark-etl.md new file mode 100644 index 00000000000..6f486f4515a --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/feature/spark-etl.md @@ -0,0 +1,642 @@ +--- +title: 支持 spark ETL 数据同步 +sidebar_position: 0.4 +--- + +## 1. 背景 +使用 Spark ETL 功能,用户可以通过配置 json 的方式进行 Spark 数据同步。 + +## 2. 支持的类型 + +目前支持的类型 +```text +jdbc、file、redis、kafka、elasticsearch、mongo、datalake(hudi、delta) +``` + +## 3. 通用配置说明 +```text +name: 数据源名称 +type: 包含`source`、`transformation`、`sink`,分别对应输入、转换、输出 +options: 配置参数 +saveMode: 保存模式,目前支持:`overwrite`和`append` +path: 文件路径,可以是: 'file://' or 'hdfs://'(default) +`resultTable`需要和`sourceTable`对应 +``` + +## 4. 使用说明 + +### 4.1 添加所需的 jar 包 +使用数据源时需要将对应的 spark connector jar 上传至 spark/jars目录,目录位置 $SPARK_HOME/jars + +spark connector jar 可以通过以下命令获取 + +```text +git clone https://github.com/apache/linkis.git + +cd linkis + +git checkout master + +cd linkis-engineconn-plugins/spark/scala-2.12 + +mvn clean install -Dmaven.test.skip=true +``` + +编译完成的spark connector jar位于以下目录中 +```text +linkis/linkis-engineconn-plugins/spark/scala-2.12/target/out/spark/dist/3.2.1/lib +``` + +### 4.2 linkis-cli 提交任务示例 + +在 code 传入具体的 json 代码即可,注意引号格式转换。 + +```shell +sh /appcom/Install/linkis/bin/linkis-cli -engineType spark-3.2.1 -codeType data_calc -code "" -submitUser hadoop -proxyUser hadoop +``` + +linkis-cli 提交 redis 数据同步任务示例 +```shell +sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType data_calc -code "{\"plugins\":[{\"name\":\"file\",\"type\":\"source\",\"config\":{\"resultTable\":\"test\",\"path\":\"hdfs://linkishdfs/tmp/linkis/spark_etl_test/etltest.dolphin\",\"serializer\":\"csv\",\"options\":{\"header\":\"true\",\"delimiter\":\";\"},\"columnNames\":[\"name\",\"age\"]}},{\"name\":\"redis\",\"type\":\"sink\",\"config\":{\"sourceTable\":\"test\",\"host\":\"wds07\",\"port\":\"6679\",\"auth\":\"password\",\"targetTable\":\"spark_etl_test\",\"saveMode\":\"append\"}}]}" -submitUser hadoop -proxyUser hadoop +``` +### 4.3 各数据源同步 json 脚本说明 + +#### 4.3.1 jdbc + +配置说明 +```text +url: jdbc连接信息 +user: 用户名称 +password: 密码 +query: sql查询语句 +``` + +json code + +```json +{ + "sources": [ + { + "name": "jdbc", + "type": "source", + "config": { + "resultTable": "test1", + "url": "jdbc:mysql://127.0.0.1:3306/dip_linkis?characterEncoding=UTF-8", + "driver": "com.mysql.jdbc.Driver", + "user": "root", + "password": "123456", + "query": "select * from dip_linkis.linkis_ps_udf_baseinfo", + "options": { + } + } + } + ], + "transformations": [ + { + "name": "sql", + "type": "transformation", + "config": { + "resultTable": "T1654611700631", + "sql": "select * from test1" + } + } + ], + "sinks": [ + { + "name": "jdbc", + "type": "sink", + "config": { + "sourceTable": "T1654611700631", + "url": "jdbc:mysql://127.0.0.1:3306/dip_linkis?characterEncoding=UTF-8", + "driver": "com.mysql.jdbc.Driver", + "user": "root", + "password": "123456", + "targetTable": "linkis_ps_udf_baseinfo2", + "options": { + } + } + } + ] +} +``` + +需要新增的jar,根据具体使用的数据源选择对应的 jar +```text +DmJdbcDriver18.jar +kingbase8-8.6.0.jar +postgresql-42.3.8.jar +``` + +#### 4.3.2 file + +配置说明 + +```text +serializer: 文件格式,可以是`csv`、`parquet`等 +columnNames: 列名 +``` + + +json code + +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "test2", + "path": "hdfs:///tmp/test_new_no_partition", + "serializer": "csv", + "columnNames": ["id", "create_user", "udf_name", "udf_type", "tree_id", "create_time", "update_time", "sys", "cluster_name", "is_expire", "is_shared"] + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "test2", + "path": "hdfs:///tmp/test_new", + "partitionBy": ["create_user"], + "saveMode": "overwrite", + "serializer": "csv" + } + } + ] +} +``` + +需要新增的 jar +``` +spark-excel-2.12.17-3.2.2_2.12-3.2.2_0.18.1.jar +``` + +#### 4.3.3 redis + +```text +sourceTable: 源表, +host: ip地址, +port": 端口, +auth": 密码, +targetTable: 目标表, +saveMode: 支持 append +``` + +json code +```json +{ + "plugins":[ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "test", + "path": "hdfs://linkishdfs/tmp/linkis/spark_etl_test/etltest.dolphin", + "serializer": "csv", + "options": { + "header":"true", + "delimiter":";" + }, + "columnNames": ["name", "age"] + } + }, + { + "name": "redis", + "type":"sink", + "config": { + "sourceTable": "test", + "host": "wds07", + "port": "6679", + "auth":"password", + "targetTable":"spark_etl_test", + "saveMode": "append" + } + } + ] +} +``` + +需要新增的jar +```text +jedis-3.2.0.jar +commons-pool2-2.8.1.jar +spark-redis_2.12-2.6.0.jar +``` + +#### 4.3.4 kafka + +配置说明 +```text +servers: kafka连接信息 +mode: 目前支持`batch`和`stream` +topic: kafka topic名称 +``` + +数据写入 json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header":"true", + "delimiter":";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "kafka", + "config": { + "sourceTable": "T1654611700631", + "servers": "localhost:9092", + "mode": "batch", + "topic": "test121212" + } + } + ] +} +``` + +数据读取 json code +```json +{ + "sources": [ + { + "name": "kafka", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "servers": "localhost:9092", + "topic": "test121212" + } + } + ], + "sinks": [ + { + "name": "kafka", + "config": { + "sourceTable": "T1654611700631", + "servers": "localhost:9092", + "mode": "stream", + "topic": "test55555" + } + } + ] +} +``` + +需要新增的 jar +``` +kafka-clients-2.8.0.jar +spark-sql-kafka-0-10_2.12-3.2.1.jar +spark-token-provider-kafka-0-10_2.12-3.2.1.jar +``` + +#### 4.3.5 elasticsearch + +配置说明 +```text +node: elasticsearch ip +port: elasticsearch port +index: elasticsearch索引名称 +``` + + +数据写入 json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header":"true", + "delimiter":";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "elasticsearch", + "config": { + "sourceTable": "T1654611700631", + "node": "localhost", + "port": "9200", + "index": "estest", + "saveMode": "overwrite" + } + } + ] +} +``` + +数据读取 json code +```json +{ + "sources": [ + { + "name": "elasticsearch", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "node": "localhost", + "port": "9200", + "index": "estest" + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/csv", + "saveMode": "overwrite", + "serializer": "csv" + } + } + ] +} +``` + +需要新增的jar +``` +elasticsearch-spark-30_2.12-7.17.7.jar +``` + +#### 4.3.6 mongo + +配置说明 +```text +uri: mongo连接信息 +database: mongo database +collection: mongo collection +``` + + +数据写入 json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header":"true", + "delimiter":";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "mongo", + "config": { + "sourceTable": "T1654611700631", + "uri": "mongodb://localhost:27017/test", + "database": "test", + "collection": "test", + "saveMode": "overwrite" + } + } + ] +} +``` + +数据读取 json code +```json +{ + "sources": [ + { + "name": "mongo", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "uri": "mongodb://localhost:27017/test", + "database": "test", + "collection": "test" + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/json", + "saveMode": "overwrite", + "serializer": "json" + } + } + ] +} +``` + +需要新增的 jar +``` +bson-3.12.8.jar +mongo-spark-connector_2.12-3.0.1.jar +mongodb-driver-core-3.12.8.jar +mongodb-driver-sync-3.12.8.jar +``` + +#### 4.3.7 delta + +配置说明 +```text +tableFormat: 目前支持`hudi`和`delta` +``` + + +数据写入 json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header":"true", + "delimiter":";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "datalake", + "config": { + "sourceTable": "T1654611700631", + "tableFormat": "delta", + "path": "file://{filePath}/delta", + "saveMode": "overwrite" + } + } + ] +} +``` + +数据读取 json code +```json +{ + "sources": [ + { + "name": "datalake", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "tableFormat": "delta", + "path": "file://{filePath}/delta", + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/csv", + "saveMode": "overwrite", + "options": { + "header":"true" + }, + "serializer": "csv" + } + } + ] +} +``` + +需要新增的 jar +``` +delta-core_2.12-2.0.2.jar +delta-storage-2.0.2.jar +``` + +#### 4.3.8 hudi + +配置说明 +```text +tableFormat: 目前支持`hudi`和`delta` +``` + + +数据写入 json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header":"true", + "delimiter":";" + }, + "columnNames": ["name", "age"] + } + } + ], + "transformations": [ + { + "name": "sql", + "type": "transformation", + "config": { + "resultTable": "T111", + "sql": "select * from T1654611700631" + } + } + ], + "sinks": [ + { + "name": "datalake", + "config": { + "sourceTable": "T1654611700631", + "tableFormat": "hudi", + "options": { + "hoodie.table.name":"huditest", + "hoodie.datasource.write.recordkey.field":"age", + "hoodie.datasource.write.precombine.field":"age" + }, + "path": "file://{filePath}/hudi", + "saveMode": "append" + } + } + ] +} +``` + +数据读取 json code +```json +{ + "sources": [ + { + "name": "datalake", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "tableFormat": "hudi", + "path": "file://{filePath}/hudi", + } + } + ], + "transformations": [ + { + "name": "sql", + "type": "transformation", + "config": { + "resultTable": "T111", + "sql": "select * from T1654611700631" + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/csv", + "saveMode": "overwrite", + "options": { + "header":"true" + }, + "serializer": "csv" + } + } + ] +} +``` + +需要新增的 jar +``` +hudi-spark3.2-bundle_2.12-0.13.0.jar +``` diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/_category_.json new file mode 100644 index 00000000000..34f26d9777c --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "快速体验", + "position": 2.0 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/deploy-to-kubernetes.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/deploy-to-kubernetes.md new file mode 100644 index 00000000000..884b7e2067e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/deploy-to-kubernetes.md @@ -0,0 +1,118 @@ +--- +title: 容器化部署 +sidebar_position: 2 +--- + +这篇文章介绍一下如何在就 Kind 的 Kubernetes 的环境中部署 Linkis 服务,以方便更轻量化的学习使用和调试。 + +## 1. 依赖版本 +- kind github:https://github.com/kubernetes-sigs/kind +- kind官网:[kind.sigs.k8s.io/](https://kind.sigs.k8s.io/) + +### 1.1 版本: +- kind 0.14.0 +- docker 20.10.17 +- centos 7.6 +- helm 3.x + +### 1.2 注意: +- 1.确保组件依赖版本 +- 2.kind 是用 docker 容器模拟节点的,机器重启回来容器都变了,调度器就不工作了,这个是kind的limitation ,官方文档有详细说明。 + +## 2.安装docker +### 2.1 安装教程 +``` +sudo yum install -y yum-utils device-mapper-persistent-data lvm2 +sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo +sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo +sudo yum makecache fast +sudo yum -y install docker-ce +systemctl start docker +systemctl enable docker +``` + +### 2.2 设置国内镜像 +``` +vi /etc/docker/daemon.json +{ +"registry-mirrors": ["http://hub-mirror.c.163.com"], +"insecure-registries": ["https://registry.mydomain.com","http://hub-mirror.c.163.com"] +} +``` + +## 3. 安装 kind +### 3.1 手工下载kind二进制 +``` +https://github.com/kubernetes-sigs/kind/releases +``` +### 3.2 安装kind二进制 +``` +chmod +x ./kind +mv kind-linux-amd64 /usr/bin/kind +``` +## 4. 安装linkis +### 4.1 下载或自行编译 linkis1.3.1 部署包 +使用版本:dev-1.3.1 分支编译版本 +``` +apache-linkis-1.3.1-bin.tar.gz +``` +### 4.2 创建目录 +``` +mkdir -p /opt/data/common/extendlib +``` +### 4.3 拷贝驱动 + +拷贝 mysql 驱动到 /opt/data/common/extendlib +``` +curl https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar -o /opt/data/common/extendlib/[mysql-connector-java-8.0.28.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar) +``` +### 4.4 重置kind(非必要) +``` +./bin/install-linkis-to-kubernetes.sh reset +``` +### 4.5 拉取镜像 +``` +./bin/install-linkis-to-kubernetes.sh pull -mghcr.dockerproxy.com +``` +### 4.6 安装linkis到kind中 +``` +./bin/install-linkis-to-kubernetes.sh install -l -mghcr.dockerproxy.com +``` +### 4.7 使用命令查看服务,等待全部启动成功 +``` +kubectl get pods -A +``` +![](/Images/deployment/kubernetes/pods.jpg) + + +### 4.8 拷贝 ldh 环境到 linkis +``` +./helm/scripts/prepare-for-spark.sh +``` +### 4.9 开启端口映射 +``` +./helm/scripts/remote-proxy.sh start +``` +### 4.10 访问系统 +``` +linkis-web: http://10.0.2.101:8088/ +eureka: http://10.0.2.101:20303/ +``` + +![](/Images/deployment/kubernetes/eureka.png) + +### 4.11 执行 linkis-cli 执行任务 +``` +进入容器 +./helm/scripts/login-pod.sh cg-engineconnmanager +执行shell测试 +sh ./bin/linkis-cli -engineType shell-1 -codeType shell -code "echo "hello" " -submitUser hadoop -proxyUser hadoop +执行hive测试 +sh ./bin/linkis-cli -engineType hive-2.3.3 -codeType hql -code "show tables" -submitUser hadoop -proxyUser hadoop +执行spark测试 +sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "show tables" -submitUser hadoop -proxyUser hadoop +执行python测试 +sh ./bin/linkis-cli -engineType python-python2 -codeType python -code "print(\"hello\")" -submitUser hadoop -proxyUser hadoop -confMap python.version=python +``` + +![](/Images/deployment/kubernetes/linkis.jpg) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/deploy-without-hdfs.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/deploy-without-hdfs.md new file mode 100644 index 00000000000..45685806725 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/deploy-without-hdfs.md @@ -0,0 +1,104 @@ +--- +title: 无 HDFS 部署 +sidebar_position: 3 +--- + +这篇文章介绍一下如何在没有部署 HDFS 的环境中部署 Linkis 服务,以方便更轻量化的学习使用和调试。 + +部署整体流程参考 "快速部署",需要修改如下少许内容。 + +去HDFS模式部署不支持 hive/spark/flink 引擎等任务 + +## 1. 配置修改 +修改 `linkis-env.sh` 文件,修改以下内容: +```bash +#使用[file://]路径模式代替[hdfs://]模式 +WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis/ +HDFS_USER_ROOT_PATH=file:///tmp/linkis +RESULT_SET_ROOT_PATH=file:///tmp/linkis + +export ENABLE_HDFS=false +export ENABLE_HIVE=false +export ENABLE_SPARK=false +``` + +将上述的配置修改为 false 之后,就不需要再单独配置 HDFS/HIVE/SPARK 等环境了, 安装部署时也会跳过这些基础环境的检查。 + +## 2. 拷贝 jar 包 +因为 mysql-connector-java 驱动是 GPL2.0 协议,不满足Apache开源协议关于license的政策,所以需要我们手动将其拷贝到如下两个目录下 +```bash +${LINKIS_HOME}/lib/linkis-commons/public-module/ +${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +``` + +可以直接从 maven 仓库下载,比如 https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.49 + +## 3. 部署和启动 +参考 "快速部署" 部分,通过执行 ${LINKIS_HOME}/bin/install.sh 命令完成部署。 +参考 "快速部署" 部分,通过执行 ${LINKIS_HOME}/sbin/linkis-start-all.sh 命令启动 Linkis 服务。 + + +## 4. 运行作业验证 +目前 1.1.2 版本只支持 shell 作业在非 HDFS 环境中运行,执行命令如下 + +```bash +$ cd ./bin +$ chmod +x linkis-cli +$ ./linkis-cli -engineType shell-1 -codeType shell -code "echo \"hello\" " -submitUser -proxyUser +``` + +正常会输出如下类似内容 +```bash +=====Java Start Command===== +exec /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre/bin/java -server -Xms32m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Linkis/linkis03/logs/linkis-cli -XX:ErrorFile=/Linkis/linkis03/logs/linkis-cli/ps_err_pid%p.log -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -classpath /Linkis/linkis03/conf/linkis-cli:/Linkis/linkis03/lib/linkis-computation-governance/linkis-client/linkis-cli/*:/Linkis/linkis03/lib/linkis-commons/public-module/*: -Dconf.root=/Linkis/linkis03/conf/linkis-cli -Dconf.file=linkis-cli.properties -Dlog.path=/Linkis/linkis03/logs/linkis-cli -Dlog.file=linkis-client.root.log.20220418221952287912946 org.apache.linkis.cli.application.LinkisClientApplication '-engineType shell-1 -codeType shell -code echo "hello" -submitUser test -proxyUser test' +[INFO] LogFile path: /Linkis/linkis03/logs/linkis-cli/linkis-client.root.log.20220418221952287912946 +[INFO] User does not provide usr-configuration file. Will use default config +[INFO] connecting to linkis gateway:http://127.0.0.1:9001 +JobId:6 +TaskId:6 +ExecId:exec_id018028linkis-cg-entranceiZbp19q51jb8p984yk2jxdZ:9104LINKISCLI_test_shell_1 +[INFO] Job is successfully submitted! + +2022-04-18 22:19:53.019 INFO Program is substituting variables for you +2022-04-18 22:19:53.019 INFO Variables substitution ended successfully +2022-04-18 22:19:53.019 WARN The code you submit will not be limited by the limit +Job with jobId : LINKISCLI_test_shell_1 and execID : LINKISCLI_test_shell_1 submitted +2022-04-18 22:19:53.019 INFO You have submitted a new job, script code (after variable substitution) is +************************************SCRIPT CODE************************************ +echo "hello" +************************************SCRIPT CODE************************************ +2022-04-18 22:19:53.019 INFO Your job is accepted, jobID is LINKISCLI_test_shell_1 and jobReqId is 6 in ServiceInstance(linkis-cg-entrance, iZbp19q51jb8p984yk2jxdZ:9104). Please wait it to be scheduled +job is scheduled. +2022-04-18 22:19:53.019 INFO Your job is Scheduled. Please wait it to run. +Your job is being scheduled by orchestrator. +2022-04-18 22:19:53.019 INFO job is running. +2022-04-18 22:19:53.019 INFO Your job is Running now. Please wait it to complete. +2022-04-18 22:19:53.019 INFO Job with jobGroupId : 6 and subJobId : 5 was submitted to Orchestrator. +2022-04-18 22:19:53.019 INFO Background is starting a new engine for you,execId astJob_4_codeExec_4 mark id is mark_4, it may take several seconds, please wait +2022-04-18 22:20:01.020 INFO Task submit to ec: ServiceInstance(linkis-cg-engineconn, iZbp19q51jb8p984yk2jxdZ:43213) get engineConnExecId is: 1 +2022-04-18 22:20:01.020 INFO EngineConn local log path: ServiceInstance(linkis-cg-engineconn, iZbp19q51jb8p984yk2jxdZ:43213) /appcom1/tmp/test/20220418/shell/cc21fbb5-3a33-471b-a565-8407ff8ebd80/logs +iZbp19q51jb8p984yk2jxdZ:43213_0 >> echo "hello" +2022-04-18 22:20:01.438 WARN [Linkis-Default-Scheduler-Thread-1] org.apache.linkis.engineconn.computation.executor.hook.executor.ExecuteOnceHook 50 warn - execute once become effective, register lock listener +hello +2022-04-18 22:20:01.020 INFO Your subjob : 5 execue with state succeed, has 1 resultsets. +2022-04-18 22:20:01.020 INFO Congratuaions! Your job : LINKISCLI_test_shell_1 executed with status succeed and 0 results. +2022-04-18 22:20:01.020 INFO job is completed. +2022-04-18 22:20:01.020 INFO Task creation time(任务创建时间): 2022-04-18 22:19:53, Task scheduling time(任务调度时间): 2022-04-18 22:19:53, Task start time(任务开始时间): 2022-04-18 22: Mission end time(任务结束时间): 2022-04-18 22:20:01 +2022-04-18 22:20:01.020 INFO Your mission(您的任务) 6 The total time spent is(总耗时时间为): 8.3 秒 +2022-04-18 22:20:01.020 INFO Congratulations. Your job completed with status Success. + +[INFO] Job execute successfully! Will try get execute result +============Result:================ +TaskId:6 +ExecId: exec_id018028linkis-cg-entranceiZbp19q51jb8p984yk2jxdZ:9104LINKISCLI_test_shell_1 +User:test +Current job status:SUCCEED +extraMsg: +result: + +[INFO] Retrieving result-set, may take time if result-set is large, please do not exit program. +============ RESULT SET 1 ============ +hello +############Execute Success!!!######## + +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/live-demo.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/live-demo.md new file mode 100644 index 00000000000..2bcc6a2055c --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/quick/live-demo.md @@ -0,0 +1,281 @@ +--- +title: 沙箱在线体验 +sidebar_position: 1 +--- + +## 1. 沙箱环境使用流程 + +### 1.1 获取邀请码 + +扫描以下二维码,添加“开源社区小助手”,根据小助手提示,提供相关信息获取邀请码。 + +|微信小助手|微信公众号| +|:---|---| +||| + + +### 1.2 注册和登录使用 + +通过1.1获取到邀请码后,即可进行注册和使用。 + +第一步:打开注册页面链接 https://dss-open.wedatasphere.com/#/register,填写相关信息,成功注册 + +![图片](/Images/quick/live-demo/640-16676643563412.jpeg) + +第二步:打开DSS沙箱页面 https://dss-open.wedatasphere.com/#/login,用注册的账号和密码进行登录; + +- 登录账号:注册的手机号; +- 登录密码:手机号后六位数字; + +![图片](/Images/quick/live-demo/640-16676643776464.png) + +### 1.3 界面说明 + +**重要说明:出于安全考虑,沙箱环境不支持`新增/修改`等操作,仅支持查询/查看的功能。** + + + +(1)成功登陆账户之后,会跳转到DSS的首页。首页顶部默认包括了管理台和Scriptis的入口,也可以添加其他组件入口到顶部导航栏。在首页进行切换工作空间,选中工作空间中的项目。目前已配置了**AIIDEMO**供大家体验,点击对应的项目即可。 + +![图片](/Images/quick/live-demo/640-16676644060226.png) + +(2)管理台:Linkis计算治理管理台,在这个页面能够看到所有脚本执行的情况、对全局资源进行管理、对参数和变量配置进行配置、进行数据源和UDF管理,是个非常重要的页面; + +![图片](/Images/quick/live-demo/640-16676644199108.png) + +(3)Scriptis:支持在线写SQL、Pyspark、HiveQL等脚本,提交给Linkis执行的数据分析Web工具,且支持UDF、函数、资源管控和智能诊断等企业级特性。目前沙箱环境出于安全考虑,没有提供python、shell的demo。 + +![图片](/Images/quick/live-demo/640-1667665078278140.png) + + + +### 1.4 导航栏配置 + +为了更快捷的使用Qualitis、Scheduis、Visualis、Exchangis组件,可以把相对应的入口添加到顶部导航栏。操作方法:点击左上角入口,把对应的组件添加到导航栏。 + +![图片](/Images/quick/live-demo/640-1667665075544138.png) + + +## 2. 创建项目和工作流 + +出于安全考虑,目前沙箱环境暂不支持创建项目和工作流的功能。各位开发者可以在自行搭建的环境中按照以下步骤进行使用。 + +DSS支持使用工作流的方式,接下来跟着我一步一步来使用。 + +(1)在工作空间“bdapWorkspace”中点击“创建项目”; + +![图片](/Images/quick/live-demo/640-1667665073311136.png) + +(2)在弹窗中填入项目的参数,如下图 + +![图片](/Images/quick/live-demo/640-1667665070215134.jpeg) + +由于沙箱环境出于安全考虑,禁止创建工程,因此会提示以下错误。自行搭建DSS环境,可以按照上述方法进行创建工程。 + +![图片](/Images/quick/live-demo/640-1667665067662132.png) + + + +(3)创建成功后在首页可以看到项目 BI_20220804; + +![图片](/Images/quick/live-demo/640-1667665065638130.png) + + + +(4)点击进入创建好的项目“BI_20220804 ”,点击添加工作流 + +![图片](/Images/quick/live-demo/640-1667665062469128.png) + + + +(5)填写工作流信息 + +![图片](/Images/quick/live-demo/640-1667665059998126.png) + + + + + +(6)进入项目工作流DEMO,我们可以看到完整的工作流界面了; + +![图片](/Images/quick/live-demo/640-1667665057158124.png) + + + +## 3. DEMO工作流组件说明 + +目前支持7类工作流节点,使用这类节点可以完成数据同步、数据分析、数据质量管理、数据可视化等任务。 + +我们直接进入AIIDEMO,点击执行,运行整个DEMO。 + +![图片](/Images/quick/live-demo/640-1667665054421122.png) + + + +### 3.1 数据交换 + +使用sqoop节点,让dss与目标数据库之间进行数据交换。 + +(1)双击“Data Sync”数据交换节点; + +![图片](/Images/quick/live-demo/640-1667665051613120.png) + + + +(2)进入到节点编辑界面,可以看到节点的详情;从Hvie同步数据到MYSQL中; + +![图片](/Images/quick/live-demo/640-1667665048477118.png) + + + +(3)点击数据源Hive,在弹窗中看到数据源的配置详情,数据源为:“bdptest10_db.presure_testx” + +![图片](/Images/quick/live-demo/640-1667665045325116.png) + + + +(4)点击要同步到的数据库为:dss_meta_open.presure_testx + +![图片](/Images/quick/live-demo/640-1667665042221114.png) + +![图片](/Images/quick/live-demo/640-1667665040045112.png) + + + +(5)同步的字段为:objectid,intcolumn、doublecolumn、floatcolumn; + +![图片](/Images/quick/live-demo/640-1667665037278110.png) + +(6)我们也可以通过顶部导航栏“Exchangis”进入组件页面,可以查看到全部的数据交换节点和进行数据交换管理。 + +![图片](/Images/quick/live-demo/640-1667665033853108.jpeg) + + + +### 3.2 数据开发 + +支持sql、python、pyspark、shell等语言,用于数据开发。直接把节点拖出来,然后双击进入节点的界面进行撰写代码。 + +(1)我们在DEMO双击“source_data”节点; + +![图片](/Images/quick/live-demo/640-1667665030566106.png) + + + +(2)进入编辑界面,撰写对应的脚本语言,进行执行,即可得到相关的执行结果; + +![图片](/Images/quick/live-demo/640-1667665027816104.png) + + + +### 3.3 数据质量 + +使用qualitis进行数据质量校验。 + +(1)点击数据质量节点“qualitis_200” + +![图片](/Images/quick/live-demo/640-1667665025253102.png) + + + +(2)进入数据校验界面,看到当前配置的校验规则; + +![图片](/Images/quick/live-demo/640-1667665021038100.png) + + + +(3)通过点击上图中的添加规则,选择不同的校验模板; + +![图片](/Images/quick/live-demo/640-166766501764598.png) + + + +(4)通过点击顶部导航菜单“Qualitis”直接进入数据质量的管理台。 + +![图片](/Images/quick/live-demo/640-166766501543896.png) + + + +### 3.4 可视化 + +使用visualis组件进行可视化BI分析。在沙箱环境中,有**DEMO**完整的例子可以进行参考。 + +(1)选中项目,点击“执行”;等待全部执行成功; + +![图片](/Images/quick/live-demo/640-166766501239894.png) + + + +(2)点击对应的数据可视化节点,可以看到已经生成的数据图表。 + +![图片](/Images/quick/live-demo/640-166766501000692.png) + +![图片](/Images/quick/live-demo/640-166766500771790.png) + + + + + +(3)可以通过点击顶部导航菜单“Visualis”直接进入可视化管理台,里面可以看到跟可视化相关的组件。 + +![图片](/Images/quick/live-demo/640-166766500170288.png) + +(4)如果想进一步详细了解可视化能力,请查看视频教程《使用 DataSphere Studio(DSS)实现大数据可视化》:https://www.bilibili.com/video/BV1xY4y1t7Ma + +![图片](/Images/quick/live-demo/640-166766499746286.png) + +### + +### **3.5 信号节点** + +目前支持三种功能节点,分别为:datachecker、eventsender、eventreceiver。信号节点常用的场景: + +1. 在跑批量工作任务前需要检查数据是否齐全,可以使用datachecker; +2. 完成某项工作后,需要通知其他工作流进行工作,使用eventsender进行发送通知; +3. 使用eventreceiver监听信号,一旦接收到eventsender发过来的信号,就执行相对应的工作任务; + +![图片](/Images/quick/live-demo/640-166766499277484.png) + + + +### **3.6 功能节点** + +支持connector和subFlow节点。 + +(1)connector节点仅作为工作流的连接节点,不承担任何功能。 + +(2)subFlow是子工作流节点,可以理解为单独的工作流。在复杂的工作流场景中可以使用subFlow节点简化主工作流的流程。 + +![图片](/Images/quick/live-demo/640-166766498331782.png) + + + +### **3.7 数据输出** + +支持通过邮件发送的方式 + +![图片](/Images/quick/live-demo/640-166766497457380.png) + +### + +### **3.8 调度中心** + +(1)当我们在编辑模式中完成了工作流开发和测试后,可以点击“发布”按钮,直接发布到调度中心。 + +![图片](/Images/quick/live-demo/640-166766496979878.png) + + + +(2)点击“前往调度中心”或者通过导航顶部的“Schedulis”都可以进入到调度中心管理台。在调度中心中可以进行调度管理,查看工作流状态。 + +![图片](/Images/quick/live-demo/640-166766445336610.png) + +## **4. 常见错误** + +目前沙箱环境仅开放部分功能给社区开发者进行体验,通过使用沙箱环境能有助于开发者快速了解WDS生态。 + +出于安全考虑,沙箱环境仅提供查看/查询/执行等功能,如出现“沙箱环境仅允许执行有限的查询操作”、“沙箱环境不许创建工程”、“后台接口异常,请联系开发处理”等等的错误提示,属于正常现象。 + +如有任何疑问,请微信联系小助手进行反馈。 + +![图片](/Images/quick/live-demo/640.jpeg) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/_category_.json new file mode 100644 index 00000000000..2dfb099e3a7 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "调优排障", + "position": 9 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/configuration.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/configuration.md new file mode 100644 index 00000000000..9aeaea665fb --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/configuration.md @@ -0,0 +1,342 @@ +--- +title: 参数列表 +sidebar_position: 1 +--- + +> 在conf目录提供了一个公共配置文件 linkis.properties,避免通用的配置参数需要同时在多个微服务里面配置。本文档将会把参数分模块列举出来。 + +请注意:本文只给出了 Linkis 所有对运行性能有影响或是环境依赖相关的配置参数,很多无需用户关心的配置参数已略去,如果用户感兴趣,可以翻阅源码查看。 + +## 1 通用配置 + +通用配置可在全局的`linkis.properties`当中设置即可,一处设置,各个微服务都可生效。 + +### 1.1 全局配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.encoding | utf-8 | Linkis默认编码格式 | +| wds.linkis.date.pattern | yyyy-MM-dd'T'HH:mm:ssZ | 默认日期格式 | +| wds.linkis.test.mode | false | 是否打开调试模式,如果设置为 true,所有微服务都支持免密登录,且所有EngineConn打开远程调试端口 | +| wds.linkis.test.user | 无 | 当wds.linkis.test.mode=true时,免密登录的默认登录用户 | +| wds.linkis.home | /appcom/Install/LinkisInstall | Linkis 安装目录,如果不存在,会自动获取 LINKIS_HOME的值 | +| wds.linkis.httpclient.default.connect.timeOut | 50000 | Linkis HttpClient的默认连接超时时间 | + +### 1.2 LDAP配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.ldap.proxy.url | 无 | LDAP URL地址 | +| wds.linkis.ldap.proxy.baseDN | 无 | LDAP baseDN地址 | +| wds.linkis.ldap.proxy.userNameFormat | 无 | | + +### 1.3 Hadoop配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.hadoop.root.user | hadoop | HDFS super 用户 | +| wds.linkis.filesystem.hdfs.root.path | 无 | 用户的HDFS默认根路径 | +| wds.linkis.keytab.enable | false | 是否打开kerberos | +| wds.linkis.keytab.file | /appcom/keytab | kerberos的keytab路径,仅wds.linkis.keytab.enable=true时生效 | +| wds.linkis.keytab.host.enabled | false | | +| wds.linkis.keytab.host | 127.0.0.1 | | +| hadoop.config.dir | 无 | 如果不配置,将从环境变量 HADOOP_CONF_DIR读取 | +| wds.linkis.hadoop.external.conf.dir.prefix | /appcom/config/external-conf/hadoop | hadoop额外配置 | + +### 1.4 Linkis RPC配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.rpc.broadcast.thread.num | 10 | Linkis RPC 广播线程数量(**建议采用默认值**) | +| wds.linkis.ms.rpc.sync.timeout | 60000 | Linkis RPC Receiver端的默认处理超时时间 | +| wds.linkis.rpc.eureka.client.refresh.interval | 1s | Eureka client的微服务列表刷新间隔(**建议采用默认值**) | +| wds.linkis.rpc.eureka.client.refresh.wait.time.max | 1m | 刷新最大等待时间(**建议采用默认值**) | +| wds.linkis.rpc.receiver.asyn.consumer.thread.max | 10 | Receiver Consumer最大线程数量(**如果在线用户多,建议适当调大该参数**) | +| wds.linkis.rpc.receiver.asyn.consumer.freeTime.max | 2m | Receiver Consumer最大空闲时间 | +| wds.linkis.rpc.receiver.asyn.queue.size.max | 1000 | Receiver 消费队列最大缓存数(**如果在线用户多,建议适当调大该参数**) | +| wds.linkis.rpc.sender.asyn.consumer.thread.max", 5 | Sender Consumer最大线程数量 | +| wds.linkis.rpc.sender.asyn.consumer.freeTime.max | 2m | Sender Consumer最大空闲时间 | +| wds.linkis.rpc.sender.asyn.queue.size.max | 300 | Sender 消费队列最大缓存数 | + +## 2. 计算治理配置 + +### 2.1 Entrance配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.spark.engine.version | 2.4.3 | 当用户提交脚本没有指定版本时,采用的默认Spark版本 | +| wds.linkis.hive.engine.version | 1.2.1 | 当用户提交脚本没有指定版本时,采用的默认Hive版本 | +| wds.linkis.python.engine.version | python2 | 当用户提交脚本没有指定版本时,采用的默认Python版本 | +| wds.linkis.jdbc.engine.version | 4 | 当用户提交脚本没有指定版本时,采用的默认JDBC版本 | +| wds.linkis.shell.engine.version | 1 | 当用户提交脚本没有指定版本时,采用的默认Shell版本 | +| wds.linkis.appconn.engine.version | v1 | 当用户提交脚本没有指定版本时,采用的默认AppConn版本| +| wds.linkis.entrance.scheduler.maxParallelismUsers | 1000 | Entrance支持的最大并发用户数 | +| wds.linkis.entrance.job.persist.wait.max | 5m | Entrance等待JobHistory持久化Job的最大时间 | +| wds.linkis.entrance.config.log.path | 无 | 如果不配置,默认采用wds.linkis.filesystem.hdfs.root.path的值 | +| wds.linkis.default.requestApplication.name | IDE | 不指定提交系统时的默认提交系统 | +| wds.linkis.default.runType | sql | 不指定脚本类型时的默认脚本类型 | +| wds.linkis.warn.log.exclude | org.apache,hive.ql,hive.metastore,com.netflix,org.apache | 默认不向Client端输出的实时WARN级别日志 | +| wds.linkis.log.exclude | org.apache,hive.ql,hive.metastore,com.netflix,org.apache,com.webank | 默认不向Client端输出的实时INFO级别日志 | +| wds.linkis.instance | 3 | 用户每个引擎的默认并发Job数 | +| wds.linkis.max.ask.executor.time | 5m | 向LinkisManager申请可用EngineConn的最大时间 | +| wds.linkis.hive.special.log.include | org.apache.hadoop.hive.ql.exec.Task | 向Client端推送Hive日志时,默认不过滤哪些日志 | +| wds.linkis.spark.special.log.include | org.apache.linkis.engine.spark.utils.JobProgressUtil | 向Client端推送Spark日志时,默认不过滤哪些日志 | +| wds.linkis.entrance.shell.danger.check.enabled | false | 是否检查并拦截Shell危险语法 | +| wds.linkis.shell.danger.usage | rm,sh,find,kill,python,for,source,hdfs,hadoop,spark-sql,spark-submit,pyspark,spark-shell,hive,yarn | Shell默认的危险语法 | +| wds.linkis.shell.white.usage | cd,ls | Shell白名单语法 | +| wds.linkis.sql.default.limit | 5000 | SQL默认的最大返回结果集行数 | + + +### 2.2 EngineConn配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.engineconn.resultSet.default.store.path | hdfs:///tmp | Job结果集默认存储路径 | +| wds.linkis.engine.resultSet.cache.max | 0k | 当结果集大小低于多少时,EngineConn端不落盘直接返回给Entrance | +| wds.linkis.engine.default.limit | 5000 | | +| wds.linkis.engine.lock.expire.time | 120000 | 引擎锁的最大空闲时间,即Entrance申请到锁后,多久不向EngineConn提交代码则被释放 | +| wds.linkis.engineconn.ignore.words | org.apache.spark.deploy.yarn.Client | Engine向Entrance端推送日志时,默认忽略的日志 | +| wds.linkis.engineconn.pass.words | org.apache.hadoop.hive.ql.exec.Task | Engine向Entrance端推送日志时,默认必须推送的日志 | +| wds.linkis.engineconn.heartbeat.time | 3m | EngineConn向LinkisManager的默认心跳间隔 | +| wds.linkis.engineconn.max.free.time | 1h | EngineConn的最大空闲时间 | + + +### 2.3 EngineConnManager配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.ecm.memory.max | 80g | ECM的最大可启动EngineConn的内存 | +| wds.linkis.ecm.cores.max | 50 | ECM的最大可启动EngineConn的CPU个数 | +| wds.linkis.ecm.engineconn.instances.max | 50 | 最大可启动EngineConn个数,一般建议设置与wds.linkis.ecm.cores.max相同 | +| wds.linkis.ecm.protected.memory | 4g | ECM的保护内存,即ECM用于启动EngineConn的内存不能超过 wds.linkis.ecm.memory.max - wds.linkis.ecm.protected.memory | +| wds.linkis.ecm.protected.cores.max | 2 | ECM的保护CPU个数,意义与wds.linkis.ecm.protected.memory相同 | +| wds.linkis.ecm.protected.engine.instances | 2 | ECM的保护实例数 | +| wds.linkis.engineconn.wait.callback.pid | 3s | 等待EngineConn回传pid的等待时间 | + +### 2.4 LinkisManager配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.manager.am.engine.start.max.time" | 10m | LinkisManager启动一个新EngineConn的最大启动时间 | +| wds.linkis.manager.am.engine.reuse.max.time | 5m | LinkisManager复用一个已有的EngineConn的最大选择时间 | +| wds.linkis.manager.am.engine.reuse.count.limit | 10 | LinkisManager复用一个已有的EngineConn的最大轮询次数 | +| wds.linkis.multi.user.engine.types | jdbc,es,presto | LinkisManager在复用一个已有的EngineConn时,哪些引擎的用户不作为复用规则使用 | +| wds.linkis.rm.instance | 10 | 每个用户在每个引擎的默认最大实例数 | +| wds.linkis.rm.yarnqueue.cores.max | 150 | 每个用户在每个引擎的使用队列最大核数 | +| wds.linkis.rm.yarnqueue.memory.max | 450g | 每个用户在每个引擎的使用队列的最大内存数 | +| wds.linkis.rm.yarnqueue.instance.max | 30 | 每个用户在每个引擎的队列中最多启动的应用数 | + + +## 3. 各引擎配置 + +### 3.1 JDBC引擎配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.jdbc.default.limit | 5000 | 默认的最大返回结果集行数 | +| wds.linkis.jdbc.support.dbs | mysql=>com.mysql.jdbc.Driver,postgresql=>org.postgresql.Driver,oracle=>oracle.jdbc.driver.OracleDriver,hive2=>org.apache.hive.jdbc.HiveDriver,presto=>com.facebook.presto.jdbc.PrestoDriver | JDBC引擎支持的驱动 | +| wds.linkis.engineconn.jdbc.concurrent.limit | 100 | 最大并行SQL执行数 | + + +### 3.2 Python引擎配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| pythonVersion | /appcom/Install/anaconda3/bin/python | Python命令路径 | +| python.path | 无 | 指定Python额外的path,该路径只接受共享存储的路径 | + +### 3.3 Spark引擎配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.engine.spark.language-repl.init.time | 30s | Scala和Python命令解释器的最大初始化时间 | +| PYSPARK_DRIVER_PYTHON | python | Python命令路径 | +| wds.linkis.server.spark-submit | spark-submit | spark-submit命令路径 | + + +## 4. PublicEnhancements配置 + +### 4.1 BML配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.bml.dws.version | v1 | Linkis Restful请求的版本号 | +| wds.linkis.bml.auth.token.key | Validation-Code | BML请求的免密token-key | +| wds.linkis.bml.auth.token.value | BML-AUTH | BML请求的免密token-value | +| wds.linkis.bml.hdfs.prefix | /tmp/linkis | BML文件存储在hdfs上的前缀文件路径 | + +### 4.2 Metadata配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| hadoop.config.dir | /appcom/config/hadoop-config | 如果不存在,则默认采用环境变量HADOOP_CONF_DIR的值 | +| hive.config.dir | /appcom/config/hive-config | 如果不存在,则默认采用环境变量HIVE_CONF_DIR的值 | +| hive.meta.url | 无 | HiveMetaStore数据库的URL。如果没有配置hive.config.dir,则该值必须配置 | +| hive.meta.user | 无 | HiveMetaStore数据库的user | +| hive.meta.password | 无 | HiveMetaStore数据库的password | + + +### 4.3 JobHistory配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.jobhistory.admin | 无 | 默认的Admin账号,用于指定哪些用户可以查看所有人的执行历史 | + + +### 4.4 FileSystem配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.filesystem.root.path | file:///tmp/linkis/ | 用户的Linux本地根目录 | +| wds.linkis.filesystem.hdfs.root.path | hdfs:///tmp/ | 用户的HDFS根目录 | +| wds.linkis.workspace.filesystem.hdfsuserrootpath.suffix | /linkis/ | 用户的HDFS根目录后的一级前缀,用户实际根目录为:${hdfs.root.path}\${user}\${hdfsuserrootpath.suffix} | +| wds.linkis.workspace.resultset.download.is.limit | true | Client下载结果集时,是否限制下载条数 | +| wds.linkis.workspace.resultset.download.maxsize.csv | 5000 | 当结果集下载为CSV文件时,限制的下载条数 | +| wds.linkis.workspace.resultset.download.maxsize.excel | 5000 | 当结果集下载为Excel文件时,限制的下载条数 | +| wds.linkis.workspace.filesystem.get.timeout | 2000L | 请求底层文件系统的最大超时时间。(**如果您的HDFS或Linux机器性能较低,建议适当调大该查数**) | + +### 4.5 UDF配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.udf.share.path | /mnt/bdap/udf | 共享UDF的存储路径,建议设置为HDFS路径 | + +## 5. MicroService配置 + +### 5.1 Gateway配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.gateway.conf.enable.proxy.user | false | 是否开启代理用户模式,如果开启,则登录用户的请求都会代理到代理用户去执行 | +| wds.linkis.gateway.conf.proxy.user.config | proxy.properties | 代理规则的存储文件 | +| wds.linkis.gateway.conf.proxy.user.scan.interval | 600000 | 代理文件的刷新间隔 | +| wds.linkis.gateway.conf.enable.token.auth | false | 是否开启Token登录模式,如果开启,则允许以token的方式访问Linkis | +| wds.linkis.gateway.conf.token.auth.config | token.properties | Token规则的存储文件 | +| wds.linkis.gateway.conf.token.auth.scan.interval | 600000 | Token文件的刷新间隔 | +| wds.linkis.gateway.conf.url.pass.auth | /dws/ | 默认放行、不作登录校验的请求 | +| wds.linkis.gateway.conf.enable.sso | false | 是否开启SSO用户登录模式 | +| wds.linkis.gateway.conf.sso.interceptor | 无 | 如果开启了SSO登录模式,则需要用户实现SSOInterceptor,用于跳转SSO登录页面 | +| wds.linkis.admin.user | hadoop | 管理员用户列表 | +| wds.linkis.login_encrypt.enable | false | 用户登录时,密码是否开启RSA加密传输 | +| wds.linkis.enable.gateway.auth | false | 是否开启Gateway IP白名单机制 | +| wds.linkis.gateway.auth.file | auth.txt | IP白名单存储文件 | + +## 6. 数据源及元数据服务配置 + +### 6.1 元数据服务配置 + +|引入版本| 参数名 | 默认值 | 描述 | +|-------| -------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------- | +|v1.1.0 | wds.linkis.server.mdm.service.lib.dir | /lib/linkis-public-enhancements/linkis-ps-metadatamanager/service | 设置需要加载数据源jar包的相对路径,会通过反射调用| +|v1.1.0 | wds.linkis.server.mdm.service.instance.expire-in-seconds | 60 | 设置加载子服务的过期时间,超过该时间将不加载该服务 | +|v1.1.0 | wds.linkis.server.dsm.app.name | linkis-ps-data-source-manager | 设置获取数据源信息的服务 | +|v1.1.0 | wds.linkis.server.mdm.service.kerberos.principle | hadoop/HOST@EXAMPLE.COM | set kerberos principle for linkis-metadata hive service | +|v1.1.0 | wds.linkis.server.mdm.service.user | hadoop | 设置hive服务的访问用户 | +|v1.1.0 | wds.linkis.server.mdm.service.kerberos.krb5.path | "" | 设置hive服务使用的kerberos krb5 路径 | +|v1.1.0 | wds.linkis.server.mdm.service.temp.location | classpath:/tmp | 设置kafka与hive的临时路径 | +|v1.1.0 | wds.linkis.server.mdm.service.sql.driver | com.mysql.jdbc.Driver | 设置mysql服务的驱动 | +|v1.1.0 | wds.linkis.server.mdm.service.sql.url | jdbc:mysql://%s:%s/%s | 设置mysql服务的url格式 | +|v1.1.0 | wds.linkis.server.mdm.service.sql.connect.timeout | 3000 | 设置mysql服务连接mysql服务的连接超时时间 | +|v1.1.0 | wds.linkis.server.mdm.service.sql.socket.timeout | 6000 | 设置mysql服务打开mysql服务的socket超时时间 | +|v1.1.0 | wds.linkis.server.mdm.service.temp.location | /tmp/keytab | 设置服务的本地临时存储路径,主要是存储从bml物料服务下载的认证文件| + + +## 7. 常用场景参数 + +### 7.1 开启测试模式 +开发过程需要免密接口,可在`linkis.properties`替换或追加此配置 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.test.mode | false | 是否打开调试模式,如果设置为 true,所有微服务都支持免密登录,且所有EngineConn打开远程调试端口 | +| wds.linkis.test.user | hadoop | 当wds.linkis.test.mode=true时,免密登录的默认登录用户 | + + +### 7.2 登录用户设置 +Apache Linkis 默认使用配置文件来管理admin用户,可以在`linkis-mg-gateway.properties`替换或追加此配置。如需多用户可接入LDAP实现。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.admin.user | hadoop | 管理员用户名 | +| wds.linkis.admin.password | 123456 | 管理员用户密码 | + +### 7.3 LDAP设置 +Apache Linkis 可以通过参数接入LDAP实现多用户管理,可以在`linkis-mg-gateway.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.ldap.proxy.url | 无 | LDAP URL地址 | +| wds.linkis.ldap.proxy.baseDN | 无 | LDAP baseDN地址 | +| wds.linkis.ldap.proxy.userNameFormat | 无 | | + +### 7.4 关闭资源检查 +Apache Linkis 提交任务时有时会调试异常,如:资源不足;可以在`linkis-cg-linkismanager.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.manager.rm.request.enable | true | 资源检查 | + +### 7.5 开启引擎调试 +Apache Linkis EC可以开启调试模式,可以在`linkis-cg-linkismanager.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.engineconn.debug.enable | false | 是否开启引擎调试 | + +### 7.6 Hive元数据配置 +Apache Linkis 的public-service服务需要读取hive的元数据;可以在`linkis-ps-publicservice.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| hive.meta.url | 无 | HiveMetaStore数据库的URL。 | +| hive.meta.user | 无 | HiveMetaStore数据库的user | +| hive.meta.password | 无 | HiveMetaStore数据库的password | + +### 7.7 Linkis 数据库配置 +Apache Linkis 访问默认使用Mysql作为数据存储,可以在`linkis.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.server.mybatis.datasource.url | 无 | 数据库连接字符串,例如:jdbc:mysql://127.0.0.1:3306/dss?characterEncoding=UTF-8 | +| wds.linkis.server.mybatis.datasource.username | 无 | 数据库用户名,例如:root | +| wds.linkis.server.mybatis.datasource.password | 无 | 数据库密码,例如:root | + +### 7.8 Linkis Session 缓存配置 +Apache Linkis 支持使用redis进行session的共享;可以在`linkis.properties`替换或追加此配置。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| linkis.session.redis.cache.enabled | None | 是否开启 | +| linkis.session.redis.host | 127.0.0.1 | 主机名 | +| linkis.session.redis.port | 6379 | 端口,例如 | +| linkis.session.redis.password | None | 密码 | + + + +### 7.9 Linkis 模块开发配置 +Apache Linkis 开发时可通过此参数,自定义加载模块的数据库、Rest接口、实体对象;可以在`linkis-ps-publicservice.properties`进行修改,多个模块之间使用逗号分割。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.server.restful.scan.packages | 无 | restful 扫描包,例如:org.apache.linkis.basedatamanager.server.restful | +| wds.linkis.server.mybatis.mapperLocations | 无 | mybatis mapper文件路径,例如: classpath*:org/apache/linkis/basedatamanager/server/dao/mapper/*.xml| +| wds.linkis.server.mybatis.typeAliasesPackage | 无 | 实体别名扫描包,例如:org.apache.linkis.basedatamanager.server.domain | +| wds.linkis.server.mybatis.BasePackage | 无 | 数据库dao层扫描,例如:org.apache.linkis.basedatamanager.server.dao | + +### 7.10 Linkis 模块开发配置 +Apache Linkis 开发时可通过此参数,自定义加载模块的路由;可以在`linkis.properties`进行修改,多个模块之间使用逗号分割。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.gateway.conf.publicservice.list | cs,contextservice,data-source-manager,metadataQuery,metadatamanager,query,jobhistory,application,configuration,filesystem,udf,variable,microservice,errorcode,bml,datasource,basedata-manager | publicservice服务支持路由的模块 | + +### 7.11 Linkis 文件系统及物料存放路径 +Apache Linkis 开发时可通过此参数,自定义加载模块的路由;可以在`linkis.properties`进行修改,多个模块之间使用逗号分割。 + +| 参数名 | 默认值 | 描述 | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.filesystem.root.path | file:///tmp/linkis/ | 本地用户目录,需在该目录下建立以用户名为名称的文件夹 | +| wds.linkis.filesystem.hdfs.root.path | hdfs:///tmp/ | HDFS用户目录 | +| wds.linkis.bml.is.hdfs | true | 是否启用hdfs | +| wds.linkis.bml.hdfs.prefix | /apps-data | hdfs路径 | +| wds.linkis.bml.local.prefix | /apps-data | 本地路径 | \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/_category_.json new file mode 100644 index 00000000000..fc5eaa61ac8 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "错误码", + "position": 3 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/error-code.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/error-code.md new file mode 100644 index 00000000000..10cabb322c9 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/error-code.md @@ -0,0 +1,1447 @@ +--- +title: 常见错误码及处理方法 +sidebar_position: 1 +--- + +#### 错误码 01001 + +**现象** + +任务执行过程中报错:错误码 01001,错误信息 您的任务没有路由到后台ECM,请联系管理员 +>The em of labels + +**原因1** + +您的任务没有路由到后台ECM + +**解决1** +1. 请检查租户标签是否正确 +2. 如果正确联系管理员 +--------------------------------- +#### 错误码 01002 + +**现象** + +任务执行过程中报错:错误码 01002,错误信息 Linkis服务负载过高,请联系管理员扩容 +>Unexpected end of file from server + +**原因1** + +Linkis服务负载过高,导致服务连接异常 + +**解决1** + +请联系管理员 + +--------------------------------- + +#### 错误码 01003 + +**现象** + +任务执行过程中报错:错误码 01003,错误信息 Linkis服务负载过高,请联系管理员扩容 +>failed to ask linkis Manager Can be retried SocketTimeoutException + +**原因1** + +Linkis服务负载过高,导致服务连接超时 + +**解决1** + +联系管理员 + +--------------------------------- + +#### 错误码 01004 + +**现象** + +任务执行过程中报错:错误码 01004,错误信息 引擎在启动时被Kill,请联系管理员 +>[0-9]+ Killed + +**原因1** + +引擎在启动时被Kill,这个是因为机器负载过高导致 + +**解决1** +1. 您可以选择重试 +2. 或者联系管理员 + +--------------------------------- + +#### 错误码 01005 + +**现象** + +任务执行过程中报错:错误码 01005,错误信息 请求Yarn获取队列信息重试2次仍失败,请联系管理员 +>Failed to request external resourceClassCastException + +**原因1** + +请求Yarn获取队列信息失败,这个是因为配置有问题导致 + +**解决1** + +请联系管理员 + +--------------------------------- + +#### 错误码 01101 + +**现象** + +任务执行过程中报错:错误码 01101,错误信息 ECM资源不足,请联系管理员扩容 +>ECM resources are insufficient + +**原因1** + +服务器资源不足导致,可能是高峰期导致 + +**解决1** +1. 可以进行任务重试 +2. 或者联系管理员 +--------------------------------- + +#### 错误码 01102 + +**现象** + +任务执行过程中报错:错误码 01102,错误信息 ECM 内存资源不足,请联系管理员扩容 +>ECM memory resources are insufficient + +**原因1** + +服务器内存资源不足 + +**解决1** +1. 可以进行任务重试 +2. 或者联系管理员 +--------------------------------- + +#### 错误码 01103 + +**现象** + +任务执行过程中报错:错误码 01103,错误信息 ECM CPU资源不足,请联系管理员扩容 +>ECM CPU resources are insufficient + +**原因1** + +服务器CPU资源不足 + +**解决1** +1. 可以进行任务重试 +2. 或者联系管理员 +--------------------------------- + +#### 错误码 01104 + +**现象** + +任务执行过程中报错:错误码 01104,错误信息 实例资源不足,请联系管理员扩容 +>ECM Insufficient number of instances + +**原因1** + +服务器实例资源不足 + +**解决1** +1. 可以进行任务重试 +2. 或者联系管理员 +--------------------------------- + +#### 错误码 01105 + +**现象** + +任务执行过程中报错:错误码 01105,错误信息 机器内存不足,请联系管理员扩容 +>Cannot allocate memory + +**原因1** + +服务器机器内存不足 + +**解决1** + +1. 可以进行任务重试 +2. 或者联系管理员 +--------------------------------- + +#### 错误码 12001 + +**现象** + +任务执行过程中报错:错误码 12001,错误信息 队列CPU资源不足,可以调整Spark执行器个数 +>Queue CPU resources are insufficient + +**原因1** + +队列CPU资源不足,超过了您设置的限制值 + +**解决1** + +- 打开DSS平台,点击管理台--参数配置--IDE--Spark--显示高级设置--woker引擎资源设置(2)--调整执行器并发数[spark.executor.instances] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkSetting.png) + +- 或者在管理台--参数配置-全局设置调整队列资源使用上限值 +--------------------------------- + +#### 错误码 12002 + +**现象** + +任务执行过程中报错:错误码 12002,错误信息 队列内存资源不足,可以调整Spark执行器个数 +>Insufficient queue memory + +**原因1** + +队列内存资源不足,超过了您设置的队列内存资源值 + +**解决1** +- 打开DSS平台,点击管理台--参数配置--IDE--Spark--显示高级设置--woker引擎资源设置(2)--调整执行器并发数[spark.executor.instances] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkSetting.png) + +- 或者在管理台--参数配置-全局设置调整队列资源使用上限值 +--------------------------------- + +#### 错误码 12003 + +**现象** + +任务执行过程中报错:错误码 12003,错误信息 队列实例数超过限制 +>Insufficient number of queue instances + +**原因1** + +队列实例数超过限制值 + +**解决1** + +- 打开DSS平台,点击管理台--参数配置--全局设置--队列资源--yarn队列实例最大个数[wds.linkis.rm.yarnqueue.instance.max] +- ![](/Images/tuning-and-troubleshooting/error-guide/queueInstanceMax.png) + +**备注** + + +涉及全局设置不推荐用户随意修改,如需修改请与运维沟通后修改。非全局设置参数,用户可自行修改 + +--------------------------------- + +#### 错误码 12004 + +**现象** + +任务执行过程中报错:错误码 12004,错误信息 全局驱动器内存使用上限,可以设置更低的驱动内存 +>Drive memory resources are insufficient + +**原因1** + +全局驱动器内存超过上限 + +**解决1** +- 打开DSS平台,点击管理台--参数配置--全局设置--队列资源--yarn队列实例最大个数[wds.linkis.rm.yarnqueue.instance.max] +- ![](/Images/tuning-and-troubleshooting/error-guide/queueInstanceMax.png) + +**解决2** + +- 如果队列可用,应用实例数过低,可联系管理员设置 + +**备注** + + +涉及全局设置不推荐用户随意修改,如需修改请与运维沟通后修改。非全局设置参数,用户可自行修改 + +--------------------------------- + +#### 错误码 12005 + +**现象** + +任务执行过程中报错:错误码 12005,错误信息 超出全局驱动器CPU个数上限,可以清理空闲引擎 +>Drive core resources are insufficient + +**原因1** + +全局驱动器CPU个数超过上限 + +**解决1** + +- 打开DSS平台,点击管理台--参数配置--全局设置--队列资源--队列CPU使用上限[wds.linkis.rm.yarnqueue.cores.max] +- ![](/Images/tuning-and-troubleshooting/error-guide/queueCodesMax.png) + +**解决2** + +- 清理空闲引擎 + +**备注** + + +涉及全局设置不推荐用户随意修改,如需修改请与运维沟通后修改。非全局设置参数,用户可自行修改 + +--------------------------------- + +#### 错误码 12006 + +**现象** + +任务执行过程中报错:错误码 12006,错误信息 超出引擎最大并发数上限,可以清理空闲引擎 +>Insufficient number of instances + +**原因1** + +超出引擎最大并发数上限 + +**解决1** + +- 修改配置,全局配置:打开DSS平台,点击管理台--参数配置--全局设置--队列资源--全局各个引擎最大并发数[wds.linkis.rm.instance] +- ![](/Images/tuning-and-troubleshooting/error-guide/MaxInstance.png) +- spark引擎 +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMaxInstance.png) +- hive引擎 +- ![](/Images/tuning-and-troubleshooting/error-guide/hiveMaxInstance.png) +- python引擎 +- ![](/Images/tuning-and-troubleshooting/error-guide/pythonMaxInstance.png) +- pipeline引擎 +- ![](/Images/tuning-and-troubleshooting/error-guide/pipelineMaxInstance.png) + +**备注** + + +涉及全局设置不推荐用户随意修改,如需修改请与运维沟通后修改。非全局设置参数,用户可自行修改 + +--------------------------------- + +#### 错误码 12008 + +**现象** + +任务执行过程中报错:错误码 12008,错误信息 获取Yarn队列信息异常,可能是您设置的yarn队列不存在 +>获取Yarn队列信息异常 + +**原因1** + +获取Yarn队列信息异常 + +**解决1** + +- 如果集群正常,用户队列配置错误: +- linkis管理台/参数配置>全局设置>yarn队列名[wds.linkis.rm.yarnqueue] +- ![](/Images/tuning-and-troubleshooting/error-guide/yarnQueue.png) + +**解决2** + +- 如果集群是新集群,先检查LinkisManager的集群配置 + >查看hadoop集群地址: http://ip:8088/cluster + > + >查看yarn队列地址:http://ip:8888/cluster/scheduler +> +**备注** + + +涉及全局设置不推荐用户随意修改,如需修改请与运维沟通后修改。非全局设置参数,用户可自行修改 + +--------------------------------- + +#### 错误码 12009 + +**现象** + +任务执行过程中报错:错误码 12009,错误信息 会话创建失败,%s队列不存在,请检查队列设置是否正确 +>queue (\S+) is not exists in YARN + +**原因1** + +队列不存在,请检查队列设置是否正确 + +**解决1** + +- 用户联系管理员,确认队列是否正确 +- ![](/Images/tuning-and-troubleshooting/error-guide/yarnQueue.png) +--------------------------------- + +#### 错误码 12010 + +**现象** + +任务执行过程中报错:错误码 12010,错误信息 集群队列内存资源不足,可以联系组内人员释放资源 +>Insufficient cluster queue memory + +**原因1** + +集群队列内存资源不足 + +**解决1** + +- 检查资源内存是否已满,用户联系组内人员释放资源,或者申请队列扩容 +- ![](/Images/tuning-and-troubleshooting/error-guide/queueRamResource.png) +--------------------------------- + +#### 错误码 12011 + +**现象** + +任务执行过程中报错:错误码 12011,错误信息 集群队列CPU资源不足,可以联系组内人员释放资源 +>Insufficient cluster queue cpu + +**原因1** + +集群队列CPU资源不足 + +**解决1** + +- 检查资源cpu是否已满,用户联系组内人员释放资源,或者申请队列扩容 + +- ![](/Images/tuning-and-troubleshooting/error-guide/queueCPUResource.png) +--------------------------------- + +#### 错误码 12013 + +**现象** + +任务执行过程中报错:错误码 12013,错误信息 资源不足导致启动引擎超时,您可以进行任务重试 +>wait for DefaultEngineConn + +**原因1** + +资源不足导致启动引擎超时 + +**解决1** + +用户重试任务,如果多次出现,请联系管理员排查 + +--------------------------------- + +#### 错误码 12014 + +**现象** + +任务执行过程中报错:错误码 12014,错误信息 请求引擎超时,可能是因为队列资源不足导致,请重试 +>wait for engineConn initial timeout + +**原因1** + +请求引擎超时 + +**解决1** + +用户重试任务,如果多次出现,请联系管理员排查 + +--------------------------------- + +#### 错误码 13001 + +**现象** + +任务执行过程中报错:错误码 13001,错误信息 Java进程内存溢出,建议优化脚本内容 +>OutOfMemoryError + +**原因1** + +Java进程内存溢出 + +**解决1** + +- 用户尝试增加java管理端内存配置,如果重复出现,请联系管理员排查 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--spark引擎资源设置(2)--spark引擎内存[spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) + +--------------------------------- + +#### 错误码 13002 + +**现象** + +任务执行过程中报错:错误码 13002,错误信息 使用资源过大,请调优sql或者加大资源 + +>Container killed by YARN for exceeding memory limits + +**原因1** + +使用资源过大 + +**解决1** + +- 在管理台增加executor内存,或在提交任务中增加内存 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--worker资源设置(2)--worker内存大小[spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) +--------------------------------- + +#### 错误码 13003 + +**现象** + +任务执行过程中报错:错误码 13003,错误信息 使用资源过大,请调优sql或者加大资源 + +>read record exception + +**原因1** + +使用资源过大 + +**解决1** + +- 用户与管理员确认后,在管理台增加executor内存,或在提交任务中增加内存 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--worker资源设置(2)--worker内存大小[spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) +--------------------------------- + +#### 错误码 13004 + +**现象** + +任务执行过程中报错:错误码 13004,错误信息 引擎意外退出,可能是使用资源过大导致 + +>failed because the engine quitted unexpectedly + +**原因1** + +引擎意外退出 + +**解决1** + +联系管理员排查 + +--------------------------------- + +#### 错误码 13005 + +**现象** + +任务执行过程中报错:错误码 13005,错误信息 Spark app应用退出,可能是复杂任务导致 + +>Spark application has already stopped + +**原因1** + +Spark app应用退出,可能是复杂任务导致 + +**解决1** + +- 用户尝试增加java管理端内存配置,如果重复出现,请联系管理员排查 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--spark引擎资源设置(2)--spark引擎内存[spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) + +**解决2** + +- 用户与管理员确认后,在管理台增加executor内存,或在提交任务中增加内存 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--worker资源设置(2)--worker内存大小[spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) + +--------------------------------- + +#### 错误码 13006 + +**现象** + +任务执行过程中报错:错误码 13006,错误信息 Spark context退出,可能是复杂任务导致 + +>Spark application has already stopped + +**原因1** + +Spark context退出,可能是复杂任务导致 + +**解决1** + +- 用户尝试增加java管理端内存配置,如果重复出现,请联系管理员排查 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--spark引擎资源设置(2)--spark引擎内存[spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) + +**解决2** + +- 用户与管理员确认后,在管理台增加executor内存,或在提交任务中增加内存 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--worker资源设置(2)--worker内存大小[spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) +--------------------------------- + +#### 错误码 13007 + +**现象** + +任务执行过程中报错:错误码 13007,错误信息 Pyspark子进程意外退出,可能是复杂任务导致 + +>Pyspark process has stopped + +**原因1** + +Pyspark子进程意外退出,可能是复杂任务导致 + +**解决1** + +- 用户尝试增加java管理端内存配置,如果重复出现,请联系管理员排查 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEspark--spark引擎资源设置(2)--spark引擎内存[spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) +--------------------------------- + +#### 错误码 21001 + +**现象** + +任务执行过程中报错:错误码 21001,错误信息 会话创建失败,用户%s不能提交应用到队列:%s,请联系提供队列给您的人员 + +>User (\S+) cannot submit applications to queue (\S+) + +**原因1** + +会话创建失败,用户%s不能提交应用到队列 + +**解决1** + +用户队列无权限,请检查队列配置是否错误,或者申请队列权限 + +--------------------------------- + +#### 错误码 21002 + +**现象** + +任务执行过程中报错:错误码 21002,错误信息 创建Python解释器失败,请联系管理员 + +>initialize python executor failed + +**原因1** + +创建Python解释器失败 + +**解决1** + +联系运维人员排查 + +--------------------------------- + +#### 错误码 21003 + +**现象** + +任务执行过程中报错:错误码 21003,错误信息 创建单机Python解释器失败,请联系管理员 + +>PythonSession process cannot be initialized + +**原因1** + +创建Python解释器失败 + +**解决1** + +联系运维人员排查 + +--------------------------------- + +#### 错误码 22001 + +**现象** + +任务执行过程中报错:错误码 22001,错误信息 %s无权限访问,请申请开通数据表权限,请联系您的数据管理人员 + +>Permission denied:\s*user=[a-zA-Z0-9_]+,\s*access=[A-Z]+\s*,\s*inode="([a-zA-Z0-9/_\.]+) + +**原因1** + +无权限访问 + +**解决1** + +- 数据库表权限需要到进行申请 +--------------------------------- + +#### 错误码 22003 + +**现象** + +任务执行过程中报错:错误码 22003,错误信息 所查库表无权限 + +>Authorization failed:No privilege + +**原因1** + +无权限访问 + +**解决1** + +- 数据库表权限需要到进行申请 + +--------------------------------- + +#### 错误码 22004 + +**现象** + +任务执行过程中报错:错误码 22004,错误信息 用户%s在机器不存在,请确认是否申请了相关权限 + +>user (\S+) does not exist + +**原因1** + +无权限访问 + +**解决1** + + +- 用户服务 +--------------------------------- + +#### 错误码 22005 + +**现象** + +任务执行过程中报错:错误码 22005,错误信息 用户在机器不存在,请确认是否申请了相关权限 + +>engineConnExec.sh: Permission denied + +**原因1** + +无权限访问 + +**解决1** + + +- 用户服务 +--------------------------------- + +#### 错误码 22006 + +**现象** + +任务执行过程中报错:错误码 22006,错误信息 用户在机器不存在,请确认是否申请了相关权限 + +>at com.sun.security.auth.UnixPrincipal + +**原因1** + +无权限访问 + +**解决1** + + +- 用户服务 +--------------------------------- + +#### 错误码 22007 + +**现象** + +任务执行过程中报错:错误码 22007,错误信息 用户在机器不存在,请确认是否申请了相关权限 + +>LoginException: java.lang.NullPointerException: invalid null input: name + +**原因1** + +无权限访问 + +**解决1** + + +- 用户服务 +--------------------------------- + +#### 错误码 22008 + +**现象** + +任务执行过程中报错:错误码 22008,错误信息 用户在机器不存在,请确认是否申请了相关权限 + +>User not known to the underlying authentication module + +**原因1** + +无权限访问 + +**解决1** + + +- 用户服务 +--------------------------------- + +#### 错误码 30001 + +**现象** + +任务执行过程中报错:错误码 30001,错误信息 库超过限制 + +>is exceeded + +**原因1** + +库超过限制 + +**解决1** + +用户自行清理数据 + +**解决2** + +申请数据库扩容 + +--------------------------------- + +#### 错误码 31001 + +**现象** + +任务执行过程中报错:错误码 31001,错误信息 用户主动kill任务 + +>is killed by user + +**原因1** + +用户主动kill任务 + +**解决1** + +- 如果确认用户未主动kill,请联系运维人员排查 +--------------------------------- + +#### 错误码 31002 + +**现象** + +任务执行过程中报错:错误码 31002,错误信息 您提交的EngineTypeLabel没有对应的引擎版本 + +>EngineConnPluginNotFoundException + +**原因1** + +EngineTypeLabel没有对应的引擎版本 + +**解决1** + +- 用户检查传的EngineTypeLabel是否正确,如果正确,请联系运维人员排查 +- 运维人员检查方法:在linkis ecp节点 lib/linkis-engineconn-plugins/是所有可用引擎插件的本地缓存。这个没有可能是引擎对应版本没有,或者引擎文件里面放了其它非正常格式文件,比如 .bak ,不该放zip的放了zip等等 + +--------------------------------- + +#### 错误码 41001 + +**现象** + +任务执行过程中报错:错误码 41001,错误信息 数据库%s不存在,请检查引用的数据库是否有误 + +>Database '([a-zA-Z_0-9]+)' not found + +**原因1** + +数据库%s不存在 + +**解决1** + +- 用户检查数据库是否存在及权限 +- >show databases + +--------------------------------- + +#### 错误码 41001 + +**现象** + +任务执行过程中报错:错误码 41001,错误信息 数据库%s不存在,请检查引用的数据库是否有误 + +>Database does not exist: ([a-zA-Z_0-9]+) + +**原因1** + +数据库%s不存在 + +**解决1** + +- 用户检查数据库是否存在及权限 +- >show databases + +--------------------------------- + +#### 错误码 41003 + +**现象** + +任务执行过程中报错:错误码 41003,错误信息 字段%s不存在,请检查引用的字段是否有误 + +>cannot resolve '`(.+)`' given input columns + +**原因1** + +字段%s不存在 + +**解决1** + +- 用户检查字段是否存在 +>desc tabl_name +--------------------------------- + +#### 错误码 41003 + +**现象** + +任务执行过程中报错:错误码 41003,错误信息 字段%s不存在,请检查引用的字段是否有误 + +>Column '(.+)' cannot be resolved + +**原因1** + +字段%s不存在 + +**解决1** + +- 用户检查字段是否存在 +>desc tabl_name +--------------------------------- + +#### 错误码 41003 + +**现象** + +任务执行过程中报错:错误码 41003,错误信息 字段%s不存在,请检查引用的字段是否有误 + +> Invalid table alias or column reference '(.+)': + +**原因1** + +字段%s不存在 + +**解决1** + +- 用户检查字段是否存在 +>desc tabl_name +--------------------------------- + +#### 错误码 41004 + +**现象** + +任务执行过程中报错:错误码 41004,错误信息 分区字段%s不存在,请检查引用的表是否为分区表或分区字段有误 + +>Partition spec \{(\S+)\} contains non-partition columns + +**原因1** + +分区字段%s不存在 + +**解决1** + +- 用户检查分区字段填写是否正确 + +--------------------------------- + +#### 错误码 41004 + +**现象** + +任务执行过程中报错:错误码 41004,错误信息 分区字段%s不存在,请检查引用的表是否为分区表或分区字段有误 + +>table is not partitioned but partition spec exists:\{(.+)\} + +**原因1** + +分区字段%s不存在 + +**解决1** + +- 用户检查分区字段填写是否正确 + +--------------------------------- + +#### 错误码 41004 + +**现象** + +任务执行过程中报错:错误码 41004,错误信息 表对应的路径不存在,请联系您的数据管理人员 + +>Path does not exist: viewfs + +**原因1** + +分区路径不存在导致 + +**解决1** + +- 请尝试refresh table XXX,或者kill引擎重跑,仍有异常,请联系数据管理人员排查 + +--------------------------------- + +#### 错误码 41004 + +**现象** + +任务执行过程中报错:错误码 41004,错误信息 字段%s不存在,请检查引用的表%s是否为分区表或分区字段有误 + +>([a-zA-Z_0-9]+) is not a valid partition column in table ([`\.a-zA-Z_0-9]+) + +**原因1** + +字段%s不存在 + +**解决1** + +- 用户检查分区字段填写是否正确 + +--------------------------------- + +#### 错误码 41005 + +**现象** + +任务执行过程中报错:错误码 41005,错误信息 文件%s不存在 + +>Caused by:\s*java.io.FileNotFoundException + +**原因1** + +文件%s不存在 + +**解决1** + +- 请尝试refresh table XXX,或者kill引擎重跑,仍有异常,请联系数据管理人员排查 + + +--------------------------------- + +#### 错误码 42003 + +**现象** + +任务执行过程中报错:错误码 42003,错误信息 未知函数%s,请检查代码中引用的函数是否有误 + +>Undefined function: '(\S+)' + +**原因1** + +引用的函数有误 + +**解决1** + +- 如果是udf,请检查函数,如果是公共函数,请联系运维人员排查 +- udf函数地址:![](/Images/tuning-and-troubleshooting/error-guide/udf.png) + +--------------------------------- + +#### 错误码 42003 + +**现象** + +任务执行过程中报错:错误码 42003,错误信息 未知函数%s,请检查代码中引用的函数是否有误 + +>Invalid function '(\S+)' + +**原因1** + +引用的函数有误 + +**解决1** + +- 如果是udf,请检查函数,如果是公共函数,请联系运维人员排查 +- udf函数地址:![](/Images/tuning-and-troubleshooting/error-guide/udf.png) + +--------------------------------- + +#### 错误码 42004 + +**现象** + +任务执行过程中报错:错误码 42004,错误信息 字段%s存在名字冲突,请检查子查询内是否有同名字段 + +>Ambiguous column Reference '(\S+)' in subquery + +**原因1** + +字段%s存在名字冲突 + +**解决1** + +- 用户检查是否有重名字段 + +--------------------------------- + +#### 错误码 42004 + +**现象** + +任务执行过程中报错:错误码 42004,错误信息 字段%s存在名字冲突,请检查子查询内是否有同名字段 + +>Reference '(\S+)' is ambiguous + +**原因1** + +字段%s存在名字冲突 + +**解决1** + +- 用户检查是否有重名字段 + +--------------------------------- + +#### 错误码 42005 + +**现象** + +任务执行过程中报错:错误码 42005,错误信息 字段%s必须指定表或者子查询别名,请检查该字段来源 + +>Column '(\S+)' Found in more than One Tables/Subqueries + +**原因1** + +字段未指定表 + +**解决1** + +- 用户增加字段来源 + +--------------------------------- + +#### 错误码 42006 + +**现象** + +任务执行过程中报错:错误码 42006,错误信息 表%s在数据库中已经存在,请删除相应表后重试 + +>Table already exists + +**原因1** + +表%s在数据库中已经存在 + +**解决1** + +- 用户需要清理表再重试 + +--------------------------------- + +#### 错误码 42006 + +**现象** + +任务执行过程中报错:错误码 42006,错误信息 表%s在数据库中已经存在,请删除相应表后重试 + +>AnalysisException: (S+) already exists + +**原因1** + +表%s在数据库中已经存在 + +**解决1** + +- 用户需要清理表再重试 + +--------------------------------- + +#### 错误码 42006 + +**现象** + +任务执行过程中报错:错误码 42006,错误信息 表%s在数据库中已经存在,请删除相应表后重试 + +>Table (\S+) already exists + +**原因1** + +表%s在数据库中已经存在 + +**解决1** + +- 用户需要清理表再重试 + + +--------------------------------- + +#### 错误码 42006 + +**现象** + +任务执行过程中报错:错误码 42006,错误信息 表%s在数据库中已经存在,请删除相应表后重试 + +>Table or view '(\S+)' already exists in database '(\S+)' + +**原因1** + +表%s在数据库中已经存在 + +**解决1** + +- 用户需要清理表再重试 + + +--------------------------------- + +#### 错误码 42007 + +**现象** + +任务执行过程中报错:错误码 42007,错误信息 插入目标表字段数量不匹配,请检查代码! + +>requires that the data to be inserted have the same number of columns as the target table + +**原因1** + +插入目标表字段数量不匹配 + +**解决1** + +- 用户检查代码 + + +--------------------------------- + +#### 错误码 42008 + +**现象** + +任务执行过程中报错:错误码 42008,错误信息 数据类型不匹配,请检查代码! + +>due to data type mismatch: differing types in + +**原因1** + +数据类型不匹配 + +**解决1** + +- 用户检查代码 + + +--------------------------------- + +#### 错误码 42009 + +**现象** + +任务执行过程中报错:错误码 42009,错误信息 字段%s引用有误,请检查字段是否存在! + +>Invalid column reference (S+) + +**原因1** + +字段%s引用有误 + +**解决1** + +- 用户检查字段是否存在 + + +--------------------------------- + +#### 错误码 42010 + +**现象** + +任务执行过程中报错:错误码 42010,错误信息 字段%s提取数据失败 + +>Can't extract value from (S+): need + +**原因1** + +字段%s提取数据失败 + +**解决1** + +- 检查select 的字段是否有误 + + +--------------------------------- + +#### 错误码 42012 + +**现象** + +任务执行过程中报错:错误码 42012,错误信息 group by 位置2不在select列表中,请检查代码! + +>GROUP BY position (S+) is not in select list + +**原因1** + +group by 的字段不在select列表中 + +**解决1** + +- 用户检查代码 + + +--------------------------------- + +#### 错误码 42014 + +**现象** + +任务执行过程中报错:错误码 42014,错误信息 插入数据未指定目标表字段%s,请检查代码! + +>Cannot insert into target table because column number/types are different '(S+)' + +**原因1** + +插入数据和目标表的字段对应不上 + +**解决1** + +- 用户检查代码 + + +--------------------------------- + +#### 错误码 42016 + +**现象** + +任务执行过程中报错:错误码 42016,错误信息 UDF函数未指定参数,请检查代码! + +>UDFArgumentException Argument expected + +**原因1** + +UDF函数未指定完整参数 + +**解决1** + +- 用户检查代码 + + +--------------------------------- + +#### 错误码 42017 + +**现象** + +任务执行过程中报错:错误码 42017,错误信息 聚合函数%s不能写在group by 中,请检查代码! + +>aggregate functions are not allowed in GROUP BY + +**原因1** + +聚合函数%s不能写在group by 中,请检查代码! + +**解决1** + +- 用户检查代码 + + +--------------------------------- + +#### 错误码 43007 + +**现象** + +任务执行过程中报错:错误码 43007,错误信息 pyspark执行失败,可能是语法错误或stage失败 + +>Py4JJavaError: An error occurred + +**原因1** + +语法错误或stage失败 + +**解决1** + +- 如果是语法错误需要检查代码进行修改 +- 如果是stage失败可以选择重试 + + +--------------------------------- + +#### 错误码 43011 + +**现象** + +任务执行过程中报错:错误码 43011,错误信息 导出Excel表超过最大限制1048575 + +>Invalid row number + +**原因1** + +数据量超过单个sheet的限制 + +**解决1** + +- 减少数据量进行导出,或者导出为CSV格式 + + +--------------------------------- + +#### 错误码 43040 + +**现象** + +任务执行过程中报错:错误码 43040,错误信息 Presto查询一定要指定数据源和库信息 + +>Schema must be specified when session schema is not set + +**原因1** + +数据源配置错误 + +**解决1** + +- 检查管理台Presto数据源配置 +- 修改配置,打开DSS平台,点击管理台--参数配置--IDE--IDEpresto--数据源配置 +- ![](/Images/tuning-and-troubleshooting/error-guide/presto.png) + + +--------------------------------- + +#### 错误码 46001 + +**现象** + +任务执行过程中报错:错误码 46001,错误信息 找不到导入文件地址:%s + +>java.io.FileNotFoundException: (\S+) \(No such file or directory\) + +**原因1** + +文件不存在 + +**解决1** + +- 请检查工作空间,或检查HDFS目录下文件是否存在 +- ![](/Images/tuning-and-troubleshooting/error-guide/hdfs.png) + + +--------------------------------- + +#### 错误码 46002 + +**现象** + +任务执行过程中报错:错误码 46002,错误信息 导出为excel时临时文件目录权限异常 + +>java.io.IOException: Permission denied(.+) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet + +**原因1** + +文件目录异常,或者文件读写权限不足 + +**解决1** + +- 请确认文件有读写权限,如有异常请联系运维人员处理 + + +--------------------------------- + +#### 错误码 46003 + +**现象** + +任务执行过程中报错:错误码 46003,错误信息 导出文件时无法创建目录:%s + +>java.io.IOException: Mkdirs failed to create (\S+) (.+) + +**原因1** + +无法创建目录 + +**解决1** + +- 联系运维人员排查 + + +--------------------------------- + +#### 错误码 46004 + +**现象** + +任务执行过程中报错:错误码 46004,错误信息 导入模块错误,系统没有%s模块,请联系运维人员安装 + +>ImportError: No module named (S+) + +**原因1** + +系统没有%s模块 + +**解决1** + +- 联系运维人员排查 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/interface.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/interface.md new file mode 100644 index 00000000000..2697608d8ff --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/error-guide/interface.md @@ -0,0 +1,133 @@ +--- +title: 接口错误排查 +sidebar_position: 3 +--- + +针对接口错误,如何快速定位接口,快速查询日志,进行介绍 + +## 如何定位 + +### 1. 前端F12 接口报错 +**错误信息排查** +![](/Images/tuning-and-troubleshooting/error-guide/errorMsg.png) +发现错误信息,按F12--network--过滤请求信息Fetch/XHR--对单次请求进行检查--priview--定位报错请求 + +**查找url** +![](/Images/tuning-and-troubleshooting/error-guide/findUrl.png) +点击单次请求的Headers,就会看到general 这里将会看到请求地址: +>Request URL :XXXXX /api/rest_j/v1/data-source-manager/op/connect/json + +### 2. 找到应用名 +某个接口请求报错,URL规范进行定位应用名。 +Linkis接口URL遵循设计规范: +>/api/rest_j/v1/{applicationName}/. + +applicationName是应用名,通过应用名查找归属的微服务,去对应的微服务下查看log日志。 + +#### 应用名和微服务的对应关系 + +|ApplicationName(应用名)|Microservice(微服务)| +|:----:|:----:| +|linkismanager|cg-linkismanager| +|engineplugin|cg-engineplugin| +|cg-engineconnmanager|cg-engineconnmanager| +|entrance|cg-entrance| +|bml|ps-bml| +|contextservice|ps-cs| +|datasource|ps-datasource| +|configuration|| +|microservice|| +|jobhistory|ps-publicservice| +|variable|| +|udf|| + + +### 3. 找到日志路径 +用户服务地址存在不一样的情况,我们需先定位日志地址 +> ps -ef | grep ps-datasource + +![](/Images/tuning-and-troubleshooting/error-guide/logs.png) + +- cg-linkismanager: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-linkismanager-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-linkismanager.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-linkismanager.out` + +- cg-engineplugin: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineplugin-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineplugin.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineplugin.out` + +- cg-engineconnmanager: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineconnmanager-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineconnmanager.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineconnmanager.out` + +- cg-entrance: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-entrance-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-entrance.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-cg-entrance.out` + +- ps-bml: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-bml-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-bml.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-bml.out` + +- ps-cs: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-cs-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-cs.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-cs.out` + +- ps-datasource: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-datasource-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-datasource.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-datasource.out` + +- ps-publicservice: +>GC日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-publicservice-gc.log` +> +>服务日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-publicservice.log` +> +>服务的System.out日志:` /${LINKIS_HOME}/logs/linkis/linkis-ps-publicservice.out` + +### 4. 查看日志 +展示接口对应的报错信息 + +找到请求日志,日志中会展示出服务调用的其他服务,或者展示自己服务中处理的逻辑日志 +>tail -fn200 linkis-ps-data-source-manager.log + +![](/Images/tuning-and-troubleshooting/error-guide/datasourcemanager.png) + +**上图展示的是服务调用其他服务的日志,可根据此信息查询另外服务的日志** + +**下图展示的是真正报错的服务日志** + +>tail -fn200 linkis-ps-metadataquery.log + +![](/Images/tuning-and-troubleshooting/error-guide/errorMsgFromMeta.png) + +前端报错展示 + +![](/Images/tuning-and-troubleshooting/error-guide/errorMsg.png) + + +### 5. 异常定位 +`ECMResourceClear failed, ecm current resource:bdpuje +s110003:9102{"instance":0,"memory":"0.0 B","cpu":0} org.apache.linkis.manager.exception.PersistenceErrorException: errCode: 210001 ,desc: label not found, this label may be removed a +lready. , ip: localhost110003 ,port: 9101 ,serviceKind: linkis-cg-linkismanager` + +其中IP和端口是对应的服务地址,serviceKind是对应的服务名称,如果是RPC调用的日志失败,可以通过这个信息找到对应的服务 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/images/engine-log.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/images/engine-log.png new file mode 100644 index 00000000000..3a4c5ee0fb3 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/images/engine-log.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/overview.md new file mode 100644 index 00000000000..158e556a4eb --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/overview.md @@ -0,0 +1,170 @@ +--- +title: 总览 +sidebar_position: 0 +--- +## 调优排障 + +> 建议的排查基本优先级可以按照:**社区issue专栏搜索关键词—\>在社区查阅《Q\&A问题总结》文档—\>定位系统日志—\>社区用户群咨询交流—\>定位源码远程debug** + + +## 1. 社区Issue搜索关键词 + +在[issue专栏](https://github.com/apache/linkis/issues), filter过滤器中搜索关键词。如: +filter:`is:issue spark3` +![](/Images-zh/tuning-and-troubleshooting/issue-searching-keywords.png) + + + +## 2. 常见Q&A问题集 + +将issue中常见的问题以及解决方案整理成文档,放在了官网页面《 [常见问题](/faq/main) 》 + + +## 3. 如何定位错误 + +### 3.1 编译阶段异常排查 +> 如果是自行编译 + +通常会出现的问题: +- 编译前,未执行`mvn -N install`, 导致linkis自身依赖没法获取 +- 升级部分依赖组件后,导致函数报错 如使用spark3 + +定位异常的手段: +可以在mvn 运行命令后面加上 -e 参数 如`mvn clean install -e` + +### 3.2 安装阶段异常排查 + +如果出现报错,又不清楚具体是执行什么命令报错,可以加 -x 参数`sh -x bin/install.sh`,将shell脚本执行过程日志打印出来,方便定位问题 + +### 3.3 启动微服务阶段异常排查 +所有微服务的日志文件统一放入了logs目录,日志目录层级如下: + +```html +├── logs 日志目录 +│ ├── linkis-cg-engineconnmanager-gc.log +│ ├── linkis-cg-engineconnmanager.log +│ ├── linkis-cg-engineconnmanager.out +│ ├── linkis-cg-engineplugin-gc.log +│ ├── linkis-cg-engineplugin.log +│ ├── linkis-cg-engineplugin.out +│ ├── linkis-cg-entrance-gc.log +│ ├── linkis-cg-entrance.log +│ ├── linkis-cg-entrance.out +│ ├── linkis-cg-linkismanager-gc.log +│ ├── linkis-cg-linkismanager.log +│ ├── linkis-cg-linkismanager.out +│ ├── linkis-cli +│ │   ├── linkis-client.hadoop.log.20220409162400037523664 +│ │   ├── linkis-client.hadoop.log.20220409162524417944443 +│ ├── linkis-mg-eureka-gc.log +│ ├── linkis-mg-eureka.log +│ ├── linkis-mg-eureka.out +│ ├── linkis-mg-gateway-gc.log +│ ├── linkis-mg-gateway.log +│ ├── linkis-mg-gateway.out +│ ├── linkis-ps-cs-gc.log +│ ├── linkis-ps-cs.log +│ ├── linkis-ps-cs.out +│ ├── linkis-ps-data-source-manager-gc.log +│ ├── linkis-ps-data-source-manager.log +│ ├── linkis-ps-data-source-manager.out +│ ├── linkis-ps-metadatamanager-gc.log +│ ├── linkis-ps-metadatamanager.log +│ ├── linkis-ps-metadatamanager.out +│ ├── linkis-ps-publicservice-gc.log +│ ├── linkis-ps-publicservice.log +│ └── linkis-ps-publicservice.out +``` + +包含计算治理、公共增强、微服务管理三大微服务模块。每个微服务下包含`linkis-xxx-gc.log`、`linkis-xxx.log`、``linkis-xxx.out`三个日志。 +分别对应服务的GC日志、服务日志、服务的System.out日志。 + +通常情况下,启动某个微服务出错时,可以在log目录查看对应服务 查看详细日志排查问题 + +但因为服务之间是存在相互调用,linkis的微服务比较多,若对系统不熟悉,有时候无法定位到具体哪个模块出现了异常,可以通过全局日志搜索方式,拉取关键异常信息,进行排查 + +```shell script +tail -f log/* |grep -5n exception(或则tail -f log/* |grep -5n ERROR) +less log/* |grep -5n exception(或则less log/* |grep -5n ERROR) +``` + + +### 3.4 运行阶段 + +#### 3.4.1 接口异常排查 + +如果某个接口请求报错,可以根据接口的返回加过中定位出现问题的微服务, +一般情况下可以**根据URL规范进行定位,**Linkis接口中的URL都遵循着一定的设计规范, +即**/api/rest_j/v1/{applicationName}/.+的格式**,通过applicationName可以定位应用名,部分应用本身是一个微服务, +这时候应用名和微服务名相同,部分应用归属于某个微服务,此时应该通过应用名查找归属的微服务, +去对应的微服务下查看log日志,下面给出微服务和应用名的对应关系。 + +| **请求路径中的ApplicationName** | **服务的提供方** | +|-------------------------------------|---------------------------------| +| /api/rest_j/v1/linkisManager/* | linkis-cg-linkismanager | +| /api/rest_j/v1/entrance/* | linkis-cg-entrance | +| /api/rest_j/v1/bml/* | linkis-ps-publicservice | +| /api/rest_j/v1/configuration/* | linkis-ps-publicservice | +| /api/rest_j/v1/jobhistory/* | linkis-ps-publicservice | +| /api/rest_j/v1/filesystem/* | linkis-ps-publicservice | +| /api/rest_j/v1/variable/* | linkis-ps-publicservice | +| /api/rest_j/v1/microservice/* | linkis-ps-publicservice | +| /api/rest_j/v1/errorcode/* | linkis-ps-publicservice | +| /api/rest_j/v1/udf/* | linkis-ps-publicservice | +| /api/rest_j/v1/datasource/* | linkis-ps-publicservice | +| /api/rest_j/v1/metadatamanager/* | linkis-ps-metadatamanager | +| /api/rest_j/v1/data-source-manager/*| linkis-ps-data-source-manager | +| /api/rest_j/v1/engineplugin/* | linkis-engineconn-plugin | +| /api/rest_j/v1/contextservice/*(暂未使用到) | linkis-ps-cs | + +对于请求异常的定位,可以根据上表的对应关系,去对应的服务日志中进行查看 + +#### 3.4.2 执行引擎任务的异常排查 + +** step1:找到EngineConn的启动部署目录 ** + +- 方式1:如果执行日志中有显示,可以在管理台上查看到 如下图: +![engine-log](images/engine-log.png) +- 方式2:如果方式1中没有找到,可以通过找到`conf/linkis-cg-engineconnmanager.properties`配置的`wds.linkis.engineconn.root.dir`的参数,该值就是引擎启动部署的目录,子目录按执行引擎的用户进行了隔离 + +```shell script +# 如果不清楚taskid,可以按时间排序后进行选择 ll -rt /appcom/tmp/${执行的用户}/${日期}/${引擎}/ +cd /appcom/tmp/${执行的用户}/${日期}/${引擎}/${taskId} +例如一个Spark 引擎的启动目录如下: +/appcom/tmp/hadoop/20210824/spark/6a09d5fb-81dd-41af-a58b-9cb5d5d81b5a +``` + +目录大体如下 +```shell script +conf -> /appcom/tmp/engineConnPublickDir/6a09d5fb-81dd-41af-a58b-9cb5d5d81b5a/v000002/conf #引擎的配置文件 +engineConnExec.sh #生成的引擎的启动脚本 +lib -> /appcom/tmp/engineConnPublickDir/45bf0e6b-0fa5-47da-9532-c2a9f3ec764d/v000003/lib #引擎依赖的包 +logs #引擎启动执行的相关日志 +``` + +** step2:查看引擎的日志 ** +```shell script +less logs/stdout +less logs/stderr +``` + +** step3:尝试手动执行脚本(如果需要) ** +可以通过尝试手动执行脚本,进行调试 +``` +sh -x engineConnExec.sh +``` + +### 4. 问题反馈 + +对于按上述排查方式排查后,仍然没解决的问题,可以通过[需求帮助](/community/how-to-ask-for-help)指引方式进行反馈和需求帮助 + + +### 5. 定位源码远程debug + +通常情况下,对源码远程debug是定位问题最有效的方式,但相对查阅文档来说,需要用户对源码结构有一定的了解, +这里建议您在远程debug前查阅《 [Linkis源码层级结构详解](../development/directory-structure.md) 》,对项目的源码结构进行初步的了解, +有一定程度上的熟悉之后,可以参考《 [如何DebugLinkis](../development/debug.md) 》一文 调试对应微服务下的代码。 + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/tuning.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/tuning.md new file mode 100644 index 00000000000..ed6eb0f172e --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/tuning-and-troubleshooting/tuning.md @@ -0,0 +1,55 @@ +--- +title: 调优手册 +sidebar_position: 2 +--- + +> Linkis0.x版本在微众银行生产上稳定运行,并支撑着各种业务,Linkis1.0作为0.x的优化版本,相关调优逻辑并没有改变,所以本文档会介绍几个生产上Linkis部署调优的建议,由于篇幅有限,本文并不能覆盖到所有的优化场景,相关调优指南也会补充更新,当然也希望社区用户为Linkis1.0的调优文档提出建议。 + +## 1. 概述 +        本文档将会按照生产的经验,介绍几个调优的手段,分别是生产上部署时Jvm堆大小选取,任务提交的并发量设置,任务运行资源申请参阅介绍。文档中叙述的参数设置,并不是建议设置的参数值,用户需要根据自己真实地生产环境,对参数进行选取。 + + +## 2. Jvm堆大小调优 +        在安装Linkis时,可以在linkis-env.sh中找到以下变量: +```shell +SERVER_HEAP_SIZE="512M" +``` +        设置该变量,在安装后,会加入到每个微服务的java启动参数中,用来控制Jvm启动堆大小,虽然在java启动时,需要设置xms和xmx两个参数,但是通常会设置成一样的值,在生产上,随着使用人数的增多,该参数需要调整大一些才能满足生产的需求。当然设置更大的堆栈内存,需要更大的服务器配置,当然,单机部署存在局限性,在生产上,可以采用分布式部署的方式,用多台服务器分别部署不同的Linkis和DSS微服务,同时调整堆栈大小,达到满足生产的需求。 + +## 3. 任务提交的并发量调优 +        Linkis的一些任务并发参数都会有一个默认值,大多数场景下默认值都可以满足需求,但是有时,默认值并不能满足需求,所以需要通过改变参数的大小进行调整,本文会介绍几个调整任务并发的参数。方便用户对生产上的并发任务进行优化。 + +        因为任务的提交都是采用RPC的方式,在linkis-common/linkis-rpc模块中,可以通过配置如下几个参数提高rpc的并发数量: +```shell +wds.linkis.rpc.receiver.asyn.consumer.thread.max=400 +wds.linkis.rpc.receiver.asyn.queue.size.max=5000 +wds.linkis.rpc.sender.asyn.consumer.thread.max=100 +wds.linkis.rpc.sender.asyn.queue.size.max=2000 +``` + +        在Linkis源码中,我们对提交任务的并发数设置了一个默认值,该值在绝大多数场景下都能很好的满足需求,但是在有些场景出现大量并发任务提交执行时,比如用Qualitis(微众银行另一款开源项目)进行大批量数据校验时,这个参数在目前的版本中并没有提升为可配置项,分别是initCapacity,maxCapacity两个参数,需要用户进行改造,提高这两个参数,可以提高并发数,当然也需要更高的服务器配置。 +```java + private val groupNameToGroups = new JMap[String, Group] + private val labelBuilderFactory = LabelBuilderFactoryContext.getLabelBuilderFactory + + override def getOrCreateGroup(groupName: String): Group = { + if (!groupNameToGroups.containsKey(groupName)) synchronized { + val initCapacity = 100 + val maxCapacity = 100 + // 其它代码... + } + } +``` + +## 4. 任务运行时资源设置 +        在提交任务运行在Yarn上时,Yarn提供了可配置的接口,Linkis作为一个可拓展性强的框架,同样也可以通过Linkis的配置来设置资源配置。 +        Spark的相关配置和Hive的相关配置如下: +在linkis-engineconn-plugins/engineconn-plugins里的Spark的部分配置,可以调整该配置改变提交到Yarn上的任务运行时环境,由于篇幅有限,如更多有关Hive,Yarn配置需要用户参考源码和参数文档: +```shell +"spark.driver.memory" = 2 //单位为G +"wds.linkis.driver.cores" = 1 +"spark.executor.memory" = 4 //单位为G +"spark.executor.cores" = 2 +"spark.executor.instances" = 3 +"wds.linkis.rm.yarnqueue" = "default" +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/_category_.json new file mode 100644 index 00000000000..57d35113b8b --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "升级指南", + "position": 10 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-from-0.X-to-1.0-guide.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-from-0.X-to-1.0-guide.md new file mode 100644 index 00000000000..6712753c386 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-from-0.X-to-1.0-guide.md @@ -0,0 +1,78 @@ +--- +title: 0.x到1.0的升级指南 +sidebar_position: 1 +--- + +> 本文简单介绍Linkis从0.X升级到1.0.0(1.0.1/1.0.2)的注意事项,Linkis1.0 对Linkis的多个服务进行了调整,改动较大,本文将介绍从0.X到1.X升级过程中的注意事项。 + +## 1. 注意事项 + +**如果您是首次接触并使用Linkis,您可以忽略该章节。**。 + +## 2. 服务升级安装 + +因为1.0基本上对所有服务进行了升级,包括服务名进行了修改,所以0.X到1.X升级时服务需要进行重新安装。 + +在安装时如果需要保留0.X的数据,一定要选择1跳过建表语句(见下面代码)。 + +Linkis1.0 的安装可以参考[如何快速安装](../deployment/deploy-quick.md) + +``` +Do you want to clear Linkis table information in the database? + 1: Do not execute table-building statements + 2: Dangerous! Clear all data and rebuild the tables + other: exit + +Please input the choice: ## choice 1 +``` +## 3. 数据库升级 + + 服务安装完成后,需要对数据库进行结构修改,包括进行表结构变更和新增表和数据: + +### 3.1 表结构修改部分: + + linkis_task 表新增了submit_user和label_json字段,更新语句是: + +```mysql-sql + ALTER TABLE linkis_task ADD submit_user varchar(50) DEFAULT NULL COMMENT 'submitUser name'; + ALTER TABLE linkis_task ADD `label_json` varchar(200) DEFAULT NULL COMMENT 'label json'; +``` + +### 3.2 需要新执行的sql: + +```mysql-sql + cd db/module + ##新增enginePlugin服务依赖的表: + source linkis_ecp.sql + ##新增public service-instanceLabel 服务依赖的表 + source linkis_instance_label.sql + ##新增linkis-manager服务依赖的表 + source linkis-manager.sql +``` + +### 3.3 publicservice-Configuration表修改 + + 为了支持Linkis1.X 的全标签化能力,configuration模块相关数据表已全部升级为标签化,和0.X的Configuration表完全不同,需要重新执行建表语句和初始化语句。 + + 这意味着,**Linkis0.X 用户已有的引擎配置参数,已无法迁移到Linkis1.0之中**(建议用户重新配置一次引擎参数)。 + + 执行建表语句如下: + +```mysql-sql + source linkis_configuration.sql +``` + + 执行初始化语句,因为 Linkis1.0 支持对接多版本的引擎,所以执行初始化语句时,一定需要修改对应引擎的版本,如下所示。 + +```mysql-sql + vim linkis_configuration_dml.sql + ## 修改对应引擎的默认版本 + SET @SPARK_LABEL="spark-2.4.3"; + SET @HIVE_LABEL="hive-1.2.1"; + ## 保存执行初始化语句 + source linkis_configuration_dml.sql +``` + +## 4. 安装Linkis1.0 + + 启动Linkis1.0,验证服务是否已正常启动并对外提供服务,具体请参考: [如何快速安装](../deployment/deploy-quick.md) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-guide.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-guide.md new file mode 100644 index 00000000000..3835026d896 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-guide.md @@ -0,0 +1,176 @@ +--- +title: 1.0.3以上的版本升级 +sidebar_position: 2 +--- + +> 本文简单介绍1.0.3以上的版本的升级大体流程 + + +## 1 升级说明 + +- 如果是第一次安装使用 Linkis,或重装 Linkis,无需关注 Linkis 升级指南。 +- 如果涉及到其他平台的组件(DataSphereStudio/Qualitis/Visualis等),升级前,请确认版本之间的兼容性,最好使用推荐的版本,可参考 https://github.com/apache/linkis#ecosystem。 +- 建议通过软链方式来进行版本管控,可以通过修改软链的目标地址 来切换版本 如:`linkis -> /appcom/Install/LinkisInstall/linkis-1.1.3.20220615210213` +- 升级过程主要是需要关注数据库表结构的调整和部分配置参数的调整 +- 除了后端服务的升级,linkis的管理台资源也需要一并升级 +- 每个版本的主要变动点 可以查阅版本的总览信息`https://linkis.apache.org/zh-CN/docs/x.x.x /release` 以及版本的[Release-Note](https://linkis.apache.org/zh-CN/download/main):https://linkis.apache.org/zh-CN/download/main +- 每个版本的数据库变化/配置参数变化 都是基于上一个版本 + +## 2 服务升级安装 + +按[部署指引文档](../deployment/deploy-quick)(文档中关于管理台的安装可以跳过),进行新版本的安装。 + +安装服务时,如果历史数据保留,请保留历史数据,如果无需保留数据,直接重装即可,也无需关注升级流程 +```shell script +Do you want to clear Linkis table information in the database? + 1: Do not execute table-building statements + 2: Dangerous! Clear all data and rebuild the tables + other: exit + +Please input the choice: ## choice 1 +``` + +## 3. 数据库表升级 +>服务安装完成后,需要对数据库进行结构修改,包括进行表结构变更和表数据变更 + + +找到对应的版本`db/upgrade/x.x.x-schema/` sql变动文件 + +如果是跨多个版本执行,请按版本顺序,依次执行, +如果某些版本没有x.x.x_schema(linkis>=1.1.0版本后,只要涉及到数据库表的调整,都会有对应版本的schema文件),则表示该版本没有数据表的变化 + +:::caution 注意 +执行upgrade下的1.1.1_schema中的ddl升级脚本,如若执行到linkis_cg_rm_resource_action_record相关的错误,请检查创建该表的语句是否缺少ENGINE=InnoDB DEFAULT CHARSET=utf8; 如果缺少,请加上再执行 +::: + +```shell script +├── linkis_ddl.sql # 当前版本的全量ddl 数据库定义语言 建表语句 +├── linkis_dml.sql # 当前版本的全量dml 数据操纵语言 数据的增改 +└── upgrade + ├── 1.1.0_schema # 对应版本的sql + │   └── mysql + │   ├── linkis_ddl.sql + │   └── linkis_dml.sql + ├── 1.1.1_schema + │   └── mysql + │   ├── linkis_ddl.sql + │   └── linkis_dml.sql + └── 1.1.3_schema + └── mysql + └── linkis_ddl.sql +``` + +```mysql-sql + #如果是跨多个版本执行,请按版本顺序,依次执行 先执行ddl 再执行dml + #比如当前从linkis-1.0.3 升级到linkis-1.1.2 + source upgrade/1.1.0_schema/mysql/linkis_ddl.sql + source upgrade/1.1.0_schema/mysql/linkis_dml.sql + + source upgrade/1.1.1_schema/mysql/linkis_ddl.sql + source upgrade/1.1.1_schema/mysql/linkis_dml.sql + +``` +## 4 数据的调整(可选) +>按实际情况,决定是否需要做如下调整 + +### 4.1 TOKEN 配置 +> 用于接口调用时的认证 + +1.1.1 版本调整将原来的TOKEN配置从`${LINKIS_HOME}/conf/token.properties`迁移到数据库表`linkis_mg_gateway_auth_token`, +对于原来在`token.properties`额外配置的TOKEN,需要手动迁移表中 + +### 4.2 UDF 调整 +1.1.1 中支持支持UDF多版本控制、UDF存储到BML的功能特性,UDF函数存储的表结构有调整,UDF的历史数据,需要单独进行迁移 + +### 4.3 Session 字段key配置 + +1.1.1 版本中调整了session字段的key,从`bdp-user-ticket-id`-> 调整为 `linkis_user_session_ticket_id_v1`, +如果是对Linkis的升级。同时部署DSS或者其他项目,但他们服务lib包中,所依赖的Linkis的linkis-module-x.x.x.jar包 <1.1.1,则需要修改位于`${LINKIS_HOME}/conf/linkis.properties`文件 +```shell +echo "wds.linkis.session.ticket.key=bdp-user-ticket-id" >> linkis.properties +``` +### 4.4 默认队列的调整 +1.1.1 开始调整了yarn队列默认集群名`wds.linkis.rm.cluster` sit调整为default,如果一直使用的sit,请修改表数据 +`linkis_cg_rm_external_resource_provider`中的集群名 + +### 4.5 其他相关包的拷贝 + +如果之前老版本Linkis中`${LINKIS_HOME_OLD}/lib/linkis-engineconn-plugins`有安装第三方appconn插件,需要拷贝至新版本中, +最好通过软链链接到appconn路径上 +如: +``` +#查看老版本是否有安装第三方appconn +cd ${LINKIS_HOME_OLD}/lib/linkis-engineconn-plugins/ +ll + appconn -> /appcom/Install/LinkisInstall/appconn + + +#新版本保持一致 +cd ${LINKIS_HOME}/lib/linkis-engineconn-plugins/ +#软链 +ln -snf /appcom/Install/LinkisInstall/appconn appconn +``` + + +如果原来版本有安装dss,需要拷贝原来包中的`dss-gateway-support-x.x.x.jar` 至linkis的`./lib/linkis-spring-cloud-services/linkis-mg-gateway/`目录下 +如: +```shell script +cp ${LINKIS_HOME_OLD}/lib/linkis-spring-cloud-services/linkis-mg-gateway/dss-gateway-support-1.1.3.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/dss-gateway-support-1.1.3.jar + +``` + +## 5 管理台的更新 + +> 升级后端,同时也需要升级对应的管理台资源,无需执行管理台的安装,直接替换掉静态资源即可 + +### 5.1 下载前端安装包并解压 +上传至管理台所在的服务器上 ,解压 +```shell script +tar -xvf apache-linkis-x.x.x-web-bin.tar.gz +``` + + +### 5.2 升级 +>管理台升级方式比较多,因为只是资源的更新,可以通过管理台安装脚本来进行,也可以直接覆盖掉原有的资源, +>推荐使用软链方式来进行,只需要修改软链的目标地址即可,下面以新建版本资源路径方式为例 + +nginx配置文件默认是 在`/etc/nginx/conf.d/*` +nginx的日志文件在 `/var/log/nginx/access.log` 和`/var/log/nginx/error.log` + +场景1: 如果是集成再DSS项目中,修改DSS项目中linkis管理台资源的地址指向 +dss的nginx配置文件默认是 在`/etc/nginx/conf.d/dss.conf` +```nginx +#示例 + server { + ...... + location dss/linkis { + alias /appcom/Install/linkis-web-newversion/dist; # 静态文件目录 + index index.html index.html; + } + ..... + } +``` + +场景2:如果linkis是独立部署 +修改Nginx的配置,静态资源地址 指向新版本的linkis管理台 +linkis的nginx配置文件默认是 在`/etc/nginx/conf.d/dss.conf` +```nginx +#示例 + server { + ...... + location dss/linkis { + alias /appcom/Install/linkis-web-newversion/dist; # 静态文件目录 + index index.html index.html; + } + ...... + } +``` + +重新加载nginx 配置 +``` +sudo nginx -s reload +``` + +### 5.3 注意事项 + +- 管理台升级后,因为浏览器可能存在缓存,如果要验证效果,最好清空下浏览器缓存 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-to-1.4.0-guide.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-to-1.4.0-guide.md new file mode 100644 index 00000000000..6f8cdb01da2 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/upgrade/upgrade-to-1.4.0-guide.md @@ -0,0 +1,193 @@ +--- +title: 1.4.0 的升级指南 +sidebar_position: 3 +--- + +> Linkis1.4.0 对 Linkis 的服务及代码进行了较多调整,本文介绍升级到 Linkis 1.4.0 的相关注意事项。 + +## 1. 注意事项 + +**1) 如果您是首次接触并使用Linkis,您可以忽略该章节,参考[单机部署](../deployment/deploy-quick.md)指南部署 Linkis 即可。** + +**2) 如果您已安装 Likis 1.4.0 之前的版本但不想保留原有数据,也可参考[单机部署](../deployment/deploy-quick.md)指南重新部署,安装时选择 2 清理所有数据并重建表即可(见下面代码)。** +``` +Do you want to clear Linkis table information in the database? + 1: Do not execute table-building statements + 2: Dangerous! Clear all data and rebuild the tables + other: exit + +Please input the choice: ## choice 2 +``` +**3) 如果您已安装 Likis 1.4.0 之前的版本但需要保留原有版本数据,可参考本文档指引进行升级。** + +**** + +## 2. 环境升级 + +Linkis 1.4.0 将默认的依赖环境 Hadoop、Hive、Spark 版本升级为 3.x。分别为 Hadoop 升级为 3.3.4、Hive 升级为 3.1.3、Spark升级为 3.2.1。请将这些环境进行升级后再进行后续操作。 + +通过如下命令验证升级后版本 +``` +echo $HADOOP_HOME +/data/hadoop-3.3.4 +echo $HIVE_HOME +/data/apache-hive-3.1.3-bin +echo $SPARK_HOME +/data/spark-3.2.1-bin-hadoop3.2 +``` + +安装前请修改 deploy-config/linkis-env.sh 文件中 Hadoop、Hive、Spark 相关配置为升级后目录,具体修改项如下: + +``` +#HADOOP +HADOOP_HOME=${HADOOP_HOME:-"/appcom/Install/hadoop"} +HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/appcom/config/hadoop-config"} + +## Hadoop env version +HADOOP_VERSION=${HADOOP_VERSION:-"3.3.4"} + +#Hive +HIVE_HOME=/appcom/Install/hive +HIVE_CONF_DIR=/appcom/config/hive-config + +#Spark +SPARK_HOME=/appcom/Install/spark +SPARK_CONF_DIR=/appcom/config/spark-config + +``` + +## 3. 服务升级安装 + +因为 1.4.0 版本量改动较大,所以旧版本到 1.4.0 版本升级时服务需要进行重新安装。 + +在安装时如果需要保留旧版本的数据,一定要选择 1 跳过建表语句(见下面代码)。 + +Linkis 1.4.0 的安装可以参考[如何快速安装](../deployment/deploy-quick.md) + +``` +Do you want to clear Linkis table information in the database? + 1: Do not execute table-building statements + 2: Dangerous! Clear all data and rebuild the tables + other: exit + +Please input the choice: ## choice 1 +``` + +## 4. 数据库升级 + 服务安装完成后,需要对数据库的数据表进行修改,包括表结构变更和表数据更新。执行对应升级版本的 DDL 和 DML 脚本即可。 + ``` + #表结构变更 + linkis-dist\package\db\upgrade\${version}_schema\mysql\linkis_ddl.sql + #表数据变更 + linkis-dist\package\db\upgrade\${version}_schema\mysql\linkis_dml.sql + ``` +注意升级时请依次往上执行升级脚本,如从当前版本 1.3.1,升级到 1.4.0 版本。需要先执行 1.3.2 升级的 DDL 和 DML 脚本,再执行 1.4.0 升级的 DDL 和 DML脚本。本文以 1.3.2 升级到 1.4.0 为例进行说明 + +### 4.1 表结构修改部分: + +连接 mysql 数据库执行 linkis-dist\package\db\upgrade\1.3.2_schema\mysql\linkis_ddl.sql 脚本内容,具体内容如下: + +```mysql-sql +ALTER TABLE `linkis_cg_manager_service_instance` ADD COLUMN `identifier` varchar(32) COLLATE utf8_bin DEFAULT NULL; +ALTER TABLE `linkis_cg_manager_service_instance` ADD COLUMN `ticketId` varchar(255) COLLATE utf8_bin DEFAULT NULL; +ALTER TABLE `linkis_cg_ec_resource_info_record` MODIFY COLUMN metrics TEXT DEFAULT NULL COMMENT 'ec metrics'; +``` + +### 4.2 需要新执行的sql: + +连接 mysql 数据库执行 linkis-dist\package\db\upgrade\1.3.2_schema\mysql\linkis_dml.sql 脚本内容,具体内容如下: +```sql +-- 默认版本升级 +UPDATE linkis_ps_configuration_config_key SET default_value = 'python3' WHERE `key` = 'spark.python.version'; +UPDATE linkis_cg_manager_label SET label_value = '*-*,hive-3.1.3' WHERE label_value = '*-*,hive-2.3.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-IDE,hive-3.1.3' WHERE label_value = '*-IDE,hive-2.3.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-nodeexecution,hive-3.1.3' WHERE label_value = '*-nodeexecution,hive-2.3.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-*,spark-3.2.1' WHERE label_value = '*-*,spark-2.4.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-IDE,spark-3.2.1' WHERE label_value = '*-IDE,spark-2.4.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-Visualis,spark-3.2.1' WHERE label_value = '*-Visualis,spark-2.4.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-nodeexecution,spark-3.2.1' WHERE label_value = '*-nodeexecution,spark-2.4.3'; + +-- 支持不同的数据源 +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('tidb', 'tidb数据库', 'tidb', '关系型数据库', '', 3, 'TiDB Database', 'TiDB', 'Relational Database'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'tidb'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, `ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL, 0, '地址(host1:port1,host2:port2...)', 'Address(host1:port1,host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', '主机名(Host)', 'Host', NULL, 'TEXT', NULL, 1, '主机名(Host)', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', '端口号(Port)', 'Port', NULL, 'TEXT', NULL, 1, '端口号(Port)', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', '驱动类名(Driver class name)', 'Driver class name', 'com.mysql.jdbc.Driver', 'TEXT', NULL, 1, '驱动类名(Driver class name)', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 0, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); + +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('starrocks', 'starrocks数据库', 'starrocks', 'olap', '', 4, 'StarRocks Database', 'StarRocks', 'Olap'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'starrocks'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, `ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL, 0, '地址(host1:port1,host2:port2...)', 'Address(host1:port1,host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', '主机名(Host)', 'Host', NULL, 'TEXT', NULL, 1, '主机名(Host)', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', '端口号(Port)', 'Port', NULL, 'TEXT', NULL, 1, '端口号(Port)', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', '驱动类名(Driver class name)', 'Driver class name', 'com.mysql.jdbc.Driver', 'TEXT', NULL, 1, '驱动类名(Driver class name)', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 0, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); + +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('gaussdb', 'gaussdb数据库', 'gaussdb', '关系型数据库', '', 3, 'GaussDB Database', 'GaussDB', 'Relational Database'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'gaussdb'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, `ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL, 0, '地址(host1:port1,host2:port2...)', 'Address(host1:port1,host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', '主机名(Host)', 'Host', NULL, 'TEXT', NULL, 1, '主机名(Host)', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', '端口号(Port)', 'Port', NULL, 'TEXT', NULL, 1, '端口号(Port)', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', '驱动类名(Driver class name)', 'Driver class name', 'org.postgresql.Driver', 'TEXT', NULL, 1, '驱动类名(Driver class name)', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); + +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('oceanbase', 'oceanbase数据库', 'oceanbase', 'olap', '', 4, 'oceanbase Database', 'oceanbase', 'Olap'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'oceanbase'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, `ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL, 0, '地址(host1:port1,host2:port2...)', 'Address(host1:port1,host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', '主机名(Host)', 'Host', NULL, 'TEXT', NULL, 1, '主机名(Host)', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', '端口号(Port)', 'Port', NULL, 'TEXT', NULL, 1, '端口号(Port)', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', '驱动类名(Driver class name)', 'Driver class name', 'com.mysql.jdbc.Driver', 'TEXT', NULL, 1, '驱动类名(Driver class name)', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); +``` + +## 4. 添加mysql驱动包 +linkis 升级为 1.4.0 版本时 mysql 驱动包需使用 8.x 版本,以 8.0.28 版本为例:[下载连接](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar)拷贝驱动包至lib包下 + +``` +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ +``` + +## 5. 启动服务 + +```shell +sh linkis-start-all.sh +``` + +## 6. 注意事项 + +1. Spark 升级为 3.x 后,不兼容 python2,因此在执行 pyspark 任务时需要安装 python3,并执行如下操作 +```shell +sudo ln -snf /usr/bin/python3 /usr/bin/python2 +``` +并且在 spark 引擎配置 $LINKIS_HOME/lib/linkis-engineconn-plugins/spark/dist/3.2.1/conf/linkis-engineconn.properties 中添加如下配置,指定python安装路径 +``` +pyspark.python3.path=/usr/bin/python3 +``` +2. 升级时配置文件中 Token 值没法自动与原数据库 Token 值统一。需要手动修改 `linkis.properties` 和 `linkis-cli/linkis-cli.properties` 文件中的Token 值为与数据表 `linkis_mg_gateway_auth_token` 相对应的 Token 值。 +3. 低版本升级高版本时请逐级执行数据库升级脚本。 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/_category_.json new file mode 100644 index 00000000000..3f03c3eaa4a --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "使用指南", + "position": 4 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/_category_.json b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/_category_.json new file mode 100644 index 00000000000..b0a16d92f70 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "管理台的使用", + "position": 8 +} \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/basicdata-management.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/basicdata-management.md new file mode 100644 index 00000000000..edd0e2b9a2f --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/basicdata-management.md @@ -0,0 +1,36 @@ +--- +title: 基础数据管理 +sidebar_position: 8 +--- + +数据源管理页面可以对用户令牌、错误码、扩展资源、引擎物料等数据进行管理。 + +## 1. 令牌管理 + +用于管理各应用 Token 信息。 + +![](../images/basic-token.png) + +## 2. 错误码管理 + +### 2.1 错误码列表 + +列出错误码信息,可以根据错误码或错误描述进行查询。 + +![](../images/basic-code.png) + +### 2.1 常见错误码问题解决 + +[常见错误码及处理方法](../../tuning-and-troubleshooting/error-guide/error-code.md) + +## 3. 扩展资源管理 + +用于管理扩展资源,例如 yarn 链接 url 等。 + +![](../images/basic-ext.png) + +## 4. 引擎物料管理 + +用于管理 Linkis 引擎物料,包括引擎插件的创建、更新以及删除。 + +![](../images/basic-bml.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/datasource-management.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/datasource-management.md new file mode 100644 index 00000000000..ef421d96d73 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/datasource-management.md @@ -0,0 +1,32 @@ +--- +title: 数据源管理 +sidebar_position: 7 +--- + +数据源管理可以对数据源链接信息、数据源环境、数据源分类以及数据源权限进行处理。 + +## 1. 数据源管理 + +数据源管理界面可以查看 Linkis 管理的数据源。并对数据源进行管理,包括创建、修改、测试连接、修改数据源状态等。 + +![](../images/datasource-manage.png) + +## 2. 数据源环境 + +数据源环境页面可以查看数据源环境,并且可以修改所管理环境的参数。 + +![](../images/env-list.png) + +![](../images/env-edit.png) + +## 3. 数据源分类 + +数据源分类页面用于管理数据源的类型,该分类在数据源管理、数据源权限页面都有使用。 + +![](../images/ds-class.png) + +## 4. 数据源权限 + +该页面对数据源权限进行管理。 + +![](../images/ds-auth.png) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/ecm-management.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/ecm-management.md new file mode 100644 index 00000000000..1740b069e56 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/ecm-management.md @@ -0,0 +1,31 @@ +--- +title: ECM 管理 +sidebar_position: 5 +--- + +ECM 管理界面仅 Linkis 计算治理台管理员可见,该页面用于管理 ECM 和所有引擎。该界面可以查看到ECM的状态信息、修改ECM标签信息、修改ECM状态信息以及查询各个ECM下的所有引擎信息。 + +## 1. 实例查看 +一个 ECM 实例就是一个 ECM服务。用户可以根据需求启动多个 ECM 服务来提高请求处理效率。该页面可以查看 ECM 实例信息,包括名称、标签以及资源等信息。并且可以通过实例名称、状态、创建者等关键字对 ECM 实例进行过虑。 + +![](../images/ecm-management.png) + + +## 2. 标签管理 +ECM 服务是根据标签进行请求过虑和处理的。每个服务包含默认标签和用户自定义标签。只有携带 ECM 服务所属标签信息的请求才会被当前服务处理。点击编辑按钮,可以编辑ECM的标签信息(仅允许编辑用户自定义标签),以及修改ECM的状态。 + +![](../images/edit-label.png) + +最常用的是租户标签 tenant,用户可以通过该标签进行租户请求隔离。 + +## 3. ECM 下的引擎信息 + +点击 ECM 的实例名称,可以查看该 ECM 下所有的引擎信息。并对引擎进行管理,包括引擎停止、添加或删除用户自定义标签、查看引擎日志等操作。 + +![](../images/ecm-btn.png) + +![](../images/ecm-engine.png) + +![](../images/ecm-engine-label.png) + +同样的给 ECM 实例下的引擎打标签后,可以更细粒度的控制处理请求的具体引擎。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/global-history.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/global-history.md new file mode 100644 index 00000000000..77af7562874 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/global-history.md @@ -0,0 +1,24 @@ +--- +title: 全局历史 +sidebar_position: 1 +--- + +## 1. 历史任务 + +全局历史界面提供了用户自身的linkis任务提交记录,各个任务的创建时间、执行语句、状态都可以在此显示。并且可以根据任务ID、时间、引擎、状态等关键字过滤。 + +> ![](../images/history-interface.png) + + +## 2. 任务详情 +点击左侧按钮可以查看任务执行日志、任务详情以及任务结果。任务执行失败可以通过任务日志排查问题。 +![../images/image2.png](../images/global-history.png) + + +![./media/image3.png](../images/task-log.png) + +## 3. 管理员视图 +对于linkis计算治理台管理员来说,管理员可以通过点击页面的切换管理员视图查看所有用户的历史任务。 + +![./media/image4.png](../images/administrator-view.png) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/global-variable.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/global-variable.md new file mode 100644 index 00000000000..e04f01295e4 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/global-variable.md @@ -0,0 +1,9 @@ +--- +title: 全局变量 +sidebar_position: 4 +--- + +全局变量界面用户可以自定义变量用于代码编写,点击编辑按钮新增参数,添加完保存即可。 + +![](../images/global-var.png) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/microservice-management.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/microservice-management.md new file mode 100644 index 00000000000..f4febc1a633 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/microservice-management.md @@ -0,0 +1,22 @@ +--- +title: 微服务管理 +sidebar_position: 6 +--- + +Linkis 是基于 Spring Cloud 构建的分布式微服务系统。注册中心服务使用的是 Eureka。微服务管理界面仅对管理员可见。 + +## 1. 服务查看 + +微服务管理界面可以查看 Linkis 下的所有微服务信息,可以通过实例名称,引擎类型关键字过滤服务。并且可以通过编辑按钮管理服务下的标签。 + +![](../images/microservice-list.png) + +![](../images/ms-edit.png) + +## 2. 注册中心 + +Linkis 自身的微服务可以点击Eureka注册中心查看,与 Linkis 关联的微服务会直接在该界面列出。 + +![](../images/eureka-btn.png) + +![](../images/eureka.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/overview.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/overview.md new file mode 100644 index 00000000000..1b0bac3a9fd --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/overview.md @@ -0,0 +1,94 @@ +--- +title: 管理台主要接口说明 +sidebar_position: 0 +--- + +### 1 全局历史 +#### 1.1 主要功能 +- 执行任务的查询:支持根据时间/任务ID/引擎类型/任务状态查询历史任务。 +- 运行态任务的强制停止 +- 管理员用户可以切换管理员视图,查看所有的用户任务 +- 查看任务详细执行日志以及执行结果 + +#### 1.2 主要接口 + +- 历史任务的分页查询 /api/rest_j/v1/jobhistory/list +- 历史任务的详细查询 /api/rest_j/v1/jobhistory/{taskId}/get +- 日志的查看 /api/rest_j/v1/filesystem/openLog?path=hdfs:%2F%2F%2Ftmp%2Flinkis%2Flog%2F2022-04-12%2FIDE%2Fhadoop%2F466.log +- 结果集文件列表 /api/rest_j/v1/filesystem/getDirFileTrees?path=hdfs:%2F%2F%2Ftmp%2Flinkis%2Fhadoop%2Flinkis%2F20220412_173302%2FIDE%2F466 +- 执行结果集数据 /api/rest_j/v1/filesystem/openFile?path=hdfs:%2F%2F%2Ftmp%2Flinkis%2Fhadoop%2Flinkis%2F20220412_173302%2FIDE%2F466%2F_0.dolphin&page=1&pageSize=5000 +- 任务的强制kill接口 /api/rest_j/v1/entrance/killJobs + + +### 2 资源管理 +#### 2.1 主要功能 +- 查看登录用户当前启动的引擎状态,占用资源情况 +- 能够通过界面操作停止引擎 +- 管理员用户可以切换管理员视图,查看yarn队列资源,以及资源重置 + +#### 2.2 主要接口 +- 资源查询接口 /api/rest_j/v1/linkisManager/rm/userresources +- 详细的资源使用的引擎实例信息 api/rest_j/v1/linkisManager/rm/applicationlist +- 引擎停止接口 /api/rest_j/v1/linkisManager/rm/enginekill +- 资源重置接口 /api/rest_j/v1/linkisManager/rm/resetResource?resourceId=2 +- 所有使用资源列表 /api/rest_j/v1/linkisManager/rm/allUserResource?page=1&size=15 + + +### 3 参数配置 +#### 3.1 主要功能 +- 用户自定义参数管理的功能 +- 用户可以在该界面管理引擎的相关配置 +- 管理员还能在这里新增应用类型和引擎 + +#### 3.2 主要接口 +- 查看配置的树形列表 /api/rest_j/v1/configuration/getFullTreesByAppName?creator=%E5%85%A8%E5%B1%80%E8%AE%BE%E7%BD%AE +- 新建二级引擎配置 /api/rest_j/v1/configuration/createSecondCategory +- 配置的保存/api/rest_j/v1/configuration/saveFullTree + + +### 4 全局变量 +#### 4.1 主要功能 +- 支持用户可以自定义变量的新增和修改,在任务提交时能够根据配置的变量值进行自动替换。能够进行常用变量的复用 + +#### 4.2 主要接口 +- 全局变量的保存 /api/rest_j/v1/variable/saveGlobalVariable +- 全局变量的查询 /api/rest_j/v1/variable/listGlobalVariable + +### 5 ECM管理 +> **仅linkis计算治理台管理员可见** +#### 5.1 主要功能 +- 管理员可以管理ECM和所有引擎, +- 可以查看到ECM的状态信息、修改ECM标签信息、修改ECM状态信息以及查询各个ECM下的所有引擎信息 +- 可以编辑ECM的标签信息(仅允许编辑部分标签),以及修改ECM的状态。 +- 可以查看该ECM下所有的引擎信息,以及可以针对单个引擎进行的停止操作,查看运行日志,并且可以编辑引擎的标签信息。 + +最大可用资源通过配置文件参数配置 默认值 +wds.linkis.ecm.memory.max 100g +wds.linkis.ecm.cores.max 100 +wds.linkis.ecm.engineconn.instances.max 50 + + +#### 5.2 主要接口 +- 查询ECM列表 api/rest_j/v1/linkisManager/listAllEMs +- 修改ECM信息 api/rest_j/v1/linkisManager/modifyEMInfo +- 查询ecm下的引擎数据 /api/rest_j/v1/linkisManager/listEMEngines +- 修改引擎信息 api/rest_j/v1/linkisManager/modifyEngineInfo +- 引擎停止接口 /api/rest_j/v1/linkisManager/rm/enginekill +- 引擎日志查询接口 /api/rest_j/v1/linkisManager/openEngineLog + + +### 6 微服务管理 + +#### 6.1 主要功能 + +可以查看Linkis下的所有微服务信息,仅linkis计算治理台管理员可见。 + +#### 6.2 主要接口 +- 服务查询 /api/rest_j/v1/microservice/allInstance +- label的更新 api/rest_j/v1/microservice/instanceLabel + + + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/param-conf.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/param-conf.md new file mode 100644 index 00000000000..7a3d03c7745 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/param-conf.md @@ -0,0 +1,69 @@ +--- +title: 参数配置 +sidebar_position: 3 +--- + +参数配置界面提供了用户自定义参数管理的功能,用户可以在该界面管理引擎的相关配置。默认提供了 `IDE`、`Visualis`、`nodeexecution` 应用的引擎配置,用户以可以根据需求增删应用和引擎。 + +## 1. 参数配置说明 +参数配置页主要是对 `Linkis` 各引擎插件的参数进行管理。`Linkis` 中引擎配置是通过标签进行管理的,不同应用下的引擎配置参数是相互隔离的。对于未显示配置的引擎参数,执行任务时会调用系统初始化时默认引擎参数配置。 + + +## 2. 新增应用(仅管理员) +管理员可以通过新增应用类型按钮,新增应用。 + +![](../images/add-app.png) + +## 3. 新增引擎 + +引擎是跟应用相关联的,在新增引擎前必须先选中对应的引用,如在 `Visualis` 应用下新增引擎。 + +![](../images/add-engine-btn.png) + +![](../images/add-engine.png) + +**注意:**引擎版本需要填写 [Linkis 支持的引擎版本](./overview.md)。否则执行 `Linkis` 任务时会报错。 + + +## 4. 编辑应用和引擎(仅管理员) +管理员可以通过编辑目录按钮删除已有的应用和引擎配置(注意!直接删除应用会删除该应用下所有的引擎配置,并且不可恢复),或者添加引擎。 + +![](../images/del-app.png) + +## 5. 全局设置 + +全局设置主要是对队列资源的参数进行配置,配置后对所有应用任务生效。 + +![](../images/global-conf.png) + +### 5.1 队列设置 + +**1. 查看可用的队列** + +访问 hadoop 集群查看可用队列,地址:http://ip:port/cluster/scheduler + +![](../images/yarn-deque.png) + +**2. 设置队列** + +设置步骤1中查询的可用队列名称,并保存。 +![](../images/yarn-write.png) + +**3. 查看设置队列可用资源** + +点击右下角按钮查看队列可用资源。 +![](../images/click-yarn.png) +![](../images/deque-resource.png) + +**4. 设置资源限制** + +根据步骤3中查询的队列可用资源(CPU、内存)设置资源限制,包括队列实例最大个数、队列CPU使用上限、队列内存使用上限、全局各个引擎内存使用上限等。 + + + +## 6. 引擎参数修改 + +用户点击对应应用下的引擎标签后,可以对引擎参数进行修改,如修改 `IDE` 应用下的 `JDBC` 引擎。修改完成后点击保存按钮。 + +![](../images/engine-conf.png) + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/permission-instructions-console.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/permission-instructions-console.md new file mode 100644 index 00000000000..edf05eb55c4 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/permission-instructions-console.md @@ -0,0 +1,124 @@ +--- +title: 管理台用户权限说明 +sidebar_position: 10 +--- + +## 1.角色类型 + +- 管理员(Admin):能够查看所有菜单入口,管理员角色权限最大,包含了历史管理员权限 +- 历史管理员(historyAdmin):除了自己提交的任务之外,还可以查看其他历史任务 +- 普通用户:查看自己提交的任务信息 + +## 2.功能角色权限图表说明 + +不同角色在功能中拥有的权限 + +| 功能名称| 管理员(Admin) | 历史管理员(historyAdmin) | 普通用户 | +| -------- | -------- | ----- |----- | +| 管理员视图(全局历史) | √ | √ | | +| 搜索栏(资源管理) | √ | | | +| 参数配置 | √ | | | +| 全局变量 | √ | √ | √ | +| ECM管理 | √ | | | +| 微服务管理 | √ | | | +| 数据源管理 | √ | √ | √ | +| 数据源环境管理 | √ | | | +| 数据源类型 | √ | | | +| UDF管理 | √ | √ | √ | +| 函数管理 | √ | √ | √ | +| 租户标签管理 | √ | | | +| 白名单管理 | √ | | | +| 代码检索(管理员视图) | √ | | | +| 代码检索(其他功能) | √ | √ | √ | + +## 3.功能权限区分 + +### 3.1 全局历史 +管理员视图仅历史管理员or管理员可查看 + +![](/Images-zh/control-panel/qhgly-img.png) + +### 3.2 资源管理 + +搜索栏仅管理员可见 + +![](/Images-zh/control-panel/sslkj-img.png) + +### 3.3 参数配置 + +仅管理员可以编辑应用 + +![](/Images-zh/control-panel/glybj-img.png) + +### 3.4 全局变量 + +皆可编辑 + +![](/Images-zh/control-panel/jksy-img.png) + +### 3.5 ECM管理(Admin) + +只有管理员才有权限 + +![](/Images-zh/control-panel/ecmgl-img.png) + +### 3.6 微服务管理(Admin) + +只有管理员才有权限 + +![](/Images-zh/control-panel/wfwgl-img.png) + +### 3.7 数据源管理 + +#### 3.7.1 数据源管理 + +都有权限 + +![](/Images-zh/control-panel/sou-img.png) + +#### 3.7.2 数据源环境管理(Admin) + +只有管理员才有权限 + +![](/Images-zh/control-panel/hj-img.png) + + +#### 3.7.3 数据源类型(Admin) + +只有管理员才有权限 + +![](/Images-zh/control-panel/pzx-img.png) + +### 3.8 UDF管理 + +#### 3.8.1 UDF管理 + +都有权限 + +![](/Images-zh/control-panel/udfgl-img.png) + +#### 3.8.2 函数管理 + +都有权限 + +![](/Images-zh/control-panel/fun-img.png) + +### 3.9 基础数据管理(Admin) + +#### 3.9.1 租户标签管理 + +只有管理员才有权限 + +![](/Images-zh/control-panel/zhbj-img.png) + +#### 3.9.2 白名单管理 + +只有管理员才有权限 + +![](/Images-zh/control-panel/bmdgl-img.png) + +### 3.10 代码检索 + +其中管理员视图仅管理员可查看 + +![](/Images-zh/control-panel/dmjs-img.png) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/resource-limit.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/resource-limit.md new file mode 100644 index 00000000000..f733c72dca2 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/resource-limit.md @@ -0,0 +1,58 @@ +--- +title: 限制参数调整 +sidebar_position: 5 +--- + +本文介绍对于内存、CPU等资源不足时如何进行参数调整。 + +## 1. 队列资源不足 +任务执行过程中报错:错误码 12001,错误信息 队列CPU资源不足,可以调整Spark执行器个数 + +点击管理台--参数配置--IDE--Spark--显示高级设置--woker引擎资源设置(2)--调整执行器并发数 +![](../images/spark-resource.png) + +或者全局设置调整队列资源使用上限。 + +![](../images/global-limit.png) + +## 2. 队列实例数超过限制 + +任务执行过程中报错:错误码 12003,错误信息 队列实例数超过限制 + +点击管理台--参数配置--全局设置--队列资源--yarn队列实例最大个数[wds.linkis.rm.yarnqueue.instance.max] + +![](../images/yarn-instance.png) + +## 3. 全局驱动器内存使用上限 +任务执行过程中报错:错误码 12004,错误信息 全局驱动器内存使用上限,可以设置更低的驱动内存 + +点击管理台--参数配置--全局设置--队列资源--队列内存使用上限[wds.linkis.rm.yarnqueue.memory.max] + +![](../images/engine-memory.png) + +## 4. 超出全局驱动器CPU个数上限 + +任务执行过程中报错:错误码 12005,错误信息 超出全局驱动器CPU个数上限,可以清理空闲引擎 + +点击管理台--参数配置--全局设置--队列资源--全局各个引擎核心个数上限[wds.linkis.rm.client.core.max] + +![](../images/global-core.png) + +或者通过清理空闲引擎解决。 + +## 5. 超出引擎最大并发数上限 + +任务执行过程中报错:错误码 12006,错误信息 超出引擎最大并发数上限,可以清理空闲引擎 + +点击管理台--参数配置--全局设置--队列资源--全局各个引擎最大并发数[wds.linkis.rm.instance] + +![](../images/global-con.png) + +**Spark 引擎** +![](../images/spark-con.png) + +**Hive 引擎** + +![](../images/hive-con.png) + +其他引擎设置类似 Spark 和 Hive 引擎。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/resource-manager.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/resource-manager.md new file mode 100644 index 00000000000..4e9487ad937 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/resource-manager.md @@ -0,0 +1,26 @@ +--- +title: 资源管理 +sidebar_position: 2 +--- + +资源管理页面可以查看历史启动的引擎,以及对现有引擎资源状态进行管理。 + +## 1. 历史引擎 + +资源管理的历史引擎栏,用户可以看到自己当前已经启动的引擎状态,包括引擎类型、创建者、以及占用资源的情况。同时也可以根据实例名称、创建用户、引擎类型等关键字进行过滤。 + +![./media/image5.png](../images/history-engine.png) + +## 2. 引擎日志 +点击历史引擎右侧查看日志按钮可以查看引擎启动日志。如果引擎启动失败,也可以通过错误日志排查失败原因。 +![./media/image5.png](../images/engine-view-log.png) +![./media/image5.png](../images/engine-log.png) + +## 3. 资源管理 +资源管理的历史引擎栏,用户可以看到自己当前启动的引擎状态,以及占用资源的情况,也能够通过页面停止引擎。 +![./media/image5.png](../images/resource-management.png) + +## 4. 管理员视图 +对于linkis计算治理台管理员来说,可以通过点击资源管理页面的切换管理员视图查看所有用户的引擎资源。 +![./media/image5.png](../images/resource-management-button.png) +![./media/image5.png](../images/resource-management-administrator.png) \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/spark-param.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/spark-param.md new file mode 100644 index 00000000000..dffdf001f08 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/spark-param.md @@ -0,0 +1,27 @@ +--- +title: Spark 引擎参数调整 +sidebar_position: 4 +--- + +本文介绍如何对 Spark 引擎进行参数调整。 + + +## 1. 调整引擎参数 + +用户可以根据需求在管理台调整 Spark 参数。Linkis 管理台 ==》 参数设置 ==》 选择相应应用 ==》 点击 Spark 引擎会显示 Spark 可设置的参数。 + +![](../images/set-spark-param.png) + +## 2. 增加引擎执行速度 + +如果想要引擎执行的更快,可以调整执行器个数,执行器核心个数越多执行效率越高。 + +![](../images/executor-count.png) + +## 3. Driver 处理大数据 + +如果需要拉取大数据再 Driver 处理,需要调整驱动内存参数。 + +![](../images/executor-memory.png) + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/udf-function.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/udf-function.md new file mode 100644 index 00000000000..f239291d9c2 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/control-panel/udf-function.md @@ -0,0 +1,176 @@ +--- +title: UDF 的使用 +sidebar_position: 9 +--- + +## 1.UDF简介 +UDF:User Defined Function,用户自定义函数。某些场景我们需要使用hive的函数来处理一些数据,像count(),sum()这些函数都是内置的。如果我们想要使用一些没有自带的函数功能,则需要自定义功能函数,就可以通过写UDF来完成。 + +### 1.1 UDF 函数实现 + +实现一个UDF的方式较为简单:只需要继承UDF类,并重写evaluate方法。 + +``` +public class HelloUDF extends UDF{ + public String evaluate(String str){ + try { + return "Hello " + str; + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + return "ERROR"; + } + } +``` + + +### 1.2 UDF 的几种类型 + +- UDF 函数(需要注册后才能使用): + - 通用类型的UDF函数:指Hive的hql和Spark的sql都可以用的UDF函数,一般编译成jar包 + - Spark类型的UDF函数:Spark专用的UDF,需要先建立好相应的scala/python脚本,通过scala或python函数来注册,注册之后也可以在sql中使用 + +- 自定义函数 PythonUDF和ScalaUDF只能在Spark引擎中使用 + - python函数,基于python编写的函数 + - scala 函数,基于scala编写的函数 + + +## 2.UDF增删改 +点击linkis管理台:首页>>UDF管理 +![](/Images/udf/udf_01.png) + + +进入有"UDF管理"和"函数管理"两栏,其中在函数管理栏是一般的方法函数,比如python和scala函数,这种不需要注册即可在脚本里像普通函数一样使用,UDF则需要注册后才能使用。 +![](/Images/udf/udf_02.png) + + +### 2.1 UDF新增 +新增通用类型的UDF函数: + +需要先编译好相应的Jar包,并上传至对应用户的工作空间中(如果是使用的dss全家桶,可以通过scriptis进行上传,如果单独至使用了linkis,需要手动上传至对应的目录) + +![](/Images/udf/udf_09.png) + +点击新增UDF按钮,有两种类型的UDF可以新增,选“通用”类型及为通过jar包方式注册,注册格式需要写UDF实现类的全限定类名。 + +![](/Images/udf/udf_03.png) + +例如下图 UDFServiceImpl 的全限定类名就是:org.apache.linkis.udf.service.impl.UDFServiceImpl + +![](../images/udf-cllass.png) + +新增Spark类型的UDF函数: + +如果是选择“spark”类型,则选择定义好的scala或python函数来注册,自定义函数需要写 scala 或 python 类型脚本。注册之后也可以在sql中使用,类似:select hello("abc")。 + +注意: +1. 注册时应该填写新建脚本中的方法名。 +2. 新增udf后对应的jar包或者脚本内容会上传到bml存储。如果本地修改了资源需要更新后才能生效。 + +![](/Images/udf/udf_04.png) + +### 2.2 UDF修改 + +点击对应udf的编辑按钮。 + +![](/Images/udf/udf_05.png) + + +如果需要更新udf的内容,则需要编辑该udf重新上传,并对该udf生成一个新的版本。如果脚本内容没有改变,而只是修改了其他内容如:使用格式,则只更新信息,不会生成新的版本。 + +![](/Images/udf/udf_06.png) + +### 2.3 UDF删除 + +点击对应udf的删除按钮即可,注意:会删除该udf的所有版本。 + +![](/Images/udf/udf_07.png) + +## 3.UDF使用 +如果要使你创建的UDF生效在程序中使用,则需要加载该UDF。“加载”/“取消加载”的入口处为:进入scriptis左侧UDF函数->个人函数,创建的UDF均在个人函数列表处。 + +**注1:新增UDF时如果没有在页面上主动取消勾选,则会默认勾选加载。此时需要kill掉对应引擎使之新起一个引擎,操作才会生效。** + +**注2:加载/取消加载udf的操作,需要kill掉对应引擎使之新起一个引擎,操作才会生效。** + +列表中非个人函数介绍: + +BDAP函数:由bdap创建的给用户使用的函数,如脱敏函数等。注:bdap函数需要主动加载才能使用。 + +系统函数:系统默认的自带函数,不需要用户自己加载就能在代码中使用。 + +共享函数:其他人共享给你的函数,你需要加载它就能使用 + +过期函数:也是共享函数,只不过共享者标记了它为过期,暂不影响使用 + +**按照参数中的 ids 加载udf** + +| 参数名 | 说明 | 默认值| +|--------------------------- |------------------------|--------| +|`linkis.user.udf.all.load` | 是否加载用户选中的所有 UDF | true | +|`linkis.user.udf.custom.ids`| UDF ID 列表,用 `,` 分隔 | - | + +调用样例: + +```http request +POST /api/rest_j/v1/entrance/submit +Content-Type: application/json +Token-Code: dss-AUTH +Token-User: linkis + +{ + "executionContent": { + "code": "show databases", + "runType": "sql" + }, + "params": { + "configuration": { + "startup": { + "linkis.user.udf.all.load": false + "linkis.user.udf.custom.ids": "1,2,3" + } + } + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "linkis-IDE" + } +} +``` + + +## 4.UDF共享 +前提:共享功能需要用户为管理员才能使用,否则前端页面不会提供操作入口。 + +点击udf的共享按钮:会弹出内容框,输入你想要共享的用户列表(逗号分隔)。 + +注:共享给他人后需要他人主动加载该UDF才能使用。 + + + +共享之后,被共享用户可以在“共享函数”中找到,勾选加载即可使用。 + +## 5.其他功能介绍 +### 5.1 UDF移交 + +如用户离职时可能需要移交个人udf给他人。点击移交按钮,选择你的移交对象,点击确定。 + + + +### 5.2 UDF过期 + +对于共享给他人的UDF,如果已经被共享用户所加载,则不能直接删除该udf,只能标记该udf为过期。暂时只作标记作用,不影响使用。 + +### 5.3 UDF版本列表 + +点击某udf的“版本列表”按钮,可以查看该udf的所有版本。对于每个版本提供如下功能: + +创建新版本:将对应版本拷贝一份至最新版本。 + +下载:将udf文件从bml下载至本地。 + +查看源码:对于python/scala脚本类型则可以直接查看源码,jar类型不支持。 + +发布:共享udf可以对其点击发布某个版本,使该版本对被共享用户生效。注:被共享用户使用的是udf已发布的最新版本,个人用户使用的始终是最新版本。 + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/datasource-client.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/datasource-client.md new file mode 100644 index 00000000000..f6355c32b41 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/datasource-client.md @@ -0,0 +1,143 @@ +--- +title: 数据源 SDK +sidebar_position: 6 +--- + +> Linkis DataSource 提供了方便的JAVA和SCALA调用的Client SDK 接口,只需要引入linkis-datasource-client的模块就可以进行使用, + +## 1. 引入依赖模块 +``` + + org.apache.linkis + linkis-datasource-client + ${linkis.version} + +如: + + org.apache.linkis + linkis-datasource-client + 1.1.0 + +``` + +## 2. Scala测试代码 +建立Scala的测试类LinkisDataSourceClientTest,具体接口含义可以见注释: +```java + +import com.fasterxml.jackson.databind.ObjectMapper +import org.apache.linkis.common.utils.JsonUtils +import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient} +import org.apache.linkis.datasource.client.request.{CreateDataSourceAction, GetAllDataSourceTypesAction, MetadataGetDatabasesAction, UpdateDataSourceParameterAction} +import org.apache.linkis.datasourcemanager.common.domain.{DataSource, DataSourceType} +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.{DWSClientConfig, DWSClientConfigBuilder} + +import java.io.StringWriter +import java.util +import java.util.concurrent.TimeUnit + + +object LinkisDataSourceClientTest { + + def main(args: Array[String]): Unit = { + val clientConfig =DWSClientConfigBuilder.newBuilder + .addServerUrl("http://127.0.0.1:9001") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connection timtout + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new StaticAuthenticationStrategy) //AuthenticationStrategy Linkis authen suppory static and Token + .setAuthTokenKey("hadoop") // set submit user + .setAuthTokenValue("xxx") // set passwd or token + .setDWSVersion("v1") //linkis rest version v1 + .build + //init datasource remote client + val dataSourceClient = new LinkisDataSourceRemoteClient(clientConfig) + //init metadata remote client + val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig) + //get all datasource type + testGetAllDataSourceTypes(dataSourceClient) + //create kafka datasource + testCreateDataSourceForKafka(dataSourceClient) + //create es datasource + testCreateDataSourceForEs(dataSourceClient) + //update datasource parameter for kafka + testUpdateDataSourceParameterForKafka(dataSourceClient) + //update datasource parameter for es + testUpdateDataSourceParameterForEs(dataSourceClient) + //get hive metadata database list + testMetadataGetDatabases(metaDataClient) + } + +def testGetAllDataSourceTypes(client:LinkisDataSourceRemoteClient): Unit ={ + val getAllDataSourceTypesResult = client.getAllDataSourceTypes(GetAllDataSourceTypesAction.builder().setUser("hadoop").build()).getAllDataSourceType + System.out.println(getAllDataSourceTypesResult) + } + +def testCreateDataSourceForKafka(client:LinkisDataSourceRemoteClient): Unit ={ + val dataSource = new DataSource(); + val dataSourceType = new DataSourceType + dataSourceType.setName("kafka") + dataSourceType.setId("2") + dataSourceType.setLayers(2) + dataSourceType.setClassifier("消息队列") + dataSourceType.setDescription("kafka") + dataSource.setDataSourceType(dataSourceType) + dataSource.setDataSourceName("kafka-test") + dataSource.setCreateSystem("client") + dataSource.setDataSourceTypeId(2l); + + val dsJsonWriter = new StringWriter + + val mapper = new ObjectMapper + JsonUtils.jackson.writeValue(dsJsonWriter, dataSource) + val map = mapper.readValue(dsJsonWriter.toString,new util.HashMap[String,Any]().getClass) + val id = client.createDataSource(CreateDataSourceAction.builder().setUser("hadoop").addRequestPayloads(map).build()).getInsert_id + System.out.println(id) + + } + +def testCreateDataSourceForEs(client:LinkisDataSourceRemoteClient): Unit ={ + val dataSource = new DataSource(); + dataSource.setDataSourceName("es-test") + dataSource.setCreateSystem("client") + dataSource.setDataSourceTypeId(7l); + val dsJsonWriter = new StringWriter + val mapper = new ObjectMapper + JsonUtils.jackson.writeValue(dsJsonWriter, dataSource) + val map = mapper.readValue(dsJsonWriter.toString,new util.HashMap[String,Any]().getClass) + val id = client.createDataSource(CreateDataSourceAction.builder().setUser("hadoop").addRequestPayloads(map).build()).getInsert_id + System.out.println(id) + + } + +def testUpdateDataSourceParameterForKafka(client:LinkisDataSourceRemoteClient): Unit ={ + val params = new util.HashMap[String,Any]() + val connParams = new util.HashMap[String,Any]() + connParams.put("brokers","127.0.0.1:9092") + params.put("connectParams",connParams) + params.put("comment","kafka data source") + client.updateDataSourceParameter(UpdateDataSourceParameterAction.builder().setUser("hadoop").setDataSourceId("7").addRequestPayloads(params).build()) + } + +def testUpdateDataSourceParameterForEs(client:LinkisDataSourceRemoteClient): Unit ={ + val params = new util.HashMap[String,Any]() + val connParams = new util.HashMap[String,Any]() + val elasticUrls = new util.ArrayList[String]() + elasticUrls.add("http://127.0.0.1:9200") + connParams.put("elasticUrls",elasticUrls) + params.put("connectParams",connParams) + params.put("comment","es data source") + client.updateDataSourceParameter(UpdateDataSourceParameterAction.builder().setUser("hadoop").setDataSourceId("8").addRequestPayloads(params).build()) + } + + + def testMetadataGetDatabases(client:LinkisMetaDataRemoteClient): Unit ={ + client.getDatabases(MetadataGetDatabasesAction.builder().setUser("hadoop").setDataSourceId(9l).setUser("hadoop").setSystem("client").build()).getDbs + } +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/datasource-manual.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/datasource-manual.md new file mode 100644 index 00000000000..f579d47206b --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/datasource-manual.md @@ -0,0 +1,536 @@ +--- +title: 数据源功能 +sidebar_position: 4 +--- + +> 介绍一下如何使用1.1.0版本的新特性功能数据源 + +## 1.数据源功能介绍 + +### 1.1 概念 + +- 数据源:我们将能提供数据存储的数据库服务称为数据库,如mysql/hive/kafka,数据源定义的是连接到实际数据库的配置信息,配置信息主要是连接需要的地址,用户认证信息,连接参数等。存储与linkis的数据库的linkis_ps_dm_datasource_*相关的表中 +- 元数据:单指数据库的元数据,是指定义数据结构的数据,数据库各类对象结构的数据。 例如数据库中的数据库名,表名,列名,字段的长度、类型等信息数据。 + +### 1.2 三个主要模块 + +** linkis-datasource-client ** +客户端模块,用户数据源的基本管理的DataSourceRemoteClient,以及进行元数据的查询操作的MetaDataRemoteClient. + +** linkis-datasource-manager-server ** +数据源管理模块,服务名ps-data-source-manager。对数据源的进行基本的管理,对外提供数据源的新增,查询,修改,连接测试等http接口。对内提供了rpc服务 ,方便元数据查询模块通过rpc调用,查询数据库建立连接需要的必要信息。 + +- [http接口文档](/api/http/linkis-ps-publicservice-api/data-source-manager-api.md) +- http接口类 org.apache.linkis.metadatamanager.server.restful +- rpc接口类 org.apache.linkis.metadatamanager.server.receiver + +** linkis-metedata-manager-server ** +元数据查询模块,服务名ps-metadatamanager。提供对数据库元数据的基本查询功能,对外提供了http接口,对内提供了rpc服务,方便数据源管理模块,通过rpc调用,进行该数据源的连通性测试。 +- [http接口文档](/api/http/linkis-ps-publicservice-api/metadatamanager-api.md) +- http接口类 org.apache.linkis.datasourcemanager.core.restful +- rpc接口类 org.apache.linkis.datasourcemanager.core.receivers + + +### 1.3 处理逻辑 +#### 1.3.1 LinkisDataSourceRemoteClient +功能结构图如下: +![datasource](/Images-zh/deployment/datasource/datasource.png) + +- LinkisDataSourceRemoteClient客户端根据请求参数,组装http请求, +- HTTP请求发送到linkis-ps-data-source-manager +- linkis-ps-data-source-manager 会进行基本参数校验,部分接口只能管理员角色能操作 +- linkis-ps-data-source-manager 与数据库进行基本的数据操作 +- linkis-ps-data-source-manager 提供的数据源测试连接的接口 内部通过rpc方式,调用ps-metadatamanager方法进行连接测试 +- http请求处理后的数据结果,会通过注解DWSHttpMessageResult功能,进行结果集到实体类的映射转化 + +LinkisDataSourceRemoteClient接口 +- GetAllDataSourceTypesResult getAllDataSourceTypes(GetAllDataSourceTypesAction) 查询所有数据源类型 +- QueryDataSourceEnvResult queryDataSourceEnv(QueryDataSourceEnvAction) 查询数据源可使用的集群配置信息 +- GetInfoByDataSourceIdResult getInfoByDataSourceId(GetInfoByDataSourceIdAction): 通过数据源id查询数据源信息 +- QueryDataSourceResult queryDataSource(QueryDataSourceAction) 查询数据源信息 +- GetConnectParamsByDataSourceIdResult getConnectParams(GetConnectParamsByDataSourceIdAction) 获取连接配置参数 +- CreateDataSourceResult createDataSource(CreateDataSourceAction) 创建数据源 +- DataSourceTestConnectResult getDataSourceTestConnect(DataSourceTestConnectAction) 测试数据源是否能正常建立连接 +- DeleteDataSourceResult deleteDataSource(DeleteDataSourceAction) 删除数据源 +- ExpireDataSourceResult expireDataSource(ExpireDataSourceAction) 设置数据源为过期状态 +- GetDataSourceVersionsResult getDataSourceVersions(GetDataSourceVersionsAction) 查询数据源配置的版本列表 +- PublishDataSourceVersionResult publishDataSourceVersion(PublishDataSourceVersionAction) 发布数据源配置版本 +- UpdateDataSourceResult updateDataSource(UpdateDataSourceAction) 更新数据源 +- UpdateDataSourceParameterResult updateDataSourceParameter(UpdateDataSourceParameterAction) 更新数据源配置参数 +- GetKeyTypeDatasourceResult getKeyDefinitionsByType(GetKeyTypeDatasourceAction) 查询某数据源类型需要的配置属性 + + +#### 1.3.2 LinkisMetaDataRemoteClient +功能结构图如下: +![metadata](/Images-zh/deployment/datasource/metadata.png) + +- LinkisMetaDataRemoteClient客户端,根据请求参数,组装http请求, +- HTTP请求发送到ps-metadatamanager +- ps-metadatamanager 会进行基本参数校验, +- 请求会根据参数 datasourceId,发送RPC请求到linkis-ps-data-source-manager,获取该数据源的类型,连接参数如用户名密码等信息 +- 拿到连接需要的信息后,根据数据源类型,加载对应目录下的lib包,通过反射机制调用对应的函数方法,从而查询到元数据信息 +- http请求处理后的数据结果,会通过注解DWSHttpMessageResult功能,进行结果集到实体类的映射转化 + +LinkisMetaDataRemoteClient接口 +- MetadataGetDatabasesResult getDatabases(MetadataGetDatabasesAction) 查询数据库列表 +- MetadataGetTablesResult getTables(MetadataGetTablesAction) 查询table数据 +- MetadataGetTablePropsResult getTableProps(MetadataGetTablePropsAction) +- MetadataGetPartitionsResult getPartitions(MetadataGetPartitionsAction) 查询分区表 +- MetadataGetColumnsResult getColumns(MetadataGetColumnsAction) 查询数据表字段 + +### 1.3 源码模块目录结构 +```shell script +linkis-public-enhancements/linkis-datasource + +├── linkis-datasource-client //客户端代码 +├── linkis-datasource-manager //数据源管理模块 +│   ├── common //数据源管理公共模块 +│   └── server //数据源管理服务模块 +├── linkis-metadata //旧版本已有的模块,保留 +├── linkis-metadata-manager //元数据查询模块 +│   ├── common //元数据查询公共模块 +│   ├── server //元数据查询服务模块 +│   └── service //支持的数据源类型 +│   ├── elasticsearch +│   ├── hive +│   ├── kafka +│   └── jdbc + + +``` +### 1.4 安装包目录结构 + +```shell script +/lib/linkis-public-enhancements/ + +├── linkis-ps-data-source-manager +├── linkis-ps-metadatamanager +│   └── service +│   ├── elasticsearch +│   ├── hive +│   ├── kafka +│   └── jdbc +``` +`wds.linkis.server.mdm.service.lib.dir` 控制反射调用时加载的类路径,参数默认值是`/lib/linkis-public-enhancements/linkis-ps-metadatamanager/service` + +### 1.5 配置参数 + +参见[调优排障>参数列表#datasource配置参数](/docs/1.1.0/tuning-and-troubleshooting/configuration/#6-数据源及元数据服务配置参数) + +### 1.6 新增数据驱动 +1.背景说明:由于某些数据库驱动程序包与Apache许可证不兼容,需要自己引入驱动程序 + +2.新驱动程序目录:./lib/linkis-public-enhancements/linkis-ps-publicservice + +3.驱动程序列表 + +| Driver Name | Driver Version | Download Link | +| ----------- | ----------- |----------- | +| db2 | db2jcc4 | https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads | +| dameng | DmJdbcDriver18 | https://download.dameng.com/eco/docs/JAVA_Mybatis_lib.zip | +| mysql | 5.1.34 | https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.34/mysql-connector-java-5.1.34.jar | +|kingbase| kingbase8 | http://maven.jeecg.org/nexus/content/repositories/jeecg/kingbase/kingbase8/8/kingbase8-8.jar | +|greenplum | 5.1.4 | https://network.pivotal.io/products/vmware-tanzu-greenplum#/releases/985537/file_groups/5749 | +| postgresql | 42.3.1 | https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.1/postgresql-42.3.1.jar| +| sqlserver | sqlserver2000 | https://www.microsoft.com/en-us/download/details.aspx?id=11774 | +| oracle | 11.2.0.3 | http://www.datanucleus.org/downloads/maven2/oracle/ojdbc6/11.2.0.3/ojdbc6-11.2.0.3.jar | + + + +## 2. 数据源功能的启用 + +linkis的启动脚本中默认不会启动数据源相关的服务两个服务(ps-data-source-manager,ps-metadatamanager), +如果想使用数据源服务,可以通过如下方式进行开启: +修改`$LINKIS_CONF_DIR/linkis-env.sh`中的 `export ENABLE_METADATA_MANAGER=true`值为true。 +通过linkis-start-all.sh/linkis-stop-all.sh 进行服务启停时,会进行数据源服务的启动与停止。 + +通过eureka页面查看服务是否正常启动 + +![datasource eureka](/Images-zh/deployment/datasource/eureka.png) + +:::caution 注意 +- 1.linkis的管理台web版本需要配合升级至1.1.0版本才能在linkis管理台上使用数据源管理页面功能。 +- 2.目前数据源中已有mysql/hive/kafak/elasticsearch的jar包, 但是kafak/elasticsearch数据源未经过严格的测试,不保证功能的完整可用性。 +::: + +## 3. 数据源的使用 +数据源的使用分为三步: +- step 1. 创建数据源/配置连接参数 +- step 2. 发布数据源,选择要使用的连接配置版本 +- step 3. 数据源使用,查询元数据信息 +,hive/kafka/elasticsearch配置是关联对应的集群环境配置. + +### 3.1 jdbc 数据源 +#### 3.1.1 通过管理台创建 +>只能创建配置数据源,以及测试数据源是否能正常连接,无法进行直接进行元数据查询 + +底层实现一个通用jdbc模块,web界面上可以选择下表中任意一种数据源 + +| Data Source | Link | +| ----------- |----------- | +| mysql | https://www.mysql.com | +| oracle | https://www.oracle.com/database/technologies | +| kingbase | https://www.kingbase.com.cn | +| postgresql | https://www.postgresql.org | +| sqlserver | https://www.microsoft.com/en-us/sql-server | +| db2 | https://www.ibm.com/products/db2/database | +| greenplum | https://greenplum.org | +| dm | https://dmdatabases.com | +| doris | https://doris.apache.org | +| clickhouse | https://clickhouse.com | + + +以mysql为例: + +> 数据源管理>新增数据源>选择mysql类型 + + +输入相关的配置信息 + +![create mysql](/Images-zh/deployment/datasource/create_mysql.png) + +录入成功后可以通过连接测试验证是否能够正常进行连接 + + +:::caution 注意 +- 通过管理台创建的数据源归属的system是Linkis +- 创建成功后,还需要进行发布(发布时进行配置参数版本的切换和选择),才能被正常使用 +::: + +配置的发布(使用那个配置进行数据源的建连): + +点击版本后再弹窗页面选择合适的配置进行发布 + +![publish](/Images-zh/deployment/datasource/publish_version.png) + + +#### 3.1.2 使用客户端 + +scala 代码示例: +```scala +package org.apache.linkis.datasource.client +import java.util +import java.util.concurrent.TimeUnit + +import org.apache.linkis.common.utils.JsonUtils +import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient} +import org.apache.linkis.datasource.client.request._ +import org.apache.linkis.datasource.client.response._ +import org.apache.linkis.datasourcemanager.common.domain.DataSource +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder +import org.junit.jupiter.api.{Disabled, Test} + +object TestMysqlClient { + + val gatewayUrl = "http://127.0.0.1:9001" + val clientConfig = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val dataSourceclient = new LinkisDataSourceRemoteClient(clientConfig.build()) + + val clientConfig2 = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig2.build()) + + @Test + @Disabled + def testCreateDataSourceMysql: Unit = { + val user = "hadoop" + val system = "Linkis" + + //创建数据源 + val dataSource = new DataSource(); + val dataSourceName = "for-mysql-test" + dataSource.setDataSourceName(dataSourceName) + dataSource.setDataSourceDesc("this is for mysql test") + dataSource.setCreateSystem(system) + dataSource.setDataSourceTypeId(1L) + + val map = JsonUtils.jackson.readValue(JsonUtils.jackson.writeValueAsString(dataSource), new util.HashMap[String, Any]().getClass) + val createDataSourceAction: CreateDataSourceAction = CreateDataSourceAction.builder() + .setUser(user) + .addRequestPayloads(map) + .build() + val createDataSourceResult: CreateDataSourceResult = dataSourceclient.createDataSource(createDataSourceAction) + val dataSourceId = createDataSourceResult.getInsertId + + + //设置连接参数 + val params = new util.HashMap[String, Any] + + val connectParams = new util.HashMap[String, Any] + connectParams.put("host", "127.0.0.1") + connectParams.put("port", "36000") + connectParams.put("username", "db username") + connectParams.put("password", "db password") + + params.put("connectParams", connectParams) + params.put("comment", "init") + + val updateParameterAction: UpdateDataSourceParameterAction = UpdateDataSourceParameterAction.builder() + .setUser(user) + .setDataSourceId(dataSourceId) + .addRequestPayloads(params) + .build() + val updateParameterResult: UpdateDataSourceParameterResult = dataSourceclient.updateDataSourceParameter(updateParameterAction) + + val version: Long = updateParameterResult.getVersion + + //发布配置版本 + dataSourceclient.publishDataSourceVersion( + PublishDataSourceVersionAction.builder() + .setDataSourceId(dataSourceId) + .setUser(user) + .setVersion(version) + .build()) + + //使用示例 + val metadataGetDatabasesAction: MetadataGetDatabasesAction = MetadataGetDatabasesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setSystem(system) + .build() + val metadataGetDatabasesResult: MetadataGetDatabasesResult = metaDataClient.getDatabases(metadataGetDatabasesAction) + + val metadataGetTablesAction: MetadataGetTablesAction = MetadataGetTablesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis") + .setSystem(system) + .build() + val metadataGetTablesResult: MetadataGetTablesResult = metaDataClient.getTables(metadataGetTablesAction) + + val metadataGetColumnsAction = MetadataGetColumnsAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis") + .setSystem(system) + .setTable("linkis_datasource") + .build() + val metadataGetColumnsResult: MetadataGetColumnsResult = metaDataClient.getColumns(metadataGetColumnsAction) + + } +} + +``` +#### 3.1.3 Linkis已支持的JDBC EngineConn +- MySQL +- Oracle +- KingBase +- PostgreSQL +- SQLServer +- DB2 +- Greenplum +- DM +- Doris +- ClickHouse +- TiDB +- Starrocks +- Gaussdb +- OceanBase + +### 3.2 Hive 数据源 + +#### 3.2.1 通过管理台创建 + +>只能创建配置数据源,以及测试数据源是否能正常连接,无法进行直接进行元数据查询 + +先需要进行集群环境信息的配置 + +表`linkis_ps_dm_datasource_env` +```roomsql +INSERT INTO `linkis_ps_dm_datasource_env` +(`env_name`, `env_desc`, `datasource_type_id`, `parameter`,`create_user`,`modify_user`) +VALUES +('testEnv', '测试环境', 4, +'{\r\n "uris": "thrift://clustername:9083",\r\n "keytab": "4dd408ad-a2f9-4501-83b3-139290977ca2",\r\n "principle":"hadoop@WEBANK.COM",\r\n "hadoopConf":{"hive.metastore.execute.setugi":"true"}\r\n}', +'user','user'); +``` +主键id作为envId,在建立连接时,需要通过此envId参数,获取集群配置相关信息。 +配置字段解释: +``` +{ + "uris": "thrift://clustername:9083", # 必选 如果未开启kerberos认证 下列[keytab][principle]参数可以为空 + "keytab": "bml resource id",//keytab 存储再物料库中的resourceId,目前需要通过http接口手动上传。 + "principle":"hadoop@WEBANK.COM" //认证的principle + "hadoopConf":{} //额外的连接参数 可选 +} +``` + +keytab的resourceId获取方式,目前基础数据管理功能还在规划中,可以通过http接口请求获取到 +参考示例 +```shell script +curl --form "file=@文件路径" \ +--form system=子系统名 \ +-H "Token-Code:认证token" \ +-H "Token-User:认证用户名" \ +http://linkis-gatewayip:port/api/rest_j/v1/bml/upload + +示例: +curl --form "file=@/appcom/keytab/hadoop.keytab" \ +--form system=ABCD \ +-H "Token-Code:QML-AUTH" \ +-H "Token-User:hadoop" \ +http://127.0.0.1:9001/api/rest_j/v1/bml/upload + +请求结果中的resourceId 即为对应的`bml resource id`值 +{"method":"/bml/upload","status":0,"message":"The task of submitting and uploading resources was successful(提交上传资源任务成功)","data":{"resourceId":"6e4e54fc-cc97-4d0d-8d5e-a311129ec84e","version":"v000001","taskId":35}} +``` + + +web端创建: + +![create_hive](/Images-zh/deployment/datasource/create_hive.png) + +#### 3.2.2 使用客户端 +```scala +package org.apache.linkis.datasource.client + +import java.util +import java.util.concurrent.TimeUnit + +import org.apache.linkis.common.utils.JsonUtils +import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient} +import org.apache.linkis.datasource.client.request._ +import org.apache.linkis.datasource.client.response._ +import org.apache.linkis.datasourcemanager.common.domain.DataSource +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder +import org.junit.jupiter.api.{Disabled, Test} + +object TestHiveClient { + val gatewayUrl = "http://127.0.0.1:9001" + val clientConfig = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val dataSourceclient = new LinkisDataSourceRemoteClient(clientConfig.build()) + + val clientConfig2 = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig2.build()) + + + @Test + @Disabled + def testCreateDataSourceMysql: Unit = { + val user = "hadoop" + val system = "Linkis" + + //创建数据源 + val dataSource = new DataSource(); + val dataSourceName = "for-hive-test" + dataSource.setDataSourceName(dataSourceName) + dataSource.setDataSourceDesc("this is for hive test") + dataSource.setCreateSystem(system) + dataSource.setDataSourceTypeId(4L) + + val map = JsonUtils.jackson.readValue(JsonUtils.jackson.writeValueAsString(dataSource), new util.HashMap[String, Any]().getClass) + val createDataSourceAction: CreateDataSourceAction = CreateDataSourceAction.builder() + .setUser(user) + .addRequestPayloads(map) + .build() + val createDataSourceResult: CreateDataSourceResult = dataSourceclient.createDataSource(createDataSourceAction) + val dataSourceId = createDataSourceResult.getInsertId + + //设置连接参数 + val params = new util.HashMap[String, Any] + val connectParams = new util.HashMap[String, Any] + connectParams.put("envId", "3") + params.put("connectParams", connectParams) + params.put("comment", "init") + + val updateParameterAction: UpdateDataSourceParameterAction = UpdateDataSourceParameterAction.builder() + .setUser(user) + .setDataSourceId(dataSourceId) + .addRequestPayloads(params) + .build() + val updateParameterResult: UpdateDataSourceParameterResult = dataSourceclient.updateDataSourceParameter(updateParameterAction) + + val version: Long = updateParameterResult.getVersion + + //发布配置版本 + dataSourceclient.publishDataSourceVersion( + PublishDataSourceVersionAction.builder() + .setDataSourceId(dataSourceId) + .setUser(user) + .setVersion(version) + .build()) + + //使用示例 + val metadataGetDatabasesAction: MetadataGetDatabasesAction = MetadataGetDatabasesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setSystem(system) + .build() + val metadataGetDatabasesResult: MetadataGetDatabasesResult = metaDataClient.getDatabases(metadataGetDatabasesAction) + + val metadataGetTablesAction: MetadataGetTablesAction = MetadataGetTablesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis_test_ind") + .setSystem(system) + .build() + val metadataGetTablesResult: MetadataGetTablesResult = metaDataClient.getTables(metadataGetTablesAction) + + + + val metadataGetColumnsAction = MetadataGetColumnsAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis_test_ind") + .setSystem(system) + .setTable("test") + .build() + val metadataGetColumnsResult: MetadataGetColumnsResult = metaDataClient.getColumns(metadataGetColumnsAction) + + } +} +``` + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/dynamic-variables.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/dynamic-variables.md new file mode 100644 index 00000000000..3810b8674bb --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/dynamic-variables.md @@ -0,0 +1,342 @@ +--- +title: 内置时间变量 +sidebar_position: 7 +--- + +## 1. 总述 +### 需求 +1. 用户希望Linkis能够提供一些公共变量然后执行的时候进行替换,比如用户每天都会批量跑同一段sql,需要指定上一天的分区时间,如果基于sql去写会比较复杂如果系统提供一个run_date的变量将会非常方便使用。 +2. 用户希望Linkis支持date pattern计算,支持在代码中写&{YYYY-MM-DD}等变量计算时间变量 +3. 用户希望自己定义变量,比如定一个一个float变量,然后在代码中进行使用 + +### 目标 +1. 支持任务代码的变量替换 +2. 支持自定义变量,支持用户在脚本和提交给Linkis的任务参数定义自定义变量,支持简单的+,-等计算 +3. 预设置系统变量:run_date,run_month,run_today等系统变量 +4. 支持date pattern变量,支持pattern的+,-操作 + +具体技术架构可以参考: +[Linkis自定义变量](https://linkis.apache.org/docs/latest/architecture/commons/variable/) + +## 2 自定义变量功能介绍 +     Linkis支持的变量类型分为自定义变量和系统内置变量,内部变量是Linkis预先定义好的,可以直接进行使用。然后不同的变量类型支持不同的计算格式:String支持+、整数小数支持+-*/,日期支持+-。 + +### 2.1 内置变量 +目前已支持的内置变量如下: +(下表中的变量值举例以闰年的20240229作为特殊日期) + +| 变量名 | 变量类型 | 变量含义 | 变量值举例 | +| ------ | -------- | -------- | ---------- | +| run\_date | String | 数据统计时间(支持用户自己设定,默认设置为当前时间的前一天),如今天执行昨天的数据,则为昨天的时间,格式为 yyyyMMdd | 20240229 | +| run\_date\_std | String | 数据统计时间(标准日期格式),如今天执行昨天数据,则为昨天的时间,格式为 yyyy-MM-dd | 2024-02-29 | +| run_today | String | run_date (数据统计时间) 的后一天,格式为 yyyyMMdd | 20240301 | +| run_today_std | String | run_date (数据统计时间) 的后一天(标准格式),格式为 yyyy-MM-dd | 2024-03-01 | +| run_mon | String | run_date所在月,格式为 yyyyMM | 202402 | +| run_mon_std | String | run_date所在月(标准格式),格式为 yyyy-MM | 2024-02 | +| run\_month\_begin | String | 数据统计时间所在月的第一天,格式为 yyyyMMdd | 20240201 | +| run\_month\_begin\_std | String | run_date 所在月的第一天(标准日期格式),格式为 yyyy-MM-dd | 2024-02-01 | +| run_month_now_begin | String | run_today所在上月的第一天,格式为 yyyyMMdd | 20240201 | +| run_month_now_begin_std | String | run_today所在上月的第一天(标准格式),格式为 yyyy-MM-dd | 2024-02-01 | +| run\_month\_end | String | run_date所在月的最后一天,格式为 yyyyMMdd | 20240229 | +| run\_month\_end\_std | String | run_date 所在月的最后一天(标准日期格式),格式为 yyyy-MM-dd | 2024-02-29 | +| run_month_now_end | String | run_today 所在上月的最后一天,格式为 yyyyMMdd | 20240229 | +| run_month_now_end_std | String | run_today 所在上月的最后一天(标准日期格式),格式为 yyyy-MM-dd | 2024-02-29 | +| run_quarter_begin | String | run_date所在季度的第一天,格式为 yyyyMMdd | 20240101 | +| run_quarter_end | String | run_date 所在季度的最后一天,格式为 yyyyMMdd | 20240331 | +| run_half_year_begin | String | run_date 所在半年的第一天,格式为 yyyyMMdd | 20240101 | +| run_half_year_end | String | run_date所在半年的最后一天,格式为 yyyyMMdd | 20240630 | +| run_year_begin | String | run_date所在年的第一天,格式为 yyyyMMdd | 20240101 | +| run_year_end | String | run_date所在年的最后一天,格式为 yyyyMMdd | 20241231 | +| run_quarter_begin_std | String | run_date所在季度的第一天(标准格式),格式为 yyyy-MM-dd | 2024-01-01 | +| run_quarter_end_std | String | run_date所在季度的最后一天(标准格式),格式为 yyyy-MM-dd | 2024-03-31 | +| run_half_year_begin_std | String | run_date所在半年的第一天(标准格式),格式为 yyyy-MM-dd | 2024-01-01 | +| run_half_year_end_std | String | run_date所在半年的最后一天(标准格式),格式为 yyyy-MM-dd | 2024-06-30 | +| run_year_begin_std | String | run_date所在年的第一天(标准格式),格式为 yyyy-MM-dd | 2024-01-01 | +| run_year_end_std | String | run_date所在年的最后一天(标准格式),格式为 yyyy-MM-dd | 2024-12-31 | +| run_tody_h | String | run_today任务运行的时间, yyyyMMddHH | 2024030111 | +| run_tody_h_std | String | run_today任务运行的时间 yyyy-MM-dd HH | 2024-03-01 11 | + +具体细节: + +1、run_date为核心自带日期变量,支持用户自定义日期,如果不指定默认为当前系统时间的前一天。 +2、其他衍生内置日期变量定义:其他日期内置变量都是相对run_date计算出来的,一旦run_date变化,其他变量值也会自动跟着变化,其他日期变量不支持设置初始值,只能通过修改run_date进行修改。 +3、内置变量支持更加丰富的使用场景:${run_date-1}为run_data的前一天;${run_month_begin-1}为run_month_begin的上个月的第一天,这里的-1表示减一个月。 + +以sql为例的例子: +``` +--@set run_date=20240229 +select +"${run_date}" as run_date, +"${run_date_std}" as run_date_std, +"${run_today}" as run_today, +"${run_today_std}" as run_today_std, +"${run_mon}" as run_mon, +"${run_mon_std}" as run_mon_std, +"${run_month_begin}" as run_month_begin, +"${run_month_begin_std}" as run_month_begin_std, +"${run_month_now_begin}" as run_month_now_begin, +"${run_month_now_begin_std}" as run_month_now_begin_std, +"${run_month_end}" as run_month_end, +"${run_month_end_std}" as run_month_end_std, +"${run_month_now_end}" as run_month_now_end, +"${run_month_now_end_std}" as run_month_now_end_std, +"${run_quarter_begin}" as run_quarter_begin, +"${run_quarter_end}" as run_quarter_end, +"${run_half_year_begin}" as run_half_year_begin, +"${run_half_year_end}" as run_half_year_end, +"${run_year_begin}" as run_year_begin, +"${run_year_end}" as run_year_end, +"${run_quarter_begin_std}" as run_quarter_begin_std, +"${run_quarter_end_std}" as run_quarter_end_std, +"${run_half_year_begin_std}" as run_half_year_begin_std, +"${run_half_year_end_std}" as run_half_year_end_std, +"${run_year_begin_std}" as run_year_begin_std, +"${run_year_end_std}" as run_year_end_std, +"${run_today_h}" as run_tody_h, +"${run_today_h_std}" as run_tody_h_std + +编译替换后的内容: +select +"20240229" as run_date, +"2024-02-29" as run_date_std, +"20240301" as run_today, +"2024-03-01" as run_today_std, +"202402" as run_mon, +"2024-02" as run_mon_std, +"20240201" as run_month_begin, +"2024-02-01" as run_month_begin_std, +"20240201" as run_month_now_begin, +"2024-02-01" as run_month_now_begin_std, +"20240229" as run_month_end, +"2024-02-29" as run_month_end_std, +"20240229" as run_month_now_end, +"2024-02-29" as run_month_now_end_std, +"20240101" as run_quarter_begin, +"20240331" as run_quarter_end, +"20240101" as run_half_year_begin, +"20240630" as run_half_year_end, +"20240101" as run_year_begin, +"20241231" as run_year_end, +"2024-01-01" as run_quarter_begin_std, +"2024-03-31" as run_quarter_end_std, +"2024-01-01" as run_half_year_begin_std, +"2024-06-30" as run_half_year_end_std, +"2024-01-01" as run_year_begin_std, +"2024-12-31" as run_year_end_std, +"2024030111" as run_tody_h, +"2024-03-01 11" as run_tody_h_std + +``` + +### 2.2 自定义变量 +     什么是自定义变量?先定义,后使用的用户变量。用户自定义变量暂时支持字符串,整数,浮点数变量的定义,其中字符串支持+法,整数和浮点数支持+-*/方法。用户自定义变量与SparkSQL和HQL本身支持的set变量语法不冲突,但是不允许同名。如何定义和使用自定义变量?如下: +``` +## 代码中定义,在任务代码前进行指定 +sql类型定义方式: +--@set f=20.1 +python/Shell类型定义如下: +#@set f=20.1 +注意:只支持一行定义一个变量 +``` +使用都是直接在代码中使用通过 ```{varName表达式},如${f*2}``` + +### 2.3 变量作用域 +在linkis中自定义变量也有作用域,优先级为脚本中定义的变量大于在任务参数中定义的Variable大于内置的run_date变量。任务参数中定义如下: +``` +## restful +{ + "executionContent": {"code": "select \"${f-1}\";", "runType": "sql"}, + "params": { + "variable": {f: "20.1"}, + "configuration": { + "runtime": { + "linkis.openlookeng.url":"http://127.0.0.1:9090" + } + } + }, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.sql"}, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +## java SDK +JobSubmitAction.builder + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) //execute user + .setLabels(labels) + .setVariableMap(varMap) //setVar + .build +``` + +## 3. Date Pattern变量介绍 + +### 3.1 功能 + +* 支持Pattern格式时间且用户可以自行随意指定 +* Pattern日期变量都是相对run_date计算出来的 +* 支持±y/±M/±d/±H等等 +* 其中+-是先对linkis内置参数run_date进行运算,然后将%之前的pattern字段进行替换,非Pattern字符不支持运算替换。 + +Pattern格式对照表: + +Letter| Date or Time Component| Presentation| Examples +----- | ----- | ----- | ----- +G |Era designator |Text |AD +y |Year |Year |1996; 96 +Y |Week year |Year |2009; 09 +M |Month in year |Month| July; Jul; 07 +w |Week in year |Number |27 +W |Week in month |Number |2 +D |Day in year |Number| 189 +d |Day in month |Number |10 +F |Day of week in month| Number |2 +E |Day name in week |Text |Tuesday; Tue +u |Day number of week (1 = Monday, …, 7 = Sunday) |Number |1 +a |Am/pm marker |Text |PM +H |Hour in day (0-23) |Number| 0 +k |Hour in day (1-24)| Number |24 +K |Hour in am/pm (0-11)| Number |0 +h |Hour in am/pm (1-12) |Number |12 +m |Minute in hour |Number |30 +s |Second in minute |Number| 55 +S |Millisecond |Number |978 +z |Time zone |General time zone |Pacific Standard Time; PST; GMT-08:00 +Z |Time zone |RFC 822 time zone |-0800 +X |Time zone |ISO 8601 time zone |-08; -0800; -08:00 + + +### 3.2 Date Pattern变量举例 +可以根据自己的喜好/业务实际情况定义需要动态渲染的参数 + +variable | result +--- | --- +&{yyyy-01-01} | 2021-01-01 +&{yyyy-01-01%-2y} | 2019-01-01 +&{yyyy-MM-01%-2M} | 2021-02-01 +&{yyyy-MM-dd%-2d} | 2021-03-31 +&{yyyy MM ----- HH%-1H} | 2021 04 ----- 14 +&{yyyyMMdd%-1d} | 20210401 +&{yyyyMM01%-1M} | 20210301 +&{HH%-1H} | 14 + +### 3.3 Date Pattern变量使用实例 + +* 例子1: sql +```sql +SELECT * FROM hive.tmp.fund_nav_histories +WHERE dt <= DATE_FORMAT(DATE_ADD('day', -1, DATE(Date_parse('&{yyyyMMdd%-1d}', '%Y%m%d'))), '%Y%m%d') +``` +渲染后 +```sql +SELECT * FROM hive.tmp.fund_nav_histories +WHERE dt <= DATE_FORMAT(DATE_ADD('day', -1, DATE(Date_parse('20220705', '%Y%m%d'))), '%Y%m%d') +``` + +* 例子2: shell +```shell +aws s3 ls s3://***/ads/tmp/dws_member_active_detail_d_20210601_20211231/pt=&{yyyyMMdd%-1d}/ +``` +渲染后 +```shell +aws s3 ls s3://***/ads/tmp/dws_member_active_detail_d_20210601_20211231/pt=20220705/ +``` + +* 例子3: datax json +```json +{ + "job": { + "setting": { + "speed": { + "channel": 1 + } + }, + "content": [ + { + "reader": { + "name": "s3reader", + "parameter": { + "bucket": "**************", + "path": [ + "ads/tmp/ccass_tm_announcements/&{yyyyMMdd%-1d}/" + ], + "stored": "parquet", + "compression": "NONE", + "column": [ + { + "index": 0, + "type": "int" + }, + { + "index": 1, + "type": "string", + "constant": "&{yyyyMMdd%-1d}" + } + ] + } + }, + "writer": { + "name": "streamwriter", + "parameter": { + "print": true + } + } + } + ] + } +} +``` +渲染后 +```json +{ + "job": { + "setting": { + "speed": { + "channel": 1 + } + }, + "content": [ + { + "reader": { + "name": "s3reader", + "parameter": { + "bucket": "**************", + "path": [ + "ads/tmp/ccass_tm_announcements/20220705/" + ], + "stored": "parquet", + "compression": "NONE", + "column": [ + { + "index": 0, + "type": "int" + }, + { + "index": 1, + "type": "string", + "constant": "20220705" + } + ] + } + }, + "writer": { + "name": "streamwriter", + "parameter": { + "print": true + } + } + } + ] + } +} +``` +* 例子4:python +```python +print(&{yyyyMMdd%-1d}) +``` +渲染后 +``` + 20220705 +``` \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/how-to-use.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/how-to-use.md new file mode 100644 index 00000000000..218d437b290 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/how-to-use.md @@ -0,0 +1,24 @@ +--- +title: 如何使用 Linkis +sidebar_position: 1 +--- + +        Linkis为了满足不同的使用场景需求,提供多种使用和接入方式,概括为三类,分别是Client端使用、Scriptis端使用、DataSphere Studio端使用,其中Scriptis和DataSphere Studio是微众银行大数据平台室开源的数据分析平台,由于这两个项目本质上完全兼容Linkis,所以通过Scriptis和DataSphere Studio使用Linkis最为简单。 +## 1. Client端使用 + +        如果需要在Linkis的基础上,接入其它应用,需要针对Linkis提供的接口进行开发,Linkis提供了多种客户端接入接口,更详细的使用介绍可以参考以下内容: +- [**Restful API使用方式**](api/linkis-task-operator.md) +- [**JDBC API使用方式**](api/jdbc-api.md) +- [**Java SDK使用方式**](../user-guide/sdk-manual.md) +## 2. Scriptis使用Linkis +        如果需要使用Linkis完成交互式在线分析处理的工作,并且不需要诸如工作流开发、工作流调度、数据服务等数据分析应用工具,可以单独安装[**Scriptis**](https://github.com/WeBankFinTech/Scriptis),详细安装教程可参考其对应的安装部署文档。 +### 2.1. 使用Scriptis执行脚本 +        目前Scriptis支持向Linkis提交多种任务类型,包括Spark SQL、Hive SQL、Scala、PythonSpark等,为了满足数据分析的需求,Scriptis左侧,提供查看用户工作空间信息、用户数据库和表信息、用户自定义函数,以及HDFS目录,同时支持上传下载,结果集导出等功能。Scriptis使用Linkis十分简单,可以很方便的在编辑栏书写脚本,提交到Linkis运行。 +![Scriptis使用Linkis](/Images-zh/EngineUsage/sparksql-run.png) +### 2.2. Scriptis管理台 +        Linkis提供资源配置和管理的接口,如果希望对任务资源进行配置管理,可以在Scriptis的管理台界面进行设置,包括队列设置、资源配置、引擎实例个数等。通过管理台,可以很方便的配置向Linkis提交任务的资源,使得更加方便快捷。 +![Scriptis使用Linkis](/Images-zh/EngineUsage/queue-set.png) + +## 3. DataSphere Studio使用Linkis +        [**DataSphere Studio**](https://github.com/WeBankFinTech/DataSphereStudio)简称DSS,是微众银行大数据平台开源的一站式数据分析处理平台,DSS交互式分析模块集成了Scriptis,使用DSS进行交互式分析和Scriptis一样,除了提供Scriptis的基本功能外,DSS提供和集成了更加丰富和强大的数据分析功能,包括用于数据提取的数据服务、开发报表的工作流、可视化分析软件Visualis等。由于原生的支持,目前DSS是与Linkis集成度最高的软件,如果希望使用完整的Linkis功能,建议使用DSS搭配Linkis一起使用。 +![DSS运行工作流](/Images-zh/EngineUsage/workflow.png) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-app.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-app.png new file mode 100644 index 00000000000..b7cb3d5edd3 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-app.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-engine-btn.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-engine-btn.png new file mode 100644 index 00000000000..aae816f7958 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-engine-btn.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-engine.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-engine.png new file mode 100644 index 00000000000..09cb047501d Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-engine.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-spark-engine.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-spark-engine.png new file mode 100644 index 00000000000..83301467232 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/add-spark-engine.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/administrator-view.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/administrator-view.png new file mode 100644 index 00000000000..f5b7041b3d1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/administrator-view.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-bml.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-bml.png new file mode 100644 index 00000000000..95ccfc4dd6b Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-bml.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-code.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-code.png new file mode 100644 index 00000000000..831aadfcce3 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-code.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-ext.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-ext.png new file mode 100644 index 00000000000..2c14c8eb621 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-ext.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-token.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-token.png new file mode 100644 index 00000000000..7508b371f62 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/basic-token.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/click-yarn.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/click-yarn.png new file mode 100644 index 00000000000..020bc40d29c Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/click-yarn.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/configuration-interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/configuration-interface.png new file mode 100644 index 00000000000..deadf64dfbf Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/configuration-interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/datasource-manage.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/datasource-manage.png new file mode 100644 index 00000000000..aed522b52f8 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/datasource-manage.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/del-app.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/del-app.png new file mode 100644 index 00000000000..88644c4ee23 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/del-app.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/deque-resource.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/deque-resource.png new file mode 100644 index 00000000000..7297571d749 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/deque-resource.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ds-auth.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ds-auth.png new file mode 100644 index 00000000000..b5ba7720592 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ds-auth.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ds-class.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ds-class.png new file mode 100644 index 00000000000..4ae4b5d43ab Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ds-class.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-btn.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-btn.png new file mode 100644 index 00000000000..e5dbdd6b951 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-btn.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-engine-label.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-engine-label.png new file mode 100644 index 00000000000..2dcbcb23486 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-engine-label.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-engine.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-engine.png new file mode 100644 index 00000000000..1cd79648d5e Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-engine.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-management.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-management.png new file mode 100644 index 00000000000..e53f4e7b2a7 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ecm-management.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/edit-directory.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/edit-directory.png new file mode 100644 index 00000000000..7a30e3e8da0 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/edit-directory.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/edit-label.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/edit-label.png new file mode 100644 index 00000000000..d0ddc0ce512 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/edit-label.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/editing-interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/editing-interface.png new file mode 100644 index 00000000000..e611e3e0efd Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/editing-interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-conf.png new file mode 100644 index 00000000000..8df8b3e0ef1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-information.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-information.png new file mode 100644 index 00000000000..a182e840367 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-information.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-log.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-log.png new file mode 100644 index 00000000000..926aa57be35 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-log.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-memory.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-memory.png new file mode 100644 index 00000000000..a99b95034d4 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-memory.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-view-log.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-view-log.png new file mode 100644 index 00000000000..290b9bb5c82 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/engine-view-log.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/env-edit.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/env-edit.png new file mode 100644 index 00000000000..5845f7339fd Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/env-edit.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/env-list.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/env-list.png new file mode 100644 index 00000000000..fd60c8109d8 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/env-list.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka-btn.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka-btn.png new file mode 100644 index 00000000000..82e52b6c8c2 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka-btn.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka-registration-center.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka-registration-center.png new file mode 100644 index 00000000000..9585c20747f Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka-registration-center.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka.png new file mode 100644 index 00000000000..dc2a5f6b83c Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/eureka.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/executor-count.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/executor-count.png new file mode 100644 index 00000000000..1063b956715 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/executor-count.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/executor-memory.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/executor-memory.png new file mode 100644 index 00000000000..e3647e921c1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/executor-memory.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-con.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-con.png new file mode 100644 index 00000000000..92d397bd241 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-con.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-conf.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-conf.png new file mode 100644 index 00000000000..b83545c2344 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-conf.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-core.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-core.png new file mode 100644 index 00000000000..0bf8f819fa1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-core.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-cpu.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-cpu.png new file mode 100644 index 00000000000..7d4c4cb1eec Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-cpu.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history-interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history-interface.png new file mode 100644 index 00000000000..59eee9b142f Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history-interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history-query-button.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history-query-button.png new file mode 100644 index 00000000000..eec31de51a1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history-query-button.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history.png new file mode 100644 index 00000000000..eec31de51a1 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-history.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-limit.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-limit.png new file mode 100644 index 00000000000..502599ac32d Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-limit.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-var.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-var.png new file mode 100644 index 00000000000..410590a663d Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-var.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-variable-interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-variable-interface.png new file mode 100644 index 00000000000..89b1cf2686f Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/global-variable-interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/history-engine.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/history-engine.png new file mode 100644 index 00000000000..1d1807f0d5b Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/history-engine.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/history-interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/history-interface.png new file mode 100644 index 00000000000..59eee9b142f Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/history-interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/hive-con.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/hive-con.png new file mode 100644 index 00000000000..5ab196f758b Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/hive-con.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/list-app.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/list-app.png new file mode 100644 index 00000000000..0bf230d699f Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/list-app.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/management-interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/management-interface.png new file mode 100644 index 00000000000..47647324d0e Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/management-interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/microservice-Interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/microservice-Interface.png new file mode 100644 index 00000000000..593edb40da3 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/microservice-Interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/microservice-list.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/microservice-list.png new file mode 100644 index 00000000000..f12164294ed Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/microservice-list.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ms-edit.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ms-edit.png new file mode 100644 index 00000000000..b6f414db1ad Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/ms-edit.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/new-application-type.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/new-application-type.png new file mode 100644 index 00000000000..f260c3df520 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/new-application-type.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-administrator.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-administrator.png new file mode 100644 index 00000000000..574fe9c2006 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-administrator.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-button.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-button.png new file mode 100644 index 00000000000..5beb5678bab Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-button.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-interface.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-interface.png new file mode 100644 index 00000000000..a4a76435f59 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management-interface.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management.png new file mode 100644 index 00000000000..a4a76435f59 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/resource-management.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/set-spark-param.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/set-spark-param.png new file mode 100644 index 00000000000..11845f95c51 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/set-spark-param.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/spark-con.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/spark-con.png new file mode 100644 index 00000000000..3f754a9b110 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/spark-con.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/spark-resource.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/spark-resource.png new file mode 100644 index 00000000000..e89a314d5ed Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/spark-resource.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/task-log-single.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/task-log-single.png new file mode 100644 index 00000000000..ff0ed867f7c Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/task-log-single.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/task-log.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/task-log.png new file mode 100644 index 00000000000..ff0ed867f7c Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/task-log.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/udf-cllass.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/udf-cllass.png new file mode 100644 index 00000000000..91956c33a07 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/udf-cllass.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/view-engine-information.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/view-engine-information.png new file mode 100644 index 00000000000..2ecd27c9861 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/view-engine-information.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-cpu.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-cpu.png new file mode 100644 index 00000000000..8861efe8f01 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-cpu.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-deque.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-deque.png new file mode 100644 index 00000000000..f73920afe28 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-deque.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-instance.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-instance.png new file mode 100644 index 00000000000..ab8763b9e1f Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-instance.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-write.png b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-write.png new file mode 100644 index 00000000000..0fd6c1b4876 Binary files /dev/null and b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/images/yarn-write.png differ diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/linkiscli-manual.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/linkiscli-manual.md new file mode 100644 index 00000000000..720ca41ee8c --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/linkiscli-manual.md @@ -0,0 +1,238 @@ +--- +title: Shell 方式 +sidebar_position: 2 +--- + +## 1. 介绍 + +Linkis-Cli 是一个用于向Linkis提交任务的Shell命令行程序。 + +## 2. 基础案例 + +您可以参照下面的例子简单地向Linkis提交任务 + +第一步,检查conf/目录下是否存在默认配置文件`linkis-cli.properties`,且包含以下配置: + +```properties + #linkis-mg-gateway服务地址 + wds.linkis.client.common.gatewayUrl=http://127.0.0.1:9001 + #认证鉴权策略 token/static + wds.linkis.client.common.authStrategy=token + #static 模式下为用户名/密码,token模式下为linkis-mg-gateway_auth_token表中token_name 和logal_users + wds.linkis.client.common.tokenKey=Validation-Code + wds.linkis.client.common.tokenValue=BML-AUTH +``` + +第二步,进入linkis安装目录,输入指令: + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop +``` + +第三步,您会在控制台看到任务被提交到linkis,并开始执行的信息。 + +linkis-cli目前仅支持同步提交,即向linkis提交任务后,不断询问任务状态、拉取任务日志,直至任务结束。任务结束时状态如果为成功,linkis-cli还会主动拉取结果集并输出。 + + +## 3. 使用方式 + +```bash + sh ./bin/linkis-cli [客户端参数][引擎参数] [启动运行参数] +``` + +## 4. 支持的参数列表 + +* 客户端参数 + + | 参数 | 说明 | 数据类型 | 是否必填 | + | ----------- | -------------------------- | -------- | ---- | + | --gatewayUrl | 手动指定linkis-mg-gateway服务的地址 | String | 否 | + | --authStg | 指定认证策略 token/static | String | 否 | + | --authKey | 指定认证key | String | 否 | + | --authVal | 指定认证value | String | 否 | + | --userConf | 指定配置文件位置 | String | 否 | + | --kill | 指定kill的taskId,执行任务停止命令 | String | 否 | + | --log | 指定执行的相关日志路径 | String | 否 | + | --result | | String | 否 | + | --status | | String | 否 | + | --async | | String | 否 | + | --mode | ujes/once | String | 否 | + +* 引擎相关参数 + + | 参数 | 说明 | 数据类型 | 是否必填 | + | ----------- | -------------------------- | -------- | ---- | + | -engineType | 指定此任务的引擎类型,带版本号 如 hive-2.3.3 | String | 是 | + | -codeType | 为此作业指定 linkis的runType 如sql/hql/shell | String | 否 | + | -codePath | 本地执行代码文件路径 | String | 否 | + | -code | 要执行的代码 | String | 否 | + | -scriptPath | 为上传的脚本指定远程路径 | String | 否 | + | -submitUser | 提交的用户 | String | 否 | + | -proxyUser | 指定在 Linkis 服务器端执行您的代码的代理用户 | String | 否 | + | -creator | 指定此任务的创建者,系统级别 如 IDE/LINKISCLI | String | 否 | + | -outPath | 指定结果集的输出路径。 如果未指定,则输出重置为屏幕(标准输出) | String | 否 | + + +* Map启动运行参数 + + | 参数 | 说明 | 数据类型 | 是否必填 | + | ----------- | -------------------------- | -------- | ---- | + | -confMap | 启动参数,可以将任何启动参数放入此 Map(例如 spark.executor.instances),输入格式:-confMap key1=value1 -confMap key2=value2 | String | 是 | + | -runtimeMap | 运行参数,可以将任何运行参数放入此 Map(例如 jdbc.url=jdbc:hive2://xxx:10000), 输入格式:-runtimeMap key1=value1 -runtimeMap key2=value2| String | 是 | + | -varMap | 指定变量映射,变量用于关键字替换。如执行语句'select form ${table_x} limit ${limit_y}' 通过varMap指定关键字变量替换, -varMap table_x=test -varMap limit_y=100 | String | 否 | + | -labelMap | 标签映射| String | 否 | + | -jobContentMap| jobContent 映射 | String | 否 | + + + +## 5. 详细示例 + +### 5.1 客户端参数 + +客户端参数可以通过手动指定的方式传入,此方式会覆盖默认配置文件`linkis-cli.properties`中的冲突配置项 +可以通过配置文件进行配置 +```bash + sh ./bin/linkis-cli --gatewayUrl http://127.0.0.1:9001 --authStg token --authKey [tokenKey] --authVal [tokenValue] -engineType spark-2.4.3 -codeType sql -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop +``` + +### 5.2 添加引擎启动参数 +>按实际使用场景如果不涉及 可以不配置 + +引擎的初始参数可以通过`-confMap`参数添加,注意参数的数据类型是Map,命令行的输入格式如下: +```html +-confMap key1=val1 -confMap key2=val2 ... +``` + + +例如:以下示例设置了引擎启动的yarn队列、spark executor个数等启动参数: + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -confMap wds.linkis.yarnqueue=q02 -confMap spark.executor.instances=3 -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop +``` + +当然,这些参数也支持以配置文件的方式读取,见【5.5 使用用户的配置文件】 + +### 5.2 添加引擎运行参数 +>按实际使用场景,如果不涉及 可以不配置 + +引擎的初始参数可以通过`-runtimeMap`参数添加,注意参数的数据类型是Map,命令行的输入格式如下: +```html +-runtimeMap key1=val1 -confMap key2=val2 ... +``` + + +例如:以下示例设置了jdbc引擎运行是需要的连接地址/用户名/密码 等参数 + +```bash + sh ./bin/linkis-cli -submitUser hadoop -engineType jdbc-4 -codeType jdbc -code "show tables" -runtimeMap jdbc.url=jdbc:mysql://127.0.0.1:36000/hive_meta -runtimeMap jdbc.username=test -runtimeMap jdbc.password=test@123 +``` + +当然,这些参数也支持以配置文件的方式读取,见【5.5 使用用户的配置文件】 + + +### 5.3 添加标签 + +标签可以通过`-labelMap`参数添加,与`-confMap`一样,`-labelMap`参数的类型也是Map: + +```bash + sh /bin/linkis-cli -engineType spark-2.4.3 -codeType sql -labelMap labelKey=labelVal -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop +``` + +### 5.4 变量替换 + +Linkis-cli的变量替换通过`${}`符号和`-varMap`共同实现 + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select count(*) from \${key};" -varMap key=testdb.test -submitUser hadoop -proxyUser hadoop +``` + +执行过程中sql语句会被替换为: + +```mysql-sql + select count(*) from testdb.test +``` + +注意`'\$'`中的转义符是为了防止参数被linux提前解析,如果是`-codePath`指定本地脚本方式,则不需要转义符 + +### 5.5 使用用户的配置文件 + +1. linkis-cli支持加载用户自定义配置文件,配置文件路径通过`--userConf`参数指定,配置文件需要是`.properties`文件格式,默认是使用 `conf/linkis-cli/linkis-cli.properties` 配置文件 + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop --userConf [配置文件路径] +``` + +2. 哪些参数可以配置? + +所有参数都可以配置化,例如: + +cli参数: + +```properties + wds.linkis.client.common.gatewayUrl=http://127.0.0.1:9001 + wds.linkis.client.common.authStrategy=static + wds.linkis.client.common.tokenKey=[静态认证key] + wds.linkis.client.common.tokenValue=[静态认证value] +``` + +参数: + +```properties + wds.linkis.client.label.engineType=spark-2.4.3 + wds.linkis.client.label.codeType=sql +``` + +Map类参数配置化时,key的格式为 + + [Map前缀] + [key] + +>通过前缀区分参数的类型(启动参数,运行参数等) + +Map前缀包括: + + - executionMap前缀: wds.linkis.client.exec + - sourceMap前缀: wds.linkis.client.source + - confMap前缀: wds.linkis.client.param.conf + - runtimeMap前缀: wds.linkis.client.param.runtime + - labelMap前缀: wds.linkis.client.label + + +注意: + +1. variableMap不支持配置化 + +2. 当配置的key和指令参数中已输入的key存在冲突时,优先级如下: + + 指令参数 > 指令Map类型参数中的key > 用户配置 > 默认配置 + +示例: + +配置引擎启动参数: + +```properties + wds.linkis.client.param.conf.spark.executor.instances=3 + wds.linkis.client.param.conf.wds.linkis.yarnqueue=q02 +``` + +配置labelMap参数: + +```properties + wds.linkis.client.label.myLabel=label123 +``` + +### 5.6 输出结果集到文件 + +使用`-outPath`参数指定一个输出目录,linkis-cli会将结果集输出到文件,每个结果集会自动创建一个文件,输出形式如下: + + task-[taskId]-result-[idx].txt + +例如: +```html + task-906-result-1.txt + task-906-result-2.txt + task-906-result-3.txt +``` + + + + diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/sdk-manual.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/sdk-manual.md new file mode 100644 index 00000000000..808fbea0aab --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/sdk-manual.md @@ -0,0 +1,534 @@ +--- +title: SDK 方式 +sidebar_position: 3 +--- + +> Linkis 提供了方便的JAVA和SCALA调用的接口,只需要引入linkis-computation-client的模块就可以进行使用,1.0后新增支持带Label提交的方式,下面将对 SDK 使用方式进行介绍。 + + +**Linkis 支持的引擎版本及脚本类型** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
引擎插件默认支持的版本脚本类型类型说明
Spark2.4.3pypython脚本
scalascala脚本
sqlsql脚本
Hive2.3.3hqlhql脚本
Pythonpython2pythonpython脚本
Shell1shellshell脚本
JDBC4jdbcsql脚本名
Flink1.12.2sqlsql脚本
openLooKeng1.5.0sqlsql脚本
Pipeline1pipeline文件导入导出
Presto0.234psqlsql脚本
Sqoop1.4.6appconn文件导入导出
Elasticsearch7.6.2esjsonjson脚本
essqlsql脚本
trino371tsqlsql脚本
+ +**Linkis 常用标签** + +|标签键|标签值|说明| +|:-|:-|:-| +|engineType| spark-2.4.3 | 指定引擎类型和版本| +|userCreator| user + "-AppName" | 指定运行的用户和您的APPName| +|codeType| sql | 指定运行的脚本类型| +|jobRunningTimeout| 10 | job运行10s没完成自动发起Kill,单位为s| +|jobQueuingTimeout| 10| job排队超过10s没完成自动发起Kill,单位为s| +|jobRetryTimeout| 10000| job因为资源等原因失败重试的等待时间,单位为ms,如果因为队列资源不足的失败,会默认按间隔发起10次重试| +|tenant| hduser02| 租户标签,设置前需要和BDP沟通需要单独机器进行隔离,则任务会被路由到单独的机器| + + +## 1. 引入依赖模块 +``` + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +如: + + org.apache.linkis + linkis-computation-client + 1.0.3 + +``` + +## 2. Java测试代码 +建立Java的测试类LinkisClientTest,具体接口含义可以见注释: +```java +package org.apache.linkis.client.test; + +import org.apache.linkis.common.utils.Utils; +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy; +import org.apache.linkis.httpclient.dws.config.DWSClientConfig; +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder; +import org.apache.linkis.manager.label.constant.LabelKeyConstant; +import org.apache.linkis.protocol.constants.TaskConstant; +import org.apache.linkis.ujes.client.UJESClient; +import org.apache.linkis.ujes.client.UJESClientImpl; +import org.apache.linkis.ujes.client.request.JobSubmitAction; +import org.apache.linkis.ujes.client.request.JobExecuteAction; +import org.apache.linkis.ujes.client.request.ResultSetAction; +import org.apache.linkis.ujes.client.response.*; +import org.apache.commons.io.IOUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class LinkisClientTest { + + // 1. build config: linkis gateway url + private static DWSClientConfig clientConfig = ((DWSClientConfigBuilder) (DWSClientConfigBuilder.newBuilder() + .addServerUrl("http://127.0.0.1:9001/") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connectionTimeOut + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy Linkis authen suppory static and Token + .setAuthTokenKey("hadoop") // set submit user + .setAuthTokenValue("123456"))) // set passwd or token (setAuthTokenValue("test")) + .setDWSVersion("v1") //linkis rest version v1 + .build(); + + // 2. new Client(Linkis Client) by clientConfig + private static UJESClient client = new UJESClientImpl(clientConfig); + + public static void main(String[] args) { + + String user = "hadoop"; // 用户需要和AuthTokenKey的值保持一致 + String executeCode = "df=spark.sql(\"show tables\")\n" + + "show(df)"; // code support:sql/hql/py/scala + try { + + System.out.println("user : " + user + ", code : [" + executeCode + "]"); + // 3. build job and execute + JobExecuteResult jobExecuteResult = toSubmit(user, executeCode); + System.out.println("execId: " + jobExecuteResult.getExecID() + ", taskId: " + jobExecuteResult.taskID()); + // 4. get job jonfo + JobInfoResult jobInfoResult = client.getJobInfo(jobExecuteResult); + int sleepTimeMills = 1000; + int logFromLen = 0; + int logSize = 100; + while (!jobInfoResult.isCompleted()) { + // 5. get progress and log + JobProgressResult progress = client.progress(jobExecuteResult); + System.out.println("progress: " + progress.getProgress()); + JobLogResult logRes = client.log(jobExecuteResult, logFromLen, logSize); + logFromLen = logRes.fromLine(); + // 0: info 1: warn 2: error 3: all + System.out.println(logRes.log().get(3)); + Utils.sleepQuietly(sleepTimeMills); + jobInfoResult = client.getJobInfo(jobExecuteResult); + } + + JobInfoResult jobInfo = client.getJobInfo(jobExecuteResult); + // 6. Get the result set list (if the user submits multiple SQLs at a time, + // multiple result sets will be generated) + String resultSet = jobInfo.getResultSetList(client)[0]; + // 7. get resultContent + ResultSetResult resultSetResult = client.resultSet(ResultSetAction.builder().setPath(resultSet).setUser(jobExecuteResult.getUser()).build()); + System.out.println("metadata: " + resultSetResult.getMetadata()); // column name type + System.out.println("res: " + resultSetResult.getFileContent()); //row data + } catch (Exception e) { + e.printStackTrace();// please use log + IOUtils.closeQuietly(client); + } + IOUtils.closeQuietly(client); + } + + + private static JobExecuteResult toSubmit(String user, String code) { + // 1. build params + // set label map :EngineTypeLabel/UserCreatorLabel/EngineRunTypeLabel/Tenant + Map labels = new HashMap(); + labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-2.4.3"); // required engineType Label + labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, user + "-APPName");// required execute user and creator eg:hadoop-IDE + labels.put(LabelKeyConstant.CODE_TYPE_KEY, "py"); // required codeType + // set start up map :engineConn start params + Map startupMap = new HashMap(16); + // Support setting engine native parameters,For example: parameters of engines such as spark/hive + startupMap.put("spark.executor.instances", 2); + // setting linkis params + startupMap.put("wds.linkis.rm.yarnqueue", "dws"); + + // 2. build jobSubmitAction + JobSubmitAction jobSubmitAction = JobSubmitAction.builder() + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) // execute user + .setLabels(labels) + .build(); + // 3. to execute + return client.submit(jobSubmitAction); + } +} +``` + +运行上述的代码即可以完成任务提交/执行/日志/结果集获取等 + +## 3. Scala测试代码 + +```scala +package org.apache.linkis.client.test + +import org.apache.commons.io.IOUtils +import org.apache.commons.lang3.StringUtils +import org.apache.linkis.common.utils.Utils +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder +import org.apache.linkis.manager.label.constant.LabelKeyConstant +import org.apache.linkis.ujes.client.request._ +import org.apache.linkis.ujes.client.response._ +import java.util +import java.util.concurrent.TimeUnit + +import org.apache.linkis.ujes.client.UJESClient + +object LinkisClientTest { + // 1. build config: linkis gateway url + val clientConfig = DWSClientConfigBuilder.newBuilder() + .addServerUrl("http://127.0.0.1:8088/") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connectionTimeOut + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy Linkis authen suppory static and Token + .setAuthTokenKey("hadoop") // set submit user + .setAuthTokenValue("hadoop") // set passwd or token (setAuthTokenValue("BML-AUTH")) + .setDWSVersion("v1") //linkis rest version v1 + .build(); + + // 2. new Client(Linkis Client) by clientConfig + val client = UJESClient(clientConfig) + + def main(args: Array[String]): Unit = { + val user = "hadoop" // execute user 用户需要和AuthTokenKey的值保持一致 + val executeCode = "df=spark.sql(\"show tables\")\n" + + "show(df)"; // code support:sql/hql/py/scala + try { + // 3. build job and execute + println("user : " + user + ", code : [" + executeCode + "]") + // 推荐使用submit,支持传递任务label + val jobExecuteResult = toSubmit(user, executeCode) + println("execId: " + jobExecuteResult.getExecID + ", taskId: " + jobExecuteResult.taskID) + // 4. get job jonfo + var jobInfoResult = client.getJobInfo(jobExecuteResult) + var logFromLen = 0 + val logSize = 100 + val sleepTimeMills: Int = 1000 + while (!jobInfoResult.isCompleted) { + // 5. get progress and log + val progress = client.progress(jobExecuteResult) + println("progress: " + progress.getProgress) + val logObj = client.log(jobExecuteResult, logFromLen, logSize) + logFromLen = logObj.fromLine + val logArray = logObj.getLog + // 0: info 1: warn 2: error 3: all + if (logArray != null && logArray.size >= 4 && StringUtils.isNotEmpty(logArray.get(3))) { + println(s"log: ${logArray.get(3)}") + } + Utils.sleepQuietly(sleepTimeMills) + jobInfoResult = client.getJobInfo(jobExecuteResult) + } + if (!jobInfoResult.isSucceed) { + println("Failed to execute job: " + jobInfoResult.getMessage) + throw new Exception(jobInfoResult.getMessage) + } + + // 6. Get the result set list (if the user submits multiple SQLs at a time, + // multiple result sets will be generated) + val jobInfo = client.getJobInfo(jobExecuteResult) + val resultSetList = jobInfoResult.getResultSetList(client) + println("All result set list:") + resultSetList.foreach(println) + val oneResultSet = jobInfo.getResultSetList(client).head + // 7. get resultContent + val resultSetResult: ResultSetResult = client.resultSet(ResultSetAction.builder.setPath(oneResultSet).setUser(jobExecuteResult.getUser).build) + println("metadata: " + resultSetResult.getMetadata) // column name type + println("res: " + resultSetResult.getFileContent) //row data + } catch { + case e: Exception => { + e.printStackTrace() //please use log + } + } + IOUtils.closeQuietly(client) + } + + + def toSubmit(user: String, code: String): JobExecuteResult = { + // 1. build params + // set label map :EngineTypeLabel/UserCreatorLabel/EngineRunTypeLabel/Tenant + val labels: util.Map[String, AnyRef] = new util.HashMap[String, AnyRef] + labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-2.4.3"); // required engineType Label + labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, user + "-APPName"); // 请求的用户和应用名,两个参数都不能少,其中APPName不能带有"-"建议替换为"_" + labels.put(LabelKeyConstant.CODE_TYPE_KEY, "py"); // 指定脚本类型 + + val startupMap = new java.util.HashMap[String, AnyRef]() + // Support setting engine native parameters,For example: parameters of engines such as spark/hive + val instances: Integer = 2 + startupMap.put("spark.executor.instances", instances) + // setting linkis params + startupMap.put("wds.linkis.rm.yarnqueue", "default") + // 2. build jobSubmitAction + val jobSubmitAction = JobSubmitAction.builder + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) //execute user + .setLabels(labels) + .build + // 3. to execute + client.submit(jobSubmitAction) + } +} +``` + +## 4. Once SDK 使用 +Linkis-cli客户端支持提交Once类型的任务,引擎进程启动后只运行一次任务,任务结束后自动销毁 + +OnceEngineConn 通过 LinkisManagerClient 调用 LinkisManager 的 createEngineConn 接口,并将代码发送到用户创建的引擎,然后引擎开始执行 + + +## Once模式使用: + +1.首先创建一个新的 maven 项目或者在项目中引入以下依赖项 + +```plain + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` +2.编写一个测试类 +使用clien条件 + +```plain +1.配置正确可用的gatew地址: +LinkisJobClient.config().setDefaultServerUrl("http://ip:9001"); +2.将引擎参数,配置项,执行code写在code里面: + String code = "env { + + " spark.app.name = \"SeaTunnel\"\n" + + " spark.executor.instances = 2\n" + + " spark.executor.cores = 1\n" + + " spark.executor.memory = \"1g\"\n" + + "}\n" + + "\n" + + "source {\n" + + " Fake {\n" + + " result_table_name = \"my_dataset\"\n" + + " }\n" + + "\n" + + "}\n" + + "\n" + + "transform {\n" + + "}\n" + + "\n" + + "sink {\n" + + " Console {}\n" + + "}"; +3.创建Once模式对象:SubmittableSimpleOnceJob : +SubmittableSimpleOnceJob = LinkisJobClient.once() + .simple() + .builder() + .setCreateService("seatunnel-Test") + .setMaxSubmitTime(300000) 超时时间 + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY(), "seatunnel-2.1.2") 引擎标签 + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY(), "hadoop-seatunnel") 用户标签 + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY(), "once") 引擎模式标签 + .addStartupParam(Configuration.IS_TEST_MODE().key(), true) 是否开启测试模式 + .addExecuteUser("hadoop") 执行用户 + .addJobContent("runType", "spark") 执行引擎 + .addJobContent("code", code) 执行代码 + .addJobContent("master", "local[4]") + .addJobContent("deploy-mode", "client") + .addSource("jobName", "OnceJobTest") 名称 + .build(); +``` +## 测试类示例代码: + +```plain +package org.apache.linkis.ujes.client + +import org.apache.linkis.common.utils.Utils +import java.util.concurrent.TimeUnit +import java.util +import org.apache.linkis.computation.client.LinkisJobBuilder +import org.apache.linkis.computation.client.once.simple.{SimpleOnceJob, SimpleOnceJobBuilder, SubmittableSimpleOnceJob} +import org.apache.linkis.computation.client.operator.impl.{EngineConnLogOperator, EngineConnMetricsOperator, EngineConnProgressOperator} +import org.apache.linkis.computation.client.utils.LabelKeyUtils +import scala.collection.JavaConverters._ +@Deprecated +object SqoopOnceJobTest extends App { + LinkisJobBuilder.setDefaultServerUrl("http://gateway地址:9001") + val logPath = "C:\\Users\\resources\\log4j.properties" + System.setProperty("log4j.configurationFile", logPath) + val startUpMap = new util.HashMap[String, AnyRef] + startUpMap.put("wds.linkis.engineconn.java.driver.memory", "1g") + val builder = SimpleOnceJob.builder().setCreateService("Linkis-Client") + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY, "sqoop-1.4.6") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY, "hadoop-Client") + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY, "once") + .setStartupParams(startUpMap) + .setMaxSubmitTime(30000) + .addExecuteUser("hadoop") + val onceJob = importJob(builder) + val time = System.currentTimeMillis() + onceJob.submit() + println(onceJob.getId) + val logOperator = onceJob.getOperator(EngineConnLogOperator.OPERATOR_NAME).asInstanceOf[EngineConnLogOperator] + println(onceJob.getECMServiceInstance) + logOperator.setFromLine(0) + logOperator.setECMServiceInstance(onceJob.getECMServiceInstance) + logOperator.setEngineConnType("sqoop") + logOperator.setIgnoreKeywords("[main],[SpringContextShutdownHook]") + var progressOperator = onceJob.getOperator(EngineConnProgressOperator.OPERATOR_NAME).asInstanceOf[EngineConnProgressOperator] + var metricOperator = onceJob.getOperator(EngineConnMetricsOperator.OPERATOR_NAME).asInstanceOf[EngineConnMetricsOperator] + var end = false + var rowBefore = 1 + while (!end || rowBefore > 0) { + if (onceJob.isCompleted) { + end = true + metricOperator = null + } + logOperator.setPageSize(100) + Utils.tryQuietly { + val logs = logOperator.apply() + logs.logs.asScala.foreach(log => { + println(log) + }) + rowBefore = logs.logs.size + } + Thread.sleep(3000) + Option(metricOperator).foreach(operator => { + if (!onceJob.isCompleted) { + println(s"Metric监控: ${operator.apply()}") + println(s"进度: ${progressOperator.apply()}") + } + }) + } + onceJob.isCompleted + onceJob.waitForCompleted() + println(onceJob.getStatus) + println(TimeUnit.SECONDS.convert(System.currentTimeMillis() - time, TimeUnit.MILLISECONDS) + "s") + System.exit(0) + + def importJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue_1003_01") + .addJobContent("sqoop.mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://数据库地址/库名") + .addJobContent("sqoop.args.username", "数据库账户") + .addJobContent("sqoop.args.password", "数据库密码") + .addJobContent("sqoop.args.query", "select * from linkis_ps_udf_manager where 1=1 and $CONDITIONS") + #表一定要存在 $CONDITIONS不可缺少 + .addJobContent("sqoop.args.hcatalog.database", "janicegong_ind") + .addJobContent("sqoop.args.hcatalog.table", "linkis_ps_udf_manager_sync2") + .addJobContent("sqoop.args.hcatalog.partition.keys", "ds") + .addJobContent("sqoop.args.hcatalog.partition.values", "20220708") + .addJobContent("sqoop.args.num.mappers", "1") + .build() + } + def exportJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue_1003_01") + .addJobContent("sqoop.mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://数据库地址/库名") + .addJobContent("sqoop.args.username", "数据库账户") + .addJobContent("sqoop.args.password", "数据库密码") + .addJobContent("sqoop.args.query", "select * from linkis_ps_udf_manager where 1=1 and $CONDITIONS") + #表一定要存在 $CONDITIONS不可缺少 + .addJobContent("sqoop.args.hcatalog.database", "janicegong_ind") + .addJobContent("sqoop.args.hcatalog.table", "linkis_ps_udf_manager_sync2") + .addJobContent("sqoop.args.hcatalog.partition.keys", "ds") + .addJobContent("sqoop.args.hcatalog.partition.values", "20220708") + .addJobContent("sqoop.args.num.mappers", "1") + .build + } +} +``` +3.测试程序完成,引擎会自动销毁,不用手动清除 \ No newline at end of file diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/udf-function.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/udf-function.md new file mode 100644 index 00000000000..975aad8e934 --- /dev/null +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.4.0/user-guide/udf-function.md @@ -0,0 +1,175 @@ +--- +title: UDF功能 +sidebar_position: 5 +--- + +> 详细介绍一下如何使用UDF功能 + +## 1.UDF创建的整体步骤说明 +### 1 通用类型的UDF函数 +整体步骤说明 +- 在本地按UDF函数格式 编写udf 函数 ,并打包称jar包文件 +- 在【Scriptis >> 工作空间】上传至工作空间对应的目录 +- 在 【管理台>>UDF函数】 创建udf (默认加载) +- 在任务代码中使用(对于新起的引擎才生效) + +**Step1 本地编写jar包** + +Hive UDF示例: +1. 引入 hive 依赖 +```xml + + org.apache.hive + hive-exec + 3.1.3 + +``` +2. 编写UDF 类 +```java +import org.apache.hadoop.hive.ql.exec.UDF; + +public class UDFExample extends UDF { + public Integer evaluate(Integer value) { + return value == null ? null : value + 1; + } +} + +3. 编译打包 +```shell +mvn package +``` + +**Step2【Scriptis >> 工作空间】上传jar包** +选择对应的文件夹 鼠标右键 选择上传 + +![](/Images/udf/udf_14.png) + +**Step3【管理台>>UDF函数】 创建UDF** +- 函数名称:符合规则即可,如test_udf_jar 在sql等脚本中使用 +- 函数类型:通用 +- 脚本路径:选择jar包存放的共享目录路径 如 ../../../wds_functions_1_0_0.jar +- 注册格式:包名+类名,如 com.webank.wedatasphere.willink.bdp.udf.ToUpperCase +- 使用格式:输入类型与返回类型,需与jar包里定义一致 +- 分类:下拉选择;或者输入自定义目录(会在个人函数下新建目标一级目录) + +![](/Images/udf/udf_15.png) + +注意 新建的udf 函数 是默认加载的 可以在 【Scriptis >> UDF函数】 页面查看到,方便大家在Scriptis 任务编辑时 方便查看,勾选中的UDF函数 表明是会被加载使用的 + +![](/Images/udf/udf_16.png) + +**Step4 使用该udf函数** + +在任务中 使用上述步骤创新的udf 函数 +函数名为 【创建UDF】 函数名称 +在pyspark中: +print (sqlContext.sql("select test_udf_jar(name1) from stacyyan_ind.result_sort_1_20200226").collect()) + +### 2 Spark类型的UDF函数 +整体步骤说明 +- 在【Scriptis >> 工作空间】在需要的目录下新建Spark脚本文件 +- 在 【管理台>>UDF函数】 创建udf (默认加载) +- 在任务代码中使用(对于新起的引擎才生效) + +**Step1 dss-scriptis-新建scala脚本** + +![](/Images/udf/udf_17.png) + +def helloWorld(str: String): String = "hello, " + str + +**Step2 创建UDF** +- 函数名称:符合规则即可,如test_udf_scala +- 函数类型:spark +- 脚本路径:../../../b +- 注册格式:输入类型与返回类型,需与定义一致;注册格式需定义的函数名严格保持一致,如helloWorld +- 分类:下拉选择dss-scriptis-UDF函数-个人函数下存在的一级目录;或者输入自定义目录(会在个人函数下新建目标一级目录) + +![](/Images/udf/udf_18.png) + + +**Step3 使用该udf函数** + +在任务中 使用上述步骤创建新的udf 函数 +函数名为 【创建UDF】 函数名称 +- 在scala中 + val s=sqlContext.sql("select test_udf_scala(name1) + from stacyyan_ind.result_sort_1_20200226") + show(s) +- 在pyspark中 + print(sqlContext.sql("select test_udf_scala(name1) + from stacyyan_ind.result_sort_1_20200226").collect()); +- 在sql中 + select test_udf_scala(name1) from stacyyan_ind.result_sort_1_20200226; + +### 3 python函数 +整体步骤说明 +- 在【Scriptis >> 工作空间】在需要的目录下新建Python脚本文件 +- 在 【管理台>>UDF函数】 创建udf (默认加载) +- 在任务代码中使用(对于新起的引擎才生效) + +**Step1 dss-scriptis-新建pyspark脚本** + +![](/Images/udf/udf_19.png) + +def addation(a, b): +return a + b +**Step2 创建UDF** +- 函数名称:符合规则即可,如test_udf_py +- 函数类型:spark +- 脚本路径:../../../a +- 注册格式:需定义的函数名严格保持一致,如addation +- 使用格式:输入类型与返回类型,需与定义一致 +- 分类:下拉选择dss-scriptis-UDF函数-个人函数下存在的一级目录;或者输入自定义目录(会在个人函数下新建目标一级目录) + +![](/Images/udf/udf_20.png) + +**Step3 使用该udf函数** +在任务中 使用上述步骤创建新的udf 函数 +函数名为 【创建UDF】 函数名称 +- 在pyspark中 + print(sqlContext.sql("select test_udf_py(pv,impression) from neiljianliu_ind.alias where entityid=504059 limit 50").collect()); +- 在sql中 + select test_udf_py(pv,impression) from neiljianliu_ind.alias where entityid=504059 limit 50 + +### 4 scala函数 +整体步骤说明 +- 在【Scriptis >> 工作空间】在需要的目录下新建Spark Scala脚本文件 +- 在 【管理台>>UDF函数】 创建udf (默认加载) +- 在任务代码中使用(对于新起的引擎才生效) + +**Step1 dss-scriptis-新建scala脚本** +def hellozdy(str:String):String = "hellozdy,haha " + str + +**Step2 创建函数** +- 函数名称:需与定义的函数名严格保持一致,如hellozdy +- 函数类型:自定义函数 +- 脚本路径:../../../d +- 使用格式:输入类型与返回类型,需与定义一致 +- 分类:下拉选择dss-scriptis-方法函数-个人函数下存在的一级目录;或者输入自定义目录(会在个人函数下新建目标一级目录) + +**Step3 使用该函数** +在任务中 使用上述步骤创建新的udf 函数 +函数名为 【创建UDF】 函数名称 +val a = hellozdy("abcd"); +print(a) + +### 5 常见的使用问题 +#### 5.1 UDF函数加载失败 +"FAILED: SemanticException [Error 10011]: Invalid function xxxx" + +![](/Images/udf/udf_10.png) + +- 首先检查UDF函数配置是否正确: + + ![](/Images/udf/udf_11.png) + +- 注册格式即为函数路径名称: + + ![](/Images/udf/udf_12.png) + +- 检查scriptis-udf函数-查看加载的函数是否勾选,当函数未勾选时,引擎启动时将不会加载udf + + ![](/Images/udf/udf_13.png) + +- 检查引擎是否已加载UDF,如果未加载,请重新另起一个引擎或者重启当前引擎 + 备注:只有当引擎初始化时,才会加载UDF,中途新增UDF,当前引擎将无法感知并且无法进行加载 \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/about/_category_.json b/versioned_docs/version-1.4.0/about/_category_.json new file mode 100644 index 00000000000..6b41c038f08 --- /dev/null +++ b/versioned_docs/version-1.4.0/about/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "About Linkis", + "position": 1.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/about/configuration.md b/versioned_docs/version-1.4.0/about/configuration.md new file mode 100644 index 00000000000..63b0ea42e26 --- /dev/null +++ b/versioned_docs/version-1.4.0/about/configuration.md @@ -0,0 +1,180 @@ +--- +title: Recommended Configuration +sidebar_position: 3 +--- + + +## 1. Recommended configuration of hardware and software environment + +Linkis builds a layer of computing middleware between the upper application and the underlying engine. As an open source distributed computing middleware, it can be well deployed and run on Intel architecture servers and mainstream virtualization environments, and supports mainstream Linux operating system environments + +### 1.1. Linux operating system version requirements + +| OS | Version | +| --- | --- | +| Red Hat Enterprise Linux | 7.0 and above | +| CentOS | 7.0 and above | +| Oracle Enterprise Linux | 7.0 and above | +| Ubuntu LTS | 16.04 and above | + +> **Note:** The above Linux operating systems can run on physical servers and mainstream virtualization environments such as VMware, KVM, and XEN + +### 1.2. Server recommended configuration + +Linkis supports 64-bit general-purpose hardware server platforms running on the Intel x86-64 architecture. The following recommendations are made for the server hardware configuration of the production environment: + +#### Production Environment + +| **CPU** | **Memory** | **Disk type** | **Network** | **Number of instances** | +| --- | --- | --- | --- | --- | +| 16 cores + | 32GB + | SAS | Gigabit network card | 1+ | + +> **Note:** +> +> - The above recommended configuration is the minimum configuration for deploying Linkis, and a higher configuration is strongly recommended for production environments +> - The hard disk size configuration is recommended to be 50GB+, and the system disk and data disk are separated + +### 1.3. Software requirements + +Linkis binary packages are compiled based on the following software versions: + +| Component | Version | Description | +| --- | --- | --- | +| Hadoop | 3.3.4 | | +| Hive | 3.1.3 | | +| Spark | 3.2.1 | | +| Flink | 1.12.2 | | +| openLooKeng | 1.5.0 | | +| Sqoop | 1.4.6 | | +| ElasticSearch | 7.6.2 | | +| Presto | 0.234 | | +| Python | Python2 | | + +> **Note:** +> If the locally installed component version is inconsistent with the above, you need to modify the corresponding component version and compile the binary package yourself for installation. + +### 1.4. Client web browser requirements + +Linkis recommends Chrome version 73 for front-end access + + +## 2. Common scenarios + +### 2.1 Open test mode +The development process requires a password-free interface, which can be replaced or appended to `linkis.properties` + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.test.mode | false | Whether to enable debugging mode, if set to true, all microservices support password-free login, and all EngineConn open remote debugging ports | +| wds.linkis.test.user | hadoop | When wds.linkis.test.mode=true, the default login user for password-free login | + +![](./images/test-mode.png) + + +### 2.2 Login user settings +Apache Linkis uses configuration files to manage admin users by default, and this configuration can be replaced or appended to `linkis-mg-gateway.properties`. For multi-user access LDAP implementation. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.admin.user | hadoop | admin username | +| wds.linkis.admin.password | 123456 | Admin user password | + +![](./images/login-user.png) + + +### 2.3 LDAP Settings +Apache Linkis can access LDAP through parameters to achieve multi-user management, and this configuration can be replaced or added in `linkis-mg-gateway.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.ldap.proxy.url | None | LDAP URL address | +| wds.linkis.ldap.proxy.baseDN | None | LDAP baseDN address | +| wds.linkis.ldap.proxy.userNameFormat | None | | + +![](./images/ldap.png) + +### 2.4 Turn off resource checking +Apache Linkis sometimes debugs exceptions when submitting tasks, such as: insufficient resources; you can replace or append this configuration in `linkis-cg-linkismanager.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.manager.rm.request.enable | true | resource check | + +![](./images/resource-enable.png) + +### 2.5 Enable engine debugging +Apache Linkis EC can enable debugging mode, and this configuration can be replaced or added in `linkis-cg-linkismanager.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.engineconn.debug.enable | true | Whether to enable engine debugging | + +![](./images/engine-debug.png) + +### 2.6 Hive metadata configuration +The public-service service of Apache Linkis needs to read hive metadata; this configuration can be replaced or appended in `linkis-ps-publicservice.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| hive.meta.url | None | The URL of the HiveMetaStore database. | +| hive.meta.user | none | user of the HiveMetaStore database | +| hive.meta.password | None | password for the HiveMetaStore database | + +![](./images/hive-meta.png) + +### 2.7 Linkis database configuration +Apache Linkis access uses Mysql as data storage by default, you can replace or append this configuration in `linkis.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.server.mybatis.datasource.url | None | Database connection string, for example: jdbc:mysql://127.0.0.1:3306/dss?characterEncoding=UTF-8 | +| wds.linkis.server.mybatis.datasource.username | None | Database user name, for example: root | +| wds.linkis.server.mybatis.datasource.password | None | Database password, for example: root | + +![](./images/linkis-db.png) + +### 2.8 Linkis Session cache configuration +Apache Linkis supports using redis for session sharing; this configuration can be replaced or appended in `linkis.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| linkis.session.redis.cache.enabled | None | Whether to enable | +| linkis.session.redis.host | 127.0.0.1 | hostname | +| linkis.session.redis.port | 6379 | Port, eg | +| linkis.session.redis.password | None | password | + +![](./images/redis.png) + +### 2.9 Linkis module development configuration +When developing Apache Linkis, you can use this parameter to customize the database, Rest interface, and entity objects of the loading module; you can modify it in `linkis-ps-publicservice.properties`, and use commas to separate multiple modules. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.server.restful.scan.packages | None | restful scan packages, for example: org.apache.linkis.basedatamanager.server.restful | +| wds.linkis.server.mybatis.mapperLocations | None | Mybatis mapper file path, for example: classpath*:org/apache/linkis/basedatamanager/server/dao/mapper/*.xml| +| wds.linkis.server.mybatis.typeAliasesPackage | None | Entity alias scanning package, for example: org.apache.linkis.basedatamanager.server.domain | +| wds.linkis.server.mybatis.BasePackage | None | Database dao layer scan, for example: org.apache.linkis.basedatamanager.server.dao | + +![](./images/deverlop-conf.png) + +### 2.10 Linkis module development configuration +This parameter can be used to customize the route of loading modules during Apache Linkis development; it can be modified in `linkis.properties`, and commas are used to separate multiple modules. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.gateway.conf.publicservice.list | cs,contextservice,data-source-manager,metadataQuery,metadatamanager,query,jobhistory,application,configuration,filesystem,udf,variable,microservice,errorcode,bml,datasource,basedata -manager | publicservice services support routing modules | + +![](./images/list-conf.png) + +### 2.11 Linkis file system and material storage path +This parameter can be used to customize the route of loading modules during Apache Linkis development; it can be modified in `linkis.properties`, and commas are used to separate multiple modules. + +| parameter name | default value | description | +| ------------------------- | ------- | --------------- -----------------------------------------------| +| wds.linkis.filesystem.root.path | file:///tmp/linkis/ | Local user directory, a folder named after the user name needs to be created under this directory | +| wds.linkis.filesystem.hdfs.root.path | hdfs:///tmp/ | HDFS user directory | +| wds.linkis.bml.is.hdfs | true | Whether to enable hdfs | +| wds.linkis.bml.hdfs.prefix | /apps-data | hdfs path | +| wds.linkis.bml.local.prefix | /apps-data | local path | + +![](./images/fs-conf.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/about/glossary.md b/versioned_docs/version-1.4.0/about/glossary.md new file mode 100644 index 00000000000..28fa28c1cca --- /dev/null +++ b/versioned_docs/version-1.4.0/about/glossary.md @@ -0,0 +1,103 @@ +--- +title: Glossary +sidebar_position: 4 +--- + +## 1. Glossary + +Linkis is developed based on the microservice architecture, and its services can be divided into 3 types of service groups (groups): computing governance service group, public enhancement service group and microservice governance service group. +- Computation Governance Services: The core service for processing tasks, supporting the 4 main stages of the computing task/request processing flow (submit->prepare->execute->result); +- Public Enhancement Services: Provide basic support services, including context services, engine/udf material management services, job history and other public services and data source management services; +- Microservice Governance Services: Customized Spring Cloud Gateway, Eureka. Provides a base for microservices + +The following will introduce the key Glossary and services of these three groups of services: + +### 1.1 Key module nouns + +| Abbreviation | Name | Main Functions | +|--------- |------------------------- |--------------- -------| +| MG/mg | Microservice Governance | Microservice Governance | +| CG/cg | Computation Governance | Computation Governance | +| EC/ec | EngineConn | Engine Connector | +| - | Engine | The underlying computing storage engine, such as spark, hive, shell | +| ECM/ecm | EngineConnManager | Management of Engine Connectors | +| ECP/ecp | EngineConnPlugin | Engine Connector Plugin | +| RM/rm | ResourceManager | Resource manager for managing task resource and user resource usage and control | +| AM/am | AppManager | Application Manager to manage EngineConn and ECM services | +| LM/lm | LinkisManager | Linkis manager service, including: RM, AM, LabelManager and other modules | +| PES/pes | Public Enhancement Services | +| - | Orchestrator | Orchestrator, used for Linkis task orchestration, task multi-active, mixed calculation, AB and other policy support | +| UJES | Unified Job Execute Service | Unified Job Execute Service | +| DDL/ddl | Data Definition Language | Database Definition Language | +| DML/dml | Data Manipulation Language | Data Manipulation Language | + +### 1.2 Mission key nouns + +- JobRequest: job request, corresponding to the job submitted by the Client to Linkis, including the execution content, user, label and other information of the job +- RuntimeMap: task runtime parameters, task level take effect, such as data source information for placing multiple data sources +- StartupMap: Engine connector startup parameters, used to start the EngineConn connected machine, the EngineConn process takes effect, such as setting spark.executor.memory=4G +- UserCreator: Task creator information: contains user information User and Client submitted application information Creator, used for tenant isolation of tasks and resources +- submitUser: task submit user +- executeUser: the real execution user of the task +- JobSource: Job source information, record the IP or script address of the job +- errorCode: error code, task error code information +- JobHistory: task history persistence module, providing historical information query of tasks +- ResultSet: The result set, the result set corresponding to the task, is saved with the .dolphin file suffix by default +- JobInfo: Job runtime information, such as logs, progress, resource information, etc. +- Resource: resource information, each task consumes resources +- RequestTask: The smallest execution unit of EngineConn, the task unit transmitted to EngineConn for execution + + + +## 2. Service Introduction + +This section mainly introduces the services of Linkis, what services will be available after Linkis is started, and the functions of the services. + +## 2.1 Service List + +After Linkis is started, the microservices included in each service group (group) are as follows: + +| Belonging to the microservice group (group) | Service name | Main functions | +| ---- | ---- | ---- | +| MGS | linkis-mg-eureka | Responsible for service registration and discovery, other upstream components will also reuse the linkis registry, such as dss| +| MGS | linkis-mg-gateway | As the gateway entrance of Linkis, it is mainly responsible for request forwarding and user access authentication | +| CGS | linkis-cg-entrance | The task submission entry is a service responsible for receiving, scheduling, forwarding execution requests, and life cycle management of computing tasks, and can return calculation results, logs, and progress to the caller | +| CGS | linkis-cg-linkismanager| Provides AppManager (application management), ResourceManager (resource management), LabelManager (label management), Engine connector plug-in manager capabilities | +| CGS | linkis-cg-engineconnmanager | Manager for EngineConn, providing lifecycle management of engines | +| CGS | linkis-cg-engineconn| The engine connector service is the actual connection service with the underlying computing storage engine (Hive/Spark), including session information with the actual engine. For the underlying computing storage engine, it acts as a client and is triggered and started by tasks| +| PES | linkis-ps-publicservice|Public Enhanced Service Group Module Service, which provides functions such as unified configuration management, context service, BML material library, data source management, microservice management, and historical task query for other microservice modules | + +All services seen by open source after startup are as follows: +![Linkis_Eureka](/Images/deployment/Linkis_combined_eureka.png) + +## 2.1 Detailed explanation of public enhanced services +After version 1.3.1, the Public Enhanced Service Group (PES) merges related module services into one service linkis-ps-publicservice by default to provide related functions. Of course, if you want to deploy separately, it is also supported. You only need to package and deploy the services of the corresponding modules. +The combined public enhanced service mainly includes the following functions: + +| Abbreviation | Service Name | Main Functions | +|--------- |------------------------- |--------------- -------| +| CS/cs | Context Service | Context Service, used to transfer result sets, variables, files, etc. between tasks | +| UDF/udf | UDF | UDF management module, provides management functions for UDF and functions, supports sharing and version control | +| variable | Variable | Global custom module, providing management functions for global custom variables | +| script | Script-dev | Script file operation service, providing script editing and saving, script directory management functions | +| jobHistory | JobHistory | Task history persistence module, providing historical information query of tasks | +| BML/bml | BigData Material library | +| - | Configuration | Configuration management, providing management and viewing of configuration parameters | +| - | instance-label | Microservice management service, providing mapping management functions for microservices and routing labels | +| - | error-code | Error code management, providing the function of managing through error codes | +| DMS/dms | Data Source Manager Service | Data Source Management Service | +| MDS/mds | MetaData Manager Service | Metadata Management Service | +| - | linkis-metadata | Provides Hive metadata information viewing function, which will be merged into MDS later | +| - | basedata-manager | Basic data management, used to manage Linkis' own basic metadata information | + +### 3 Module Introduction +This section mainly introduces the major modules and functions of Linkis. + +- linkis-commons: The public modules of linkis, including public tool modules, RPC modules, microservice foundation and other modules +- linkis-computation-governance: Computing governance module, including modules for computing governance multiple services: Entrance, LinkisManager, EngineConnManager, EngineConn, etc. +- linkis-engineconn-plugins: Engine connector plugin module, contains all engine connector plugin implementations +- linkis-extensions: The extension enhancement module of Linkis, not a necessary function module, now mainly includes the IO module for file proxy operation +- linkis-orchestrator: Orchestration module for Linkis task orchestration, advanced strategy support such as task multi-active, mixed calculation, AB, etc. +- linkis-public-enhancements: public enhancement module, which contains all public services for invoking linkis internal and upper-layer application components +- linkis-spring-cloud-services: Spring cloud related service modules, including gateway, registry, etc. +- linkis-web: front-end module \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/about/images/deverlop-conf.png b/versioned_docs/version-1.4.0/about/images/deverlop-conf.png new file mode 100644 index 00000000000..3d5fc8af601 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/deverlop-conf.png differ diff --git a/versioned_docs/version-1.4.0/about/images/engine-debug.png b/versioned_docs/version-1.4.0/about/images/engine-debug.png new file mode 100644 index 00000000000..788bd2b58f0 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/engine-debug.png differ diff --git a/versioned_docs/version-1.4.0/about/images/fs-conf.png b/versioned_docs/version-1.4.0/about/images/fs-conf.png new file mode 100644 index 00000000000..85c4234a9b4 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/fs-conf.png differ diff --git a/versioned_docs/version-1.4.0/about/images/hive-meta.png b/versioned_docs/version-1.4.0/about/images/hive-meta.png new file mode 100644 index 00000000000..50c02906a77 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/hive-meta.png differ diff --git a/versioned_docs/version-1.4.0/about/images/ldap.png b/versioned_docs/version-1.4.0/about/images/ldap.png new file mode 100644 index 00000000000..9625ae20be0 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/ldap.png differ diff --git a/versioned_docs/version-1.4.0/about/images/linkis-db.png b/versioned_docs/version-1.4.0/about/images/linkis-db.png new file mode 100644 index 00000000000..35f7f5573df Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/linkis-db.png differ diff --git a/versioned_docs/version-1.4.0/about/images/linkis-intro-01.png b/versioned_docs/version-1.4.0/about/images/linkis-intro-01.png new file mode 100644 index 00000000000..5c672c8a931 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/linkis-intro-01.png differ diff --git a/versioned_docs/version-1.4.0/about/images/linkis-intro-03.png b/versioned_docs/version-1.4.0/about/images/linkis-intro-03.png new file mode 100644 index 00000000000..3ba32d84349 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/linkis-intro-03.png differ diff --git a/versioned_docs/version-1.4.0/about/images/list-conf.png b/versioned_docs/version-1.4.0/about/images/list-conf.png new file mode 100644 index 00000000000..d19c194a023 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/list-conf.png differ diff --git a/versioned_docs/version-1.4.0/about/images/login-user.png b/versioned_docs/version-1.4.0/about/images/login-user.png new file mode 100644 index 00000000000..477c634f1d4 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/login-user.png differ diff --git a/versioned_docs/version-1.4.0/about/images/redis.png b/versioned_docs/version-1.4.0/about/images/redis.png new file mode 100644 index 00000000000..3a064640613 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/redis.png differ diff --git a/versioned_docs/version-1.4.0/about/images/resource-enable.png b/versioned_docs/version-1.4.0/about/images/resource-enable.png new file mode 100644 index 00000000000..973fcee8409 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/resource-enable.png differ diff --git a/versioned_docs/version-1.4.0/about/images/test-mode.png b/versioned_docs/version-1.4.0/about/images/test-mode.png new file mode 100644 index 00000000000..3466b1b8857 Binary files /dev/null and b/versioned_docs/version-1.4.0/about/images/test-mode.png differ diff --git a/versioned_docs/version-1.4.0/about/introduction.md b/versioned_docs/version-1.4.0/about/introduction.md new file mode 100644 index 00000000000..84f4a47267c --- /dev/null +++ b/versioned_docs/version-1.4.0/about/introduction.md @@ -0,0 +1,113 @@ +--- +title: Introduction +sidebar_position: 1 +--- + + Linkis builds a layer of computation middleware between upper applications and underlying engines. By using standard interfaces such as REST/WS/JDBC provided by Linkis, the upper applications can easily access the underlying engines such as MySQL/Spark/Hive/Presto/Flink, etc., and achieve the intercommunication of user resources like unified variables, scripts, UDFs, functions and resource files,and provides data source and metadata management services through REST standard interface. at the same time. + +As a computation middleware, Linkis provides powerful connectivity, reuse, orchestration, expansion, and governance capabilities. By decoupling the application layer and the engine layer, it simplifies the complex network call relationship, and thus reduces the overall complexity and saves the development and maintenance costs as well. + +Since the first release of Linkis in 2019, it has accumulated more than **700** trial companies and **1000+** sandbox trial users, which involving diverse industries, from finance, banking, tele-communication, to manufactory, internet companies and so on. Lots of companies have already used Linkis as a unified entrance for the underlying computation and storage engines of the big data platform. + + +![linkis-intro-01](images/linkis-intro-01.png) + +![linkis-intro-03](images/linkis-intro-03.png) + +## Features + +- **Support for diverse underlying computation storage engines** : Spark, Hive, Python, Shell, Flink, JDBC, Pipeline, Sqoop, OpenLooKeng, Presto, ElasticSearch, Trino, SeaTunnel, etc.; + +- **Support for diverse language** : SparkSQL, HiveSQL, Python, Shell, Pyspark, Scala, JSON and Java; + +- **Powerful computing governance capability** : It can provide task routing, load balancing, multi-tenant, traffic control, resource control and other capabilities based on multi-level labels; + +- **Support full stack computation/storage engine** : The ability to receive, execute and manage tasks and requests for various compute and storage engines, including offline batch tasks, interactive query tasks, real-time streaming tasks and data lake tasks; + +- **Unified context service** : supports cross-user, system and computing engine to associate and manage user and system resource files (JAR, ZIP, Properties, etc.), result sets, parameter variables, functions, UDFs, etc., one setting, automatic reference everywhere; + +- **Unified materials** : provides system and user level material management, can share and flow, share materials across users, across systems; + +- **Unified data source management** : provides the ability to add, delete, check and change information of Hive, ElasticSearch, Mysql, Kafka, MongoDB and other data sources, version control, connection test, and query metadata information of corresponding data sources; + +- **Error code capability** : provides error codes and solutions for common errors of tasks, which is convenient for users to locate problems by themselves; + + +## Supported engine types + +| **Engine name** | **Support underlying component version
(default dependency version)** | **Linkis Version Requirements** | **Included in Release Package By Default** | **Description** | +|:---- |:---- |:---- |:---- |:---- | +|Spark|Apache 2.0.0~2.4.7,
CDH >= 5.4.0,
(default Apache Spark 2.4.3)|\>=1.0.3|Yes|Spark EngineConn, supports SQL , Scala, Pyspark and R code| +|Hive|Apache >= 1.0.0,
CDH >= 5.4.0,
(default Apache Hive 2.3.3)|\>=1.0.3|Yes|Hive EngineConn, supports HiveQL code| +|Python|Python >= 2.6,
(default Python2*)|\>=1.0.3|Yes|Python EngineConn, supports python code| +|Shell|Bash >= 2.0|\>=1.0.3|Yes|Shell EngineConn, supports Bash shell code| +|JDBC|MySQL >= 5.0, Hive >=1.2.1,
(default Hive-jdbc 2.3.4)|\>=1.0.3|No |JDBC EngineConn, already supports Mysql,Oracle,KingBase,PostgreSQL,SqlServer,DB2,Greenplum,DM,Doris,ClickHouse,TiDB,Starrocks,GaussDB and OceanBase, can be extended quickly Support other engines with JDBC Driver package, such as SQLite| +|Flink |Flink >= 1.12.2,
(default Apache Flink 1.12.2)|\>=1.0.2|No |Flink EngineConn, supports FlinkSQL code, also supports starting a new Yarn in the form of Flink Jar Application| +|Pipeline|-|\>=1.0.2|No|Pipeline EngineConn, supports file import and export| +|openLooKeng|openLooKeng >= 1.5.0,
(default openLookEng 1.5.0)|\>=1.1.1|No|openLooKeng EngineConn, supports querying data virtualization engine with Sql openLooKeng| +|Sqoop| Sqoop >= 1.4.6,
(default Apache Sqoop 1.4.6)|\>=1.1.2|No|Sqoop EngineConn, support data migration tool Sqoop engine| +|Presto|Presto >= 0.180|\>=1.2.0|No|Presto EngineConn, supports Presto SQL code| +|ElasticSearch|ElasticSearch >=6.0|\>=1.2.0|No|ElasticSearch EngineConn, supports SQL and DSL code| +|Trino | Trino >=371 | >=1.3.1 | No | Trino EngineConn, supports Trino SQL code | +|Seatunnel | Seatunnel >=2.1.2 | >=1.3.1 | No | Seatunnel EngineConn, supportt Seatunnel SQL code | +## Download + +Please go to the [Linkis releases page](https://github.com/apache/linkis/releases) to download a compiled distribution or a source code package of Linkis. + +## Compile and deploy +Please follow [Compile Guide](../development/build.md) to compile Linkis from source code. +Please refer to [Deployment_Documents](../deployment/deploy-quick.md) to do the deployment. + +## Examples and Guidance +- [Engine Usage Guidelines](../engine-usage/overview.md) +- [API Documentation](../api/overview.md) + +## Documentation + +The documentation of linkis is in [Linkis-WebSite](https://github.com/apache/linkis-website) + +## Architecture +Linkis services could be divided into three categories: computation governance services, public enhancement services and microservice governance services. +- The computation governance services, support the 3 major stages of processing a task/request: submission -> preparation -> execution. +- The public enhancement services, including the material library service, context service, and data source service. +- The microservice governance services, including Spring Cloud Gateway, Eureka and Open Feign. + +Below is the Linkis architecture diagram. You can find more detailed architecture docs in [Architecture](../architecture/overview.md). +![architecture](/Images/Linkis_1.0_architecture.png) + +Based on Linkis the computation middleware, we've built a lot of applications and tools on top of it in the big data platform suite [WeDataSphere](https://github.com/WeBankFinTech/WeDataSphere). Below are the currently available open-source projects. + +![wedatasphere_stack_Linkis](/Images/wedatasphere_stack_Linkis.png) + +- [**DataSphere Studio** - Data Application Integration& Development Framework](https://github.com/WeBankFinTech/DataSphereStudio) + +- [**Scriptis** - Data Development IDE Tool](https://github.com/WeBankFinTech/Scriptis) + +- [**Visualis** - Data Visualization Tool](https://github.com/WeBankFinTech/Visualis) + +- [**Schedulis** - Workflow Task Scheduling Tool](https://github.com/WeBankFinTech/Schedulis) + +- [**Qualitis** - Data Quality Tool](https://github.com/WeBankFinTech/Qualitis) + +- [**MLLabis** - Machine Learning Notebook IDE](https://github.com/WeBankFinTech/prophecis) + +More projects upcoming, please stay tuned. + +## Contributing + +Contributions are always welcomed, we need more contributors to build Linkis together. either code, or doc or other supports that could help the community. +For code and documentation contributions, please follow the [contribution guide](/community/how-to-contribute). + +## Contact Us + +Any questions or suggestions please kindly submit an issue. +You can scan the QR code below to join our WeChat group to get more immediate response. + +![introduction05](/Images/wedatasphere_contact_01.png) + +Meetup videos on [Bilibili](https://space.bilibili.com/598542776?from=search&seid=14344213924133040656). + +## Who is Using Linkis + +We opened [an issue](https://github.com/apache/linkis/issues/23) for users to feedback and record who is using Linkis. +Since the first release of Linkis in 2019, it has accumulated more than **700** trial companies and **1000+** sandbox trial users, which involving diverse industries, from finance, banking, tele-communication, to manufactory, internet companies and so on. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/_category_.json b/versioned_docs/version-1.4.0/api/_category_.json new file mode 100644 index 00000000000..51de50a69b7 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "API", + "position": 7.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/_category_.json b/versioned_docs/version-1.4.0/api/http/_category_.json new file mode 100644 index 00000000000..803138a2024 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Http API", + "position": 6 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/_category_.json b/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/_category_.json new file mode 100644 index 00000000000..b1c3a8501a2 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Engine Plugin Management Service", + "position": 4 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engine-plugin-api.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engine-plugin-api.md new file mode 100644 index 00000000000..7fdb9898744 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engine-plugin-api.md @@ -0,0 +1,576 @@ +--- +title: Engine Plugin API +sidebar_position: 5 +--- + +** EnginePluginRestful class ** + +## refresh + + +**Interface address**:`/api/rest_j/v1/engineplugin/refresh` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Refresh a single resource

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ecType|type|query|false|string| +|version|version|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## refresh all + + +**Interface address**:`/api/rest_j/v1/engineplugin/refreshAll` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Refresh all ec resources

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## rollback + +**Interface address**: `/api/rest_j/v1/engineplugin/rollBack` + +**Request method**:`POST` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Roll back the material version of the current engine plugin + +**Request parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| --------------------- | ------------------------- | - ------- | -------- | --------------------- | ------ | +| engineConnBmlResource | EngineConnBmlResource entity | body | true | EngineConnBmlResource | | + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | dataset | object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": {} +} +``` + +## Get all versions of the engine in the material + +**Interface address**:/api/rest_j/v1/engineplugin/getVersionList + +**Request method**: GET + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Get all versions of the engine plugin in the material management system + +**Request parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| ------------- | ---------------- | -------- | -------- | --------------------- | ------ | +| bmlResourceId | engine material resource id | body | true | EngineConnBmlResource | | +| ecType | engine name | body | false | String | | +| version | engine version | body | false | String | | + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | dataset | object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": {} +} +``` + + + +## Get all engine names + +**Interface address**:/api/rest_j/v1/engineplugin/getTypeList + +**Request method**: GET + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Get all types of engine names + +**Request parameters** + + + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | dataset | object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "typeList": [ + "hive", + "io_file", + "jdbc", + "open look", + "python", + "shell", + "spark" + ] + } +} +``` + + + +## Get all versions of the engine + +**Interface address**: /api/rest_j/v1/engineplugin/getTypeVersionList/{type} + +**Request method**: GET + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Get all types of engine names + +**Request parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------------- | -------- | -------- | ------- - | ------ | +| type | type name of the engine | path | true | String | | + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | dataset | object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "queryList": [ + "v4" + ] + } +} +``` + + + +## Update engine plugin + +**Interface address**:/api/rest_j/v1/engineplugin/updateEnginePluginBML + +**Request method**: POST + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Update specific engine plugins + +**Request parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | ------------ | -------- | -------- | --------- ---- | ------ | +| file | engine material file | body | true | MultipartFile | | +| ecType | engine type name | body | true | String| | +| version | engine version | body | true | String | | + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | dataset | object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "mess": "upload file success" + } +} +``` + + + +## Engine Plugins + +**Interface address**: /api/rest_j/v1/engineplugin/list + +**Request method**: GET + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Request all engine plugin information + +**Request parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| ----------- | ------------ | -------- | -------- | ------ -------- | ------ | +| currentPage | current page | qurey | true | integer(int32) | | +| ecType | engine type name | qurey | false | String | | +| version | engine version | qurey | false | String | | +| pageSize | page size | qurey | true | integer(int32) | | + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | dataset | object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "totalPage": 17, + "queryList": [ + { + "id": 239, + "engineConnType": "python", + "version": "python2", + "fileName": "lib.zip", + "lastModified": 1661950452000, + "fileSize": 6093507, + "bmlResourceId": "8edb8e88-fc75-4ce3-a330-3ece9ec533cb", + "bmlResourceVersion": "v000001", + "createTime": "2022-08-31 20:56:59", + "lastUpdateTime": "2022-08-31 20:56:59" + }, + { + "id": 238, + "engineConnType": "python", + "version": "python2", + "fileName": "conf.zip", + "lastModified": 1661950450000, + "fileSize": 43841, + "bmlResourceId": "a46beb9b-7368-4900-a2a6-241f1ec49002", + "bmlResourceVersion": "v000001", + "createTime": "2022-08-31 20:56:54", + "lastUpdateTime": "2022-08-31 20:56:54" + } + ] + } +} +``` + + + +## New engine plugin + +**Interface address**:/api/rest_j/v1/engineplugin/uploadEnginePluginBML + +**Request method**: POST + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Upload a new engine plugin + +**Request parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | ------------------ | -------- | -------- | --- ---------- | ------ | +| file | engine material file compression package | body | true | MultipartFile | | + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | dataset | object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "mess": "upload file success" + } +} +``` + + + +## Remove engine plugins + +**Interface address**:/api/rest_j/v1/engineplugin/deleteEnginePluginBML + +**Request method**: GET + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**:`*/*` + +**Interface Description**: + +Delete the specified engine plugin + +**Request parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | ------------ | -------- | -------- | -------- | ------ | +| ecType | engine type name | qurey | true | String | | +| version | engine version | qurey | false | String | | + +**Response Status**: + +| status code | description | schema | +| ------ | ------------ | ------- | +| 200 | OK | Message | +| 401 | Unauthorized | | +| 403 | Forbidden | | +| 404 | Not Found | | + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | -------------- | -------------- | +| data | data set| object | | +| message | description | string | | +| method | request url | string | | +| status | status | integer(int32) | integer(int32) | + +**Response Example**: + +``` +{"method":null,"status":0,"message":"OK","data":{"msg":"delete successfully"}} +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md new file mode 100644 index 00000000000..5c01760fdbc --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md @@ -0,0 +1,109 @@ +--- +title: Engine Material Refresh Interface +sidebar_position: 0.1 +--- +>The material resources mainly used for the engine (under {LINKIS_INSTALL_HOME}/lib/linkis-engineconn-plugin, the jar package/configuration file of the engine) are updated to BML. + +## refresh + +**Interface address**:`/api/rest_j/v1/engineplugin/refresh` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**: Update the material resources of the specified engine + + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ecType|Engine Type|query|true|string|| +|version|version can be empty or *|query|false|string|| + +**Sample Request**: +``` +#url +http://ip:port/api/rest_j/v1/engineplugin/refresh?ecType=hive&version=2.3.3 + +#Request Header +Content-Type:application/json +Token-Code:BML-AUTH +Token-User:hadoop +``` + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "msg": "Refresh successfully" + } +} +```` + + +##refreshAll + + +**Interface address**:`/api/rest_j/v1/engineplugin/refreshAll` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**: Update material resources of all engines + + +**Request Parameters**: +none + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "msg": "Refresh successfully" + } +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/_category_.json b/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/_category_.json new file mode 100644 index 00000000000..85236f81fce --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Entrance Service", + "position": 5 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-management-api.md new file mode 100644 index 00000000000..b3a155db972 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-management-api.md @@ -0,0 +1,128 @@ +--- +title: Task Management +sidebar_position: 8 +--- +** EntranceMetricRestfulApi class ** + + +# Task management + + +## start task + + +**Interface address**:`/api/rest_j/v1/entrance/api/metrics/runningtask` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Start task

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## task info + + +**Interface address**:`/api/rest_j/v1/entrance/api/metrics/taskinfo` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Task information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|Creator|query|false|string| +|engineTypeLabel|Engine Type Label|query|false|string| +|user|user|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-operation-api.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-operation-api.md new file mode 100644 index 00000000000..11a67e88f9c --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-entrance-api/task-operation-api.md @@ -0,0 +1,565 @@ +--- +title: Task Action +sidebar_position: 7 +--- +** EntranceRestfulApi class ** + + +## process task request + + +**Interface address**:`/api/rest_j/v1/entrance/execute` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

The execute function handles the request submitted by the user to execute the task

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|json|json|body|true|object| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Submit the execute function + + +**Interface address**:`/api/rest_j/v1/entrance/submit` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Submit execute function

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|Submit|json|body|true|Submit|Submit| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## end task + + +**Interface address**: `/api/rest_j/v1/entrance/{id}/kill` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

kill task

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|ID|path|false|string| +|taskID|taskID|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## End Jobs + + +**Interface address**: `/api/rest_j/v1/entrance/{id}/killJobs` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

End Jobs

+ +**Request example**: +````javascript +{ + "taskIDList": [], + "idList": [] +} +```` + + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id request path generation |true|string|string| +|taskIDList|collection of task IDs|false|String|String| +|idList|ID collection|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/entrance/#id/killJobs", + "status": 0, + "message": "success", + "data": { + "messages": [{ + "method": "", + "status": 0, + "message": "", + "data": { + "execID": "" + } + }] + } +} +```` + + +## task log + + +**Interface address**: `/api/rest_j/v1/entrance/{id}/log` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get task log

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|Task ID|path|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Pause task + + +**Interface address**:`/api/rest_j/v1/entrance/{id}/pause` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Pause task

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|Task ID|path|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Mission progress + + +**Interface address**:`/api/rest_j/v1/entrance/{id}/progress` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Task progress

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|Task ID|path|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## Resource progress + + +**Interface address**:`/api/rest_j/v1/entrance/{id}/progressWithResource` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Resource progress

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|ID|path|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## task status + + +**Interface address**:`/api/rest_j/v1/entrance/{id}/status` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Task status

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|ID|path|false|string| +|taskID|taskID|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/_category_.json b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/_category_.json new file mode 100644 index 00000000000..bd94533009f --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "LinkisManger Services", + "position": 2 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ec-resource-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ec-resource-management-api.md new file mode 100644 index 00000000000..05cda8bfd2f --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ec-resource-management-api.md @@ -0,0 +1,288 @@ +--- +title: EC Resource Information Management +sidebar_position: 10 +--- +** ECResourceInfoRestfulApi class ** + + + + +## delete EC info + + +**Interface address**:`/api/rest_j/v1/linkisManager/ecinfo/delete/{ticketid}}` + + +**Request method**: `DELETE` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

Delete EC information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketid|ticketid|path|true|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|204|No Content| +|401|Unauthorized| +|403|Forbidden| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get EC information + + +**Interface address**: `/api/rest_j/v1/linkisManager/ecinfo/get` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

Get EC information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketid|ticketid|query|true|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + +## Search EC information + + +**Interface address**: `/api/rest_j/v1/linkisManager/ecinfo/ecrHistoryList` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

Get EC information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|instance|instance|query|false|string| +|creator|creator|query|false|string| +|startDate|startDate|query|false|string| +|endDate|endDate|query|false|string| +|engineType|engineType|query|false|string| +|pageNow|pageNow|query|false|Int| +|pageSize|pageSize|query|false|Int| + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "message": "", + "status": 0, + "data": { + "engineList": [ + { + "id": -94209540.07806732, + "requestResource": "consectetur dolor eiusmod ipsum", + "releasedResource": "est in id Ut", + "usedTimes": -51038117.02855969, + "ticketId": "adipisicing in nostrud do", + "ecmInstance": "id magna Lorem eiusmod", + "engineType": "dolor", + "usedTime": -38764910.74278392, + "logDirSuffix": "sunt eiusmod aute et", + "releaseTime": -33417043.232267484, + "usedResource": "in amet veniam velit", + "requestTimes": -15643696.319572791, + "labelValue": "veniam incididunt magna", + "releaseTimes": 96384811.3484546, + "createTime": 38434279.49900183, + "serviceInstance": "consequat aliqua in enim", + "createUser": "Lorem Ut occaecat amet" + }, + { + "labelValue": "adipisicing deserunt do", + "usedTimes": 49828407.223826766, + "usedResource": "mollit laboris cupidatat enim", + "releaseTimes": -73400915.22672182, + "releasedResource": "est qui id ipsum mollit", + "requestResource": "deserunt reprehenderit ut", + "serviceInstance": "do laborum", + "requestTimes": -33074164.700212136, + "ecmInstance": "dolore", + "logDirSuffix": "ea incididunt", + "createUser": "Ut exercitation officia dolore ipsum", + "usedTime": 25412456.522457644, + "createTime": -93227549.70578489, + "id": -84032815.0589972, + "ticketId": "eu in mollit do", + "engineType": "non Ut eu", + "releaseTime": 34923394.9602966 + }, + { + "releaseTime": -91057731.93164417, + "usedTime": 99226623.97199354, + "id": 59680041.603043556, + "requestResource": "officia Ut enim nulla", + "usedTimes": -14680356.219609797, + "logDirSuffix": "proident amet reprehenderit tempor", + "ticketId": "minim esse", + "releaseTimes": 37270921.94107443, + "serviceInstance": "enim adipisicing cupidatat", + "createUser": "culpa", + "requestTimes": -33504917.797325186, + "releasedResource": "et dolore quis", + "ecmInstance": "elit dolor adipisicing id", + "createTime": -38827280.78902944, + "engineType": "ullamco in eiusmod reprehenderit aute", + "labelValue": "dolore qui labore nulla laboris", + "usedResource": "irure sint nostrud Excepteur sunt" + }, + { + "requestResource": "deserunt incididunt enim", + "releaseTimes": -16708903.732444778, + "id": 80588551.12419662, + "ecmInstance": "et veniam", + "releaseTime": -50240956.63233949, + "usedTimes": -5348294.728038415, + "labelValue": "incididunt tempor reprehenderit quis eu", + "createUser": "in in", + "serviceInstance": "minim sit", + "ticketId": "in dolore", + "usedTime": -30138563.761232898, + "logDirSuffix": "quis laborum ea", + "createTime": 65920455.93896958, + "requestTimes": 38810152.0160971, + "engineType": "est in Ut proident", + "usedResource": "nulla laboris Ut", + "releasedResource": "cupidatat irure" + }, + { + "usedResource": "Lorem adipisicing dolor", + "createTime": -11906770.11266476, + "labelValue": "et id magna", + "releaseTimes": 32546901.20497243, + "id": -90442428.4679744, + "logDirSuffix": "aute ut eu commodo", + "ticketId": "cillum sint non deserunt", + "requestResource": "non velit sunt consequat culpa", + "requestTimes": -75282512.0022062, + "usedTime": 6378131.554130778, + "releasedResource": "Duis in", + "serviceInstance": "dolore ut officia", + "usedTimes": 70810503.51038182, + "createUser": "voluptate sed", + "ecmInstance": "laboris do sit dolore ipsum", + "engineType": "id", + "releaseTime": 37544575.30154848 + } + ] + } +} +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ecm-resource-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ecm-resource-management-api.md new file mode 100644 index 00000000000..9ca5c30aee4 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/ecm-resource-management-api.md @@ -0,0 +1,402 @@ +--- +title: ECM Resource Information Management +sidebar_position: 10 +--- +** ECResourceInfoRestfulApi class ** + + + + +## delete EC info + + +**Interface address**:`/api/rest_j/v1/linkisManager/ecinfo/delete/{ticketid}}` + + +**Request method**: `DELETE` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

Delete EC information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketid|ticketid|path|true|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|204|No Content| +|401|Unauthorized| +|403|Forbidden| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get EC information + + +**Interface address**: `/api/rest_j/v1/linkisManager/ecinfo/get` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

Get EC information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|ticketid|ticketid|query|true|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 + } +```` +## ECM resource list + + +**Interface address**: `/api/rest_j/v1/linkisManager/listAllEMs` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

Get a detailed list of all ECM resources, which can be queried according to conditions, and query all by default

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|instance|instance name|query|false|string| +|nodeHealthy|Status, the status has the following enumeration types 'Healthy', 'UnHealthy', 'WARN', 'StockAvailable', 'StockUnavailable'|query|false|string| +|owner|Creator|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/linkisManager/listAllEMs", + "status": 0, + "message": "OK", + "data": { + "EMs": [{ + "labels": [{ + "stringValue": "", + "labelKey": "", + "feature": "", + "instance": "", + "serviceInstance": { + "instance": "", + "applicationName": "" + }, + "serviceName": "", + "featureKey": "", + "empty": + }], + "applicationName": "", + "instance": ":", + "resourceType": "", + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": , + "instance": + }, + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": 0, + "cores": 0, + "instance": 0 + }, + "expectedResource": { + "memory": 0, + "cores": 0, + "instance": 0 + }, + "leftResource": { + "memory": , + "cores": , + "instance": + }, + "owner": "", + "runningTasks": null, + "pendingTasks": null, + "succeedTasks": null, + "failedTasks": null, + "maxMemory": , + "usedMemory": , + "systemCPUUsed": null, + "systemLeftMemory": , + "nodeHealthy": "", + "msg": "", + "startTime": + }] + } +} +```` + + +## Edit EMC instance + + +**Interface address**: `/api/rest_j/v1/linkisManager/modifyEMInfo` + + +**Request method**: `PUT` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

Edit or modify the instance under EMC management

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|Engine Label|false|String|String| +|emStatus|Instance status, the status has the following enumeration types 'Healthy', 'UnHealthy', 'WARN', 'StockAvailable', 'StockUnavailable'|false|String|String| +|instance|Engine instance name|false|String|String| +|labelKey|The label in the added content belongs to the key in the map in the labels collection|false|String|String| +|labels|The engine instance updates the parameter content, and the collection stores the map type |false|List|List| +|stringValue|The value of the label in the added content belongs to the value in the map in the labels collection|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/linkisManager/modifyEMInfo", + "status": 0, + "message": "success", + "data": {} +} +```` + + +## Open engine log + + +**Interface address**: `/api/rest_j/v1/linkisManager/openEngineLog` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

Open the engine log, the stdout type engine log is opened by default

+ +**Request example**: +````javascript +{ + applicationName: "" + emInstance: "" + instance: "" + parameters: { + pageSize: , + fromLine: , + logType: "" + } +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|Engine Label|String|false|String| +|emInstance|Instance name|String|false|String| +|fromLine|From Line|String|false|String| +|instance|Engine instance name|String|false|String| +|logType|Log type, default stdout type, belonging to parameters|String|false|String| +|pageSize|Page Size|String|false|String| +|parameters|Pagination information|Map|false|Map| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/linkisManager/openEngineLog", + "status": 0, + "message": "OK", + "data": { + "result": { + "logPath": "", + "logs": [""], + "endLine": , + "rows": + }, + "isError": false, + "errorMsg": "" + } +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/engine-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/engine-management-api.md new file mode 100644 index 00000000000..7e0379e0716 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/engine-management-api.md @@ -0,0 +1,579 @@ +--- +title: Engine Management +sidebar_position: 11 +--- +** EngineRestfulApi class ** + + + + +## create engine connection + + +**Interface address**:`/api/rest_j/v1/linkisManager/createEngineConn` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

Create engine connection

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Execute engine connection operation + + +**Interface address**: `/api/rest_j/v1/linkisManager/executeEngineConnOperation` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

Execute engine connection operation

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## Get engine connection + + +**Interface address**: `/api/rest_j/v1/linkisManager/getEngineConn` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

Get engine connection

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +##kill engine connection + + +**Interface address**: `/api/rest_j/v1/linkisManager/killEngineConn` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

kill engine connection

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## All node states + + +**Interface address**:`/api/rest_j/v1/linkisManager/listAllNodeHealthyStatus` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

All node status

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|onlyEditable|onlyEditable|query|false|boolean| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/linkisManager/listAllNodeHealthyStatus", + "status": 0, + "message": "OK", + "data": { + "nodeStatus": [] + } +} +```` + + +## List engine + + +**Interface address**: `/api/rest_j/v1/linkisManager/listEMEngines` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

List Engine

+ +**Request example**: +````javascript +{ + em: { + serviceInstance: { + applicationName: "linkis-cg-engineconnmanager", + instance: "localhost110003:9102" + } + } +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|Engine tag name, which belongs to the value in serviceInstance|String|false|String| +|em|The outermost layer of the input parameter|Map|false|Map| +|emInstance|The name of the engine instance and the level of 'em' belong to the outermost layer|String|false|String| +|engineType|The engine type belongs to the outermost level with the same level as 'em'|String|false|String| +|instance|Instance name|String|false|String| +|nodeStatus|The status is the outermost level with 'em', and the status has the following enumeration types 'Healthy', 'UnHealthy', 'WARN', 'StockAvailable', 'StockUnavailable'|String|false|String| +|owner|The creator is at the same level as 'em' and belongs to the outermost layer|String|false|String| +|serviceInstance|The input parameter belongs to ''em|Map|false|Map| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/linkisManager/listEMEngines", + "status": 0, + "message": "OK", + "data": { + "engines": [] + } +} +```` +## Engine user collection + + +**Interface address**:`/api/rest_j/v1/linkisManager/listUserEngines` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `application/json` + + +**Interface description**:

Engine user set

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Edit engine instance + + +**Interface address**:`/api/rest_j/v1/linkisManager/modifyEngineInfo` + + +**Request method**: `PUT` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

Edit engine instance content

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|Engine Label|false|String|String| +|emStatus|Running Status|false|String|String| +|instance|Engine instance name|false|String|String| +|labelKey|The label in the added content belongs to the key in the map in the labels collection|false|String|String| +|labels|The engine instance updates the parameter content, and the collection stores the map type |false|List|List| +|stringValue|The value of the label in the added content belongs to the value in the map in the labels collection|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +##kill engine + + +**Interface address**: `/api/rest_j/v1/linkisManager/rm/enginekill` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `application/json` + + +**Interface description**:

Close the engine, one or more can be closed

+ + +**Request example**: +````javascript + [ + { + engineInstance: "", + applicationName:"" + } + ] + +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|The application name, the outermost layer is an array and the engineInstance parameter is a level|false|String|String| +|engineInstance|The name of the engine instance, the outermost layer is an array and the applicationName parameter is a level|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/resource-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/resource-management-api.md new file mode 100644 index 00000000000..c9db836be2f --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-cg-linkismanager-api/resource-management-api.md @@ -0,0 +1,606 @@ +--- +title: Resource Management +sidebar_position: 12 +--- +** RMMonitorRest class ** + + + + +## All user resources + + +**Interface address**:`/api/rest_j/v1/linkisManager/rm/allUserResource` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

All user resources

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|creator|query|false|string| +|engineType|engineType|query|false|string| +|page|page|query|false|integer(int32)| +|size|size|query|false|integer(int32)| +|username|username|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "total": 34, + "resources": [{ + "id": , + "username": "", + "creator": "", + "engineTypeWithVersion": "", + "resourceType": "", + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": "instance": 0 + }, + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": 0, + "cores": 0, + "instance": 0 + }, + "expectedResource": null, + "leftResource": { + "memory": , + "cores": , + "instance": + }, + "createTime": , + "updateTime": , + "loadResourceStatus": "", + "queueResourceStatus": + }] + } +} +```` + + +## Application List + + +**Interface address**: `/api/rest_j/v1/linkisManager/rm/applicationlist` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Get the list of application engines in resource management

+ +**Request example**: +````javascript +{ + userCreator: "" +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|userCreator|userCreator|query|true|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": , + "status": , + "message": "", + "data": { + "applications": [{ + "creator": "", + "applicationList": { + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": , + "instance": + }, + "engineInstances": [{ + "resource": { + "resourceType": "", + "maxResource": { + "memory": , + "cores": , + "instance": + }, + "minResource": { + "memory": , + "cores": , + "instance": + }, + "usedResource": { + "memory": , + "cores": , + "instance": + }, + "lockedResource": { + "memory": , + "cores": , + "instance": + }, + "expectedResource": null, + "leftResource": { + "memory": , + "cores": , + "instance": + } + }, + "engineType": "", + "owner": "", + "instance": "", + "creator": "", + "startTime": "", + "status": "", + "label": "" + }] + } + }] + } +} +```` + +## EngineType + +**Interface address**: `/api/rest_j/v1/linkisManager/rm/engineType` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface Description**:

Engine Type

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Engine manager + + +**Interface address**: `/api/rest_j/v1/linkisManager/rm/engines` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface Description**:

Engine Manager

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|false|object| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## queue manager + + +**Interface address**: `/api/rest_j/v1/linkisManager/rm/queueresources` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Queue Manager

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|true|object| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## queue + + +**Interface address**: `/api/rest_j/v1/linkisManager/rm/queues` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Queue

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|false|object| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## reset resources + + +**Interface address**:`/api/rest_j/v1/linkisManager/rm/resetResource` + + +**Request method**: `DELETE` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Reset resources

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|resourceId|query|false|integer(int32)| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|204|No Content| +|401|Unauthorized| +|403|Forbidden| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Resource information + + +**Interface address**: `/api/rest_j/v1/linkisManager/rm/userresources` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Query resource list and detailed resource data such as usage percentage

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|param|param|body|false|object| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "userResources": [{ + "userCreator": "", + "engineTypes": [{ + "engineType": "", + "percent": "" + }], + "percent": "" + }] + } +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/_category_.json b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/_category_.json new file mode 100644 index 00000000000..795162be5ef --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Context Service", + "position": 3 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-history-service-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-history-service-api.md new file mode 100644 index 00000000000..c1b436f6fc3 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-history-service-api.md @@ -0,0 +1,320 @@ +--- +title: Context History Service +sidebar_position: 14 +--- +** ContextHistoryRestfulApi class ** + + + +## create history + + +**Interface address**:`/api/rest_j/v1/contextservice/createHistory` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface Description**:

Create History

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| Parameter name | Parameter description | Required | Request type| Data type | schema | +|contextHistory|History context|false|String|String| +|contextID|context id|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get multiple histories + + +**Interface address**:`/api/rest_j/v1/contextservice/getHistories` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Get multiple history records

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| Parameter name | Parameter description | Required | Request type| Data type | schema | +|contextID|context id|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get history + + +**Interface address**:`/api/rest_j/v1/contextservice/getHistory` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Get history records

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| Parameter name | Parameter description | Required | Request type| Data type | schema | +|contextID|ContextId|false|String|String| +|source|Context Source|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## delete history + + +**Interface address**:`/api/rest_j/v1/contextservice/removeHistory` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete history records

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| Parameter name | Parameter description | Required | Request type| Data type | schema | +|contextHistory|History context|false|String|String| +|contextID|context id|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## search history + + +**Interface address**:`/api/rest_j/v1/contextservice/searchHistory` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Search history

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| Parameter name | Parameter description | Required | Request type| Data type | schema | +|contextID|ContextId|false|String|String| +|keywords|Keywords|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-listening-service-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-listening-service-api.md new file mode 100644 index 00000000000..5d42edfee2c --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-listening-service-api.md @@ -0,0 +1,188 @@ +--- +title: Context Listening Service +sidebar_position: 16 +--- +** ContextListenerRestfulApi class ** + + +# Context listener service + + +## heartbeat + + +**Interface address**:`/api/rest_j/v1/contextservice/heartbeat` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**: + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## onBindIDListener + + +**Interface address**:`/api/rest_j/v1/contextservice/onBindIDListener` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**: + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## onBindKeyListener + + +**Interface address**:`/api/rest_j/v1/contextservice/onBindKeyListener` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**: + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-logging-service-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-logging-service-api.md new file mode 100644 index 00000000000..a31534f5e06 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-logging-service-api.md @@ -0,0 +1,378 @@ +--- +title: Context Logging Service +sidebar_position: 17 +--- +** ContextIDRestfulApi class ** + + +## create text record + + +**Interface address**: `/api/rest_j/v1/contextservice/createContextID` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Create text record

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| +|contextID|ContextId|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get text ID + + +**Interface address**: `/api/rest_j/v1/contextservice/getContextID` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get text ID

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|contextId|ContextId|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## delete text ID + + +**Interface address**: `/api/rest_j/v1/contextservice/removeContextID` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete text ID

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| +|contextId|ContextId|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## reset text ID + + +**Interface address**: `/api/rest_j/v1/contextservice/resetContextID` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface Description**:

Reset Text ID

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| +|contextId|ContextId|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Search text Id execution time + + +**Interface address**:`/api/rest_j/v1/contextservice/searchContextIDByTime` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Search text ID execution time

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessTimeEnd|Access end time|query|false|string| +|accessTimeStart|Access Start Time|query|false|string| +|createTimeEnd|Create end time|query|false|string| +|createTimeStart|create time|query|false|string| +|pageNow|page number|query|false|string| +|pageSize|page size|query|false|string| +|updateTimeEnd|Update end time|query|false|string| +|updateTimeStart|Update time|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Modify text ID + + +**Interface address**: `/api/rest_j/v1/contextservice/updateContextID` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Modify text ID

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|jsonNode|jsonNode|body|true|JsonNode|JsonNode| +|contextId|ContextId|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-service-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-service-api.md new file mode 100644 index 00000000000..173af923d25 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-cs-api/context-service-api.md @@ -0,0 +1,697 @@ +--- +title: Context API +sidebar_position: 15 +--- +** ContextRestfulApi class ** + + + +## Clear all context by ID + + +**Interface address**: `/api/rest_j/v1/contextservice/clearAllContextByID` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Clear all context by ID

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|idList|Context id collection|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Clear all context by time + + +**Interface address**:`/api/rest_j/v1/contextservice/clearAllContextByTime` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Clear so context by time

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|bodyMap|bodyMap|body|true|object| +|accessTimeEnd|Access Time End|false|String|String| +|accessTimeStart|Access Time Start|false|String|String| +|createTimeEnd|Create time end|false|String|String| +|createTimeStart|Create Time|false|String|String| +|updateTimeStart|Update start time|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## Get context content + + +**Interface address**:`/api/rest_j/v1/contextservice/getContextValue` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Get context content

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextID|context id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## delete all values + + +**Interface address**:`/api/rest_j/v1/contextservice/removeAllValue` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete all values

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextID|context id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Remove all values ​​by value prefix + + +**Interface address**:`/api/rest_j/v1/contextservice/removeAllValueByKeyPrefix` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Remove all values ​​by prefix and context type

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextID|contextID|false|String|String| +|keyPrefix|keyPrefix|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Remove all values ​​by key prefix and context type + + +**Interface address**:`/api/rest_j/v1/contextservice/removeAllValueByKeyPrefixAndContextType` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Remove all values ​​by prefix and context type

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextKeyType|contextKeyType|false|String|String| +|keyPrefix|keyPrefix|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + +## delete value + + +**Interface address**:`/api/rest_j/v1/contextservice/removeValue` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete value

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextID|context id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## reset value + + +**Interface address**:`/api/rest_j/v1/contextservice/resetValue` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Reset value

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextID|context id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## search context content + + +**Interface address**:`/api/rest_j/v1/contextservice/searchContextValue` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Search context content

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|condition|condition|false|String|String| +|contextID|context id|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## set value + + +**Interface address**:`/api/rest_j/v1/contextservice/setValue` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Set value

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextID|context id|false|String|String| +|contextKeyValue|contextKeyValue|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## set key + + +**Interface address**:`/api/rest_j/v1/contextservice/setValueByKey` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Set key for value

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +| +|contextID|context id|false|String|String| +|contextKey|contextKey|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/_category_.json b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/_category_.json new file mode 100644 index 00000000000..b1604031365 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Public Service", + "position": 1 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bm-operation-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bm-operation-management-api.md new file mode 100644 index 00000000000..dc8afead378 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bm-operation-management-api.md @@ -0,0 +1,443 @@ +--- +title: BM Project Operation Management +sidebar_position: 29 +--- + +** BmlProjectRestful class ** + + +## Attachment resource item + + +**Interface address**:`/api/rest_j/v1/bml/attachResourceAndProject` + + +**Request mode**:`POST` + + +**Request data type**:`application/json` + + +**Response data type**:`*/*` + + +**Interface description**:

Attachment resource item

+ + + +**Request parameters**: + + +|parameter name | parameter description | request type | must be | data type | schema| +| -------- | -------- | ----- | -------- | -------- | ------ | +|projectName | project name | string | false | string| +|resourceid | resource name | string | false | string| + + +**Response status**: + +|Status code | description | schema| +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +|parameter name | parameter description | type | schema| +| -------- | -------- | ----- |----- | +|data | dataset | object| +|message | description | string| +|method| request url|string| +|status | status | integer | integer | + + +**Response example**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## Create BML project + + +**Interface address**:`/api/rest_j/v1/bml/createBmlProject` + + +**Request mode**:`POST` + + +**Request data type**:`application/json` + + +**Response data type**:`*/*` + + +**Interface description**:

Create BML project

+ + + +**Request parameters**: + + +|parameter name | parameter description | request type | must be | data type | schema| +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessusers | access users | string | false | string| +|editusers | edit user | string | false | string| +|projectName | project name | string | false | string| + + +**Response status**: + + +|Status code | description | schema| +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +|Parameter name | parameter description | type | schema| +| -------- | -------- | ----- |----- | +|Data | dataset | object| +|Message | description | string| +|Method| request url|string| +|Status | status | integer | integer | + + +**Response example**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## Download shared resources + + +**Interface address**:`/api/rest_j/v1/bml/downloadShareResource` + + +**Request mode**:`GET` + + +**Request data type**:`application/x-www-form-urlencoded` + + +**Response data type**:`*/*` + + +**Interface description**:

Download shared resources

+ + + +**Request parameters**: + + +|Parameter name | parameter description | request type | must be | data type | schema| +| -------- | -------- | ----- | -------- | -------- | ------ | +|Resourceid | resource ID | query | false | string| +|Version | version | query | false | string| + + +**Response status**: + + +|Status code | description | schema| +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +|parameter name | parameter description | type | schema| +| -------- | -------- | ----- |----- | +|data | dataset | object| +|message | description | string| +|method| request url|string| +|status | status | integer | integer | + + +**Response example**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## Project information + + +**Interface address**:`/api/rest_j/v1/bml/getProjectInfo` + + +**Request mode**:`GET` + + +**Request data type**:`application/x-www-form-urlencoded` + + +**Response data type**:`*/*` + + +**Interface description**:

Project information

+ + + +**Request parameters**: + + +|Parameter name | parameter description | request type | must be | data type | schema| +| -------- | -------- | ----- | -------- | -------- | ------ | +|ProjectName | project name | query | false | string| + + +**Response status**: + + +|Status code | description | schema| +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +|Parameter name | parameter description | type | schema| +| -------- | -------- | ----- |----- | +|Data | dataset | object| +|Message | description | string| +|Method| request url|string| +|Status | status | integer | integer | + + +**Response example**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## Update project user + + +**Interface address**:`/api/rest_j/v1/bml/updateProjectUsers` + + +**Request mode**:`POST` + + +**Request data type**:`application/json` + + +**Response data type**:`*/*` + + +**Interface description**:

Update project users

+ + + +**Request parameters**: + + +|parameter name | parameter description | whether it is required | request type | data type | schema| +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessusers | access users | false | string | string| +|editusers | edit user | false | string | string| +|projectName | project name | false | string | string| + + +**Response status**: + + +|Status code | description | schema| +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +|Parameter name | parameter description | type | schema| +| -------- | -------- | ----- |----- | +|Data | dataset | object| +|Message | description | string| +|Method| request url|string| +|Status | status | integer | integer | + + +**Response example**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## Update shared resources + + +**Interface address**:`/api/rest_j/v1/bml/updateShareResource` + + +**Request mode**:`POST` + + +**Request data type**:`multipart/form-data` + + +**Response data type**:`*/*` + + +**Interface description**:

Update shared resources

+ + + +**Request parameters**: + + +|parameter name | parameter description | request type | must be | data type | schema| +| -------- | -------- | ----- | -------- | -------- | ------ | +|file | file | formdata | false | ref| +|resourceid | resource ID | query | false | string| + +**Response status**: + + +|Status code | description | schema| +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +|Parameter name | parameter description | type | schema| +| -------- | -------- | ----- |----- | +|Data | dataset | object| +|Message | description | string| +|Method| request url|string| +|Status | status | integer | integer | + + +**Response example**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + + +## Upload shared resources + + +**Interface address**:`/api/rest_j/v1/bml/uploadShareResource` + + +**Request mode**:`POST` + + +**Request data type**:`application/json` + + +**Response data type**:`*/*` + + +**Interface description**:

Upload shared resources

+ + + +**Request parameters**: + + +|parameter name | parameter description | request type | must be | data type | schema| +| -------- | -------- | ----- | -------- | -------- | ------ | +|expireTime | expiration time | query | false | string| +|expiretype | failure type | query | false | string| +|file | file set | formdata | false | ref| +|isexpire | invalid | query | false | string| +|maxversion | MAV version | query | false | ref| +|projectName | project name | query | false | string| +|resourceheader | resource header | query | false | string| +|system | system | query | false | string| + +**Response status**: + + +|Status code | description | schema| +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +|Parameter name | parameter description | type | schema| +| -------- | -------- | ----- |----- | +|Data | dataset | object| +|Message | description | string| +|Method| request url|string| +|Status | status | integer | integer | + + +**Response example**: +```javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +``` + diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bml-resource-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bml-resource-management-api.md new file mode 100644 index 00000000000..482277d4d45 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bml-resource-management-api.md @@ -0,0 +1,803 @@ +--- +title: BML Resource Management +sidebar_position: 30 +--- +** BmlRestfulApi class ** + + +## update owner + + +**Interface address**:`/api/rest_j/v1/bml/changeOwner` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Update owner

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|newOwner|Old Owner||false|String|String| +|oldOwner|New Owner||false|String|String| +|resourceId|ResourceId||false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + +## Copy resources to other users + + +**Interface address**:`/api/rest_j/v1/bml/copyResourceToAnotherUser` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Copy resources to specified user

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|anotherUser|specified user||false|String|String| +|resourceId|ResourceId||false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## delete resource + + +**Interface address**:`/api/rest_j/v1/bml/deleteResource` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete version

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|ResourceId||true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## delete multiple resources + + +**Interface address**:`/api/rest_j/v1/bml/deleteResources` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete multiple resources

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceIds| Collection of resource IDs, delete multiple resources||true|List|List| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## delete version + + +**Interface address**:`/api/rest_j/v1/bml/deleteVersion` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete version

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|ResourceId||true|String|String| +|version|version||true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Download resources + + +**Interface address**:`/api/rest_j/v1/bml/download` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get the resources corresponding to download through the two parameters of resourceId and version

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|ResourceId|query|false|string|| +|version|Resource version, if not specified, defaults to latest |query|false|string|| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + +## Get Basic + + +**Interface address**:`/api/rest_j/v1/bml/getBasic` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get Basic

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|ResourceId|query|true|string|| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get resource information + + +**Interface address**:`/api/rest_j/v1/bml/getResourceInfo` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get resource information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|ResourceId|query|false|string|| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get resource information + + +**Interface address**:`/api/rest_j/v1/bml/getResources` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get resource information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|page number|query|false|string|| +|pageSize|page size|query|false|string|| +|system|system|query|false|string|| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + +## Get version information + + +**Interface address**: `/api/rest_j/v1/bml/getVersions` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get bml version information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|page number|query|false|string|| +|pageSize|page size|query|false|string|| +|resourceId|Resource ID|query|false|string|| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## rollback version + + +**Interface address**:`/api/rest_j/v1/bml/rollbackVersion` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Rollback version

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|resourceId|ResourceId||false|String|String| +|version|Rollback version||false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## update resource + + +**Interface address**:`/api/rest_j/v1/bml/updateVersion` + + +**Request method**: `POST` + + +**Request data type**: `multipart/form-data` + + +**Response data type**: `*/*` + + +**Interface description**:

Users update resource files through http

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|file|filefile|formData|true|ref|| +|resourceId|resourceId|query|true|string|| of the resource the user wishes to update + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## upload resources + + +**Interface address**:`/api/rest_j/v1/bml/upload` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Upload resources

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|file|file|formData|true|array|file| +|expireTime|expireTime|query|false|string|| +|expireType|expireType|query|false|string|| +|isExpire|isExpire|query|false|string|| +|maxVersion|maxVersion|query|false|integer(int32)|| +|resourceHeader|resourceHeader|query|false|string|| +|system|system|query|false|string|| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created|| +|401|Unauthorized|| +|403|Forbidden|| +|404|Not Found|| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object|| +|message|Description|string|| +|method|request url|string|| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bmlfs-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bmlfs-management-api.md new file mode 100644 index 00000000000..ba906f6e171 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/bmlfs-management-api.md @@ -0,0 +1,200 @@ +--- +title: BMLFS Management +sidebar_position: 18 +--- +** BMLFsRestfulApi class ** + + + +## Open ScriptFromBML + + +**Interface address**:`/api/rest_j/v1/filesystem/openScriptFromBML` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

openScriptFromBML

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|fileName|File name|query|true|string| +|creator|Creator|query|false|string| +|projectName|Project name|query|false|string| +|resourceId|ResourceId|query|false|string| +|version|version|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## -product-openScriptFromBML + + +**Interface address**:`/api/rest_j/v1/filesystem/product/openScriptFromBML` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

/product/openScriptFromBML

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|fileName|File name|query|true|string| +|creator|Creator|query|false|string| +|resourceId|ResourceId|query|false|string| +|version|version|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Save script from BML + + +**Interface address**:`/api/rest_j/v1/filesystem/saveScriptToBML` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Save script from BML

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|Creator|true|String|String| +|fileName|File name|true|String|String| +|metadata|metadata|true|String|String| +|projectName|Project Name|true|String|String| +|resourceId|Resource ID|true|String|String| +|scriptContent|Content|true|String|String| +|SaveScriptToBML|json|body|true|SaveScriptToBML|SaveScriptToBML| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/currency-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/currency-api.md new file mode 100644 index 00000000000..2acdcf18fd7 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/currency-api.md @@ -0,0 +1,62 @@ +--- +title: Public API +sidebar_position: 6 +--- +** CommonRestfulApi class ** + +## offline + + +**Interface address**:`/api/rest_j/v1/offline` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Offline

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/data-source-manager-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/data-source-manager-api.md new file mode 100644 index 00000000000..c6b8782fdc7 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/data-source-manager-api.md @@ -0,0 +1,1495 @@ +--- +title: DataSource API +sidebar_position: 1 +--- + +# DataSourceAdminRestfulApi + +## queryDataSourceEnv +**Interface address**: `/api/rest_j/v1/data-source-manager/env` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Query the list of cluster environment information configured by the data source + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|currentPage|query|false|integer(int32)|| +|name|name|query|false|string|| +|pageSize|pageSize|query|false|integer(int32)|| +|typeId|typeId|query|false|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/env", + "status": 0, + "message": "OK", + "data": { + "queryList": [ + { + "id": 2, + "envName": "Test Environment UAT", + "envDesc": "Test Environment UAT", + "dataSourceTypeId": 4, + "connectParams": { + "hadoopConf": { + "hive.metastore.execute.setugi": "true" + }, + "uris": "thrift://localhost:9083" + }, + "createTime": 1647249913000, + "modifyTime": 1647249913000 + }, + { + "id": 3, + "envName": "Open Source Test Environment", + "envDesc": "Open Source Test Environment", + "dataSourceTypeId": 4, + "connectParams": { + "keytab": "4dd408ad-a2f9-4501-83b3-139290977ca2", + "uris": "thrift://bdpclustername:9083", + "principle": "hadoop@WEBANK.COM" + }, + "createTime": 1647249913000, + "modifyTime": 1647249913000 + } + ] + } +} +```` +## getAllEnvListByDataSourceType +**Interface address**: `/api/rest_j/v1/data-source-manager/env-list/all/type/{typeId}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Query a list of cluster information configured by a data source + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|typeId|typeId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/env-list/all/type/4", + "status": 0, + "message": "OK", + "data": { + "envList": [ + { + "id": 1, + "envName": "Test Environment SIT" + }, + { + "id": 2, + "envName": "Test Environment UAT" + }, + { + "id": 3, + "envName": "Open Source Test Environment" + } + ] + } +} +```` +## insertJsonEnv +**Interface address**: `/api/rest_j/v1/data-source-manager/env/json` + +**Request method**: `POST` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request example**: +````javascript +{ + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" +} +```` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceEnv|dataSourceEnv|body|true|DataSourceEnv|DataSourceEnv| +|  connectParams|||false|object|| +|  createTime|||false|string(date-time)|| +|  createUser|||false|string|| +|  dataSourceType|||false|DataSourceType|DataSourceType| +|    classifier|||false|string|| +|    description|||false|string|| +|    icon|||false|string|| +|    id|||false|string|| +|    layers|||false|integer|| +|    name|||false|string|| +|    option|||false|string|| +|  dataSourceTypeId|||false|integer(int64)|| +|  envDesc|||false|string|| +|  envName|||false|string|| +|  id|||false|integer(int64)|| +|  modifyTime|||false|string(date-time)|| +|  modifyUser|||false|string|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` +## getEnvEntityById +**Interface address**:`/api/rest_j/v1/data-source-manager/env/{envId}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Query the detailed information of an environment + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|envId|envId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/env/1", + "status": 0, + "message": "OK", + "data": { + "env": { + "id": 1, + "envName": "Test Environment SIT", + "envDesc": "Test Environment SIT", + "connectParams": { + "hadoopConf": { + "hive.metastore.execute.setugi": "true" + }, + "uris": "thrift://localhost:9083" + }, + "createTime": 1647249913000, + "modifyTime": 1647249913000 + } + } +} +```` +## removeEnvEntity +**Interface address**:`/api/rest_j/v1/data-source-manager/env/{envId}` + +**Request method**: `DELETE` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|envId|envId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/env/4", + "status": 0, + "message": "OK", + "data": { + "removeId": 4 + } +} +```` +##updateJsonEnv +**Interface address**: `/api/rest_j/v1/data-source-manager/env/{envId}/json` + +**Request method**: `PUT` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request example**: +````javascript +{ + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" +} +```` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceEnv|dataSourceEnv|body|true|DataSourceEnv|DataSourceEnv| +|  connectParams|||false|object|| +|  createTime|||false|string(date-time)|| +|  createUser|||false|string|| +|  dataSourceType|||false|DataSourceType|DataSourceType| +|    classifier|||false|string|| +|    description|||false|string|| +|    icon|||false|string|| +|    id|||false|string|| +|    layers|||false|integer|| +|    name|||false|string|| +|    option|||false|string|| +|  dataSourceTypeId|||false|integer(int64)|| +|  envDesc|||false|string|| +|  envName|||false|string|| +|  id|||false|integer(int64)|| +|  modifyTime|||false|string(date-time)|| +|  modifyUser|||false|string|| +|envId|envId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` +# DataSourceCoreRestfulApi + +## queryDataSource +**Interface address**:`/api/rest_j/v1/data-source-manager/info` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Query the specific information of the data source + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|currentPage|currentPage|query|false|integer(int32)|| +|identifies|identifies|query|false|string|| +|name|name|query|false|string|| +|pageSize|pageSize|query|false|integer(int32)|| +|system|system|query|false|string|| +|typeId|typeId|query|false|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/info", + "status": 0, + "message": "OK", + "data": { + "totalPage": 12, + "queryList": [ + { + "id": 11, + "dataSourceName": "test1256", + "dataSourceTypeId": 4, + "createSystem": "Linkis", + "createTime": 1647909291000, + "createUser": "hadoop", + "versionId": 1, + "expire": false, + "dataSourceType": { + "id": "11", + "name": "hive", + "layers": 0 + } + }, + { + "id": 10, + "dataSourceName": "hive-test", + "dataSourceDesc": "hive test", + "dataSourceTypeId": 4, + "createSystem": "Linkis", + "createTime": 1647862455000, + "modifyTime": 1647930476000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 3, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "id": "10", + "name": "hive", + "layers": 0 + } + } + + ] + } +} +```` +## removeDataSource +**Interface address**:`/api/rest_j/v1/data-source-manager/info/delete/{dataSourceId}` + +**Request method**: `DELETE` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: delete a data source data + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/info/delete/1", + "status": 0, + "message": "OK", + "data": { + "removeId": 1 + } +} +```` +## insertJsonInfo +**Interface address**:`/api/rest_j/v1/data-source-manager/info/json` + +**Request method**: `POST` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request example**: +````javascript +{ + "connectParams": {}, + "createIdentify": "", + "createSystem": "", + "createTime": "", + "createUser": "", + "dataSourceDesc": "", + "dataSourceEnv": { + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" + }, + "dataSourceEnvId": 0, + "dataSourceName": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "expire": true, + "id": 0, + "labels": "", + "modifyTime": "", + "modifyUser": "", + "publishedVersionId": 0, + "versionId": 0, + "versions": [ + { + "comment": "", + "connectParams": {}, + "createTime": "", + "createUser": "", + "datasourceId": 0, + "parameter": "", + "versionId": 0 + } + ] +} +```` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSource|dataSource|body|true|DataSource|DataSource| +|  connectParams|||false|object|| +|  createIdentify|||false|string|| +|  createSystem|||false|string|| +|  createTime|||false|string(date-time)|| +|  createUser|||false|string|| +|  dataSourceDesc|||false|string|| +|  dataSourceEnv|||false|DataSourceEnv|DataSourceEnv| +|    connectParams|||false|object|| +|    createTime|||false|string|| +|    createUser|||false|string|| +|    dataSourceType|||false|DataSourceType|DataSourceType| +|      classifier|||false|string|| +|      description|||false|string|| +|      icon|||false|string|| +|      id|||false|string|| +|      layers|||false|integer|| +|      name|||false|string|| +|      option|||false|string|| +|    dataSourceTypeId|||false|integer|| +|    envDesc|||false|string|| +|    envName|||false|string|| +|    id|||false|integer|| +|    modifyTime|||false|string|| +|    modifyUser|||false|string|| +|  dataSourceEnvId|||false|integer(int64)|| +|  dataSourceName|||false|string|| +|  dataSourceType|||false|DataSourceType|DataSourceType| +|    classifier|||false|string|| +|    description|||false|string|| +|    icon|||false|string|| +|    id|||false|string|| +|    layers|||false|integer|| +|    name|||false|string|| +|    option|||false|string|| +|  dataSourceTypeId|||false|integer(int64)|| +|  expire|||false|boolean|| +|  id|||false|integer(int64)|| +|  labels|||false|string|| +|  modifyTime|||false|string(date-time)|| +|  modifyUser|||false|string|| +|  publishedVersionId|||false|integer(int64)|| +|  versionId|||false|integer(int64)|| +|  versions|||false|array|DatasourceVersion| +|    comment|||false|string|| +|    connectParams|||false|object|| +|    createTime|||false|string|| +|    createUser|||false|string|| +|    datasourceId|||false|integer|| +|    parameter|||false|string|| +|    versionId|||false|integer|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` +## getInfoByDataSourceName +**Interface address**: `/api/rest_j/v1/data-source-manager/info/name/{dataSourceName}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Query data source information through datsourceName + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/info/name/hive-test", + "status": 0, + "message": "OK", + "data": { + "info": { + "id": 10, + "dataSourceName": "hive-test", + "dataSourceDesc": "hive test", + "dataSourceTypeId": 4, + "createSystem": "Linkis", + "connectParams": { + "envId": "3" + }, + "createTime": 1647862455000, + "modifyTime": 1647930476000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 3, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "name": "hive", + "layers": 0 + } + } + } +} +```` +## getInfoByDataSourceId +**Interface address**:`/api/rest_j/v1/data-source-manager/info/{dataSourceId}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/info/1", + "status": 0, + "message": "OK", + "data": { + "info": { + "id": 1, + "dataSourceName": "Open source co-construction environment", + "dataSourceDesc": "123", + "dataSourceTypeId": 1, + "createSystem": "Linkis", + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + }, + "createTime": 1647258360000, + "modifyTime": 1647437692000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 1, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "name": "mysql", + "icon": "https://uat.dongcha.weoa.com/static/img/logo.770c1525.png", + "layers": 0 + } + } + } +} +```` +## expireDataSource +**Interface address**: `/api/rest_j/v1/data-source-manager/info/{dataSourceId}/expire` + +**Request method**: `PUT` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/info/1/expire", + "status": 0, + "message": "OK", + "data": { + "expireId": 1 + } +} +```` +##updateDataSourceInJson +**Interface address**: `/api/rest_j/v1/data-source-manager/info/{dataSourceId}/json` + +**Request method**: `PUT` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request example**: +````javascript +{ + "connectParams": {}, + "createIdentify": "", + "createSystem": "", + "createTime": "", + "createUser": "", + "dataSourceDesc": "", + "dataSourceEnv": { + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" + }, + "dataSourceEnvId": 0, + "dataSourceName": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "expire": true, + "id": 0, + "labels": "", + "modifyTime": "", + "modifyUser": "", + "publishedVersionId": 0, + "versionId": 0, + "versions": [ + { + "comment": "", + "connectParams": {}, + "createTime": "", + "createUser": "", + "datasourceId": 0, + "parameter": "", + "versionId": 0 + } + ] +} +```` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSource|dataSource|body|true|DataSource|DataSource| +|  connectParams|||false|object|| +|  createIdentify|||false|string|| +|  createSystem|||false|string|| +|  createTime|||false|string(date-time)|| +|  createUser|||false|string|| +|  dataSourceDesc|||false|string|| +|  dataSourceEnv|||false|DataSourceEnv|DataSourceEnv| +|    connectParams|||false|object|| +|    createTime|||false|string|| +|    createUser|||false|string|| +|    dataSourceType|||false|DataSourceType|DataSourceType| +|      classifier|||false|string|| +|      description|||false|string|| +|      icon|||false|string|| +|      id|||false|string|| +|      layers|||false|integer|| +|      name|||false|string|| +|      option|||false|string|| +|    dataSourceTypeId|||false|integer|| +|    envDesc|||false|string|| +|    envName|||false|string|| +|    id|||false|integer|| +|    modifyTime|||false|string|| +|    modifyUser|||false|string|| +|  dataSourceEnvId|||false|integer(int64)|| +|  dataSourceName|||false|string|| +|  dataSourceType|||false|DataSourceType|DataSourceType| +|    classifier|||false|string|| +|    description|||false|string|| +|    icon|||false|string|| +|    id|||false|string|| +|    layers|||false|integer|| +|    name|||false|string|| +|    option|||false|string|| +|  dataSourceTypeId|||false|integer(int64)|| +|  expire|||false|boolean|| +|  id|||false|integer(int64)|| +|  labels|||false|string|| +|  modifyTime|||false|string(date-time)|| +|  modifyUser|||false|string|| +|  publishedVersionId|||false|integer(int64)|| +|  versionId|||false|integer(int64)|| +|  versions|||false|array|DatasourceVersion| +|    comment|||false|string|| +|    connectParams|||false|object|| +|    createTime|||false|string|| +|    createUser|||false|string|| +|    datasourceId|||false|integer|| +|    parameter|||false|string|| +|    versionId|||false|integer|| +|dataSourceId|dataSourceId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` +## getInfoByDataSourceIdAndVersion +**Interface address**: `/api/rest_j/v1/data-source-manager/info/{dataSourceId}/{version}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| +|version|version|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/info/1/1", + "status": 0, + "message": "OK", + "data": { + "info": { + "id": 1, + "dataSourceName": "Open source co-construction environment", + "dataSourceDesc": "123", + "dataSourceTypeId": 1, + "createSystem": "Linkis", + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + }, + "createTime": 1647258360000, + "modifyTime": 1647437692000, + "modifyUser": "hadoop", + "createUser": "hadoop", + "versionId": 1, + "publishedVersionId": 1, + "expire": false, + "dataSourceType": { + "name": "mysql", + "icon": "https://uat.dongcha.weoa.com/static/img/logo.770c1525.png", + "layers": 0 + } + } + } +} +```` +## getKeyDefinitionsByType +**Interface address**:`/api/rest_j/v1/data-source-manager/key-define/type/{typeId}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|typeId|typeId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/key-define/type/4", + "status": 0, + "message": "OK", + "data": { + "keyDefine": [ + { + "id": 6, + "key": "envId", + "description": "Cluster Environment", + "name": "Cluster Environment", + "valueType": "SELECT", + "require": true, + "dataSource": "/data-source-manager/env-list/all/type/4" + }, + { + "id": 7, + "key": "keyTabFile", + "description": "KeyTab file", + "name": "keyTab file", + "valueType": "FILE", + "require": false, + "dataSource": "http://127.0.0.1:9001/api/rest_j/v1/bml/upload" + } + ] + } +} +```` +## getConnectParams +**Interface address**: `/api/rest_j/v1/data-source-manager/name/{dataSourceName}/connect-params` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/name/linkis_test256/connect-params", + "status": 0, + "message": "OK", + "data": { + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + } + } +} +```` +## insertJsonParameter +**Interface address**:`/api/rest_j/v1/data-source-manager/parameter/{dataSourceId}/json` + +**Request method**: `POST` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| +|params|params|body|true|object|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` +## publishByDataSourceId +**Interface address**: `/api/rest_j/v1/data-source-manager/publish/{dataSourceId}/{versionId}` + +**Request method**: `POST` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| +|versionId|versionId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/publish/3/2", + "status": 0, + "message": "OK", + "data": {} +} +```` +## getAllDataSourceTypes +**Interface address**:`/api/rest_j/v1/data-source-manager/type/all` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: +No +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/type/all", + "status": 0, + "message": "OK", + "data": { + "typeList": [ + { + "id": "1", + "name": "mysql", + "description": "mysql database", + "option": "mysql database", + "classifier": "Relational Database", + "icon": "https://uat.dongcha.weoa.com/static/img/logo.770c1525.png", + "layers": 3 + }, + + { + "id": "4", + "name": "hive", + "description": "hive database", + "option": "hive", + "classifier": "Big Data Storage", + "layers": 3 + } + + ] + } +} +```` +## getConnectParams +**Interface address**:`/api/rest_j/v1/data-source-manager/{dataSourceId}/connect-params` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/3/connect-params", + "status": 0, + "message": "OK", + "data": { + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + } + } +} +```` +## getVersionList +**Interface address**: `/api/rest_j/v1/data-source-manager/{dataSourceId}/versions` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/1/versions", + "status": 0, + "message": "OK", + "data": { + "versions": [ + { + "versionId": 1, + "datasourceId": 1, + "connectParams": { + "host": "127.0.0.1", + "password": "xxxxx", + "port": "9600", + "username": "linkis" + }, + "parameter": "{\"host\":\"127.0.0.1\",\"port\":\"9600\",\"username\":\"linkis\",\"password\": \"rO0ABXQACUFiY2RAMjAyMg==\"}", + "comment": "Initialization Version", + "createUser": "hadoop" + } + ] + } +} +```` +## connectDataSource +**Interface address**: `/api/rest_j/v1/data-source-manager/{dataSourceId}/{version}/op/connect` + +**Request method**: `PUT` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|integer(int64)|| +|version|version|path|true|integer(int64)|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ + "method": "/api/data-source-manager/1/1/op/connect", + "status": 0, + "message": "OK", + "data": { + "ok": true + } +} +```` +# data-source-operate-restful-api +## connect +**Interface address**:`/api/rest_j/v1/data-source-manager/op/connect/json` + +**Request method**: `POST` + +**Request data type**: `application/json` + +**Response data type**: `application/json` + +**Interface description**: + +**Request example**: +````javascript +{ + "connectParams": {}, + "createIdentify": "", + "createSystem": "", + "createTime": "", + "createUser": "", + "dataSourceDesc": "", + "dataSourceEnv": { + "connectParams": {}, + "createTime": "", + "createUser": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "envDesc": "", + "envName": "", + "id": 0, + "modifyTime": "", + "modifyUser": "" + }, + "dataSourceEnvId": 0, + "dataSourceName": "", + "dataSourceType": { + "classifier": "", + "description": "", + "icon": "", + "id": "", + "layers": 0, + "name": "", + "option": "" + }, + "dataSourceTypeId": 0, + "expire": true, + "id": 0, + "labels": "", + "modifyTime": "", + "modifyUser": "", + "publishedVersionId": 0, + "versionId": 0, + "versions": [ + { + "comment": "", + "connectParams": {}, + "createTime": "", + "createUser": "", + "datasourceId": 0, + "parameter": "", + "versionId": 0 + } + ] +} +```` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSource|dataSource|body|true|DataSource|DataSource| +|  connectParams|||false|object|| +|  createIdentify|||false|string|| +|  createSystem|||false|string|| +|  createTime|||false|string(date-time)|| +|  createUser|||false|string|| +|  dataSourceDesc|||false|string|| +|  dataSourceEnv|||false|DataSourceEnv|DataSourceEnv| +|    connectParams|||false|object|| +|    createTime|||false|string|| +|    createUser|||false|string|| +|    dataSourceType|||false|DataSourceType|DataSourceType| +|      classifier|||false|string|| +|      description|||false|string|| +|      icon|||false|string|| +|      id|||false|string|| +|      layers|||false|integer|| +|      name|||false|string|| +|      option|||false|string|| +|    dataSourceTypeId|||false|integer|| +|    envDesc|||false|string|| +|    envName|||false|string|| +|    id|||false|integer|| +|    modifyTime|||false|string|| +|    modifyUser|||false|string|| +|  dataSourceEnvId|||false|integer(int64)|| +|  dataSourceName|||false|string|| +|  dataSourceType|||false|DataSourceType|DataSourceType| +|    classifier|||false|string|| +|    description|||false|string|| +|    icon|||false|string|| +|    id|||false|string|| +|    layers|||false|integer|| +|    name|||false|string|| +|    option|||false|string|| +|  dataSourceTypeId|||false|integer(int64)|| +|  expire|||false|boolean|| +|  id|||false|integer(int64)|| +|  labels|||false|string|| +|  modifyTime|||false|string(date-time)|| +|  modifyUser|||false|string|| +|  publishedVersionId|||false|integer(int64)|| +|  versionId|||false|integer(int64)|| +|  versions|||false|array|DatasourceVersion| +|    comment|||false|string|| +|    connectParams|||false|object|| +|    createTime|||false|string|| +|    createUser|||false|string|| +|    datasourceId|||false|integer|| +|    parameter|||false|string|| +|    versionId|||false|integer|| + +**Response parameters**: + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data||object|| +|message||string|| +|method||string|| +|status||integer(int32)|integer(int32)| + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/file-system-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/file-system-api.md new file mode 100644 index 00000000000..7d211c4fc81 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/file-system-api.md @@ -0,0 +1,1035 @@ +--- +title: File System API +sidebar_position: 27 +--- +** FsRestfulApi class ** + + + + + +## create new Dir + + +**Interface address**:`/api/rest_j/v1/filesystem/createNewDir` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Create a new Dir

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|path|true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## create new file + + +**Interface address**: `/api/rest_j/v1/filesystem/createNewFile` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Create a new file

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|path|true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## delete dir file or file + + +**Interface address**: `/api/rest_j/v1/filesystem/deleteDirOrFile` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete dir file or file

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|address|true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 + } +```` + + +## download + + +**Interface address**:`/api/rest_j/v1/filesystem/download` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Download

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|charset|Charset|true|String|String| +|path|address|true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## file info + + +**Interface address**:`/api/rest_j/v1/filesystem/fileInfo` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface Description**:

File Information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|address|query|true|string| +|pageSize|page size|query|false|ref| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## format + + +**Interface address**:`/api/rest_j/v1/filesystem/formate` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

resultsets converted to Excel

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|encoding|encoding|query|true|string| +|escapeQuotes|escapeQuotes|query|true|string| +|fieldDelimiter|Field Delimiter|query|true|string| +|hasHeader|Hash value|query|true|boolean| +|quote|quote|query|true|string| +|path|address|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## function list + + +**Interface address**:`/api/rest_j/v1/filesystem/getDirFileTrees` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get a list of udf functions

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|request path|query|true|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/filesystem/getDirFileTrees", + "status": 0, + "message": "OK", + "data": { + "dirFileTrees": { + "name": "", + "path": "", + "properties": null, + "children": [{ + "name": "", + "path": "", + "properties": { + "size": "", + "modifytime": "" + }, + "children": , + "isLeaf": , + "parentPath": "" + }], + "isLeaf": , + "parentPath": + } + } +} +```` + + +## root path + + +**Interface address**:`/api/rest_j/v1/filesystem/getUserRootPath` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get root path

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|pathType|FileType|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## does it exist + + +**Interface address**: `/api/rest_j/v1/filesystem/isExist` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Whether it exists

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|address|query|true|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## open a file + + +**Interface address**: `/api/rest_j/v1/filesystem/openFile` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Open file

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|address|query|true|string| +|charset|Charset|query|false|string| +|page|page number|query|false|ref| +|pageSize|page size|query|false|ref| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/filesystem/openFile", + "status": 0, + "message": "OK", + "data": { + "metadata": [{ + "columnName": "_c0", + "comment": "NULL", + "dataType": "" + }], + "totalPage": , + "totalLine": , + "page": , + "type": "", + "fileContent": [ + [""] + ] + } +} +```` + + +## Turn on logging + + +**Interface address**:`/api/rest_j/v1/filesystem/openLog` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Open logging

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|address|query|false|string| +|proxyUser|Proxy User|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/filesystem/openLog", + "status": 0, + "message": "OK", + "data": { + "log": ["", ""] + } +} +```` +## Rename + + +**Interface address**:`/api/rest_j/v1/filesystem/rename` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Rename the file

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|newDest|new name|false|String|String| +|oldDest|old name|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Convert the result set to Excel + + +**Interface address**: `/api/rest_j/v1/filesystem/resultsetToExcel` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Convert the result set to Excel

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|autoFormat|Auto |query|false|boolean| +|charset|result set|query|false|string| +|csvSeerator|csv Separator|query|false|string| +|limit|limit|query|false|ref| +|nullValue|null value|query|false|string| +|outputFileName|Output file name|query|false|string| +|outputFileType|Output file type|query|false|string| +|path|address|query|false|string| +|quoteRetouchEnable| Whether to quote modification|query|false|boolean| +|sheetName|sheet name|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Convert resultsets to Excel + + +**Interface address**:`/api/rest_j/v1/filesystem/resultsetsToExcel` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

resultsets converted to Excel

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|autoFormat|Auto |query|true|boolean| +|limit|limit|query|true|ref| +|nullValue|null value|query|true|string| +|outputFileName|Output file name|query|true|string| +|path|address|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## save the script + + +**Interface address**:`/api/rest_j/v1/filesystem/saveScript` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Save script

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|address|true|String|String| +|SaveScript|json|body|true|SaveScript|SaveScript| +|charset|Charset|false|String|String| +|params|Page Size|false|Object|Object| +|scriptContent|page number|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## upload + + +**Interface address**:`/api/rest_j/v1/filesystem/upload` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Upload files, multiple files can be uploaded

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|file|file|formData|false|ref| +|path|address|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/global-variable-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/global-variable-api.md new file mode 100644 index 00000000000..d7fa44f91b3 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/global-variable-api.md @@ -0,0 +1,78 @@ +--- +title: Global Variable API +sidebar_position: 23 +--- +** VariableRestfulApi class ** + + +## add global variables + + +**Interface address**:`/api/rest_j/v1/variable/saveGlobalVariable` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Add global variables

+ +**Request example**: +````javascript +{ + globalVariables: [{ + keyID: , + key: "", + valueID: , + value: "" + }] +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|globalVariables|Added parameter data one-to-many key:globalVariables,value:List|Map|true|Map| +|key|Parameter name, belonging to globalVariables|String|true|String| +|value| variable value, and key belong to the key-value pair that is contained by globalVariables |List|true|List| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/variable/saveGlobalVariable", + "status": 0, + "message": "OK", + "data": {} +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/homepage-function-interface-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/homepage-function-interface-api.md new file mode 100644 index 00000000000..20883d2f5ad --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/homepage-function-interface-api.md @@ -0,0 +1,328 @@ +--- +title: Admin Console Home Page Interface +sidebar_position: 28 +--- +** QueryRestfulApi class ** + + +## admin authentication + + +**Interface address**:`/api/rest_j/v1/jobhistory/governanceStationAdmin` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Used to verify whether it is an administrator, if it is, it will return true if it is not false

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + data: { + solution: null, + admin: true + } + message: "OK" + method: "/api/jobhistory/governanceStationAdmin" + status: 0 +} +```` + + +## global history + + +**Interface address**:`/api/rest_j/v1/jobhistory/list` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Acquire global historical data list according to conditions and get all by default

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|Creator|query|false|string| +|endDate|End time|query|false|integer(int64)| +|executeApplicationName|operator|query|false|string| +|isAdminView|Whether it is in administrator mode or normal mode|query|false|boolean| +|pageSize|Number of pages|query|false|ref| +|proxyUser|Proxy User|query|false|string| +|startDate|Start time|query|false|integer(int64)| +|status|end time|query|false|string| +|taskID|ID|query|false|integer(int64)| +|tpageNow|page number|query|false|ref| +|pageNow|pageNow|query|false|integer(int32)| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + { + "method": "/api/jobhistory/list", + "status": 0, + "message": "OK", + "data": { + "solution": null, + "totalPage": 90, + "tasks": [{ + "taskID": , + "instance": ", + "execId": "", + "umUser": "", + "engineInstance": null, + "executionCode": "", + "progress": "", + "logPath": "", + "resultLocation": "", + "status": "", + "createdTime": , + "updatedTime": , + "engineType": "", + "errCode": 0, + "errDesc": "", + "executeApplicationName": "", + "requestApplicationName": "", + "runType": "datachecker", + "paramsJson": "", + "costTime": 1000, + "strongerExecId": "", + "sourceJson": "", + "sourceTailor": "", + "engineStartTime": null, + "labels": [], + "canRetry": , + "subJobs": + }] + } + } +} +```` +## list undo + + +**Interface address**:`/api/rest_j/v1/jobhistory/listundone` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Undo list

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|creator|query|false|string| +|endDate|End time|query|false|integer(int64)| +|engineType|engineType|query|false|string| +|pageNow|pageNow|query|false|ref| +|pageSize|pageSize|query|false|ref| +|startDate|Start time|query|false|ref| +|startTaskID|startTaskID|query|false|integer(int64)| +|status|status|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## History details + + +**Interface address**:`/api/rest_j/v1/jobhistory/{id}/get` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get the detailed information of a history through the history ID

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|HistoryId|query|false|integer(int64)| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +```javascript +{ + "method": "/api/jobhistory/1928730/get", + "status": 0, + "message": "OK", + "data": { + "task": { + "taskID": , + "instance": "", + "execId": "", + "umUser": "", + "engineInstance": "", + "executionCode": "", + "progress": "", + "logPath": "", + "resultLocation": "", + "status": "", + "createdTime":, + "updatedTime": , + "engineType": "", + "errCode": , + "errDesc": "", + "executeApplicationName": "", + "requestApplicationName": "", + "runType": "hql", + "paramsJson": "", + "costTime": , + "strongerExecId": "", + "sourceJson": "", + "sourceTailor": "", + "engineStartTime": null, + "labels": [""], + "canRetry": false, + "subJobs": null + } + } +} +``` + + + diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/instance-management-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/instance-management-api.md new file mode 100644 index 00000000000..211537951c9 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/instance-management-api.md @@ -0,0 +1,289 @@ +--- +title: Instance Management API +sidebar_position: 26 +--- +** InstanceRestful class ** + + + + +## Microservice instance list + + +**Interface address**: `/api/rest_j/v1/microservice/allInstance` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get the list of microservice management module instances to get single or multiple default all

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "instances": [{ + "id": , + "updateTime": , + "createTime": , + "applicationName": ", + "instance": "", + "labels": [{ + "stringValue": "", + "labelKey": "", + "feature": "", + "id": 5, + "labelValueSize": 0, + "modifiable": true, + "updateTime": , + "createTime": , + "featureKey": "", + "empty": + }] + }] + } +} +```` + + +## Get eurekaURL + + +**Interface address**: `/api/rest_j/v1/microservice/eurekaURL` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

return eurekaURL

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "url": "" + } +} +```` + + +## Edit the microservice instance + + +**Interface address**: `/api/rest_j/v1/microservice/instanceLabel` + + +**Request method**: `PUT` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Edit or modify the instance in microservice management

+ +**Request example**: +````javascript +{ + applicationName: "linkis-ps-cs" + instance: "localhost110004:9108" + labels: [{ + labelKey: "route", + stringValue: "cs_2_dev" + }] +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|applicationName|Engine Label|String|false|String| +|instance|Engine instance name|String|false|String| +|labelKey|The label in the added content belongs to the key in the map in the labels collection|String|false|String| +|labels|The engine instance updates the parameter content, and the collection stores the map type |List|false|List| +|stringValue|The value of the label in the added content belongs to the value in the map in the labels collection|String|false|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "success", + "data": { + "labels": [{ + "stringValue": "", + "labelKey": "", + "feature": null, + "modifiable": , + "featureKey": "", + "empty": + }] + } +} +```` + + +## Modifiable label types + + +**Interface address**:`/api/rest_j/v1/microservice/modifiableLabelKey` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get a list of label types that can be modified, such as 'userCreator, route'

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "keyList": [] + } +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/jobhistory-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/jobhistory-api.md new file mode 100644 index 00000000000..c690546a6b8 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/jobhistory-api.md @@ -0,0 +1,251 @@ +--- +title: History Job Interface +sidebar_position: 3 +--- + +** QueryRestfulApi class ** + +## governanceStationAdmin +**Interface address**:`/api/rest_j/v1/jobhistory/governanceStationAdmin` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Determine whether the user is an administrator + +**Request Parameters**: +none + +**Sample Response**: + +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "admin": true + } +} +```` + + +## getHistoryTask +**Interface address**:`/api/rest_j/v1/jobhistory/{id}/get` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Get the list of database names of the data source + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|path|true|string|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "task": { + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + } + } +} +```` + +## listHistoryTask +**Interface address**:`/api/rest_j/v1/jobhistory/list` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|startDate|startDate|path|false|Long|| +|endDate|endDate|path|false|Long|| +|status|status|path|false|string|| +|pageNow|pageNow|path|false|Integer|| +|pageSize|pageSize|path|false|Integer|| +|taskID|taskID|path|false|Long|| +|executeApplicationName|executeApplicationName|path|false|string|| +|creator|creator|path|false|string|| +|proxyUser|proxyUser|path|false|string|| +|isAdminView|isAdminView|path|false|Boolean|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "tasks": [{ + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }, + { + "taskID": 2, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }], + "totalPage": 1 + } +} +```` + +## listUndoneHistoryTask +**Interface address**:`/api/rest_j/v1/jobhistory/listundone` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|startDate|startDate|path|false|Long|| +|endDate|endDate|path|false|Long|| +|status|status|path|false|string|| +|pageNow|pageNow|path|false|Integer|| +|pageSize|pageSize|path|false|Integer|| +|startTaskID|startTaskID|path|false|Long|| +|engineType|engineType|path|false|string|| +|creator|creator|path|false|string|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "tasks": [{ + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "Running", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }, + { + "taskID": 2, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "Running", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + }], + "totalPage": 1 + } +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/link-error-code.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/link-error-code.md new file mode 100644 index 00000000000..1441c928ccf --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/link-error-code.md @@ -0,0 +1,64 @@ +--- +title: Linkis Error Codes +sidebar_position: 20 +--- +** LinkisErrorCodeRestful class ** + + + +## Get Linkis error code + + +**Interface address**:`/api/rest_j/v1/errorcode/getAllErrorCodes` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get Linkis error code list

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/mdq-table-interface-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/mdq-table-interface-api.md new file mode 100644 index 00000000000..e08886e320d --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/mdq-table-interface-api.md @@ -0,0 +1,318 @@ +--- +title: Mdq Table Interface +sidebar_position: 21 +--- + +** MdqTableRestfulApi class ** + + + + +## Generate the DDL statement for the new library table + + +**Interface address**:`/api/rest_j/v1/datasource/displaysql` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Generate DDL statement for new library table

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|table|Table|String|false|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get partition statistics + + +**Interface address**:`/api/rest_j/v1/datasource/getPartitionStatisticInfo` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get partition statistics

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|Datasource|query|false|string| +|partitionSort|Partition Sort|String|false|String| +|tableName|table name|query|false|string| +|partitionPath|partitionPath|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + +## Get table information + + +**Interface address**:`/api/rest_j/v1/datasource/getTableBaseInfo` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get table information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|Datasource|query|false|string| +|tableName|table name|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get table field information + + +**Interface address**:`/api/rest_j/v1/datasource/getTableFieldsInfo` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get table field information

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|Datasource|query|false|string| +|tableName|table name|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Get table statistics + + +**Interface address**:`/api/rest_j/v1/datasource/getTableStatisticInfo` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get table statistics

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|database|Datasource|query|false|string| +|pageNow|page number|query|false|string| +|pageSize|page size|query|false|string| +|partitionSort|Partition Sort|query|false|string| +|tableName|table name|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadatamanager-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadatamanager-api.md new file mode 100644 index 00000000000..e42c233b121 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadatamanager-api.md @@ -0,0 +1,257 @@ +--- +title: Metadata Query API +sidebar_position: 3 +--- + +# MetadataCoreRestful + +## getColumns +**Interface address**: `/api/rest_j/v1/metadatamanager/columns/{dataSourceId}/db/{database}/table/{table}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Get the column information of the data table + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + +**Sample Response**: + +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "columns": [ + { + "index": 1, + "primaryKey": true, + "name": "id", + "type": "INT" + }, + { + "index": 2, + "primaryKey": false, + "name": "datasource_name", + "type": "VARCHAR" + }, + { + "index": 3, + "primaryKey": false, + "name": "datasource_desc", + "type": "VARCHAR" + }, + { + "index": 4, + "primaryKey": false, + "name": "datasource_type_id", + "type": "INT" + }, + { + "index": 5, + "primaryKey": false, + "name": "create_identify", + "type": "VARCHAR" + }, + { + "index": 6, + "primaryKey": false, + "name": "create_system", + "type": "VARCHAR" + }, + { + "index": 7, + "primaryKey": false, + "name": "parameter", + "type": "VARCHAR" + }, + { + "index": 8, + "primaryKey": false, + "name": "create_time", + "type": "DATETIME" + }, + { + "index": 9, + "primaryKey": false, + "name": "modify_time", + "type": "DATETIME" + }, + { + "index": 10, + "primaryKey": false, + "name": "create_user", + "type": "VARCHAR" + }, + { + "index": 11, + "primaryKey": false, + "name": "modify_user", + "type": "VARCHAR" + }, + { + "index": 12, + "primaryKey": false, + "name": "labels", + "type": "VARCHAR" + }, + { + "index": 13, + "primaryKey": false, + "name": "version_id", + "type": "INT" + }, + { + "index": 14, + "primaryKey": false, + "name": "expire", + "type": "TINYINT" + }, + { + "index": 15, + "primaryKey": false, + "name": "published_version_id", + "type": "INT" + } + ] + } +} +```` + + +## getDatabases +**Interface address**:`/api/rest_j/v1/metadatamanager/dbs/{dataSourceId}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Get the list of database names of the data source + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string|| +|system|system|query|true|string|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "dbs": [ + "information_schema", + "linkis", + "linkis_sit" + ] + } +} +```` + + +## getPartitions +**Interface address**:`/api/rest_j/v1/metadatamanager/partitions/{dataSourceId}/db/{database}/table/{table}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| +|traverse|traverse|query|false|boolean|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "props": { + "partKeys": [ + "ds" + ], + "root": {} + } + } +} +```` + +## getTableProps +**Interface address**:`/api/rest_j/v1/metadatamanager/props/{dataSourceId}/db/{database}/table/{table}` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceId|dataSourceId|path|true|string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "props": { + "skip.header.line.count": "1", + "columns.types": "int:int:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string", + "columns": "id,age,job,marital,education,default,balance,housing,loan,contact,day,month,duration,campaign,pdays,previous,poutcome,y", + "field.delim": ",", + "transient_lastDdlTime": "1646732554", + "partition_columns.types": "string", + "columns.comments": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "bucket_count": "-1", + "serialization.ddl": "struct demo_data { i32 id, i32 age, string job, string marital, string education, string default, string balance, string housing, string loan, string contact, string day, string month, string duration, string campaign, string pdays, string previous, string poutcome, string y}", + "file.outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", + "partition_columns": "ds", + "colelction.delim": "-", + "serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", + "name": "dss_autotest.demo_data", + "location": "hdfs://bdpdev01/user/hive/warehouse/hadoop/dss_autotest.db/demo_data", + "mapkey.delim": ":", + "file.inputformat": "org.apache.hadoop.mapred.TextInputFormat", + "serialization.format": ",", + "column.name.delimiter": "," + } + } +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadataquery-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadataquery-api.md new file mode 100644 index 00000000000..aca3c2bedee --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/metadataquery-api.md @@ -0,0 +1,267 @@ +--- +title: Metadata Query API +sidebar_position: 3 +--- +> The new interface after the optimization of the metadata query interface, see [Metadata Query API](./metadatamanager-api.md) for the old interface that has been abandoned. Compared with the old interface, mainly adjust the request path and interface parameter naming + +# MetadataQueryRestful class + +## getColumns + +**Interface address**:`/api/rest_j/v1/metadataQuery/getColumns` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Get the column information of the data table + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|envId|envId|path| false |string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + +**Sample Response**: + +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "columns": [ + { + "index": 1, + "primaryKey": true, + "name": "id", + "type": "INT" + }, + { + "index": 2, + "primaryKey": false, + "name": "datasource_name", + "type": "VARCHAR" + }, + { + "index": 3, + "primaryKey": false, + "name": "datasource_desc", + "type": "VARCHAR" + }, + ] + } +} +```` + + +## getDatabases +**Interface address**:`/api/rest_j/v1/metadataQuery/getDatabases` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Get the list of database names of the data source + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|envId|envId|path| false |string|| +|system|system|query|true|string|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "dbs": [ + "information_schema", + "linkis", + "linkis_sit" + ] + } +} +```` + + +## getPartitions + +> return value adjusted to props -> partitions + +**Interface address**:`/api/rest_j/v1/metadataQuery/getPartitions` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| +|traverse|traverse|query|false|boolean|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "partitions": { + "partKeys": [ + "ds" + ], + "root": {} + } + } +} +```` + +## getTableProps + +**Interface address**:`/api/rest_j/v1/metadataQuery/getTableProps` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|database|database|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "props": { + "skip.header.line.count": "1", + "columns.types": "int:int:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string:string", + "columns": "id,age,job,marital,education,default,balance,housing,loan,contact,day,month,duration,campaign,pdays,previous,poutcome,y", + "field.delim": ",", + "transient_lastDdlTime": "1646732554", + "partition_columns.types": "string", + "columns.comments": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "bucket_count": "-1", + "serialization.ddl": "struct demo_data { i32 id, i32 age, string job, string marital, string education, string default, string balance, string housing, string loan, string contact, string day, string month, string duration, string campaign, string pdays, string previous, string poutcome, string y}", + "file.outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", + "partition_columns": "ds", + "colelction.delim": "-", + "serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", + "name": "dss_autotest.demo_data", + "location": "hdfs://bdpdev01/user/hive/warehouse/hadoop/dss_autotest.db/demo_data", + "mapkey.delim": ":", + "file.inputformat": "org.apache.hadoop.mapred.TextInputFormat", + "serialization.format": ",", + "column.name.delimiter": "," + } + } +} +```` + + +## getPartitionProps +**Interface address**:`/api/rest_j/v1/metadataQuery/getPartitionProps` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|database|database|path|true|string|| +|partition|partition|path|true|string|| +|system|system|query|true|string|| +|table|table|path|true|string|| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## getTables +**Interface address**:`/api/rest_j/v1/metadataQuery/getTables` + +**Request method**: `GET` + +**Request data type**: `application/x-www-form-urlencoded` + +**Response data type**: `application/json` + +**Interface description**: Get the list of data tables of a database of the data source + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|dataSourceName|dataSourceName|path|true|string|| +|envId|envId|path| false |string|| +|database|database|path|true|string|| +|system|system|query|true|string|| + +**Sample Response**: +````javascript +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "tables": [ + "test", + "test_0317a", + "test_import_sqoop_1", + "test_linkis_sqoop_1", + "test_linkis_sqoop_2", + "test_linkis_sqoop_3", + "upload_test" + ] + } +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/parameter-configuration-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/parameter-configuration-api.md new file mode 100644 index 00000000000..90d5a38582b --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/parameter-configuration-api.md @@ -0,0 +1,886 @@ +--- +title: Parameter Configuration +sidebar_position: 24 +--- +** ConfigurationRestfulApi class ** + + + + +## Add KeyForEngine + + +**Interface address**:`/api/rest_j/v1/configuration/addKeyForEngine` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Add KeyForEngine

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|engineType|engineType|query|false|string| +|keyJson|keyJson|query|false|string| +|token|token|query|false|string| +|version|version|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Add application type + + +**Interface address**:`/api/rest_j/v1/configuration/createFirstCategory` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Add application type tag

+ +**Request example**: +````javascript +{ + "categoryName": "", + "description": "" +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryName|Reference type label name|false|String|String| +|description|Description|false|String|STRing| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/createFirstCategory", + "status": 0, + "message": "OK", + "data": {} +} +```` + + +## Add parameter configuration + + +**Interface address**:`/api/rest_j/v1/configuration/createSecondCategory` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Add parameter configuration

+ +**Request example**: +````javascript +{ + categoryId: , + description: "", + engineType: "", + version: "" +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description |Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryId|Parameter ConfigurationId|true|String|String| +|description|Description|true|String|String| +|engineType|Engine Type|true|String|String| +|version|version number|true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/createSecondCategory", + "status": 0, + "message": "OK", + "data": {} +} +```` + + +## delete configuration + + +**Interface address**: `/api/rest_j/v1/configuration/deleteCategory` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete parameter configuration

+ +**Request example**: +````javascript +{ + categoryId: +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryId|Parameter ConfigurationId|String|true|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/deleteCategory", + "status": 0, + "message": "OK", + "data": {} +} +```` + + +## Engine type list + + +**Interface address**:`/api/rest_j/v1/configuration/engineType` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get a list of engine types

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/engineType", + "status": 0, + "message": "OK", + "data": { + "engineType": [] + } +} +```` +## App types + + +**Interface address**: `/api/rest_j/v1/configuration/getCategory` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Apply type tag in parameter configuration

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/getCategory", + "status": 0, + "message": "OK", + "data": { + "Category": [{ + "categoryId": , + "labelId": , + "categoryName": "", + "childCategory": [], + "description": null, + "tag": null, + "createTime": , + "updateTime": , + "level": , + "fatherCategoryName": "" + }], + "description": null, + "tag": null, + "createTime": , + "updateTime": , + "level": , + "fatherCategoryName": + }] +} +} +```` + + +## queue resources + + +**Interface address**:`/api/rest_j/v1/configuration/getFullTreesByAppName` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

The queue resource module in the parameter configuration returns the column and value of the queue resource

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|label name|query|false|string| +|engineType|engineType|query|false|string| +|version|version|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/getFullTreesByAppName", + "status": 0, + "message": "OK", + "data": { + "fullTree": [{ + "name": "Queue Resource", + "description": null, + "settings": [{ + "id": , + "key": "", + "description": "", + "name": "", + "defaultValue": "", + "validateType": "", + "validateRange": "[]", + "level": 1, + "engineType": , + "treeName": "", + "valueId": , + "configValue": "", + "configLabelId": , + "unit": null, + "isUserDefined": , + "hidden": , + "advanced": + }] + }] + } +} +```` + + +## Get key value + + +**Interface address**:`/api/rest_j/v1/configuration/keyvalue` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get key value

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|configKey|configKey|query|true|string| +|creator|creator|query|false|string| +|engineType|engineType|query|false|string| +|version|version|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` +## save key value + + +**Interface address**:`/api/rest_j/v1/configuration/keyvalue` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Save key value

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type| Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|configKey|configKey|true|String|String| +|configValue|configValue|true|String|String| +|creator|creator|true|String|String| +|engineType|engineType|true|String|String| +|version|version|true|String|String| +|SaveKeyValue|json|body|true|SaveKeyValue|SaveKeyValue| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## delete key value + + +**Interface address**:`/api/rest_j/v1/configuration/keyvalue` + + +**Request method**: `DELETE` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete key value

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|configKey|configKey|true|String|String| +|creator|creator|true|String|String| +|engineType|engineType|true|String|String| +|version|version|true|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|204|No Content| +|401|Unauthorized| +|403|Forbidden| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## rpc test + + +**Interface address**: `/api/rest_j/v1/configuration/rpcTest` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

rpc test

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|creator|query|false|string| +|engineType|engineType|query|false|string| +|username|username|query|false|string| +|version|version|query|false|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "data": {}, + "message": "", + "method": "", + "status": 0 +} +```` + + +## Save queue resources + + +**Interface address**:`/api/rest_j/v1/configuration/saveFullTree` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Save queue resources

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|creator|App Type Name|String|true|String| +|description|Description, belonging to the content in fullTree|String|true|String| +|engineType|Engine Type|String|true|String| +|fullTree|Details under Application Type|List|true|List| +|name|Queue resource name, which belongs to the content in fullTree|String|true|String| +|settings|Detailed content in the queue resource, belonging to the content in fullTree|List|true|List| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/saveFullTree", + "status": 0, + "message": "OK", + "data": {} +} +```` + + +## Update category information + + +**Interface address**: `/api/rest_j/v1/configuration/updateCategoryInfo` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Update category information

+ + +**Sample Response**: +````javascript +{ + description: "", + categoryId: +} +```` + +**Request Parameters**: + + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|categoryId|categoryId|String|true|String| +|description|description|String|true|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ + "method": "/api/configuration/updateCategoryInfo", + "status": 0, + "message": "OK", + "data": {} +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/udf-api.md b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/udf-api.md new file mode 100644 index 00000000000..e296fd4afae --- /dev/null +++ b/versioned_docs/version-1.4.0/api/http/linkis-ps-publicservice-api/udf-api.md @@ -0,0 +1,1256 @@ +--- +title: UDF Operations Management +sidebar_position: 16 +--- + +** UDFApi class ** + +## new + +**Interface address**:`/api/rest_j/v1/udf/add` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Added

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|clusterName|clusterName|false|String|String| +|createTime|CreateTime|false|Date|Date| +|createUser|Creator|false|String|String| +|description|Description|false|String|String| +|directory|Category, personal function first-level directory|false|String|String| +|isExpire| is invalid|false|Boolean|Boolean| +|isLoad|Whether to load|false|Boolean|Boolean| +|isShared|Shared|false|Boolean|Boolean| +|path|Only store the last uploaded path of the user for prompting|false|String|String| +|registerFormat|register execution address|false|String|String| +|sys|sys|false|String|String| +|treeId|treeId|false|Long|Long| +|udfName|udfName|false|String|String| +|udfType|udfType|false|Integer|Integer| +|updateTime|Update time|false|Date|Date| +|useFormat|Use Format|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## udf tree menu + + +**Interface address**:`/api/rest_j/v1/udf/all` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Get detailed information of udf tree menu

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|Request Path|false|String|String| +|jsonString|jsonString|false|string|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## Get udf user list + + +**Interface address**:`/api/rest_j/v1/udf/allUdfUsers` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get udf user list

+ + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## confirmed + + +**Interface address**: `/api/rest_j/v1/udf/authenticate` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Prove...is real

+ + + +**Request Parameters**: + + +No + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + +## delete + + +**Interface address**:`/api/rest_j/v1/udf/delete/{id}` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|false|integer|integer(int64)| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## udf file download to local + + +**Interface address**:`/api/rest_j/v1/udf/downloadToLocal` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Download UDF file to local according to version parameters

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## UDF View source code + + +**Interface address**:`/api/rest_j/v1/udf/downloadUdf` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

UDF view source code

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + +## delete + + +**Interface address**:`/api/rest_j/v1/udf/delete/{id}` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Delete

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|false|integer|integer(int64)| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## udf file download to local + + +**Interface address**:`/api/rest_j/v1/udf/downloadToLocal` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Download UDF file to local according to version parameters

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## UDF View source code + + +**Interface address**:`/api/rest_j/v1/udf/downloadUdf` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

UDF view source code

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + +## Publish + + +**Interface address**:`/api/rest_j/v1/udf/publish` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

UDF version released

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## fallback version + + +**Interface address**:`/api/rest_j/v1/udf/rollback` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Back to version

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer| +|version|version|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## set expiration + + +**Interface address**:`/api/rest_j/v1/udf/setExpire` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

Setting expired

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|Long|Long| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## UDF sharing + + +**Interface address**: `/api/rest_j/v1/udf/shareUDF` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

UDF sharing

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|sharedUsers|sharedUsers|false|List|List| +|udfInfo|udfInfo|false|UDFInfo|UDFInfo| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## tree new + + +**Interface address**:`/api/rest_j/v1/udf/tree/add` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

tree added

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|category|category|false|String|String| +|childrens|childrens|false|List|List| +|clusterName|clusterName|false|String|String| +|createTime|createTime|false|Date|Date| +|description|description|false|String|String| +|id|id|false|Long|Long| +|name|name|false|String|String| +|parent|parent|false|Long|Long| +|udfInfos|udfInfos|false|List|List| +|updateTime|updateTime|false|Date|Date| +|userName|userName|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + +## tree delete + + +**Interface address**:`/api/rest_j/v1/udf/tree/delete/{id}` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

tree delete

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|id|false|integer|integer(int64)| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## tree update + + +**Interface address**:`/api/rest_j/v1/udf/tree/update` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

tree update

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|category|category|false|String|String| +|childrens|childrens|false|List|List| +|clusterName|clusterName|false|String|String| +|createTime|createTime|false|Date|Date| +|description|description|false|String|String| +|id|id|false|Long|Long| +|name|name|false|String|String| +|parent|parent|false|Long|Long| +|udfInfos|udfInfos|false|List|List| +|updateTime|updateTime|false|Date|Date| +|userName|userName|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## renew + + +**Interface address**:`/api/rest_j/v1/udf/update` + + +**Request method**: `POST` + + +**Request data type**: `application/json` + + +**Response data type**: `*/*` + + +**Interface description**:

UDF modification

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|description|Description|false|String|String| +|id|id|false|Long|Long| +|isLoad|Whether to load|false|Boolean|Boolean| +|path|Only store the last uploaded path of the user for prompting|false|String|String| +|registerFormat|register execution address|false|String|String| +|udfName|udfName|false|String|String| +|udfType|udfType|false|Integer|Integer| +|useFormat|Use Format|false|String|String| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|201|Created| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## Get user directory + + +**Interface address**: `/api/rest_j/v1/udf/userDirectory` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

Get the first-level classification of the user's personal function

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|category|Get the user directory of the specified collection type, if the type is UDF, get the user directory under this type |false|string|string| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` + + +## version list + + +**Interface address**:`/api/rest_j/v1/udf/versionList` + + +**Request method**: `GET` + + +**Request data type**: `application/x-www-form-urlencoded` + + +**Response data type**: `*/*` + + +**Interface description**:

View version list

+ + + +**Request Parameters**: + + +| Parameter name | Parameter description | Required | Request type | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|udfId|udfId|false|integer|integer(int64)| + + +**Response Status**: + + +| Status code | Description | schema | +| -------- | -------- | ----- | +|200|OK|Message| +|401|Unauthorized| +|403|Forbidden| +|404|Not Found| + + +**Response parameters**: + + +| parameter name | parameter description | type | schema | +| -------- | -------- | ----- |----- | +|data|Dataset|object| +|message|Description|string| +|method|request url|string| +|status|Status|integer(int32)|integer(int32)| + + +**Sample Response**: +````javascript +{ +"data": {}, +"message": "", +"method": "", +"status": 0 +} +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/jdbc-api.md b/versioned_docs/version-1.4.0/api/jdbc-api.md new file mode 100644 index 00000000000..e3e5ec640bf --- /dev/null +++ b/versioned_docs/version-1.4.0/api/jdbc-api.md @@ -0,0 +1,59 @@ +--- +title: Task JDBC API +sidebar_position: 4 +--- + +# Task Submission And Execution Of JDBC API + +### 1. Introduce Dependent Modules +The first way depends on the JDBC module in the pom: +```xml + + org.apache.linkis + linkis-jdbc-driver + ${linkis.version} + +``` +**Note:** The module has not been deployed to the central repository. You need to execute `mvn install -Dmaven.test.skip=true` in the linkis-computation-governance/linkis-jdbc-driver directory for local installation. + +**The second way is through packaging and compilation:** +1. Enter the linkis-jdbc-driver directory in the Linkis project and enter the command in the terminal to package `mvn assembly:assembly -Dmaven.test.skip=true` +The packaging instruction skips the running of the unit test and the compilation of the test code, and packages the dependencies required by the JDBC module into the Jar package. +2. After the packaging is complete, two Jar packages will be generated in the target directory of JDBC. The one with dependencies in the Jar package name is the Jar package we need. +### 2. Create A Test Category +Establish a Java test class LinkisJDBCTest, the specific interface meaning can be seen in the notes: +```java +package org.apache.linkis.jdbc.test; + +import java.sql.*; + +public class LinkisJDBCTest { + + public static void main(String[] args) throws SQLException, ClassNotFoundException { + + //1. load driver:org.apache.linkis.ujes.jdbc.UJESSQLDriver + Class.forName("org.apache.linkis.ujes.jdbc.UJESSQLDriver"); + + //2. Get Connection:jdbc:linkis://gatewayIP:gatewayPort/dbName?EngineType=hive&creator=test, user/password + Connection connection = DriverManager.getConnection("jdbc:linkis://127.0.0.1:9001/default?EngineType=hive&creator=test","hadoop","hadoop"); + //3. Create statement + Statement st= connection.createStatement(); + ResultSet rs=st.executeQuery("show tables"); + //4.get result + while (rs.next()) { + ResultSetMetaData metaData = rs.getMetaData(); + for (int i = 1; i <= metaData.getColumnCount(); i++) { + System.out.print(metaData.getColumnName(i) + ":" +metaData.getColumnTypeName(i)+": "+ rs.getObject(i) + " "); + } + System.out.println(); + } + //close resource + rs.close(); + st.close(); + connection.close(); + } +} +``` + +1. Where EngineType is the specified corresponding engine type: supports Spark/hive/presto/shell, etc. +2. Creator is the specified corresponding application type, which is used for resource isolation between applications \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/linkis-task-operator.md b/versioned_docs/version-1.4.0/api/linkis-task-operator.md new file mode 100644 index 00000000000..4f9afd104c6 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/linkis-task-operator.md @@ -0,0 +1,426 @@ +--- +title: Task Rest API +sidebar_position: 3 +--- + +# Linkis Task submission and execution Rest API + +- The return of the Linkis Restful interface follows the following standard return format: + +```json +{ + "method": "", + "status": 0, + "message": "", + "data": {} +} +``` + +**Convention**: + + - method: Returns the requested Restful API URI, which is mainly used in WebSocket mode. + - status: return status information, where: -1 means no login, 0 means success, 1 means error, 2 means verification failed, 3 means no access to the interface. + - data: return specific data. + - message: return the requested prompt message. If the status is not 0, the message returned is an error message, and the data may have a stack field, which returns specific stack information. + +For more information about the Linkis Restful interface specification, please refer to: [Linkis Restful Interface Specification](../development/development-specification/api.md) + +### 1. Submit task + + +- Interface `/api/rest_j/v1/entrance/submit` + +- Submission method `POST` + +- Request Parameters + +```json +{ + "executionContent": { + "code": "show tables", + "runType": "sql" + }, + "params": { + "variable": {// task variable + "testvar": "hello" + }, + "configuration": { + "runtime": {// task runtime params + "jdbc.url": "XX" + }, + "startup": { // ec start up params + "spark.executor.cores": "4" + } + } + }, + "source": { //task source information + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +``` + +-Sample Response + +```json +{ + "method": "/api/rest_j/v1/entrance/submit", + "status": 0, + "message": "Request executed successfully", + "data": { + "execID": "030418IDEhivelocalhost010004:10087IDE_hadoop_21", + "taskID": "123" + } +} +``` + +- execID is the unique identification execution ID generated for the task after the user task is submitted to Linkis. It is of type String. This ID is only useful when the task is running, similar to the concept of PID. The design of ExecID is `(requestApplicationName length)(executeAppName length)(Instance length)${requestApplicationName}${executeApplicationName}${entranceInstance information ip+port}${requestApplicationName}_${umUser}_${index}` + +- taskID is the unique ID that represents the task submitted by the user. This ID is generated by the database self-increment and is of Long type + + +### 2. Get Status + +- Interface `/api/rest_j/v1/entrance/${execID}/status` + +- Submission method `GET` + +- Sample Response + +```json +{ + "method": "/api/rest_j/v1/entrance/{execID}/status", + "status": 0, + "message": "Get status successful", + "data": { + "execID": "${execID}", + "status": "Running" + } +} +``` + +### 3. Get Logs + +- Interface `/api/rest_j/v1/entrance/${execID}/log?fromLine=${fromLine}&size=${size}` + +- Submission method `GET` + +- The request parameter fromLine refers to the number of lines from which to get, and size refers to the number of lines of logs that this request gets + +- Sample Response, where the returned fromLine needs to be used as a parameter for the next request of this interface + +```json +{ + "method": "/api/rest_j/v1/entrance/${execID}/log", + "status": 0, + "message": "Return log information", + "data": { + "execID": "${execID}", + "log": ["error log","warn log","info log", "all log"], + "fromLine": 56 + } +} +``` + +### 4. Get Progress and resource + +- Interface `/api/rest_j/v1/entrance/${execID}/progressWithResource` + +- Submission method `GET` + +- Sample Response + +```json +{ + "method": "/api/entrance/exec_id018017linkis-cg-entrance127.0.0.1:9205IDE_hadoop_spark_2/progressWithResource", + "status": 0, + "message": "OK", + "data": { + "yarnMetrics": { + "yarnResource": [ + { + "queueMemory": 9663676416, + "queueCores": 6, + "queueInstances": 0, + "jobStatus": "COMPLETED", + "applicationId": "application_1655364300926_69504", + "queue": "default" + } + ], + "memoryPercent": 0.009, + "memoryRGB": "green", + "coreRGB": "green", + "corePercent": 0.02 + }, + "progress": 0.5, + "progressInfo": [ + { + "succeedTasks": 4, + "failedTasks": 0, + "id": "jobId-1(linkis-spark-mix-code-1946915)", + "totalTasks": 6, + "runningTasks": 0 + } + ], + "execID": "exec_id018017linkis-cg-entrance127.0.0.1:9205IDE_hadoop_spark_2" + } +} +``` + +### 5. Kill Task + +- Interface `/api/rest_j/v1/entrance/${execID}/kill` + +- Submission method `POST` + +- Sample Response + +```json +{ + "method": "/api/rest_j/v1/entrance/{execID}/kill", + "status": 0, + "message": "OK", + "data": { + "execID":"${execID}" + } +} +``` + +### 6. Get task info + +- Interface `/api/rest_j/v1/jobhistory/{id}/get` + +- Submission method `GET` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|id|task id|path|true|string|| + + +- Sample Response + +````json +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "task": { + "taskID": 1, + "instance": "xxx", + "execId": "exec-id-xxx", + "umUser": "test", + "engineInstance": "xxx", + "progress": "10%", + "logPath": "hdfs://xxx/xxx/xxx", + "resultLocation": "hdfs://xxx/xxx/xxx", + "status": "FAILED", + "createdTime": "2019-01-01 00:00:00", + "updatedTime": "2019-01-01 01:00:00", + "engineType": "spark", + "errorCode": 100, + "errDesc": "Task Failed with error code 100", + "executeApplicationName": "hello world", + "requestApplicationName": "hello world", + "runType": "xxx", + "paramJson": "{\"xxx\":\"xxx\"}", + "costTime": 10000, + "strongerExecId": "execId-xxx", + "sourceJson": "{\"xxx\":\"xxx\"}" + } + } +} +```` + +### 7. Get result set info + +Support for multiple result sets + +- Interface `/api/rest_j/v1/filesystem/getDirFileTrees` + +- Submission method `GET` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|result directory |query|true|string|| + + +- Sample Response + +````json +{ + "method": "/api/filesystem/getDirFileTrees", + "status": 0, + "message": "OK", + "data": { + "dirFileTrees": { + "name": "1946923", + "path": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923", + "properties": null, + "children": [ + { + "name": "_0.dolphin", + "path": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923/_0.dolphin",//result set 1 + "properties": { + "size": "7900", + "modifytime": "1657113288360" + }, + "children": null, + "isLeaf": true, + "parentPath": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923" + }, + { + "name": "_1.dolphin", + "path": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923/_1.dolphin",//result set 2 + "properties": { + "size": "7900", + "modifytime": "1657113288614" + }, + "children": null, + "isLeaf": true, + "parentPath": "hdfs:///tmp/hadoop/linkis/2022-07-06/211446/IDE/1946923" + } + ], + "isLeaf": false, + "parentPath": null + } + } +} +```` + +### 8. Get result content + +- Interface `/api/rest_j/v1/filesystem/openFile` + +- Submission method `GET` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|path|result path|query|true|string|| +|charset|Charset|query|false|string|| +|page|page number|query|false|ref|| +|pageSize|page size|query|false|ref|| + + +- Sample Response + +````json +{ + "method": "/api/filesystem/openFile", + "status": 0, + "message": "OK", + "data": { + "metadata": [ + { + "columnName": "count(1)", + "comment": "NULL", + "dataType": "long" + } + ], + "totalPage": 0, + "totalLine": 1, + "page": 1, + "type": "2", + "fileContent": [ + [ + "28" + ] + ] + } +} +```` + + +### 9. Get Result by stream + +Get the result as a CSV or Excel file + +- Interface `/api/rest_j/v1/filesystem/resultsetToExcel` + +- Submission method `GET` + +**Request Parameters**: + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|autoFormat|Auto |query|false|boolean|| +|charset|charset|query|false|string|| +|csvSeerator|csv Separator|query|false|string|| +|limit|row limit|query|false|ref|| +|nullValue|null value|query|false|string|| +|outputFileName|Output file name|query|false|string|| +|outputFileType|Output file type csv or excel|query|false|string|| +|path|result path|query|false|string|| +|quoteRetouchEnable| Whether to quote modification|query|false|boolean|| +|sheetName|sheet name|query|false|string|| + + +- Response + +````json +binary stream +```` + + +### 10. Compatible with 0.x task submission interface + +- Interface `/api/rest_j/v1/entrance/execute` + +- Submission method `POST` + + +- Request Parameters + + +```json +{ + "executeApplicationName": "hive", //Engine type + "requestApplicationName": "dss", //Client service type + "executionCode": "show tables", + "params": { + "variable": {// task variable + "testvar": "hello" + }, + "configuration": { + "runtime": {// task runtime params + "jdbc.url": "XX" + }, + "startup": { // ec start up params + "spark.executor.cores": "4" + } + } + }, + "source": { //task source information + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + }, + "runType": "hql", //The type of script to run + "source": {"scriptPath":"file:///tmp/hadoop/1.hql"} +} +``` + +- Sample Response + +```json +{ + "method": "/api/rest_j/v1/entrance/execute", + "status": 0, + "message": "Request executed successfully", + "data": { + "execID": "030418IDEhivelocalhost010004:10087IDE_hadoop_21", + "taskID": "123" + } +} +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/login-api.md b/versioned_docs/version-1.4.0/api/login-api.md new file mode 100644 index 00000000000..26c29f0dd67 --- /dev/null +++ b/versioned_docs/version-1.4.0/api/login-api.md @@ -0,0 +1,130 @@ +--- +title: Login API +sidebar_position: 1 +--- + +# Login Document +## 1. Docking With LDAP Service + +Enter the /conf/linkis-spring-cloud-services/linkis-mg-gateway directory and execute the command: +```bash + vim linkis-server.properties +``` + +Add LDAP related configuration: +```bash +wds.linkis.ldap.proxy.url=ldap://127.0.0.1:1389/ #LDAP service URL +wds.linkis.ldap.proxy.baseDN=dc=webank,dc=com #Configuration of LDAP service +``` + +## 2. How To Open The Test Mode To Achieve Login-Free + +Enter the /conf/linkis-spring-cloud-services/linkis-mg-gateway directory and execute the command: +```bash + vim linkis-server.properties +``` + + +Turn on the test mode and the parameters are as follows: +```bash + wds.linkis.test.mode=true # Open test mode + wds.linkis.test.user=hadoop # Specify which user to delegate all requests to in test mode +``` + +## 3.Log In Interface Summary +We provide the following login-related interfaces: + - Login In + + - Login Out + + - Heart Beat + + +## 4. Interface details + +- The return of the Linkis Restful interface follows the following standard return format: + +```json +{ + "method": "", + "status": 0, + "message": "", + "data": {} +} +``` + +**Protocol**: + +- method: Returns the requested Restful API URI, which is mainly used in WebSocket mode. +- status: returns status information, where: -1 means no login, 0 means success, 1 means error, 2 means verification failed, 3 means no access to the interface. +- data: return specific data. +- message: return the requested prompt message. If the status is not 0, the message returns an error message, and the data may have a stack field, which returns specific stack information. + +For more information about the Linkis Restful interface specification, please refer to: [Linkis Restful Interface Specification](../development/development-specification/api) + +### 1). Login In + +- Interface `/api/rest_j/v1/user/login` + +- Submission method `POST` + +```json + { + "userName": "", + "password": "" + } +``` + +- Return to example + +```json + { + "method": null, + "status": 0, + "message": "login successful(登录成功)!", + "data": { + "isAdmin": false, + "userName": "" + } + } +``` + +Among them: + +-isAdmin: Linkis only has admin users and non-admin users. The only privilege of admin users is to support viewing the historical tasks of all users in the Linkis management console. + +### 2). Login Out + +- Interface `/api/rest_j/v1/user/logout` + +- Submission method `POST` + + No parameters + +- Return to example + +```json + { + "method": "/api/rest_j/v1/user/logout", + "status": 0, + "message": "Logout successful(退出登录成功)!" + } +``` + +### 3). Heart Beat + +- Interface `/api/rest_j/v1/user/heartbeat` + +- Submission method `POST` + + No parameters + +- Return to example + +```json + { + "method": "/api/rest_j/v1/user/heartbeat", + "status": 0, + "message": "Maintain heartbeat success(维系心跳成功)!" + } +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/api/overview.md b/versioned_docs/version-1.4.0/api/overview.md new file mode 100644 index 00000000000..3f08075bdec --- /dev/null +++ b/versioned_docs/version-1.4.0/api/overview.md @@ -0,0 +1,13 @@ +--- +title: Overview +sidebar_position: 0 +--- + +## 1. Document description +Linkis1.0 has been refactored and optimized on the basis of Linkix0.x, and it is also compatible with the 0.x interface. However, in order to prevent compatibility problems when using version 1.0, you need to read the following documents carefully: + +1. When using Linkis1.0 for customized development, you need to use Linkis's authorization authentication interface. Please read [Login API Document](login-api.md) carefully. + +2. Linkis1.0 provides a JDBC interface. You need to use JDBC to access Linkis. Please read [Task Submit and Execute JDBC API Document](jdbc-api.md). + +3. Linkis1.0 provides the Rest interface. If you need to develop upper-level applications on the basis of Linkis, please read [Task Submit and Execute Rest API Document](linkis-task-operator.md). \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/_category_.json b/versioned_docs/version-1.4.0/architecture/_category_.json new file mode 100644 index 00000000000..2daa77685e2 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Architecture", + "position": 8.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/_category_.json new file mode 100644 index 00000000000..5775546574d --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Feature", + "position": 5.1 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/commons/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/commons/_category_.json new file mode 100644 index 00000000000..71bc86501fe --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/commons/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Commons", + "position": 1 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/commons/proxy-user.md b/versioned_docs/version-1.4.0/architecture/feature/commons/proxy-user.md new file mode 100644 index 00000000000..2753359e658 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/commons/proxy-user.md @@ -0,0 +1,37 @@ +--- +title: Proxy User Mode +sidebar_position: 6 +--- + +## 1 Background +At present, when linkis is executing the task submitted by the user, the main process service of linkis will switch to the corresponding user through sudo -u ${submit user}, and then execute the corresponding engine startup command. +This requires creating a corresponding system user for each ${submit user} in advance, and configuring relevant environment variables. +For new users, a series of environment initialization preparations are required. Frequent user changes will increase operation and maintenance costs, and there are too many users, so resources cannot be configured for a single user, and resources cannot be well managed. If the A agent can be executed to the designated agent user, the execution entry can be converged uniformly, and the problem of needing to initialize the environment can be solved. + +## 2 Basic Concepts +- Login user: the user who directly logs in to the system through the user name and password +- Proxy user: The user who actually performs the operation as the login user is called the proxy user, and the related operations of the proxy login user + +## 3 Goals achieved +- Login user A can choose a proxy user and decide which proxy user to proxy to +- Login user A can delegate tasks to proxy user B for execution +- When logging in to user A as an agent to agent user B, you can view B-related execution records, task results and other data +- A proxy user can proxy multiple login users at the same time, but a login user can only be associated with a certain proxy user at the same time + +## 4 Realize the general idea + +Modify the existing interface cookie processing, which needs to be able to parse out the logged-in user and proxy user in the cookie +```html +The key of the proxy user's cookie is: linkis_user_session_proxy_ticket_id_v1 +Login user's cookie: linkis_user_session_ticket_id_v1 + +```` + +- The relevant interface of linkis needs to be able to identify the proxy user information based on the original UserName obtained, and use the proxy user to perform various operations. And record the audit log, including the user's task execution operation, download operation +- When the task is submitted for execution, the entry service needs to modify the executing user to be the proxy user + +## 5 Things to Consider & Note + +- Users are divided into proxy users and non-proxy users. Users of proxy type cannot perform proxying to other users again. +- It is necessary to control the list of logged-in users and system users who can be proxied, to prohibit the occurrence of arbitrary proxies, and to avoid uncontrollable permissions. It is best to support database tables to configure, and can be directly modified to take effect without restarting the service +- Separately record log files containing proxy user operations, such as proxy execution, function update, etc. All proxy user operations of PublicService are recorded in the log, which is convenient for auditing \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/commons/rpc.md b/versioned_docs/version-1.4.0/architecture/feature/commons/rpc.md new file mode 100644 index 00000000000..2917cc5612d --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/commons/rpc.md @@ -0,0 +1,21 @@ +--- +title: RPC Module +sidebar_position: 2 +--- + +## 1.Overview +The call of HTTP interface between Feign-based microservices can only satisfy a simple A microservice instance that randomly selects a service instance in B microservices according to simple rules, and if this B microservice instance wants to asynchronously return information To the caller, it is simply impossible to achieve. +At the same time, because Feign only supports simple service selection rules, it cannot forward the request to the specified microservice instance, and cannot broadcast a request to all instances of the recipient microservice. + +## 2. Architecture description +### 2.1 Architecture design diagram +![Linkis RPC architecture diagram](/Images/Architecture/Commons/linkis-rpc.png) +### 2.2 Module description +The functions of the main modules are introduced as follows: +* Eureka: service registration center, user management service, service discovery. +* Sender: Service request interface, the sender uses Sender to request service from the receiver. +* Receiver: The service request receives the corresponding interface, and the receiver responds to the service through this interface. +* Interceptor: Sender will pass the user's request to the interceptor. The interceptor intercepts the request and performs additional functional processing on the request. The broadcast interceptor is used to broadcast operations on the request, the retry interceptor is used to retry the processing of failed requests, and the cache interceptor is used to read and cache simple and unchanged requests. , And the default interceptor that provides the default implementation. +* Decoder, Encoder: used for request encoding and decoding. +* Feign: is a lightweight framework for http request calls, a declarative WebService client program, used for Linkis-RPC bottom communication. +* Listener: monitor module, mainly used to monitor broadcast requests. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/commons/variable.md b/versioned_docs/version-1.4.0/architecture/feature/commons/variable.md new file mode 100644 index 00000000000..a2708c32dc9 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/commons/variable.md @@ -0,0 +1,94 @@ +--- +title: Custom Variable Design +sidebar_position: 1 +--- + +## 1. Overview +### need +1. The user hopes that Linkis can provide some public variables and then replace them during execution. For example, the user runs the same SQL in batches every day, and needs to specify the partition time of the previous day. Writing based on SQL will be more complicated if the system provides a run_date variable It will be very convenient to use. +2. The user hopes that Linkis supports date pattern calculation, supports writing variables such as &{YYYY-MM-DD} in the code to calculate time variables +3. The user wants to define variables by himself, such as setting a float variable, and then use it in the code + +### Target +1. Support variable replacement of task code +2. Support custom variables, support users to define custom variables in scripts and task parameters submitted to Linkis, support simple +, - and other calculations +3. Preset system variables: run_date, run_month, run_today and other system variables +4. Support date pattern variable, support +, - operation of pattern + +## 2. Overall Design +     During the execution of the Linkis task, the custom variable is carried out in Entrance, mainly through the interceptor of Entrance before the task is submitted and executed. Variables and defined variables, and the initial value of the custom variable passed in through the task completes the code replacement and becomes the final executable code. + +### 2.1 Technical Architecture +     The overall structure of custom variables is as follows. After the task is submitted, it will pass through the variable replacement interceptor. First, it will analyze all the variables and expressions used in the code, and then replace them with the initial values of the system and user-defined variables, and finally submit the parsed code to EngineConn for execution. So the underlying engine is already replaced code. + +![arc](/Images/Architecture/Commons/var_arc.png) + +Remarks: Because the functions of variable and parsing are more general, the extraction tool class is defined in linkis-commons: org.apache.linkis.common.utils.VariableUtils + +### 2.2 Business Architecture +     The feature this time is mainly to complete the analysis, calculation, and replacement functions of variable substitution, which mainly involves the Entrance module of linkis for code interception and the variable substitution tools defined by the Linkis-commons module : + +| Component Name | Level 1 Module | Level 2 Module | Function Point | +|---|---|---|---| +| Linkis | CG | Entrance|Intercept task code and call Linkis-common's VariableUtils for code replacement| +| Linkis | Linkis-commons | linkis-common|Provide variable, analysis, calculation tool class VariableUtils| + +## 3. Module design +### 3.1 Core Execution Process +[input port] The input port is code and code type (python/sql/scala/sh). +[Processing flow] Entrance will first enter the interceptor after receiving the task, and start the variable interceptor to complete the analysis, replacement and calculation of variables +The overall timing diagram is as follows: + +![time](/Images/Architecture/Commons/var_time.png) + +What needs to be explained here is: +1. Custom variables and system variables are used in ${}, such as ${run_date} +2. The date pattern variable is used as &{}, for example, the value of &{yyyy-01-01} is 2022-01-01. + The reason why it is divided into two different ways is to prevent the string defined by the custom variable from containing pattern characters. For example, if a custom variable with y=1 is defined, it may represent different meanings, and it will be the year variable by the pattern task. + + +### 3.2 Specific details: +1. run_date is a date variable that comes with the core, and supports user-defined dates. If not specified, it defaults to the day before the current system time. +2. Definition of other derived built-in date variables: other date built-in variables are calculated relative to run_date. Once run_date changes, the values of other variables will also change automatically. Other date variables do not support setting initial values and can only be modified by modifying run_date . +3. The built-in variables support richer usage scenarios: ${run_date-1} is the day before run_data; ${run_month_begin-1} is the first day of the previous month of run_month_begin, where -1 means minus one month. +4. Pattern type variables are also calculated based on run_date, and then replaced and +— + +### 3.3 Variable scope +Custom variables also have a scope in linkis, and the priority is that the variable defined in the script is greater than the Variable defined in the task parameter and greater than the built-in run_date variable. The task parameters are defined as follows: +``` +## restful +{ + "executionContent": {"code": "select \"${f-1}\";", "runType": "sql"}, + "params": { + "variable": {f: "20.1"}, + "configuration": { + "runtime": { + "linkis.openlookeng.url":"http://127.0.0.1:9090" + } + } + }, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.sql"}, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +## java SDK +JobSubmitAction. builder + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) //execute user + .setLabels(labels) + .setVariableMap(varMap) //setVar + .build +``` + +## 4. Interface design: +The main tools are: +``` +VariableUtils: +def replace(replaceStr: String): String replaces the variable in the code and returns the replaced code +def replace(replaceStr: String, variables: util.Map[String, Any]): String supports passing in the value of a custom variable for replacement +def replace(code: String, runtType: String, variables: util.Map[String, String]): String supports incoming code types, and performs replacement parsing according to different types +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/_category_.json new file mode 100644 index 00000000000..5058aeccbad --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Computation Governance Services", + "position": 2 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine-conn-manager.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine-conn-manager.md new file mode 100644 index 00000000000..383a614f78c --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine-conn-manager.md @@ -0,0 +1,50 @@ +--- +title: EngineConnManager Design +sidebar_position: 2 +--- + +EngineConnManager architecture design +------------------------- + +EngineConnManager (ECM): EngineConn's manager, provides engine lifecycle management, and reports load information and its own health status to RM. +### ECM architecture + +![](/Images/Architecture/engine/ecm-01.png) + +### Introduction to the second-level module + +**Linkis-engineconn-linux-launch** + +The engine launcher, whose core class is LinuxProcessEngineConnLauch, is used to provide instructions for executing commands. + +**Linkis-engineconn-manager-core** + +The core module of ECM includes the top-level interface of ECM health report and EngineConn health report function, defines the relevant indicators of ECM service, and the core method of constructing EngineConn process. + +| Core top-level interface/class | Core function | +|------------------------------------|--------------------------------------------------------------------------| +| EngineConn | Defines the properties of EngineConn, including methods and parameters | +| EngineConnLaunch | Define the start method and stop method of EngineConn | +| ECMEvent | ECM related events are defined | +| ECMEventListener | Defined ECM related event listeners | +| ECMEventListenerBus | Defines the listener bus of ECM | +| ECMMetrics | Defines the indicator information of ECM | +| ECMHealthReport | Defines the health report information of ECM | +| NodeHealthReport | Defines the health report information of the node | + +**Linkis-engineconn-manager-server** + +The server side of ECM defines top-level interfaces and implementation classes such as ECM health information processing service, ECM indicator information processing service, ECM registration service, EngineConn start service, EngineConn stop service, EngineConn callback service, etc., which are mainly used for ECM to itself and EngineConn Life cycle management, health information reporting, heartbeat sending, etc. +Core Service and Features module are as follows: + +| Core service | Core function | +|---------------------------------|-------------------------------------------------| +| EngineConnLaunchService | Contains core methods for generating EngineConn and starting the process | +| BmlResourceLocallizationService | Used to download BML engine related resources and generate localized file directory | +| ECMHealthService | Report your own healthy heartbeat to AM regularly | +| ECMMetricsService | Report your own indicator status to AM regularly | +| EngineConnKillSerivce | Provides related functions to stop the engine | +| EngineConnListService | Provide caching and management engine related functions | +| EngineConnCallBackService | Provide the function of the callback engine | + + diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/_category_.json new file mode 100644 index 00000000000..98fe7a2eea9 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "EngineConn", + "position": 5 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/add-an-engine-conn.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/add-an-engine-conn.md new file mode 100644 index 00000000000..34505b1ba4b --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/add-an-engine-conn.md @@ -0,0 +1,109 @@ +--- +title: EngineConn Startup Process +sidebar_position: 4 +--- +# How to add an EngineConn + +Adding EngineConn is one of the core processes of the computing task preparation phase of Linkis computing governance. It mainly includes the following steps. First, client side (Entrance or user client) initiates a request for a new EngineConn to LinkisManager . Then LinkisManager initiates a request to EngineConnManager to start EngineConn based on demands and label rules. Finally, LinkisManager returns the usable EngineConn to the client side. + +Based on the figure below, let's explain the whole process in detail: + +![Process of adding a EngineConn](/Images/Architecture/Add_an_EngineConn/add_an_EngineConn_flow_chart.png) + +## 1. LinkisManger receives the requests from client side + +**Glossary:** + +- LinkisManager: The management center of Linkis computing governance capabilities. Its main responsibilities are: + 1. Based on multi-level combined tags, provide users with available EngineConn after complex routing, resource management and load balancing. + + 2. Provide EC and ECM full life cycle management capabilities. + + 3. Provide users with multi-Yarn cluster resource management functions based on multi-level combined tags. It is mainly divided into three modules: AppManager, ResourceManager and LabelManager , which can support multi-active deployment and have the characteristics of high availability and easy expansion. + +After the AM module receives the Client’s new EngineConn request, it first checks the parameters of the request to determine the validity of the request parameters. Secondly, selects the most suitable EngineConnManager (ECM) through complex rules for use in the subsequent EngineConn startup. Next, it will apply to RM for the resources needed to start the EngineConn, Finally, it will request the ECM to create an EngineConn. + +The four steps will be described in detail below. + +### 1. Request parameter verification + +After the AM module receives the engine creation request, it will check the parameters. First, it will check the permissions of the requesting user and the creating user, and then check the Label attached to the request. Since in the subsequent creation process of AM, Label will be used to find ECM and perform resource information recording, etc, you need to ensure that you have the necessary Label. At this stage, you must bring the Label with UserCreatorLabel (For example: hadoop-IDE) and EngineTypeLabel ( For example: spark-2.4.3). + +### 2. Select a EngineConnManager(ECM) + +ECM selection is mainly to complete the Label passed through the client to select a suitable ECM service to start EngineConn. In this step, first, the LabelManager will be used to search in the registered ECM through the Label passed by the client, and return in the order according to the label matching degree. After obtaining the registered ECM list, rules will be selected for these ECMs. At this stage, rules such as availability check, resource surplus, and machine load have been implemented. After the rule is selected, the ECM with the most matching label, the most idle resource, and the low load will be returned. + +### 3. Apply resources required for EngineConn + +1. After obtaining the assigned ECM, AM will then request how many resources will be used by the client's engine creation request by calling the EngineConnPluginServer service. Here, the resource request will be encapsulated, mainly including Label, the EngineConn startup parameters passed by the Client, and the user configuration parameters obtained from the Configuration module. The resource information is obtained by calling the ECP service through RPC. + +2. After the EngineConnPluginServer service receives the resource request, it will first find the corresponding engine tag through the passed tag, and select the EngineConnPlugin of the corresponding engine through the engine tag. Then use EngineConnPlugin's resource generator to calculate the engine startup parameters passed in by the client, calculate the resources required to apply for a new EngineConn this time, and then return it to LinkisManager. + + **Glossary:** + +- EgineConnPlugin: It is the interface that Linkis must implement when connecting a new computing storage engine. This interface mainly includes several capabilities that this EngineConn must provide during the startup process, including EngineConn resource generator, EngineConn startup command generator, EngineConn engine connection Device. Please refer to the Spark engine implementation class for the specific implementation: [SparkEngineConnPlugin](https://github.com/apache/linkis/blob/master/linkis-engineconn-pluginsspark/src/main/scala/com/webank/wedatasphere/linkis/engineplugin/spark/SparkEngineConnPlugin.scala). +- EngineConnPluginServer: It is a microservice that loads all the EngineConnPlugins and provides externally the required resource generation capabilities of EngineConn and EngineConn's startup command generation capabilities. +- EngineConnResourceFactory: Calculate the total resources needed when EngineConn starts this time through the parameters passed in. +- EngineConnLaunchBuilder: Through the incoming parameters, a startup command of the EngineConn is generated to provide the ECM to start the engine. +3. After AM obtains the engine resources, it will then call the RM service to apply for resources. The RM service will use the incoming Label, ECM, and the resources applied for this time to make resource judgments. First, it will judge whether the resources of the client corresponding to the Label are sufficient, and then judge whether the resources of the ECM service are sufficient, if the resources are sufficient, the resource application is approved this time, and the resources of the corresponding Label are added or subtracted. + +### 4. Request ECM for engine creation + +1. After completing the resource application for the engine, AM will encapsulate the engine startup request, send it to the corresponding ECM via RPC for service startup, and obtain the instance object of EngineConn. +2. AM will then determine whether EngineConn is successfully started and become available through the reported information of EngineConn. If it is, the result will be returned, and the process of adding an engine this time will end. + +## 2. ECM initiates EngineConn + +**Glossary:** + +- EngineConnManager: EngineConn's manager. Provides engine life-cycle management, and at the same time reports load information and its own health status to RM. +- EngineConnBuildRequest: The start engine command passed by LinkisManager to ECM, which encapsulates all tag information, required resources and some parameter configuration information of the engine. +- EngineConnLaunchRequest: Contains the BML materials, environment variables, ECM required local environment variables, startup commands and other information required to start an EngineConn, so that ECM can build a complete EngineConn startup script based on this. + +After ECM receives the EngineConnBuildRequest command passed by LinkisManager, it is mainly divided into three steps to start EngineConn: + +1. Request EngineConnPluginServer to obtain EngineConnLaunchRequest encapsulated by EngineConnPluginServer. +2. Parse EngineConnLaunchRequest and encapsulate it into EngineConn startup script. +3. Execute startup script to start EngineConn. + +### 2.1 EngineConnPluginServer encapsulates EngineConnLaunchRequest + +Get the EngineConn type and corresponding version that actually needs to be started through the label information of EngineConnBuildRequest, get the EngineConnPlugin of the EngineConn type from the memory of EngineConnPluginServer, and convert the EngineConnBuildRequest into EngineConnLaunchRequest through the EngineConnLaunchBuilder of the EngineConnPlugin. + +### 2.2 Encapsulate EngineConn startup script + +After the ECM obtains the EngineConnLaunchRequest, it downloads the BML materials in the EngineConnLaunchRequest to the local, and checks whether the local necessary environment variables required by the EngineConnLaunchRequest exist. After the verification is passed, the EngineConnLaunchRequest is encapsulated into an EngineConn startup script. + +### 2.3 Execute startup script + +Currently, ECM only supports Bash commands for Unix systems, that is, only supports Linux systems to execute the startup script. + +Before startup, the sudo command is used to switch to the corresponding requesting user to execute the script to ensure that the startup user (ie, JVM user) is the requesting user on the Client side. + +After the startup script is executed, ECM will monitor the execution status and execution log of the script in real time. Once the execution status returns to non-zero, it will immediately report EngineConn startup failure to LinkisManager and the entire process is complete; otherwise, it will keep monitoring the log and status of the startup script until The script execution is complete. + +## 3. EngineConn initialization + +After ECM executed EngineConn's startup script, EngineConn microservice was officially launched. + +**Glossary:** + +- EngineConn microservice: Refers to the actual microservices that include an EngineConn and one or more Executors to provide computing power for computing tasks. When we talk about adding an EngineConn, we actually mean adding an EngineConn microservice. +- EngineConn: The engine connector is the actual connection unit with the underlying computing storage engine, and contains the session information with the actual engine. The difference between it and Executor is that EngineConn only acts as a connection and a client, and does not actually perform calculations. For example, SparkEngineConn, its session information is SparkSession. +- Executor: As a real computing storage scenario executor, it is the actual computing storage logic execution unit. It abstracts the various capabilities of EngineConn and provides multiple different architectural capabilities such as interactive execution, subscription execution, and responsive execution. + +The initialization of EngineConn microservices is generally divided into three stages: + +1. Initialize the EngineConn of the specific engine. First use the command line parameters of the Java main method to encapsulate an EngineCreationContext that contains relevant label information, startup information, and parameter information, and initialize EngineConn through EngineCreationContext to complete the establishment of the connection between EngineConn and the underlying Engine, such as: SparkEngineConn will initialize one at this stage SparkSession is used to establish a connection relationship with a Spark application. +2. Initialize the Executor. After the EngineConn is initialized, the corresponding Executor will be initialized according to the actual usage scenario to provide service capabilities for subsequent users. For example, the SparkEngineConn in the interactive computing scenario will initialize a series of Executors that can be used to submit and execute SQL, PySpark, and Scala code capabilities, and support the Client to submit and execute SQL, PySpark, Scala and other codes to the SparkEngineConn. +3. Report the heartbeat to LinkisManager regularly, and wait for EngineConn to exit. When the underlying engine corresponding to EngineConn is abnormal, or exceeds the maximum idle time, or Executor is executed, or the user manually kills, the EngineConn automatically ends and exits. + +---- + +At this point, The process of how to add a new EngineConn is basically over. Finally, let's make a summary: + +- The client initiates a request for adding EngineConn to LinkisManager. +- LinkisManager checks the legitimacy of the parameters, first selects the appropriate ECM according to the label, then confirms the resources required for this new EngineConn according to the user's request, applies for resources from the RM module of LinkisManager, and requires ECM to start a new EngineConn as required after the application is passed. +- ECM first requests EngineConnPluginServer to obtain an EngineConnLaunchRequest containing BML materials, environment variables, ECM required local environment variables, startup commands and other information needed to start an EngineConn, and then encapsulates the startup script of EngineConn, and finally executes the startup script to start the EngineConn. +- EngineConn initializes the EngineConn of a specific engine, and then initializes the corresponding Executor according to the actual usage scenario, and provides service capabilities for subsequent users. Finally, report the heartbeat to LinkisManager regularly, and wait for the normal end or termination by the user. + diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-metrics.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-metrics.md new file mode 100644 index 00000000000..739f085886a --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-metrics.md @@ -0,0 +1,76 @@ +--- +title: EngineConn Metrics Reporting Feature +sidebar_position: 6 +tags: [Feature] +--- + + +## 1. Functional requirements +### 1.1 Requirement Background +The reported information lacks engine information, and the reported resources and progress interfaces are redundant, which reduces performance. It needs to be aligned for optimization and adjustment, and an extension module should be added to the reporting protocol. + +### 1.2 Goals +- Added RPC protocol containing resources, progress, and additional information, supporting reporting of these information in one request +- Reconstruct existing resources and progress reporting links, and combine the actions of reporting related information into one request + +## 2. Overall Design + +This requirement involves the `linkis-entrance, linkis-computation-orchestrator, linkis-orchestrator-ecm-plugin, linkis-computation-engineconn` modules. Add and refactor the reporting information in the `computation-engineconn` module, and parse the information and store it on the entry side. + +### 2.1 Technical Architecture + +The engine information reporting architecture is shown in the figure. After the user submits the task to the entry, the entry applies to the linkismanager for an engine. +After applying to the engine, submit tasks to the application, and receive regular reports of tasks (resources, progress, status). Until the task is executed, the entry returns the final result when the user queries. +For this modification, the engine metrics information needs to be added to the entry into the database; +Combine Resource and Progress interface information in Orchestrator, and add additional information such as metrics; +On the ComputationEngineConn side of the interactive engine, the reported resources and progress information are combined, and engine statistics are additionally reported. + +![engineconn-mitrics-1.png](/Images-zh/Architecture/EngineConn/engineconn-mitrics-1.png) + + +### 2.2 Business Architecture +This feature involves the following function point modules: + +| First-level module | Second-level module | Function point | +| :------------ | :------------ | :------------ | +| Entrance | | Merge resource and progress interfaces; parse new engine metrics | +| Orchestrator | orchestrator-core | Merge resource and progress interfaces; handle TaskRunningInfo messages | +| Orchestrator | orchestrator-plugin-ecm | Resource and progress interfaces for merging monitor engine information | +| Orchestrator | computation-engineconn | Reporting interface for combining resources and progress; new reporting engine example metrics | + + +## 3. Module Design +### Core execution flow +-\[input] The input is the interactive engine `computation-engineconn`. When the engine executes a task, it reports the running information `TaskRunningInfo`, including the original `TaskProgressInfo` and `TaskResourceInfo`, and adds the engine example information and the information about the number of existing tasks of the engine. +- \[Processing process] `orchestrator-plugin-ecm` is responsible for monitoring the reporting information when the engine runs tasks, receiving the reporting information, and generating the `TaskRunningInfoEvent` asynchronous message, + Sent to `OrchestratorAsyncListenerBus` for processing. The `TaskRunningInfoListener` registered to the `OrchestratorAsyncListener` receives the message, triggers the `listener` method, and calls back to the `TaskRunningInfo` callback method of the `Entrance` Job. + The callback method parses the resource, progress, and engine `metrancs` information in `TaskRunningInfo` and persists them respectively. + +![engineconn-mitrics-2.png](/Images-zh/Architecture/EngineConn/engineconn-mitrics-2.png) + +## 4. Data structure + +`RPC protocol TaskRunningInfo` has been added to the requirement, no db table has been added + +## 5. Interface Design +No external interface + +## 6. Non-functional design: +### 6.1 Security +RPC interface internal authentication, does not involve external security issues + +### 6.2 Performance +Combined two RPC interfaces to reduce the number of reports and improve performance + +### 6.3 Capacity +Less metrics information, no impact + +### 6.4 High Availability +not involving + + + + + + + diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-plugin.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-plugin.md new file mode 100644 index 00000000000..5fc84c21e18 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn-plugin.md @@ -0,0 +1,77 @@ +--- +title: EngineConnPlugin (ECP) Design +sidebar_position: 3 +--- + + +EngineConnPlugin (ECP) architecture design +=============================== + +The engine connector plug-in is an implementation that can dynamically load the engine connector and reduce the occurrence of version conflicts. It has the characteristics of convenient expansion, fast refresh, and selective loading. In order to allow developers to freely extend Linkis's Engine engine, and dynamically load engine dependencies to avoid version conflicts, the EngineConnPlugin was designed and developed, allowing new engines to be introduced into the execution life cycle of computing middleware by implementing established plug-in interfaces. +The plug-in interface disassembles the definition of the engine, including parameter initialization, allocation of engine resources, construction of engine connections, and setting of engine default tags. + +一、ECP architecture diagram + +![](/Images/Architecture/linkis-engineConnPlugin-01.png) + +Introduction to the second-level module: +============== + +EngineConn-Plugin-Server +------------------------ + +The engine connector plug-in service is an entrance service that provides external registration plug-ins, management plug-ins, and plug-in resource construction. The engine plug-in that is successfully registered and loaded will contain the logic of resource allocation and startup parameter configuration. During the engine initialization process, EngineConn +Other services such as Manager call the logic of the corresponding plug-in in Plugin Server through RPC requests. + +| Core Class | Core Function | +|----------------------------------|---------------------------------------| +| EngineConnLaunchService | Responsible for building the engine connector launch request | +| EngineConnResourceFactoryService | Responsible for generating engine resources | +| EngineConnResourceService | Responsible for downloading the resource files used by the engine connector from BML | + + +EngineConn-Plugin-Loader Engine Connector Plugin Loader +--------------------------------------- + +The engine connector plug-in loader is a loader used to dynamically load the engine connector plug-ins according to request parameters, and has the characteristics of caching. The specific loading process is mainly composed of two parts: 1) Plug-in resources such as the main program package and program dependency packages are loaded locally (not open). 2) Plug-in resources are dynamically loaded from the local into the service process environment, for example, loaded into the JVM virtual machine through a class loader. + +| Core Class | Core Function | +|---------------------------------|----------------------------------------------| +| EngineConnPluginsResourceLoader | Load engine connector plug-in resources | +| EngineConnPluginsLoader | Load the engine connector plug-in instance, or load an existing one from the cache | +| EngineConnPluginClassLoader | Dynamically instantiate engine connector instance from jar | + +EngineConn-Plugin-Cache engine plug-in cache module +---------------------------------------- + +Engine connector plug-in cache is a cache service specially used to cache loaded engine connectors, and supports the ability to read, update, and remove. The plug-in that has been loaded into the service process will be cached together with its class loader to prevent multiple loading from affecting efficiency; at the same time, the cache module will periodically notify the loader to update the plug-in resources. If changes are found, it will be reloaded and refreshed automatically Cache. + +| Core Class | Core Function | +|-----------------------------|------------------------------| +| EngineConnPluginCache | Cache loaded engine connector instance | +| RefreshPluginCacheContainer | Engine connector that refreshes the cache regularly | + +EngineConn-Plugin-Core: Engine connector plug-in core module +--------------------------------------------- + +The engine connector plug-in core module is the core module of the engine connector plug-in. Contains the implementation of the basic functions of the engine plug-in, such as the construction of the engine connector start command, the construction of the engine resource factory and the implementation of the core interface of the engine connector plug-in. + +| Core Class | Core Function | +|-------------------------|----------------------------------------------------------| +| EngineConnLaunchBuilder | Build Engine Connector Launch Request | +| EngineConnFactory | Create Engine Connector | +| EngineConnPlugin | The engine connector plug-in implements the interface, including resources, commands, and instance construction methods. | +| EngineResourceFactory | Engine Resource Creation Factory | + +EngineConn-Plugins: Engine connection plugin collection +----------------------------------- + +The engine connection plug-in collection is used to place the default engine connector plug-in library that has been implemented based on the plug-in interface defined by us. Provides the default engine connector implementation, such as jdbc, spark, python, shell, etc. Users can refer to the implemented cases based on their own needs to implement more engine connectors. + +| Core Class | Core Function | +|---------------------|------------------| +| engineplugin-jdbc | jdbc engine connector | +| engineplugin-shell | Shell engine connector | +| engineplugin-spark | spark engine connector | +| engineplugin-python | python engine connector | + diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn.md new file mode 100644 index 00000000000..f3581a3f25b --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/engine/engine-conn.md @@ -0,0 +1,139 @@ +--- +title: EngineConn Design +sidebar_position: 1 +--- + +## 1. Overview + + EngineConn: engine connector, which is used to connect to the underlying computing and storage engine to complete task execution, task information push and result return, etc. It is the basis for Linkis to provide computing and storage capabilities. + +## 2. Overall Design + + The overall design idea of EngineConn is to complete the acquisition and storage of the session information of the underlying engine when starting, complete the connection between the EngineConn process and the underlying engine, and then complete the scheduling of tasks to the underlying engine Session stored in EngineConn through the Executor unit for execution. and get execution-related information. + +### 2.1 Technical Architecture + +**Introduction to related terms:** + +**EngineConn:** Used to store the session information of the underlying engine. To complete the connection with the underlying engine, for example, the Spark engine stores the SparkSession. + +**Executor:** The scheduling executor used to accept the task passed by the caller (such as: Entrance), and finally submit the task to the underlying engine Session for execution. Different tasks implement different Executor classes. The most used is the interactive ComputationExecutor, which is used to accept tasks and push task information to the caller in real time. And the non-interactive ManageableOnceExecutor that accepts only one task is used to complete the submission and execution of the task started by EngineConn. + +![arc](/Images/Architecture/engine/ec_arc_01.png) + +### 2.2 Business Architecture + +|Component name|First-level module|Second-level module|Function points| +|:----|:----|:----|:----| +|Linkis|EngineConn|linkis-engineconn-common|The common module of engine conn, which defines the most basic entity classes and interfaces in engine conn. | +|Linkis|EngineConn|linkis-engineconn-core|The core module of the engine connector, which defines the interfaces involved in the core logic of EngineConn. | +|Linkis|EngineConn|linkis-executor-core|The core module of the executor, which defines the core classes related to the executor. | +|Linkis|EngineConn|linkis-accessible-executor|The underlying abstraction of the accessible Executor. You can interact with it through RPC requests to obtain its status, load, concurrency and other basic indicators Metrics data | +|Linkis|EngineConn|linkis-computation-engineconn|Related classes that provide capabilities for interactive computing tasks. | + +## 3. Module design + +Input: The caller executes the task + +Output: return task information such as execution status, results, logs, etc. + +Key logic: the timing diagram of the key logic of task execution + +![time](/Images/Architecture/engine/ec_arc_02.png) + +Key Notes: + +1. If it is a serial Executor, after EngineConn receives a task, it will mark EngineConn as Busy and cannot accept other tasks, and will judge whether the lock of the task is consistent to prevent EngineConn from being submitted by multiple callers at the same time. After the task is executed, it becomes the Unlock state +2. If it is a parallel Executor, after EngineConn receives the task, the state is still in the Unlock state, and it can continue to accept the task. Only when the number of concurrent tasks is reached or the machine index is abnormal will it be marked as Busy state +3. If it is an Once type task, EngineConn will automatically execute the task after it is started, and the EngineConn process will exit after the task is executed. + +## 4. Data structure/storage design + +not involving + +## 5. Interface design + +**Brief introduction of other classes:** + +The common module of linkis-engineconn-common engine connector defines the most basic entity classes and interfaces in the engine connector. + +|Core Service|Core Function| +|:----|:----| +|EngineCreationContext|contains the context information of EngineConn during startup| +|EngineConn| contains the specific information of EngineConn, such as type, specific connection information with layer computing storage engine, etc.| +|EngineExecution|Provides the creation logic of Executor| +|EngineConnHook|Defines the operations before and after each stage of engine startup| + +The core module of linkis-engineconn-core engine connector defines the interfaces involved in the core logic of EngineConn. + +|Core Classes|Core Functions| +|:----|:----| +|EngineConnManager|Provides related interfaces for creating and obtaining EngineConn| +|ExecutorManager|Provides related interfaces for creating and obtaining Executor| +|ShutdownHook|Defines actions during engine shutdown| +|EngineConnServer|Startup class of EngineConn microservice| + +linkis-executor-core is the core module of the executor, which defines the core classes related to the executor. The executor is the real computing execution unit, which is responsible for submitting user code to EngineConn for execution. + +|Core Classes|Core Functions| +|:----|:----| +|Executor| is the actual computing logic execution unit, and provides top-level abstraction of various capabilities of the engine. | +|EngineConnAsyncEvent| defines EngineConn related asynchronous events| +|EngineConnSyncEvent| defines the synchronization event related to EngineConn| +|EngineConnAsyncListener| defines EngineConn-related asynchronous event listeners| +|EngineConnSyncListener| defines EngineConn-related synchronization event listeners| +|EngineConnAsyncListenerBus|Defines the listener bus for EngineConn asynchronous events| +|EngineConnSyncListenerBus|Defines the listener bus for EngineConn sync events| +|ExecutorListenerBusContext| defines the context of the EngineConn event listener| +|LabelService|Provide label reporting function| +|ManagerService|Provides the function of information transfer with LinkisManager| + +linkis-accessible-executor: The underlying abstraction of the Executor that can be accessed. You can interact with it through RPC requests to obtain basic metrics such as its status, load, and concurrency. + +|Core Classes|Core Functions| +|:----|:----| +|LogCache|Provides the function of log caching| +|AccessibleExecutor| An Executor that can be accessed and interacted with via RPC requests. | +|NodeHealthyInfoManager|Manage Executor's health information| +|NodeHeartbeatMsgManager|Manage Executor's heartbeat information| +|NodeOverLoadInfoManager|Manage Executor load information| +|Listener-related|Provides events related to Executor and corresponding listener definitions| +|EngineConnTimedLock|Define Executor level lock| +|AccessibleService|Provide the start-stop and status acquisition functions of Executor| +|ExecutorHeartbeatService|Provides Executor's heartbeat-related functions| +|LockService|Provides lock management functions| +|LogService|Provides log management functions| +|EngineConnCallback|Define the callback logic of EngineConn| + +Related classes that provide capabilities for interactive computing tasks. + +|Core Classes|Core Functions| +|:----|:----| +|EngineConnTask| defines interactive computing tasks submitted to EngineConn| +|ComputationExecutor| defines an interactive Executor, which has interactive capabilities such as status query and task kill, and can only execute tasks once by default. | +|ConcurrentComputationExecutor|Interactive synchronous concurrent Executor, inherited from ComputationExecutor, but supports executing multiple tasks at the same time| +|AsyncConcurrentComputationExecutor|Interactive asynchronous concurrent Executor, inherited from ComputationExecutor, supports multiple tasks to be executed at the same time, and the task does not occupy the execution thread and adopts the form of asynchronous notification| +|TaskExecutionService|Provides management functions for interactive computing tasks| + + +## 6. Non-functional design + +### 6.1 Security + +1. All the relevant information of the task can only be queried by submitting the user +2. The default startup user of the EngineConn process is the submission user +### 6.2 Performance + +EngineConn that supports concurrency supports colleagues to run a large number of tasks concurrently. For example, a single Trino EngineConn can run more than 300 trino tasks at the same time + +### 6.3 Capacity + +not involving + +### 6.4 High Availability + +EngineConn is a process started on demand and task. Support high availability + +### 6.5 Data Quality + +not involving \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/entrance.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/entrance.md new file mode 100644 index 00000000000..ef1c4ccba83 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/entrance.md @@ -0,0 +1,27 @@ +--- +title: Entrance Architecture Design +sidebar_position: 2 +--- + +The Links task submission portal is used to receive, schedule, forward execution requests, life cycle management services for computing tasks, and can return calculation results, logs, and progress to the caller. It is split from the Entrance of Linkis0.X Native capabilities. + +1. Entrance architecture diagram + +![](/Images/Architecture/linkis-entrance-01.png) + +**Introduction to the second-level module:** + +EntranceServer +-------------- + +EntranceServer computing task submission portal service is the core service of Entrance, responsible for the reception, scheduling, execution status tracking, and job life cycle management of Linkis execution tasks. It mainly realizes the conversion of task execution requests into schedulable Jobs, scheduling, applying for Executor execution, job status management, result set management, log management, etc. + +| Core Class | Core Function | +|-------------------------|---------------------| +| EntranceInterceptor | Entrance interceptor is used to supplement the information of the incoming parameter task, making the content of this task more complete. The supplementary information includes: database information supplement, custom variable replacement, code inspection, limit restrictions, etc. | +| EntranceParser | The Entrance parser is used to parse the request parameter Map into Task, and it can also convert Task into schedulable Job, or convert Job into storable Task. | +| EntranceExecutorManager | Entrance executor management creates an Executor for the execution of EntranceJob, maintains the relationship between Job and Executor, and supports the labeling capabilities requested by Job | +| PersistenceManager | Persistence management is responsible for job-related persistence operations, such as the result set path, job status changes, progress, etc., stored in the database. | +| ResultSetEngine | The result set engine is responsible for the storage of the result set after the job is run, and it is saved in the form of a file to HDFS or a local storage directory. | +| LogManager | Log Management is responsible for the storage of job logs and the management of log error codes. | +| Scheduler | The job scheduler is responsible for the scheduling and execution of all jobs, mainly through scheduling job queues. | \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-cli.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-cli.md new file mode 100644 index 00000000000..9910e86f75f --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-cli.md @@ -0,0 +1,36 @@ +--- +title: Linkis-Client Architecture +sidebar_position: 3 +--- + +Provide users with a lightweight client that submits tasks to Linkis for execution. + +#### Linkis-Client architecture diagram + +![img](/Images/Architecture/linkis-client-01.png) + + + +#### Second-level module introduction + +##### Linkis-Computation-Client + +Provides an interface for users to submit execution tasks to Linkis in the form of SDK. + +| Core Class | Core Function | +| ---------- | -------------------------------------- ---------- | +| Action | Defines the requested attributes, methods and parameters included | +| Result | Defines the properties of the returned result, the methods and parameters included | +| UJESClient | Responsible for request submission, execution, status, results and related parameters acquisition | + + + +##### Linkis-Cli + +Provides a way for users to submit tasks to Linkis in the form of a shell command terminal. + +| Core Class | Core Function | +| ----------- | ------------------------------------- ----------------------- | +| Common | Defines the parent class and interface of the instruction template parent class, the instruction analysis entity class, and the task submission and execution links | +| Core | Responsible for parsing input, task execution and defining output methods | +| Application | Call linkis-computation-client to perform tasks, and pull logs and final results in real time | \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/_category_.json new file mode 100644 index 00000000000..8bb53d93abc --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Linkis Manager", + "position": 4 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/app-manager.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/app-manager.md new file mode 100644 index 00000000000..04040528e07 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/app-manager.md @@ -0,0 +1,38 @@ +--- +title: App Manager +sidebar_position: 1 +--- + +## 1. Background +        The Entrance module of the old version of Linkis is responsible for too much responsibilities, the management ability of the Engine is weak, and it is not easy to follow-up expansion, the AppManager module is newly extracted to complete the following responsibilities: +1. Add the AM module to move the engine management function previously done by Entrance to the AM module. +2. AM needs to support operating Engine, including: adding, multiplexing, recycling, preheating, switching and other functions. +3. Need to connect to the Manager module to provide Engine management functions: including Engine status maintenance, engine list maintenance, engine information, etc. +4. AM needs to manage EM services, complete EM registration and forward the resource registration to RM. +5. AM needs to be connected to the Label module, including the addition and deletion of EM/Engine, the label manager needs to be notified to update the label. +6. AM also needs to dock the label module for label analysis, and need to obtain a list of serverInstances with a series of scores through a series of labels (How to distinguish between EM and Engine? the labels are completely different). +7. Need to provide external basic interface: including the addition, deletion and modification of engine and engine manager, metric query, etc. +## Architecture diagram +![AppManager03](/Images/Architecture/AppManager-03.png) +        As shown in the figure above: AM belongs to the AppManager module in LinkisMaster and provides services. +        New engine application flow chart: +![AppManager02](/Images/Architecture/AppManager-02.png) +        From the above engine life cycle flow chart, it can be seen that Entrance is no longer doing the management of the Engine, and the startup and management of the engine are controlled by AM. +## Architecture description +        AppManager mainly includes engine service and EM service: +Engine service includes all operations related to EngineConn, such as engine creation, engine reuse, engine switching, engine recycling, engine stopping, engine destruction, etc. +EM service is responsible for information management of all EngineConnManager, and can perform service management on ECM online, including tag modification, suspension of ECM service, obtaining ECM instance information, obtaining ECM running engine information, killing ECM operation, and also according to EM Node information Query all EngineNodes, and also support searching by user, saving EM Node load information, node health information, resource usage information, etc. +The new EngineConnManager and EngineConn both support tag management, and the types of engines have also added offline, streaming, and interactive support. + +        Engine creation: specifically responsible for the new engine function of the LinkisManager service. The engine startup module is fully responsible for the creation of a new engine, including obtaining ECM tag collections, resource requests, obtaining engine startup commands, notifying ECM to create new engines, updating engine lists, etc. +CreateEngienRequest->RPC/Rest -> MasterEventHandler ->CreateEngineService -> +->LabelContext/EnginePlugin/RMResourcevice->(RcycleEngineService)EngineNodeManager->EMNodeManager->sender.ask(EngineLaunchRequest)->EngineManager service->EngineNodeManager->EngineLocker->Engine->EngineNodeManager->EngineFactory=>EngineService=> ServerInstance +When creating an engine is the part that interacts with RM, EnginePlugin should return specific resource types through Labels, and then AM sends resource requests to RM. + +        Engine reuse: In order to reduce the time and resources consumed for engine startup, the principle of reuse must be given priority to the use of engines. Reuse generally refers to the reuse of engines that users have created. The engine reuse module is responsible for providing a collection of reusable engines. Election and lock the engine and start using it, or return that there is no engine that can be reused. +ReuseEngienRequest->RPC/Rest -> MasterEventHandler ->ReuseEngineService -> +->abelContext->EngineNodeManager->EngineSelector->EngineLocker->Engine->EngineNodeManager->EngineReuser->EngineService=>ServerInstance + +        Engine switching: It mainly refers to the label switching of existing engines. For example, when the engine is created, it was created by Creator1. Now it can be changed to Creator2 by engine switching. At this time, you can allow the current engine to receive tasks with the tag Creator2. +SwitchEngienRequest->RPC/Rest -> MasterEventHandler ->SwitchEngineService ->LabelContext/EnginePlugin/RMResourcevice->EngineNodeManager->EngineLocker->Engine->EngineNodeManager->EngineReuser->EngineService=>ServerInstance. +Engine manager: Engine manager is responsible for managing the basic information and metadata information of all engines. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/engine-conn-history.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/engine-conn-history.md new file mode 100644 index 00000000000..46e2d888d92 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/engine-conn-history.md @@ -0,0 +1,89 @@ +--- +title: EngineConn History Features +sidebar_position: 5 +tags: [Feature] +--- + +## 1. Functional requirements +### 1.1 Requirement Background +Before version 1.1.3, LinkisManager only recorded the information and resource usage of the running EngineConn, but the information was lost after the task was completed. If you need to do some statistics and view of historical ECs, or to view the logs of ECs that have ended, it is too cumbersome, so it is more important to record historical ECs. + +### 1.2 Goals +- Complete the storage of EC information and resource information persistent to DB +- Supports viewing and searching of historical EC information through the restful interface +- Support to view logs of EC that has ended + +## 2. Overall Design + +The main changes in this feature are the RM and AM modules under LinkisManager, and an information record table has been added. + +### 2.1 Technical Architecture +Because this implementation needs to record EC information and resource information, and resource information is divided into three concepts, such as requesting resources, actually using resources, and releasing resources, and all of them need to be recorded. Therefore, the general plan for this implementation is: based on the EC in the life cycle of the ResourceManager to implement, and when the EC completes the above three stages, the update operation of the EC information is added. The overall picture is shown below: + +![engineconn-history-01.png](/Images-zh/Architecture/EngineConn/engineconn-history-01.png) + + + +### 2.2 Business Architecture + +This feature is mainly to complete the information recording of historical ECs and support the log viewing of historical technical ECs. The modules designed by the function point are as follows: + +| First-level module | Second-level module | Function point | +|---|---|---| +| LinkisManager | ResourceManager| Complete the EC information record when the EC requests resources, reports the use of resources, and releases resources| +| LinkisManager | AppManager| Provides an interface to list and search all historical EC information| + +## 3. Module Design +### Core execution flow + +- \[Input] The input is mainly for the requested resource when the engine is created, the real used resource reported after the engine is started, and the information input when the resource is released when the engine exits, mainly including the requested label, resource, EC's unique ticketid, resource type etc. +- \[Processing process] Information recording service, which processes the input data, and parses the corresponding engine information, user, creator, and log path through tags. Confirm the resource request, use, and release by the resource type. Then talk about the information stored in the DB. + +The call sequence diagram is as follows: +![engineconn-history-02.png](/Images-zh/Architecture/EngineConn/engineconn-history-02.png) + + + +## 4. Data structure: +```sql +# EC information resource record table +DROP TABLE IF EXISTS `linkis_cg_ec_resource_info_record`; +CREATE TABLE `linkis_cg_ec_resource_info_record` ( + `id` INT(20) NOT NULL AUTO_INCREMENT, + `label_value` VARCHAR(255) NOT NULL COMMENT 'ec labels stringValue', + `create_user` VARCHAR(128) NOT NULL COMMENT 'ec create user', + `service_instance` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'ec instance info', + `ecm_instance` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'ecm instance info ', + `ticket_id` VARCHAR(100) NOT NULL COMMENT 'ec ticket id', + `log_dir_suffix` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'log path', + `request_times` INT(8) COMMENT 'resource request times', + `request_resource` VARCHAR(255) COMMENT 'request resource', + `used_times` INT(8) COMMENT 'resource used times', + `used_resource` VARCHAR(255) COMMENT 'used resource', + `release_times` INT(8) COMMENT 'resource released times', + `released_resource` VARCHAR(255) COMMENT 'released resource', + `release_time` datetime DEFAULT NULL COMMENT 'released time', + `used_time` datetime DEFAULT NULL COMMENT 'used time', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'create time', + PRIMARY KEY (`id`), + KEY (`ticket_id`), + UNIQUE KEY `label_value_ticket_id` (`ticket_id`, `label_value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +```` + +## 5. Interface Design +Engine history management page API interface, refer to the document Add history engine page to the management console + +## 6. Non-functional design + +### 6.1 Security +No security issues are involved, the restful interface requires login authentication + +### 6.2 Performance +Less impact on engine life cycle performance + +### 6.3 Capacity +Requires regular cleaning + +### 6.4 High Availability +not involving \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/label-manager.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/label-manager.md new file mode 100644 index 00000000000..2d8eeafbe32 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/label-manager.md @@ -0,0 +1,43 @@ +--- +title: Label Manager +sidebar_position: 3 +--- + +## LabelManager architecture design + +#### Brief description +LabelManager is a functional module in Linkis that provides label services to upper-level applications. It uses label technology to manage cluster resource allocation, service node election, user permission matching, and gateway routing and forwarding; it includes generalized analysis and processing tools that support various custom Label labels, And a universal tag matching scorer. +### Overall architecture schematic + +![label_manager_global](/Images/Architecture/LabelManager/label_manager_global.png) + +#### Architecture description +- LabelBuilder: Responsible for the work of label analysis. It can parse the input label type, keyword or character value to obtain a specific label entity. There is a default generalization implementation class or custom extensions. +- LabelEntities: Refers to a collection of label entities, including cluster labels, configuration labels, engine labels, node labels, routing labels, search labels, etc. +- NodeLabelService: The associated service interface class of instance/node and label, which defines the interface method of adding, deleting, modifying and checking the relationship between the two and matching the instance/node according to the label. +- UserLabelService: Declare the associated operation between the user and the label. +- ResourceLabelService: Declare the associated operations of cluster resources and labels, involving resource management of combined labels, cleaning or setting the resource value associated with the label. +- NodeLabelScorer: Node label scorer, corresponding to the implementation of different label matching algorithms, using scores to indicate node label matching. + +### 1. LabelBuilder parsing process +Take the generic label analysis class GenericLabelBuilder as an example to clarify the overall process: +The process of label parsing/construction includes several steps: +1. According to the input, select the appropriate label class to be parsed. +2. According to the definition information of the tag class, recursively analyze the generic structure to obtain the specific tag value type. +3. Convert the input value object to the tag value type, using implicit conversion or positive and negative analysis framework. +4. According to the return of 1-3, instantiate the label, and perform some post operations according to different label classes. + +### 2. NodeLabelScorer scoring process +In order to select a suitable engine node based on the tag list attached to the Linkis user execution request, it is necessary to make a selection of the matching engine list, which is quantified as the tag matching degree of the engine node, that is, the score. +In the label definition, each label has a feature value, namely CORE, SUITABLE, PRIORITIZED, OPTIONAL, and each feature value has a boost value, which is equivalent to a weight and an incentive value. +At the same time, some features such as CORE and SUITABLE must be unique features, that is, strong filtering is required during the matching process, and a node can only be associated with one CORE/SUITABLE label. +According to the relationship between existing tags, nodes, and request attached tags, the following schematic diagram can be drawn: +![label_manager_scorer](/Images/Architecture/LabelManager/label_manager_scorer.png) + +The built-in default scoring logic process should generally include the following steps: +1. The input of the method should be two sets of network relationship lists, namely `Label -> Node` and `Node -> Label`, where the Node node in the `Node -> Label` relationship must have all the CORE and SUITABLE feature labels, these nodes are also called candidate nodes. +2. The first step is to traverse and calculate the relationship list of `Node -> Label`, and traverse the label Label associated with each node. In this step, the label is scored first. If the label is not the label attached to the request, the score is 0. +Otherwise, the score is divided into: (basic score/the number of times the tag corresponds to the feature value in the request) * the incentive value of the corresponding feature value, where the basic score defaults to 1, and the initial score of the node is the sum of the associated tag scores; where because The CORE/SUITABLE type label must be the only label, and the number of occurrences is always 1. +3. After obtaining the initial score of the node, the second step is to traverse the calculation of the `Label -> Node` relationship. Since the first step ignores the effect of unrequested attached labels on the score, the proportion of irrelevant labels will indeed affect the score. This type of label is unified with the UNKNOWN feature, and this feature also has a corresponding incentive value; +We set that the higher the proportion of candidate nodes associated with irrelevant labels in the total associated nodes, the more significant the impact on the score, which can further accumulate the initial score of the node obtained in the first step. +4. Normalize the standard deviation of the scores of the candidate nodes and sort them. diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/overview.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/overview.md new file mode 100644 index 00000000000..81bc1e6f3f8 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/overview.md @@ -0,0 +1,48 @@ +--- +title: Overview +sidebar_position: 0 +--- + +LinkisManager Architecture Design +==================== +        As an independent microservice of Linkis, LinkisManager provides AppManager (application management), ResourceManager (resource management), and LabelManager (label management) capabilities. It can support multi-active deployment and has the characteristics of high availability and easy expansion. +## 1. Architecture Diagram +![Architecture Diagram](/Images/Architecture/LinkisManager/LinkisManager-01.png) +### 1.1 Noun explanation +- EngineConnManager (ECM): Engine Manager, used to start and manage engines. +- EngineConn (EC): Engine connector, used to connect the underlying computing engine. +- ResourceManager (RM): Resource Manager, used to manage node resources. +## 2. Introduction to the second-level module +### 2.1 Application management module linkis-application-manager +        AppManager is used for unified scheduling and management of engines: + +| Core Interface/Class | Main Function | +|------------|--------| +|EMInfoService | Defines EngineConnManager information query and modification functions | +|EMRegisterService| Defines EngineConnManager registration function | +|EMEngineService | Defines EngineConnManager's creation, query, and closing functions of EngineConn | +|EngineAskEngineService | Defines the function of querying EngineConn | +|EngineConnStatusCallbackService | Defines the function of processing EngineConn status callbacks | +|EngineCreateService | Defines the function of creating EngineConn | +|EngineInfoService | Defines EngineConn query function | +|EngineKillService | Defines the stop function of EngineConn | +|EngineRecycleService | Defines the recycling function of EngineConn | +|EngineReuseService | Defines the reuse function of EngineConn | +|EngineStopService | Defines the self-destruct function of EngineConn | +|EngineSwitchService | Defines the engine switching function | +|AMHeartbeatService | Provides EngineConnManager and EngineConn node heartbeat processing functions | + +        The process of applying for an engine through AppManager is as follows: +![AppManager](/Images/Architecture/LinkisManager/AppManager-01.png) +### 2.2 Label management module linkis-label-manager +        LabelManager provides label management and analysis capabilities. + +| Core Interface/Class | Main Function | +|------------|--------| +|LabelService | Provides the function of adding, deleting, modifying and checking labels | +|ResourceLabelService | Provides resource label management functions | +|UserLabelService | Provides user label management functions | +The LabelManager architecture diagram is as follows: +![ResourceManager](/Images/Architecture/LinkisManager/ResourceManager-01.png) +### 2.3 Monitoring module linkis-manager-monitor +        Monitor provides the function of node status monitoring. diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/resource-manager.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/resource-manager.md new file mode 100644 index 00000000000..df3ea73a8dd --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/linkis-manager/resource-manager.md @@ -0,0 +1,138 @@ +--- +title: Resource Manager +sidebar_position: 2 +--- + +## 1. Background +        ResourceManager (RM for short) is the computing resource management module of Linkis. All EngineConn (EC for short), EngineConnManager (ECM for short), and even external resources including Yarn are managed by RM. RM can manage resources based on users, ECM, or other granularities defined by complex tags. +## 2. The role of RM in Linkis +![01](/Images/Architecture/rm-01.png) +![02](/Images/Architecture/rm-02.png) +        As a part of Linkis Manager, RM mainly functions as follows: maintain the available resource information reported by ECM, process the resource application submitted by ECM, record the actual resource usage information reported by EC in real time during the life cycle after successful application, and provide query current resource usage The relevant interface of the situation. +In Linkis, other services that interact with RM mainly include: +1. Engine Manager, ECM for short: Processes the microservices that start the engine connector request. As a resource provider, ECM is responsible for registering and unregistering resources with RM. At the same time, as the manager of the engine, ECM is responsible for applying for resources from RM instead of the new engine connector that is about to start. For each ECM instance, there is a corresponding resource record in the RM, which contains information such as the total resources and protection resources it provides, and dynamically updates the used resources. +![03](/Images/Architecture/rm-03.png) +2. The engine connector, referred to as EC, is the actual execution unit of user operations. At the same time, as the actual user of the resource, the EC is responsible for reporting the actual use of the resource to the RM. Each EC has a corresponding resource record in the RM: during the startup process, it is reflected as a locked resource; during the running process, it is reflected as a used resource; after being terminated, the resource record is subsequently deleted. +![04](/Images/Architecture/rm-04.png) +## 3. Resource type and format +![05](/Images/Architecture/rm-05.png) +        As shown in the figure above, all resource classes implement a top-level Resource interface, which defines the calculation and comparison methods that all resource classes need to support, and overloads the corresponding mathematical operators to enable resources to be Directly calculated and compared like numbers. + +| Operator | Correspondence Method | Operator | Correspondence Method | +|--------|-------------|--------|-------------| +| \+ | add | \> | moreThan | +| \- | minus | \< | lessThan | +| \* | multiply | = | equals | +| / | divide | \>= | notLessThan | +| \<= | notMoreThan | | | + +        The currently supported resource types are shown in the following table. All resources have corresponding json serialization and deserialization methods, which can be stored in json format and transmitted across the network: + +| Resource Type | Description | +|-----------------------|--------------------------------------------------------| +| MemoryResource | Memory Resource | +| CPUResource | CPU Resource | +| LoadResource | Both memory and CPU resources | +| YarnResource | Yarn queue resources (queue, queue memory, queue CPU, number of queue instances) | +| LoadInstanceResource | Server resources (memory, CPU, number of instances) | +| DriverAndYarnResource | Driver and executor resources (with server resources and Yarn queue resources at the same time) | +| SpecialResource | Other custom resources | + +## 4. Available resource management +        The available resources in the RM mainly come from two sources: the available resources reported by the ECM, and the resource limits configured according to tags in the Configuration module. +**ECM resource report**: +1. When the ECM is started, it will broadcast the ECM registration message. After receiving the message, the RM will register the resource according to the content contained in the message. The resource-related content includes: + + 1. Total resources: the total number of resources that the ECM can provide. + + 2. Protect resources: When the remaining resources are less than this resource, no further resources are allowed to be allocated. + + 3. Resource type: such as LoadResource, DriverAndYarnResource and other type names. + + 4. Instance information: machine name plus port name. + +2. After RM receives the resource registration request, it adds a record in the resource table, the content is consistent with the parameter information of the interface, and finds the label representing the ECM through the instance information, and adds an association in the resource and label association table recording. + +3. When the ECM is closed, it will broadcast a message that the ECM is closed. After receiving the message, the RM will go offline according to the ECM instance information in the message, that is, delete the resource and associated records corresponding to the ECM instance tag. + +**Configuration module tag resource configuration** +        In the Configuration module, users can configure the number of resources based on different tag combinations, such as limiting the maximum available resources of the User/Creator/EngineType combination. + +        The RM queries the Configuration module for resource information through the RPC message, using the combined tag as the query condition, and converts it into a Resource object to participate in subsequent comparison and recording. + +## 5. Resource Usage Management +**Receive user's resource application:** +1. When LinkisManager receives a request to start EngineConn, it will call RM's resource application interface to apply for resources. The resource application interface accepts an optional time parameter. When the waiting time for applying for a resource exceeds the limit of the time parameter, the resource application will be automatically processed as a failure. +**Judging whether there are enough resources:** +That is, to determine whether the remaining available resources are greater than the requested resources, if greater than or equal to, the resources are sufficient; otherwise, the resources are insufficient. + +1. RM preprocesses the label information attached to the resource application, and filters, combines and converts the original labels according to the rules (such as combining the User/Creator label and EngineType label), which makes the subsequent resource judgment more granular flexible. + +2. Lock each converted label one by one, so that their corresponding resource records remain unchanged during the processing of resource applications. + +3. According to each label: + + 1. Query the corresponding resource record from the database through the Persistence module. If the record contains the remaining available resources, it is directly used for comparison. + + 2. If there is no direct remaining available resource record, it will be calculated by the formula of [Remaining Available Resource=Maximum Available Resource-Used Resource-Locked Resource-Protected Resource]. + + 3. If there is no maximum available resource record, request the Configuration module to see if there is configured resource information, if so, use the formula for calculation, if not, skip the resource judgment for this tag. + + 4. If there is no resource record, skip the resource judgment for this tag. + +4. As long as one tag is judged to be insufficient in resources, the resource application will fail, and each tag will be unlocked one by one. + +5. Only when all tags are judged to be sufficient resources, can the resource application be successfully passed and proceed to the next step. + +**lock by application of resources:** + +1. The number of resource request by generating a new record in the resource table, and associated with each tag. + +2. If there is a tag corresponding to the remaining available resource record, the corresponding number of the abatement. + +3. Generate a timed task, the lock checks whether these resources are actually used after a certain time, if the timeout is not used, it is mandatory recycling. + +4. unlock each tag. + +**report the actual use of resources:** + +1. EngineConn after the start, broadcast a resource utilization message. RM after receiving the message, check whether the label corresponding to the EngineConn lock resource record, and if not, an error. + +2. If you have locked resource, the EngineConn all labels associated lock. + +3. For each tag, the resource record corresponding lock record for the conversion of used resources. + +4. Unlock all labels. + +**Release actual used resources:** + +1. EngineConn after the end of the life cycle, recycling broadcast messages. RM after receiving the message, check whether the EngineConn corresponding label resources have been recorded. + +2. If so, all the labels associated EngineConn be locked. + +3, minus the amount used in the corresponding resource record for each label. + +4. If there is a tag corresponding to the remaining available resource record, the corresponding increase in number. + +5. The unlocking each tag + +## 6. External resource management +        In RM, in order to classify resources more flexibly and expansively, support multi-cluster resource management and control, and at the same time make it easier to access new external resources, the following considerations have been made in the design: + +1. Unified management of resources through tags. After the resource is registered, it is associated with the tag, so that the attributes of the resource can be expanded infinitely. At the same time, resource applications are also tagged to achieve flexible matching. + +2. Abstract the cluster into one or more tags, and maintain the environmental information corresponding to each cluster tag in the external resource management module to achieve dynamic docking. + +3. Abstract a general external resource management module. If you need to access new external resource types, you can convert different types of resource information into Resource entities in the RM as long as you implement a fixed interface to achieve unified management. +![06](/Images/Architecture/rm-06.png) + +        Other modules of RM obtain external resource information through the interface provided by ExternalResourceService. + +        The ExternalResourceService obtains information about external resources through resource types and tags: + +1. The type, label, configuration and other attributes of all external resources (such as cluster name, Yarn web + url, Hadoop version and other information) are maintained in the linkis\_external\_resource\_provider table. + +2. For each resource type, there is an implementation of the ExternalResourceProviderParser interface, which parses the attributes of external resources, converts the information that can be matched to the Label into the corresponding Label, and converts the information that can be used as a parameter to request the resource interface into params . Finally, an ExternalResourceProvider instance that can be used as a basis for querying external resource information is constructed. + +3. According to the resource type and label information in the parameters of the ExternalResourceService method, find the matching ExternalResourceProvider, generate an ExternalResourceRequest based on the information in it, and formally call the API provided by the external resource to initiate a resource information request. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/overview.md b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/overview.md new file mode 100644 index 00000000000..813381c0597 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/computation-governance-services/overview.md @@ -0,0 +1,38 @@ +--- +title: Overview +sidebar_position: 1 +--- + +## **Overview** + +Computing Governance Service Group, CGS: Computation Governance Services. It is the core module of Linkis to complete the main steps of computing tasks and requests such as submission, preparation, execution, and return of results. + +## Architecture Diagram +![linkis Computation Gov](/Images/Linkis_1.0_architecture.png) +**Operation process optimization:** Linkis1.0 will optimize the overall execution process of the job, from submission —\> preparation —\> +Perform three stages to fully upgrade Linkis's Job execution architecture, as shown in the following figure: +![](/Images/Architecture/linkis-computation-gov-02.png) +## Architecture Description +### 1. Entrance +        Entrance, as the submission portal for computing tasks, provides task reception, scheduling and job information forwarding capabilities. It is a native capability split from Linkis0.X's Entrance. +[Entrance Architecture Design](entrance.md) +### 2. Orchestrator +        Orchestrator, as the entrance to the preparation phase, inherits the capabilities of parsing Jobs, applying for Engines, and submitting execution from Entrance of Linkis0.X; at the same time, Orchestrator will provide powerful orchestration and computing strategy capabilities to meet multiple activities, active backups, transactions, and replays. , Current limiting, heterogeneous and mixed computing and other application scenarios. + + + +### 3. LinkisManager +        As the management brain of Linkis, LinkisManager is mainly composed of AppManager, ResourceManager, LabelManager and EngineConnPlugin. +1. ResourceManager not only has Linkis0.X's resource management capabilities for Yarn and Linkis EngineManager, but also provides tag-based multi-level resource allocation and recycling capabilities, allowing ResourceManager to have full resource management capabilities across clusters and across computing resource types; +2. AppManager will coordinate and manage all EngineConnManager and EngineConn. The life cycle of EngineConn application, reuse, creation, switching, and destruction will be handed over to AppManager for management; and LabelManager will provide cross-IDC and cross-cluster based on multi-level combined tags EngineConn and EngineConnManager routing and management capabilities; +3. EngineConnPlugin is mainly used to reduce the access cost of new computing storage, so that users can access a new computing storage engine only by implementing one class. + [Enter LinkisManager Architecture Design](linkis-manager/overview.md) +### 4. Engine Manager +        Engine conn Manager (ECM) is a simplified and upgraded version of linkis0. X engine manager. The ECM under linkis1.0 removes the application ability of the engine, and the whole microservice is completely stateless. It will focus on supporting the startup and destruction of all kinds of enginecon. +[Enter EngineConnManager Architecture Design](engine-conn-manager.md) + ### 5. EngineConn +         EngineConn is an optimized and upgraded version of Linkis0.X Engine. It will provide EngineConn and Executor two modules. EngineConn is used to connect the underlying computing storage engine and provide a session session that connects the underlying computing storage engines; Executor is based on this Session session , Provide full-stack computing support for interactive computing, streaming computing, offline computing, and data storage. + [Enter EngineConn Architecture Design](engine/engine-conn.md) diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/_category_.json new file mode 100644 index 00000000000..54c60ad8ffe --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Public Enhancement Services", + "position": 3 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/_category_.json new file mode 100644 index 00000000000..66c486ba0f2 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "BML", + "position": 4 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/engine-bml-dissect.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/engine-bml-dissect.md new file mode 100644 index 00000000000..95a2d5355ed --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/engine-bml-dissect.md @@ -0,0 +1,294 @@ +--- +title: Analysis of Engine BML +sidebar_position: 1 +--- + +> Introduction: This article takes the engine-related material management process as the entry point, and combines the underlying data model and source code to analyze the implementation details of the engine material management function in detail, hoping to help you better understand the BML (material library) service. Architecture. + +## 1. BML material library service + +The BML material library is a functional module under the PublicEnhancementService (PS) in Linkis, the public enhancement service framework. + +![PS-BML](/Images/Architecture/Public_Enhancement_Service/engine_bml/PS-BML.png) + +In the Linkis architecture system, the concept of `material` refers to various file data that are stored and hosted in a unified manner, including script code, resource files, third-party jars, related class libraries and configuration files required when the engine starts, as well as keytab files for security authentication, etc. + +In short, any data that exists in the file state can be centrally hosted in the material library, and then downloaded and used in the respective required scenarios. + +The material service is stateless and can be deployed in multiple instances to achieve high service availability. Each instance provides independent services to the outside world without interfering with each other. All material metadata and version information are shared in the database, and the underlying material data can be accessed. Store in HDFS or local (shared) file system, and support the implementation of file storage-related interfaces, extending other file storage systems, etc. + +The material service provides precise permission control. For the material of the engine resource type, it can be shared and accessed by all users; for some material data containing sensitive information, only limited users can read it. + +The material file adopts the method of appending, which can combine multiple versions of resource files into one large file to avoid generating too many small HDFS files. Too many small HDFS files will reduce the overall performance of HDFS. + +The material service provides lifecycle management of operation tasks such as file upload, update, and download. At the same time, there are two forms of using the material service, the rest interface and the SDK. Users can choose according to their own needs. + +The BML architecture diagram is as follows: + +![BML Architecture](/Images/Architecture/Public_Enhancement_Service/engine_bml/bml-jiagou.png) + +For the above overview of the BML architecture, please refer to the official website document: https://linkis.apache.org/zh-CN/docs/latest/architecture/public-enhancement-services/bml + +## 2. BML material library service underlying table model + +Before deeply understanding the process details of BML material management, it is necessary to sort out the database table model that the underlying BML material management service relies on. + +![BML-Model](/Images/Architecture/Public_Enhancement_Service/engine_bml/BML-Model.png) + +Combined with Linkis' linkis_ddl.sql file and the engine material upload and update process described below, you can understand the meaning of fields in bml resources related tables and the field relationship between tables. + +## 3. Usage scenarios of BML material library service + +Currently in Linkis, the usage scenarios of the BML material library service include: + +- Engine material files, including files in conf and lib required for engine startup +- Stored scripts, such as the scripts in the Scripts linked by the workflow task node are stored in the BML material library +- Workflow content version management in DSS +- Management of resource files required when tasks are running + +## 4. Analysis of engine material management process + +`Engine material` is a subset of the Linkis material concept, and its role is to provide the latest version of jar package resources and configuration files for the engine to start. This section mainly starts from the engine material management function, and analyzes the flow details of engine material data in BML. + +### 4.1 Engine Material Description + +After the Linkis installation package is deployed normally, you can see all the engine material directories under the `LINKIS_INSTALL_HOME/lib/linkis-engineconn-plugins` directory. Taking the jdbc engine as an example, the structure of the engine material directory is as follows: + +```shell +jdbc +├── dist +│   └── v4 +│   ├── conf +│   ├── conf.zip +│   ├── lib +│   └── lib.zip +└── plugin + └── 4 + └── linkis-engineplugin-jdbc-1.1.2.jar +``` + +Material catalog composition: + +```shell +jdbc/dist/version/conf.zip +jdbc/dist/version/lib.zip + +jdbc/plugin/version number (remove v and leave the number)/linkis-engineplugin-engine name-1.1.x.jar +```` + +conf.zip and lib.zip will be hosted in the material management service as engine materials. After each local modification to the material conf or lib, a new version number will be generated for the corresponding material, and the material file data will be re-uploaded. When the engine starts, the material data of the latest version number will be obtained, lib and conf will be loaded, and the java process of the engine will be started. + +### 4.2 Engine material upload and update process + +When Linkis is deployed and started for the first time, the engine material (lib.zip and conf.zip) will be triggered to upload to the material library for the first time; when the jar package under the engine lib or the engine configuration file in conf is modified, the engine material needs to be triggered. The refresh mechanism ensures that the latest material file can be loaded when the engine is started. + +Taking the current version of Linkis 1.1.x as an example, there are two ways to trigger the engine material refresh: + +Restart the engineplugin service with the command `sh sbin/linkis-daemon.sh restart cg-engineplugin` + +Interface to refresh by requesting engine material + +```shell +# refresh all engine materials +curl --cookie "linkis_user_session_ticket_id_v1=kN4HCk555Aw04udC1Npi4ttKa3duaCOv2HLiVea4FcQ=" http://127.0.0.1:9001/api/rest_j/v1/engineplugin/refreshAll +# Specify the engine type and version to refresh the item +curl --cookie "linkis_user_session_ticket_id_v1=kN4HCk555Aw04udC1Npi4ttKa3duaCOv2HLiVea4FcQ=" http://127.0.0.1:9001/api/rest_j/v1/engineplugin/refresh?ecType=jdbc&version=4 +``` + +The underlying implementation mechanism of the two types of engine material refresh methods is the same, both call the refreshAll() or refresh() method in the `EngineConnResourceService` class. + +In the init() method in the default implementation class `DefaultEngineConnResourceService` of the abstract class `EngineConnResourceService`, the parameter wds.linkis.engineconn.dist.load.enable (default is true) is used to control whether to start the engineplugin service every time. Execute refreshAll(false) to check whether all engine materials have been updated (where faslse represents asynchronous acquisition of execution results). + +> The init() method is modified by the annotation @PostConstruct. After the DefaultEngineConnResourceService is loaded, it is executed before the object is used, and it is executed only once. + +Manually call the interface of engineplugin/refresh, that is, manually execute the refreshAll or refresh method in the `EngineConnResourceService` class. + +So the logic of engine material detection and update is in the refreshAll and refresh methods in `DefaultEngineConnResourceService`. + +The core logic of refreshAll() is: + +1) Obtain the installation directory of the engine through the parameter wds.linkis.engineconn.home, the default is: + +```scala +getEngineConnsHome = Configuration.getLinkisHome() + "/lib/linkis-engineconn-plugins"; +```` + +2) Traverse the engine directory + +```scala +getEngineConnTypeListFromDisk: Array[String] = new File(getEngineConnsHome).listFiles().map(_.getName) +``` + +3) The `EngineConnBmlResourceGenerator` interface provides the validity detection of the underlying files or directories of each engine (version). The corresponding implementation exists in the abstract class `AbstractEngineConnBmlResourceGenerator`. + +4) The `DefaultEngineConnBmlResourceGenerator` class is mainly used to generate `EngineConnLocalizeResource`. EngineConnLocalizeResource is the encapsulation of the material resource file metadata and InputStream. In the subsequent logic, EngineConnLocalizeResource will be used as a material parameter to participate in the material upload process. + +The code details of the three files EngineConnBmlResourceGenerator, AbstractEngineConnBmlResourceGenerator, and DefaultEngineConnBmlResourceGenerator will not be described in detail. You can use the following UML class diagram to get a general understanding of its inheritance mechanism, and combine the specific implementation in the method to understand the function of this part. + +![BML](/Images/Architecture/Public_Enhancement_Service/engine_bml/bml_uml.png) + +Go back to the refreshAll method in the `DefaultEngineConnResourceService` class, and continue to look at the core process of the refreshTask thread: + +```scala +engineConnBmlResourceGenerator.getEngineConnTypeListFromDisk foreach { engineConnType => + Utils.tryCatch { + engineConnBmlResourceGenerator.generate(engineConnType).foreach { + case (version, localize) => + logger.info(s" Try to initialize ${engineConnType}EngineConn-$version.") + refresh(localize, engineConnType, version) + } + } + ...... +} +``` + +Scan the installation directory of the engine to get a list of each engine material directory. After the legality check of each engine material directory structure is passed, you can get the corresponding `EngineConnLocalizeResource`, and then call refresh(localize: Array[EngineConnLocalizeResource] , engineConnType: String, version: String) to complete the upload of subsequent materials. + +Inside the refresh() method, the main processes are as follows: + +Obtain the material list data corresponding to engineConnType and version from the table `linkis_cg_engine_conn_plugin_bml_resources`, and assign it to the variable engineConnBmlResources. + +```scala +val engineConnBmlResources = asScalaBuffer(engineConnBmlResourceDao.getAllEngineConnBmlResource(engineConnType, version)) +```` + +![ec data](/Images/Architecture/Public_Enhancement_Service/engine_bml/ec-data.png) + + + +#### 4.2.1 Engine material upload process + +**Engine material upload process sequence diagram** + +![Engine material upload process sequence diagram](/Images/Architecture/Public_Enhancement_Service/engine_bml/bml-shixu.png) + +If there is no matching data in the table `linkis_cg_engine_conn_plugin_bml_resources`, you need to use the data in EngineConnLocalizeResource to construct an EngineConnBmlResource object and save it to the `linkis_cg_engine_conn_plugin_bml_resources` table. Before saving this data, you need to upload the material file, that is, execute `uploadToBml` (localizeResource)` method. + +Inside the uploadToBml(localizeResource) method, the interface for requesting material upload is constructed by constructing bmlClient. which is: + +```scala +private val bmlClient = BmlClientFactory.createBmlClient() +bmlClient.uploadResource(Utils.getJvmUser, localizeResource.fileName, localizeResource.getFileInputStream) +``` + +In BML Server, the location of the material upload interface is in the uploadResource interface method in the BmlRestfulApi class. The main process is: + +```scala +ResourceTask resourceTask = taskService.createUploadTask(files, user, properties); +``` + +Every time a material is uploaded, a ResourceTask will be constructed to complete the file upload process, and the execution record of the file upload task will be recorded. Inside the createUploadTask method, the main operations are as follows: + +1) Generate a globally unique resource_id for the uploaded resource file, String resourceId = UUID.randomUUID().toString(); + +2) Build a ResourceTask record and store it in the table `linkis_ps_bml_resources_task`, as well as a series of subsequent Task state modifications. + +```scala +ResourceTask resourceTask = ResourceTask.createUploadTask(resourceId, user, properties); +taskDao.insert(resourceTask); + +taskDao.updateState(resourceTask.getId(), TaskState.RUNNING.getValue(), new Date()); +``` + +3) The actual writing of material files into the material library is completed by the upload method in the ResourceServiceImpl class. Inside the upload method, a set of byte streams corresponding to `List files` will be persisted to the material library file storage In the system; store the properties data of the material file in the resource record table (linkis_ps_bml_resources) and the resource version record table (linkis_ps_bml_resources_version). + +```scala +MultipartFile p = files[0] +String resourceId = (String) properties.get("resourceId"); +String fileName =new String(p.getOriginalFilename().getBytes(Constant.ISO_ENCODE), + Constant.UTF8_ENCODE); +fileName = resourceId; +String path = resourceHelper.generatePath(user, fileName, properties); +// generatePath currently supports Local and HDFS paths, and the composition rules of paths are determined by LocalResourceHelper or HdfsResourceHelper +// implementation of the generatePath method in +StringBuilder sb = new StringBuilder(); +long size = resourceHelper.upload(path, user, inputStream, sb, true); +// The file size calculation and the file byte stream writing to the file are implemented by the upload method in LocalResourceHelper or HdfsResourceHelper +Resource resource = Resource.createNewResource(resourceId, user, fileName, properties); +// Insert a record into the resource table linkis_ps_bml_resources +long id = resourceDao.uploadResource(resource); +// Add a new record to the resource version table linkis_ps_bml_resources_version, the version number at this time is instant.FIRST_VERSION +// In addition to recording the metadata information of this version, the most important thing is to record the storage location of the file of this version, including the file path, starting location, and ending location. +String clientIp = (String) properties.get("clientIp"); +ResourceVersion resourceVersion = ResourceVersion.createNewResourceVersion( + resourceId, path, md5String, clientIp, size, Constant.FIRST_VERSION, 1); +versionDao.insertNewVersion(resourceVersion); +``` + +After the above process is successfully executed, the material data is truly completed, and then the UploadResult is returned to the client, and the status of this ResourceTask is marked as completed. Exception information. + +![resource-task](/Images/Architecture/Public_Enhancement_Service/engine_bml/resource-task.png) + + + +#### 4.2.2 Engine material update process + +**Engine material update process sequence diagram** + +![Engine material update process sequence diagram](/Images/Architecture/Public_Enhancement_Service/engine_bml/engine-bml-update-shixu.png) + +If the table `linkis_cg_engine_conn_plugin_bml_resources` matches the local material data, you need to use the data in EngineConnLocalizeResource to construct an EngineConnBmlResource object, and update the metadata information such as the version number, file size, modification time, etc. of the original material file in the `linkis_cg_engine_conn_plugin_bml_resources` table. Before updating, you need to complete the update and upload operation of the material file, that is, execute the `uploadToBml(localizeResource, engineConnBmlResource.getBmlResourceId)` method. + +Inside the uploadToBml(localizeResource, resourceId) method, an interface for requesting material resource update by constructing bmlClient. which is: + +```scala +private val bmlClient = BmlClientFactory.createBmlClient() +bmlClient.updateResource(Utils.getJvmUser, resourceId, localizeResource.fileName, localizeResource.getFileInputStream) +``` + +In BML Server, the interface for material update is located in the updateVersion interface method in the BmlRestfulApi class. The main process is as follows: + +Complete the validity detection of resourceId, that is, check whether the incoming resourceId exists in the linkis_ps_bml_resources table. If the resourceId does not exist, an exception will be thrown to the client, and the material update operation at the interface level will fail. + +Therefore, the corresponding relationship of the resource data in the tables `linkis_cg_engine_conn_plugin_bml_resources` and `linkis_ps_bml_resources` needs to be complete, otherwise an error will occur that the material file cannot be updated. + +```scala +resourceService.checkResourceId(resourceId) +``` + +If resourceId exists in the linkis_ps_bml_resources table, it will continue to execute: + +```scala +StringUtils.isEmpty(versionService.getNewestVersion(resourceId)) +```` + +The getNewestVersion method is to obtain the maximum version number of the resourceId in the table `linkis_ps_bml_resources_version`. If the maximum version corresponding to the resourceId is empty, the material will also fail to update, so the integrity of the corresponding relationship of the data here also needs to be strictly guaranteed. + +After the above two checks are passed, a ResourceUpdateTask will be created to complete the final file writing and record update saving. + +```scala +ResourceTask resourceTask = null; +synchronized (resourceId.intern()) { + resourceTask = taskService.createUpdateTask(resourceId, user, file, properties); +} +``` + +Inside the createUpdateTask method, the main functions implemented are: + +```scala +// Generate a new version for the material resource +String lastVersion = getResourceLastVersion(resourceId); +String newVersion = generateNewVersion(lastVersion); +// Then the construction of ResourceTask, and state maintenance +ResourceTask resourceTask = ResourceTask.createUpdateTask(resourceId, newVersion, user, system, properties); +// The logic of material update upload is completed by the versionService.updateVersion method +versionService.updateVersion(resourceTask.getResourceId(), user, file, properties); +``` + +Inside the versionService.updateVersion method, the main functions implemented are: + +```scala +ResourceHelper resourceHelper = ResourceHelperFactory.getResourceHelper(); +InputStream inputStream = file.getInputStream(); +// Get the path of the resource +String newVersion = params.get("newVersion").toString(); +String path = versionDao.getResourcePath(resourceId) + "_" + newVersion; +// The acquisition logic of getResourcePath is to limit one from the original path, and then splice newVersion with _ +// select resource from linkis_ps_bml_resources_version WHERE resource_id = #{resourceId} limit 1 +// upload resources to hdfs or local +StringBuilder stringBuilder = new StringBuilder(); +long size = resourceHelper.upload(path, user, inputStream, stringBuilder, OVER_WRITE); +// Finally insert a new resource version record in the linkis_ps_bml_resources_version table +ResourceVersion resourceVersion = ResourceVersion.createNewResourceVersion(resourceId, path, md5String, clientIp, size, newVersion, 1); +versionDao.insertNewVersion(resourceVersion); +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/overview.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/overview.md new file mode 100644 index 00000000000..429239e031b --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/bml/overview.md @@ -0,0 +1,99 @@ +--- +title: Overview +sidebar_position: 0 +--- + + +## Background + +BML (Material Library Service) is a material management system of linkis, which is mainly used to store various file data of users, including user scripts, resource files, third-party Jar packages, etc., and can also store class libraries that need to be used when the engine is running. + +It has the following functions: + +1) Support various types of files. Supports text and binary files. If you are a user in the field of big data, you can store their script files and material compression packages in the system. + +2), the service is stateless, multi-instance deployment, to achieve high service availability. When the system is deployed, it can be deployed with multiple instances. Each instance provides services independently to the outside world without interfering with each other. All information is stored in the database for sharing. + +3) Various ways of use. Provides two ways of Rest interface and SDK, users can choose according to their needs. + +4) The file is appended to avoid too many small HDFS files. Many small HDFS files will lead to a decrease in the overall performance of HDFS. We have adopted a file append method to combine multiple versions of resource files into one large file, effectively reducing the number of files in HDFS. + +5) Accurate authority control, safe storage of user resource file content. Resource files often have important content, and users only want to read it by themselves + +6) Provide life cycle management of file upload, update, download and other operational tasks. + +## Architecture diagram + +![BML Architecture Diagram](/Images/Architecture/bml-02.png) + +## Schema description + +1. The Service layer includes resource management, uploading resources, downloading resources, sharing resources, and project resource management. + +Resource management is responsible for basic operations such as adding, deleting, modifying, and checking resources, controlling access rights, and whether files are out of date. + +2. File version control + Each BML resource file has version information. Each update operation of the same resource will generate a new version. Of course, it also supports historical version query and download operations. BML uses the version information table to record the deviation position and size of each version of the resource file HDFS storage, and can store multiple versions of data on one HDFS file. + +3. Resource file storage + HDFS files are mainly used as actual data storage. HDFS files can effectively ensure that the material library files are not lost. The files are appended to avoid too many small HDFS files. + +### Core Process + +**upload files:** + +1. Determine the operation type of the file uploaded by the user, whether it is the first upload or update upload. If it is the first upload, a new resource information record needs to be added. The system has generated a globally uniquely identified resource_id and a resource_location for this resource. The first version A1 of resource A needs to be stored in the resource_location location in the HDFS file system. After storing, you can get the first version marked as V00001. If it is an update upload, you need to find the latest version last time. + +2. Upload the file stream to the specified HDFS file. If it is an update, it will be added to the end of the last content by file appending. + +3. Add a new version record, each upload will generate a new version record. In addition to recording the metadata information of this version, the most important thing is to record the storage location of the version of the file, including the file path, start location, and end location. + +**download file:** + +1. When users download resources, they need to specify two parameters: one is resource_id and the other is version. If version is not specified, the latest version will be downloaded by default. + +2. After the user passes in the two parameters resource_id and version to the system, the system queries the resource_version table, finds the corresponding resource_location, start_byte and end\_byte to download, and uses the skipByte method of stream processing to set the front (start_byte- 1) skip bytes, then read to end_byte + The number of bytes. After the reading is successful, the stream information is returned to the user. + +3. Insert a successful download record in resource_download_history + +## Database Design + +1. Resource information table (resource) + +| Field name | Function | Remarks | +|-------------------|------------------------------|----------------------------------| +| resource_id | A string that uniquely identifies a resource globally | UUID can be used for identification | +| resource_location | The location where resources are stored | For example, hdfs:///tmp/bdp/\${USERNAME}/ | +| owner | The owner of the resource | e.g. zhangsan | +| create_time | Record creation time | | +| is_share | Whether to share | 0 means not to share, 1 means to share | +| update\_time | Last update time of the resource | | +| is\_expire | Whether the record resource expires | | +| expire_time | Record resource expiration time | | + +2. Resource version information table (resource_version) + +| Field name | Function | Remarks | +|-------------------|--------------------|----------| +| resource_id | Uniquely identifies the resource | Joint primary key | +| version | The version of the resource file | | +| start_byte | Start byte count of resource file | | +| end\_byte | End bytes of resource file | | +| size | Resource file size | | +| resource_location | Resource file placement location | | +| start_time | Record upload start time | | +| end\_time | End time of record upload | | +| updater | Record update user | | + +3. Resource download history table (resource_download_history) + +| Field | Function | Remarks | +|-------------|---------------------------|--------------------------------| +| resource_id | Record the resource_id of the downloaded resource | | +| version | Record the version of the downloaded resource | | +| downloader | Record downloaded users | | +| start\_time | Record download time | | +| end\_time | Record end time | | +| status | Whether the record is successful | 0 means success, 1 means failure | +| err\_msg | Log failure reason | null means success, otherwise log failure reason | \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/_category_.json b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/_category_.json new file mode 100644 index 00000000000..795162be5ef --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Context Service", + "position": 3 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/content-service-cleanup.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/content-service-cleanup.md new file mode 100644 index 00000000000..8a7fb39aae0 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/content-service-cleanup.md @@ -0,0 +1,238 @@ +--- +title: CS Cleanup Interface Features +sidebar_position: 9 +tags: [Feature] +--- + +## 1. Functional requirements +### 1.1 Background +Before version 1.1.3, the ContextService unified context service lacked a cleaning mechanism, and lacked the creation time, update time fields, and batch cleaning interfaces. +In the case of long-term accumulation, millions of data may appear, affecting query efficiency. + +### 1.2 Goals +- Modify 1ContextService` underlying library table, add creation time, modification time, last access time fields, complete the update time of `ContextID` and `ContextMap` related data into the database +- Add `restful` interface for cleaning and cleaning, support batch and retail cleaning interface according to time range and id list +- Add the corresponding `java sdk` interface of `cs-client` + +## 2. Overall Design +This requirement involves `cs-client`, `cs-persistence` and `cs-server` modules under `ContextService`. +Add 3 fields of the existing table in the `cs-persistence` module; add 3 `restful` interfaces in the `cs-server` module, and add 3 `sdk api` in the `cs-client` module. + +### 2.1 Technical Architecture + +For the overall architecture of ContextService, please refer to the existing document: [ContextService Architecture Document](overview.md) + +The access relationship of each module of ContestService is shown in the following figure +![linkis-contextservice-clean-01.png](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-clean-01.png) + + +Table changes are made in the `cs-persistence` module. This change involves 5 tables `context_id, context_map, context_id_listener, context_key_listener, context_history`, all of which need to add 3 fields `create_time, update_time, access_time`. The `context_id and context_map` tables are enabled, and the other three tables are not enabled. `create_time` adds the time before the persistence module performs the insert operation. `update_time` and `access_time` are actively called by the upstream interface. In the update interface, `update_time` and `access_time` are mutually exclusive updates, that is, when `access_time` exists (not null), `update_time` will not be updated, otherwise update_time will be updated . + +The `update_time` field is updated in the cs-cache module, the ADD message is detected when a new `context_id` is loaded from the db, and the `access_time` is synchronized to the db at this time. +Only the `create_time, update_time, access_time` of the `context_id` table are recorded in the table. Subsequent search cleaning is also performed from the context_id table. + +Add 3 cleanup related interfaces: `searchContextIDByTime, clearAllContextByID, clearAllContextByTime` +- `searchContextIDByTime` searches according to 3 time ranges and returns a list of contextIDs +- `clearAllContextByID` clears the content of the context_map table and context_id table corresponding to the ID in the input contextID list +- `clearAllContextByTime` searches according to 3 time ranges, and clears all the contents of the context_map table and context_id table corresponding to the searched contextID + +### 2.2 Business Architecture +This feature is to add related interfaces for batch query and cleanup to the ContextService service, and to add fields such as the update time of the underlying data table, so as to clean up expired data according to the access situation. The function points involve the modules as shown in the table below. + +| First-level module | Second-level module | Function point | +| :------------ | :------------ | :------------ | +| linkis-ps-cs | cs-client | Added batch cleaning interface related java sdk api interface | +| Linkis-ps-cs | cs-server | Added restful interface related to batch cleaning interface | +| linkis-ps-cs | cs-persistence | Add 3 time-related fields of the underlying table | + + +## 3. Module Design +### Main execution process +- Create ContextID. When the user creates the ContextID, the create_time will be recorded, and this field will not be updated later +- Update ContextID. When the user updates the ContextID, the update_time field is updated. Note that if the update is from the cache at this time, the access_time field will not be updated; if it is loaded from the db to the cache and then updated with the new contextID, the access_time will be updated first, and then the new update_time will be updated separately. +- Query ContextID according to time. When the user queries the ContextID of the corresponding time range, only a list of haid strings will be returned. This interface has paging, the default is limited to 5000 pieces of data +- Bulk cleanup of ContextIDs. All contextMap data and contextID data corresponding to the incoming idList will be cleaned up in batches. The maximum number of incoming arrays is 5000 +- Query and clear ContextID, first query and then batch clear + +The corresponding timing diagrams above are as follows: +![linkis-contextservice-clean-02.png](/Images-zh/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-clean-02.png) + +Two of them require additional attention: +①The restful api in the cs-server service will encapsulate the request as a Job and submit it to the queue and block waiting for the result. The operation type of CLEAR is newly defined to facilitate matching to the cleanup related interface. +② To process the Service service of the Job in ①, the name needs to be defined as not including the ContextID to avoid the dynamic proxy conversion of the HighAvailable module. This conversion is only for the interface with only one ContextID in the request, and it is meaningless and affects the batch cleanup and batch query interface. performance. + +## 4. Data structure +```` +# The main involved context_id table structure is as follows, adding create_time, update_time, expire_time fields +CREATE TABLE `linkis_ps_cs_context_id` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user` varchar(32) DEFAULT NULL, + `application` varchar(32) DEFAULT NULL, + `source` varchar(255) DEFAULT NULL, + `expire_type` varchar(32) DEFAULT NULL, + `expire_time` datetime DEFAULT NULL, + `instance` varchar(128) DEFAULT NULL, + `backup_instance` varchar(255) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time', + `access_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'last access time', + PRIMARY KEY (`id`), + KEY `instance` (`instance`(128)), + KEY `backup_instance` (`backup_instance`(191)), + KEY `instance_2` (`instance`(128), `backup_instance`(128)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +```` + +## 5. Interface Design +### 5.1 Restful interface + +1 Query ID interface `searchContextIDByTime` + +①Interface name +GET `/api/rest_j/v1/contextservice/searchContextIDByTime` + +②Input parameters + +| Parameter name | Parameter description | Request type | Required | Data type | schema | +| -------- | -------- | ----- | -------- | -------- | ------ | +|accessTimeEnd|Access end time|query|false|string| +|accessTimeStart|Access start time|query|false|string| +|createTimeEnd|Create end time|query|false|string| +|createTimeStart|create time|query|false|string| +|pageNow|page number|query|false|string| +|pageSize|page size|query|false|string| +|updateTimeEnd|Update end time|query|false|string| +|updateTimeStart|Update time|query|false|string| + + +③Example of output parameters +```` +{ + "method": "/api/contextservice/searchContextIDByTime", + "status": 0, + "message": "OK", + "data": { + "contextIDs": [ + "8-8--cs_1_devcs_2_dev10493", + "8-8--cs_1_devcs_2_dev10494", + "8-8--cs_1_devcs_2_dev10495", + "8-8--cs_1_devcs_2_dev10496", + "8-8--cs_1_devcs_2_dev10497", + "8-8--cs_2_devcs_2_dev10498" + ] + } +} +```` + + +2. Clear the specified ID interface clearAllContextByID + +①Interface name `POST /api/rest_j/v1/contextservice/clearAllContextByID` +② Example of input parameters +```` +{ +"idList" : [ +"8-8--cs_1_devcs_1_dev2236" +] +} +```` + +③Example of output parameters +```` +{ + "method": "/api/contextservice/clearAllContextByID", + "status": 0, + "message": "OK", + "data": { + "num": "1" + } +} +```` + +3. Clean up the interface `clearAllContextByTime` according to the time + ①Interface name + POST /api/rest_j/v1/contextservice/clearAllContextByTime + ② Example of input parameters + { + "createTimeStart": "2022-06-01 00:00:00", + "createTimeEnd": "2022-06-30 00:00:00" + } + ③Example of output parameters +```` +{ + "method": "/api/contextservice/clearAllContextByTime", + "status": 0, + "message": "OK", + "data": { + "num": "1" + } +} +```` + +### 5.2 JAVA SDK API +```` +# import pom + + org.apache.linkis + linkis-cs-client + 1.1.3 + + +# Code reference is as follows + +String createTimeStart = "2022-05-26 22:04:00"; + String createTimeEnd = "2022-06-01 24:00:00"; + + ContextClient contextClient = ContextClientFactory.getOrCreateContextClient(); + +# Interface 1 searchHAIDByTime + List idList = + contextClient.searchHAIDByTime( + createTimeStart, createTimeEnd, null, null, null, null, 0, 0); + + for (String id : idList) { + System.out.println(id); + } + + System.out.println("Got " + idList.size() + "ids."); + + if (idList.size() > 0) { + String id1 = idList.get(0); + System.out.println("will clear context of id : " + id1); + } + +# Interface 2 batchClearContextByHAID + List tmpList = new ArrayList<>(); + tmpList.add(id1); + int num = contextClient.batchClearContextByHAID(tmpList); + System.out.println("Succeed to clear " + num + " ids."); + +# Interface 3 batchClearContextByTime + int num1 = + contextClient.batchClearContextByTime( + createTimeStart, createTimeEnd, null, null, null, null); + System.out.println("Succeed to clear " + num1 + " ids by time."); + +```` + + +## 6. Non-functional design +### 6.1 Security +The resultful interface requires login authentication and requires an administrator to operate. The administrator user is configured in the properties file + +### 6.2 Performance +- The query ID interface searchContextIDByTime has paging, no performance impact +- Clear the specified ID interface clearAllContextByID to limit the amount of operation data, no performance impact +- The interface clearAllContextByTime is cleared according to the time. If the query time range is too large, the query may time out, but the task will not fail. and the cleanup operation is a single operation and does not affect other queries + +### 6.3 Capacity +This requirement provides a time range query and batch cleaning interface, which requires the upper-layer application that uses ContextService to actively clean up data. + +### 6.4 High Availability +The interface reuses the high availability of the ContextService microservice itself. + + + + + + diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-cache.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-cache.md new file mode 100644 index 00000000000..2bca0c8d5e5 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-cache.md @@ -0,0 +1,101 @@ +--- +title: CS Cache Architecture +sidebar_position: 8 +--- + + +## **CSCache Architecture** +### **issues that need resolving** + +### 1.1. Memory structure needs to be solved: + +1. Support splitting by ContextType: speed up storage and query performance + +2. Support splitting according to different ContextID: Need to complete ContextID, see metadata isolation + +3. Support LRU: Recycle according to specific algorithm + +4. Support searching by keywords: Support indexing by keywords + +5. Support indexing: support indexing directly through ContextKey + +6. Support traversal: need to support traversal according to ContextID and ContextType + +### 1.2 Loading and parsing problems to be solved: + +1. Support parsing ContextValue into memory data structure: It is necessary to complete the parsing of ContextKey and value to find the corresponding keywords. + +2. Need to interface with the Persistence module to complete the loading and analysis of the ContextID content + +### 1.3 Metric and cleaning mechanism need to solve the problem: + +1. When JVM memory is not enough, it can be cleaned based on memory usage and frequency of use + +2. Support statistics on the memory usage of each ContextID + +3. Support statistics on the frequency of use of each ContextID + +## **ContextCache Architecture** + +The architecture of ContextCache is shown in the following figure: + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-01.png) + +1. ContextService: complete the provision of external interfaces, including additions, deletions, and changes; + +2. Cache: complete the storage of context information, map storage through ContextKey and ContextValue + +3. Index: The established keyword index, which stores the mapping between the keywords of the context information and the ContextKey; + +4. Parser: complete the keyword analysis of the context information; + +5. LoadModule completes the loading of information from the persistence layer when the ContextCache does not have the corresponding ContextID information; + +6. AutoClear: When the Jvm memory is insufficient, complete the on-demand cleaning of ContextCache; + +7. Listener: Metric information for the mobile phone ContextCache, such as memory usage and access times. + +## **ContextCache storage structure design** + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-02.png) + +The storage structure of ContextCache is divided into three layers: + +**ContextCache:** stores the mapping relationship between ContextID and ContextIDValue, and can complete the recovery of ContextID according to the LRU algorithm; + +**ContextIDValue:** CSKeyValueContext that has stored all context information and indexes of ContextID. And count the memory and usage records of ContestID. + +**CSKeyValueContext:** Contains the CSInvertedIndexSet index set that stores and supports keywords according to type, and also contains the storage set CSKeyValueMapSet that stores ContextKey and ContextValue. + +CSInvertedIndexSet: categorize and store keyword indexes through CSType + +CSKeyValueMapSet: categorize and store context information through CSType + +## **ContextCache UML Class Diagram Design** + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-03.png) + +## **ContextCache Timing Diagram** + +The following figure draws the overall process of using ContextID, KeyWord, and ContextType to check the corresponding ContextKeyValue in ContextCache. +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-04.png) + +Note: The ContextIDValueGenerator will go to the persistence layer to pull the Array[ContextKeyValue] of the ContextID, and parse the ContextKeyValue key storage index and content through ContextKeyValueParser. + +The other interface processes provided by ContextCacheService are similar, so I won't repeat them here. + +## **KeyWord parsing logic** + +The specific entity bean of ContextValue needs to use the annotation \@keywordMethod on the corresponding get method that can be used as the keyword. For example, the getTableName method of Table must be annotated with \@keywordMethod. + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-cache-05.png) + +When ContextKeyValueParser parses ContextKeyValue, it scans all the annotations modified by KeywordMethod of the specific object passed in and calls the get method to obtain the returned object toString, which will be parsed through user-selectable rules and stored in the keyword collection. Rules have separators, and regular expressions + +Precautions: + +1. The annotation will be defined to the core module of cs + +2. The modified Get method cannot take parameters + +3. The toSting method of the return object of the Get method must return the keyword \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-client.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-client.md new file mode 100644 index 00000000000..68fced67dae --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-client.md @@ -0,0 +1,66 @@ +--- +title: CS Client Design +sidebar_position: 2 +--- + +## **CSClient design ideas and implementation** + + +CSClient is a client that interacts with each microservice and CSServer group. CSClient needs to meet the following functions. + +1. The ability of microservices to apply for a context object from cs-server + +2. The ability of microservices to register context information with cs-server + +3. The ability of microservices to update context information to cs-server + +4. The ability of microservices to obtain context information from cs-server + +5. Certain special microservices can sniff operations that have modified context information in cs-server + +6. CSClient can give clear instructions when the csserver cluster fails + +7. CSClient needs to provide a copy of all the context information of csid1 as a new csid2 for scheduling execution + +> The overall approach is to send http requests through the linkis-httpclient that comes with linkis, and send requests and receive responses by implementing various Action and Result entity classes. + +### 1. The ability to apply for context objects + +To apply for a context object, for example, if a user creates a new workflow on the front end, dss-server needs to apply for a context object from dss-server. When applying for a context object, the identification information (project name, workflow name) of the workflow needs to be passed through CSClient Send it to the CSServer (the gateway should be sent to one randomly at this time, because no csid information is carried at this time), once the application context returns the correct result, it will return a csid and bind the workflow. + +### 2. Ability to register contextual information + +> The ability to register context, for example, the user uploads a resource file on the front-end page, uploads the file content to dss-server, dss-server stores the content in bml, and then needs to register the resourceid and version obtained from bml to cs-server In this case, you need to use the ability of csclient to register. The ability to register is to pass in csid and cskey +> Register with csvalue (resourceid and version). + +### 3. Ability to update registered context + +> The ability to update contextual information. For example, if a user uploads a resource file test.jar, csserver already has registered information. If the user updates the resource file when editing the workflow, then cs-server needs to update this content Update. At this time, you need to call the updated interface of csclient + +### 4. The ability to get context + +The context information registered to csserver needs to be read when variable replacement, resource file download, and downstream nodes call upstream nodes to generate information. For example, when the engine side executes code, it needs to download bml resources. When you need to interact with csclient and csserver, get the resourceid and version of the file in bml and then download it. + +### 5. Certain special microservices can sniff operations that have modified context information in cs-server + +This operation is based on the following example. For example, a widget node has a strong linkage with the upstream sql node. The user writes a sql in the sql node, and the metadata of the sql result set is a, b, and c. Field, the widget node behind is bound to this sql, you can edit these three fields on the page, and then the user changes the sql statement, the metadata becomes a, b, c, d four fields, this When the user needs to refresh manually. We hope that if the script is changed, the widget node can automatically update the metadata. This generally uses the listener mode. For simplicity, the heartbeat mechanism can also be used for polling. + +### 6. CSClient needs to provide a copy of all context information of csid1 as a new csid2 for scheduling execution + +Once the user publishes a project, he hopes to tag all the information of the project similar to git. The resource files and custom variables here will not change anymore, but there are some dynamic information, such as the result set generated. The content of csid will still be updated. So csclient needs to provide an interface for csid1 to copy all context information for microservices to call + +## **Implementation of ClientListener Module** + +For a client, sometimes you want to know that a certain csid and cskey have changed in the cs-server as soon as possible. For example, the csclient of visualis needs to be able to know that the previous sql node has changed, then it needs to be notified , The server has a listener module, and the client also needs a listener module. For example, a client wants to be able to monitor the changes of a certain cskey of a certain csid, then he needs to register the cskey to the callbackEngine in the corresponding csserver instance, Subsequent, for example, another client changes the content of the cskey. When the first client performs a heatbeat, the callbackengine needs to notify all the cskeys that the client has listened to. In this case, the first client knows it. The content of the cskey has changed. When heatbeat returns data, we should notify all listeners registered to ContextClientListenerBus to use the on method + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-client-01.png) + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-client-02.png) + +## **Implementation of GatewayRouter** + + +The Gateway plug-in implements Context forwarding. The forwarding logic of the Gateway plug-in is carried out through the GatewayRouter. It needs to be divided into two ways. The first is to apply for a context object. At this time, the information carried by the CSClient does not contain csid. For the information, the judgment logic at this time should be through the registration information of eureka, and the first request sent will randomly enter a microservice instance. +The second case is that the content of the ContextID is carried. We need to parse the csid. The way of parsing is to obtain the information of each instance through the method of string cutting, and then use eureka to determine whether this micro-channel still exists through the instance information. Service, if it exists, send it to this microservice instance + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-client-03.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-highavailable.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-highavailable.md new file mode 100644 index 00000000000..1caca467b4d --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-highavailable.md @@ -0,0 +1,91 @@ +--- +title: CS HA Design +sidebar_position: 3 +--- + +## **CS HA Architecture Design** + +### 1, CS HA architecture summary + +#### (1) CS HA architecture diagram + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-01.png) + +#### (2) Problems to be solved + +-HA of Context instance object + +-Client generates CSID request when creating workflow + +-List of aliases of CS Server + +-Unified CSID generation and analysis rules + +#### (3) Main design ideas + +① Load balancing + +When the client creates a new workflow, it randomly requests the HA module of a certain server to generate a new HAID with equal probability. The HAID information includes the main server information (hereinafter referred to as the main instance), and the candidate instance, where the candidate instance is The instance with the lowest load among the remaining servers, and a corresponding ContextID. The generated HAID is bound to the workflow and is persisted to the database, and then all change operation requests of the workflow will be sent to the main instance to achieve uniform load distribution. + +②High availability + +In subsequent operations, when the client or gateway determines that the main instance is unavailable, the operation request is forwarded to the standby instance for processing, thereby achieving high service availability. The HA module of the standby instance will first verify the validity of the request based on the HAID information. + +③Alias ​​mechanism + +The alias mechanism is adopted for the machine, the Instance information contained in the HAID adopts a custom alias, and the alias mapping queue is maintained in the background. It is that the client uses HAID when interacting with other components in the background, and uses ContextID when interacting with other components in the background. When implementing specific operations, a dynamic proxy mechanism is used to convert HAID to ContextID for processing. + +### 2, module design + +#### (1) Module diagram + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-02.png) + +#### (2) Specific modules + +①ContextHAManager module + +Provide interface for CS Server to call to generate CSID and HAID, and provide alias conversion interface based on dynamic proxy; + +Call the persistence module interface to persist CSID information; + +②AbstractContextHAManager module + +The abstraction of ContextHAManager can support the realization of multiple ContextHAManager; + +③InstanceAliasManager module + +RPC module provides Instance and alias conversion interface, maintains alias mapping queue, and provides alias and CS +Server instance query; provide an interface to verify whether the host is valid; + +④HAContextIDGenerator module + +Generate a new HAID and encapsulate it into the client's agreed format and return it to the client. The HAID structure is as follows: + +\${length of first instance}\${length of second instance}{instance alias 1} {instance alias 2} {actual ID}, the actual ID is set as ContextID +Key; + +⑤ContextHAChecker module + +Provide HAID verification interface. Each request received will verify whether the ID format is valid, and whether the current host is the primary instance or the secondary instance: if it is the primary instance, the verification is passed; if it is the secondary instance, verify whether the primary instance is invalid and the primary instance is invalid The verification is passed. + +⑥BackupInstanceGenerator module + +Generate a backup instance and attach it to the CSID information; + +⑦MultiTenantBackupInstanceGenerator interface + +(Reserved interface, not implemented yet) + +### 3. UML Class Diagram + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-03.png) + +### 4. HA module operation sequence diagram + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-ha-04.png) + +CSID generated for the first time: +The client sends a request, and the Gateway forwards it to any server. The HA module generates the HAID, including the main instance, the backup instance and the CSID, and completes the binding of the workflow and the HAID. + +When the client sends a change request, Gateway determines that the main Instance is invalid, and then forwards the request to the standby Instance for processing. After the instance on the standby Instance verifies that the HAID is valid, it loads the instance and processes the request. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-listener.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-listener.md new file mode 100644 index 00000000000..471732c1c84 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-listener.md @@ -0,0 +1,37 @@ +--- +title: CS Listener Architecture +sidebar_position: 4 +--- +## **Listener Architecture** + +In DSS, when a node changes its metadata information, the context information of the entire workflow changes. We expect all nodes to perceive the change and automatically update the metadata. We use the monitoring mode to achieve, and use the heartbeat mechanism to poll to maintain the metadata consistency of the context information. + +### **Client registration itself, CSKey registration and CSKey update process** + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-listener-01.png) + +The main process is as follows: + +1. Registration operation: The clients client1, client2, client3, and client4 register themselves and the CSKey they want to monitor with the csserver through HTPP requests. The Service service obtains the callback engine instance through the external interface, and registers the client and its corresponding CSKeys. + +2. Update operation: If the ClientX node updates the CSKey content, the Service service updates the CSKey cached by the ContextCache, and the ContextCache delivers the update operation to the ListenerBus. The ListenerBus notifies the specific listener to consume (that is, the ContextKeyCallbackEngine updates the CSKeys corresponding to the Client). The consumed event will be automatically removed. + +3. Heartbeat mechanism: + +All clients use heartbeat information to detect whether the value of CSKeys in ContextKeyCallbackEngine has changed. + +ContextKeyCallbackEngine returns the updated CSKeys value to all registered clients through the heartbeat mechanism. If there is a client's heartbeat timeout, remove the client. + +### **Listener UM class diagram** + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-listener-02.png) + +Interface: ListenerManager + +External: Provide ListenerBus for event delivery. + +Internally: provide a callback engine for specific event registration, access, update, and heartbeat processing logic + +## **Listener callbackengine timing diagram** + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-listener-03.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-persistence.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-persistence.md new file mode 100644 index 00000000000..233ce0fe450 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-persistence.md @@ -0,0 +1,13 @@ +--- +title: CS Persistence Architecture +sidebar_position: 5 +--- + +## **CSPersistence Architecture** + +### Persistence UML diagram + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-persistence-01.png) + + +The Persistence module mainly defines ContextService persistence related operations. The entities mainly include CSID, ContextKeyValue, CSResource, and CSTable. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-search.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-search.md new file mode 100644 index 00000000000..9d65ea6012b --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service-search.md @@ -0,0 +1,132 @@ +--- +title: CS Search Architecture +sidebar_position: 6 +--- + +## **CSSearch Architecture** +### **Overall architecture** + +As shown below: + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-01.png) + +1. ContextSearch: The query entry, accepts the query conditions defined in the Map form, and returns the corresponding results according to the conditions. + +2. Building module: Each condition type corresponds to a Parser, which is responsible for converting the condition in the form of Map into a Condition object, which is implemented by calling the logic of ConditionBuilder. Conditions with complex logical relationships will use ConditionOptimizer to optimize query plans based on cost-based algorithms. + +3. Execution module: Filter out the results that match the conditions from the Cache. According to different query targets, there are three execution modes: Ruler, Fetcher and Match. The specific logic is described later. + +4. Evaluation module: Responsible for calculation of conditional execution cost and statistics of historical execution status. + +### **Query Condition Definition (ContextSearchCondition)** + +A query condition specifies how to filter out the part that meets the condition from a ContextKeyValue collection. The query conditions can be used to form more complex query conditions through logical operations. + +1. Support ContextType, ContextScope, KeyWord matching + + 1. Corresponding to a Condition type + + 2. In Cache, these should have corresponding indexes + +2. Support contains/regex matching mode for key + + 1. ContainsContextSearchCondition: contains a string + + 2. RegexContextSearchCondition: match a regular expression + +3. Support logical operations of or, and and not + + 1. Unary operation UnaryContextSearchCondition: + +> Support logical operations of a single parameter, such as NotContextSearchCondition + +1. Binary operation BinaryContextSearchCondition: + +> Support the logical operation of two parameters, defined as LeftCondition and RightCondition, such as OrContextSearchCondition and AndContextSearchCondition + +1. Each logical operation corresponds to an implementation class of the above subclass + +2. The UML class diagram of this part is as follows: + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-02.png) + +### **Construction of query conditions** + +1. Support construction through ContextSearchConditionBuilder: When constructing, if multiple ContextType, ContextScope, KeyWord, contains/regex matches are declared at the same time, they will be automatically connected by And logical operation + +2. Support logical operations between Conditions and return new Conditions: And, Or and Not (considering the form of condition1.or(condition2), the top-level interface of Condition is required to define logical operation methods) + +3. Support to build from Map through ContextSearchParser corresponding to each underlying implementation class + +### **Execution of query conditions** + +1. Three function modes of query conditions: + + 1. Ruler: Filter out eligible ContextKeyValue sub-Arrays from an Array + + 2. Matcher: Determine whether a single ContextKeyValue meets the conditions + + 3. Fetcher: Filter out an Array of eligible ContextKeyValue from ContextCache + +2. Each bottom-level Condition has a corresponding Execution, responsible for maintaining the corresponding Ruler, Matcher, and Fetcher. + +### **Query entry ContextSearch** + +Provide a search interface, receive Map as a parameter, and filter out the corresponding data from the Cache. + +1. Use Parser to convert the condition in the form of Map into a Condition object + +2. Obtain cost information through Optimizer, and determine the order of query according to the cost information + +3. After executing the corresponding Ruler/Fetcher/Matcher logic through the corresponding Execution, the search result is obtained + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-03.png) + +### **Query Optimization** + +1. OptimizedContextSearchCondition maintains the Cost and Statistics information of the condition: + + 1. Cost information: CostCalculator is responsible for judging whether a certain Condition can calculate Cost, and if it can be calculated, it returns the corresponding Cost object + + 2. Statistics information: start/end/execution time, number of input lines, number of output lines + +2. Implement a CostContextSearchOptimizer, whose optimize method is based on the cost of the Condition to optimize the Condition and convert it into an OptimizedContextSearchCondition object. The specific logic is described as follows: + + 1. Disassemble a complex Condition into a tree structure based on the combination of logical operations. Each leaf node is a basic simple Condition; each non-leaf node is a logical operation. + +> Tree A as shown in the figure below is a complex condition composed of five simple conditions of ABCDE through various logical operations. + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-04.png) +
(Tree A)
+ +1. The execution of these Conditions is actually depth first, traversing the tree from left to right. Moreover, according to the exchange rules of logical operations, the left and right order of the child nodes of a node in the Condition tree can be exchanged, so all possible trees in all possible execution orders can be enumerated. + +> Tree B as shown in the figure below is another possible sequence of tree A above, which is exactly the same as the execution result of tree A, except that the execution order of each part has been adjusted. + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-search-05.png) +
(Tree B)
+ +1. For each tree, the cost is calculated from the leaf node and collected to the root node, which is the final cost of the tree, and finally the tree with the smallest cost is obtained as the optimal execution order. + +> The rules for calculating node cost are as follows: + +1. For leaf nodes, each node has two attributes: Cost and Weight. Cost is the cost calculated by CostCalculator. Weight is assigned according to the order of execution of the nodes. The current default is 1 on the left and 0.5 on the right. See how to adjust it later (the reason for assigning weight is that the conditions on the left have already been set in some cases. It can directly determine whether the entire combinatorial logic matches or not, so the condition on the right does not have to be executed in all cases, and the actual cost needs to be reduced by a certain percentage) + +2. For non-leaf nodes, Cost = the sum of Cost×Weight of all child nodes; the weight assignment logic is consistent with that of leaf nodes. + +> Taking tree A and tree B as examples, calculate the costs of these two trees respectively, as shown in the figure below, the number in the node is Cost\|Weight, assuming that the cost of the 5 simple conditions of ABCDE is 10, 100, 50 , 10, and 100. It can be concluded that the cost of tree B is less than that of tree A, which is a better solution. + + +
+ +
+ +1. Use CostCalculator to measure the cost of simple conditions: + + 1. The condition acting on the index: the cost is determined according to the distribution of the index value. For example, when the length of the Array obtained by condition A from the Cache is 100 and condition B is 200, then the cost of condition A is less than B. + + 2. Conditions that need to be traversed: + + 1. According to the matching mode of the condition itself, an initial Cost is given: For example, Regex is 100, Contains is 10, etc. (the specific values ​​etc. will be adjusted according to the situation when they are realized) + + 2. According to the efficiency of historical query, the real-time Cost is obtained after continuous adjustment on the basis of the initial Cost. Throughput per unit time \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service.md new file mode 100644 index 00000000000..af84dbe5b68 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/context-service.md @@ -0,0 +1,58 @@ +--- +title: CS Architecture +sidebar_position: 1 +--- + +## **ContextService Architecture** + +### **Horizontal Division** + +Horizontally divided into three modules: Restful, Scheduler, Service + +#### Restful Responsibilities: + + Encapsulate the request as httpjob and submit it to the Scheduler + +#### Scheduler Responsibilities: + + Find the corresponding service through the ServiceName of the httpjob protocol to execute the job + +#### Service Responsibilities: + + The module that actually executes the request logic, encapsulates the ResponseProtocol, and wakes up the wait thread in Restful + +### **Vertical Division** +Vertically divided into 4 modules: Listener, History, ContextId, Context: + +#### Listener responsibilities: + +1. Responsible for the registration and binding of the client side (write to the database and register in the CallbackEngine) + +2. Heartbeat interface, return Array[ListenerCallback] through CallbackEngine + +#### History Responsibilities: +Create and remove history, operate Persistence for DB persistence + +#### ContextId Responsibilities: +Mainly docking with Persistence for ContextId creation, update and removal, etc. + +#### Context responsibility: + +1. For removal, reset and other methods, first operate Persistence for DB persistence, and update ContextCache + +2. Encapsulate the query condition and go to the ContextSearch module to obtain the corresponding ContextKeyValue data + +The steps for requesting access are as follows: +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-01.png) + +## **UML Class Diagram** +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-02.png) + +## **Scheduler thread model** + +Need to ensure that Restful's thread pool is not filled + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-03.png) + +The sequence diagram is as follows: +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-service-04.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/overview.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/overview.md new file mode 100644 index 00000000000..d44f182f297 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/context-service/overview.md @@ -0,0 +1,128 @@ +--- +title: Overview +sidebar_position: 0 +--- + +## **Background** + +### **What is Context** + +All necessary information to keep a certain operation going on. For example: reading three books at the same time, the page number of each book has been turned is the context of continuing to read the book. + +### **Why do you need CS (Context Service)?** + +CS is used to solve the problem of data and information sharing across multiple systems in a data application development process. + +For example, system B needs to use a piece of data generated by system A. The usual practice is as follows: + +1. B system calls the data access interface developed by A system; + +2. System B reads the data written by system A into a shared storage. + +With CS, the A and B systems only need to interact with the CS, write the data and information that need to be shared into the CS, and read the data and information that need to be read from the CS, without the need for an external system to develop and adapt. , Which greatly reduces the call complexity and coupling of information sharing between systems, and makes the boundaries of each system clearer. + +## **Product Range** + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-01.png) + + +### Metadata context + +The metadata context defines the metadata specification. + +Metadata context relies on data middleware, and its main functions are as follows: + +1. Open up the relationship with the data middleware, and get all user metadata information (including Hive table metadata, online database table metadata, and other NOSQL metadata such as HBase, Kafka, etc.) + +2. When all nodes need to access metadata, including existing metadata and metadata in the application template, they must go through the metadata context. The metadata context records all metadata information used by the application template. + +3. The new metadata generated by each node must be registered with the metadata context. + +4. When the application template is extracted, the metadata context is abstracted for the application template (mainly, the multiple library tables used are made into \${db}. tables to avoid data permission problems) and all dependent metadata information is packaged. + +Metadata context is the basis of interactive workflows and the basis of application templates. Imagine: When Widget is defined, how to know the dimensions of each indicator defined by DataWrangler? How does Qualitis verify the graph report generated by Widget? + +### Data context + +The data context defines the data specification. + +The data context depends on data middleware and Linkis computing middleware. The main functions are as follows: + +1. Get through the data middleware and get all user data information. + +2. Get through the computing middleware and get the data storage information of all nodes. + +3. When all nodes need to write temporary results, they must pass through the data context and be uniformly allocated by the data context. + +4. When all nodes need to access data, they must pass the data context. + +5. The data context distinguishes between dependent data and generated data. When the application template is extracted, all dependent data is abstracted and packaged for the application template. + +### Resource context + +The resource context defines the resource specification. + +The resource context mainly interacts with Linkis computing middleware. The main functions are as follows: + +1. User resource files (such as Jar, Zip files, properties files, etc.) + +2. User UDF + +3. User algorithm package + +4. User script + +### Environmental context + +The environmental context defines the environmental specification. + +The main functions are as follows: + +1. Operating System + +2. Software, such as Hadoop, Spark, etc. + +3. Package dependencies, such as Mysql-JDBC. + +### Object context + +The runtime context is all the context information retained when the application template (workflow) is defined and executed. + +It is used to assist in defining the workflow/application template, prompting and perfecting all necessary information when the workflow/application template is executed. + +The runtime workflow is mainly used by Linkis. + + +## **CS Architecture Diagram** + +![](/Images/Architecture/Public_Enhancement_Service/ContextService/linkis-contextservice-02.png) + +## **Architecture Description:** + +### 1. Client +The entrance of external access to CS, Client module provides HA function; +[Enter Client Architecture Design](context-service-client.md) + +### 2. Service Module +Provide a Restful interface to encapsulate and process CS requests submitted by the client; +[Enter Service Architecture Design](context-service.md) + +### 3. ContextSearch +The context query module provides rich and powerful query capabilities for the client to find the key-value key-value pairs of the context; +[Enter ContextSearch architecture design](context-service-search.md) + +### 4. Listener +The CS listener module provides synchronous and asynchronous event consumption capabilities, and has the ability to notify the Client in real time once the Zookeeper-like Key-Value is updated; +[Enter Listener architecture design](context-service-listener.md) + +### 5. ContextCache +The context memory cache module provides the ability to quickly retrieve the context and the ability to monitor and clean up JVM memory usage; +[Enter ContextCache architecture design](context-service-cache.md) + +### 6. HighAvailable +Provide CS high availability capability; +[Enter HighAvailable architecture design](context-service-highavailable.md) + +### 7. Persistence +The persistence function of CS; +[Enter Persistence architecture design](context-service-persistence.md) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/datasource-manager.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/datasource-manager.md new file mode 100644 index 00000000000..0e61a115774 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/datasource-manager.md @@ -0,0 +1,140 @@ +--- +title: Data Source Management Service Architecture +sidebar_position: 5 +--- +## Background + +Exchangis0.x and Linkis0.x in earlier versions both have integrated data source modules. In order to manage the ability to reuse data sources, Linkis reconstructs the data source module based on linkis-datasource (refer to related documents), and converts the data source Management unpacks into data source management services and metadata management services。 + +This article mainly involves the DataSource Manager Server data source management service, which provides the following functions: + +1)、Linkis unified management service startup and deployment, does not increase operation and maintenance costs, reuse Linkis service capabilities; + +2)、Provide management services of graphical interface through Linkis Web. The interface provides management services such as new data source, data source query, data source update, connectivity test and so on; + +3)、 the service is stateless, multi-instance deployment, so that the service is highly available. When the system is deployed, multiple instances can be deployed. Each instance provides services independently to the outside world without interfering with each other. All information is stored in the database for sharing. + +4)、Provide full life cycle management of data sources, including new, query, update, test, and expiration management. + +5)、Multi-version data source management, historical data sources will be saved in the database, and data source expiration management is provided. + +6)、The Restful interface provides functions, a detailed list: data source type query, data source detailed information query, data source information query based on version, data source version query, get data source parameter list, multi-dimensional data source search, get data source environment query and Update, add data source, data source parameter configuration, data source expiration setting, data source connectivity test. + +## Architecture Diagram + +![datasource Architecture diagram](/Images/Architecture/datasource/linkis-datasource-server.png) + +## Architecture Description + +1、The service is registered in the Linkis-Eureak-Service service and managed in a unified manner with other Linkis microservices. The client can obtain the data source management service by connecting the Linkis-GateWay-Service service and the service name data-source-manager. + +2、The interface layer provides other applications through the Restful interface, providing additions, deletions, and changes to data sources and data source environments, data source link and dual link tests, data source version management and expiration operations; + +3、The Service layer is mainly for the service management of the database and the material library, and permanently retains the relevant information of the data source; + +4、The link test of the data source is done through the linkis metastore server service, which now provides the mysql\es\kafka\hive service + +### Core Process + +1、To create a new data source, firstly, the user of the new data source will be obtained from the request to determine whether the user is valid. The next step will be to verify the relevant field information of the data source. The data source name and data source type cannot be empty. The data source name is used to confirm whether the data source exists. If it does not exist, it will be inserted in the database, and the data source ID number will be returned. + +2、 To update the data source, firstly, the user of the new data source will be obtained from the request to determine whether the user is valid. The next step will be to verify the relevant field information of the new data source. The data source name and data source type cannot be empty. It will confirm whether the data source exists according to the data source ID number. If it does not exist, an exception will be returned. If it exists, it will be further judged whether the user has update permission for the data source. The user is the administrator or the owner of the data source. Only have permission to update. If you have permission, the data source will be updated and the data source ID will be returned. + +3、 To update the data source parameters, firstly, the user of the new data source will be obtained from the request to determine whether the user is valid, and the detailed data source information will be obtained according to the passed parameter data source ID, and then it will be determined whether the user is the owner of the changed data source or not. For the administrator, if there is any, the modified parameters will be further verified, and the parameters will be updated after passing, and the versionId will be returned. + +## Entity Object + +| Class Name | Describe | +| ---------------------------- | ------------------------------------------------------------ | +| DataSourceType | Indicates the type of data source | +| DataSourceParamKeyDefinition | Declare data source property configuration definitions | +| DataSource | Data source object entity class, including permission tags and attribute configuration definitions | +| DataSourceEnv | Data source environment object entity class, which also contains attribute configuration definitions | +| DataSourceParameter | Data source specific parameter configuration | +| DatasourceVersion | Data source version details | + +## **Database Design** + +##### Database Diagram: + +![](/Images-zh/Architecture/datasource/dn-db.png) + +##### Data Table Definition: + +Table:linkis_ps_dm_datatsource <-->Object:DataSource + +| Serial Number | Column | Describe | +| ------------- | -------------------- | -------------------------------------- | +| 1 | id | Data source ID | +| 2 | datasource_name | Data source name | +| 3 | datasource_desc | Data source detailed description | +| 4 | datasource_type_id | Data source type ID | +| 5 | create_identify | create identify | +| 6 | create_system | System for creating data sources | +| 7 | parameter | Data source parameters | +| 8 | create_time | Data source creation time | +| 9 | modify_time | Data source modification time | +| 10 | create_user | Data source create user | +| 11 | modify_user | Data source modify user | +| 12 | labels | Data source label | +| 13 | version_id | Data source version ID | +| 14 | expire | Whether the data source is out of date | +| 15 | published_version_id | Data source release version number | + +Table Name:linkis_ps_dm_datasource_type <-->Object:DataSourceType + +| Serial Number | Column | Describe | +| ------------- | ----------- | ------------------------------ | +| 1 | id | Data source type ID | +| 2 | name | Data source type name | +| 3 | description | Data source type description | +| 4 | option | Type of data source | +| 5 | classifier | Data source type classifier | +| 6 | icon | Data source image display path | +| 7 | layers | Data source type hierarchy | + +Table:linkis_ps_dm_datasource_env <-->Object:DataSourceEnv + +| Serial Number | Column | Describe | +| ------------- | ------------------ | ------------------------------------- | +| 1 | id | Data source environment ID | +| 2 | env_name | Data source environment name | +| 3 | env_desc | Data source environment description | +| 4 | datasource_type_id | Data source type ID | +| 5 | parameter | Data source environment parameters | +| 6 | create_time | Data source environment creation time | +| 7 | create_user | Data source environment create user | +| 8 | modify_time | Data source modification time | +| 9 | modify_user | Data source modify user | + +Table:linkis_ps_dm_datasource_type_key <-->Object:DataSourceParamKeyDefinition + +| Serial Number | Column | Describe | +| ------------- | ------------------- | -------------------------------------- | +| 1 | id | Key-value type ID | +| 2 | data_source_type_id | Data source type ID | +| 3 | key | Data source parameter key value | +| 4 | name | Data source parameter name | +| 5 | default_value | Data source parameter default value | +| 6 | value_type | Data source parameter type | +| 7 | scope | Data source parameter range | +| 8 | require | Is the data source parameter required? | +| 9 | description | Data source parameter description | +| 10 | value_regex | Regular data source parameters | +| 11 | ref_id | Data source parameter association ID | +| 12 | ref_value | Data source parameter associated value | +| 13 | data_source | Data source | +| 14 | update_time | update time | +| 15 | create_time | Create Time | + +Table:linkis_ps_dm_datasource_version <-->Object:DatasourceVersion + +| Serial Number | Column | Describe | +| ------------- | ------------- | ---------------------------------------- | +| 1 | version_id | Data source version ID | +| 2 | datasource_id | Data source ID | +| 3 | parameter | The version parameter of the data source | +| 4 | comment | comment | +| 5 | create_time | Create Time | +| 6 | create_user | Create User | + diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/metadata-manager.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/metadata-manager.md new file mode 100644 index 00000000000..a4b136af970 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/metadata-manager.md @@ -0,0 +1,39 @@ +--- +title: Data Source Management Service Architecture +sidebar_position: 6 +--- +## Background + +Exchangis0.x and Linkis0.x in earlier versions both have integrated data source modules. In order to manage the ability to reuse data sources, Linkis reconstructs the data source module based on linkis-datasource (refer to related documents), and converts the data source Management is unpacked into data source management services and metadata management services. + +This article mainly involves the MetaData Manager Server data source management service, which provides the following functions: + +1)、Linkis unified management service startup and deployment, does not increase operation and maintenance costs, and reuses Linkis service capabilities; + +2)、The service is stateless and deployed in multiple instances to achieve high service availability. When the system is deployed, multiple instances can be deployed. Each instance provides services independently to the outside world without interfering with each other. All information is stored in the database for sharing. + +3)、Provides full life cycle management of data sources, including new, query, update, test, and expiration management. + +4)、Multi-version data source management, historical data sources will be saved in the database, and data source expiration management is provided. + +5)、The Restful interface provides functions, a detailed list: database information query, database table information query, database table parameter information query, and data partition information query. + +## Architecture Diagram + +![Data Source Architecture Diagram](/Images-zh/Architecture/datasource/meta-server.png) + +## Architecture Description + +1、The service is registered in the Linkis-Eureak-Service service and managed in a unified manner with other Linkis microservices. The client can obtain the data source management service by connecting the Linkis-GateWay-Service service and the service name metamanager. + +2、The interface layer provides database\table\partition information query to other applications through the Restful interface; + +3、In the Service layer, the data source type is obtained in the data source management service through the data source ID number, and the specific supported services are obtained through the type. The first supported service is mysql\es\kafka\hive; + +### Core Process + +1、 The client enters the specified data source ID and obtains information through the restful interface. For example, to query the database list with the data source ID of 1, the url is `http:///metadatamanager/dbs/1`, + +2、 According to the data source ID, access the data source service `` through RPC to obtain the data source type; + +3、 According to the data source type, load the corresponding Service service [hive\es\kafka\mysql], perform the corresponding operation, and then return; \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/overview.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/overview.md new file mode 100644 index 00000000000..47215a64d72 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/overview.md @@ -0,0 +1,96 @@ +--- +title: Overview +sidebar_position: 1 +--- + +PublicEnhencementService (PS) architecture design +===================================== + +PublicEnhancementService (PS): Public enhancement service, a module that provides functions such as unified configuration management, context service, physical library, data source management, microservice management, and historical task query for other microservice modules. + +![](/Images/Architecture/PublicEnhencementArchitecture.png) + +Introduction to the second-level module: +============== + +BML material library +--------- + +It is the linkis material management system, which is mainly used to store various file data of users, including user scripts, resource files, third-party Jar packages, etc., and can also store class libraries that need to be used when the engine runs. + +| Core Class | Core Function | +|-----------------|------------------------------------| +| UploadService | Provide resource upload service | +| DownloadService | Provide resource download service | +| ResourceManager | Provides a unified management entry for uploading and downloading resources | +| VersionManager | Provides resource version marking and version management functions | +| ProjectManager | Provides project-level resource management and control capabilities | + +Unified configuration management +------------------------- + +Configuration provides a "user-engine-application" three-level configuration management solution, which provides users with the function of configuring custom engine parameters under various access applications. + +| Core Class | Core Function | +|----------------------|--------------------------------| +| CategoryService | Provides management services for application and engine catalogs | +| ConfigurationService | Provides a unified management service for user configuration | + +ContextService context service +------------------------ + +ContextService is used to solve the problem of data and information sharing across multiple systems in a data application development process. + +| Core Class | Core Function | +|---------------------|------------------------------------------| +| ContextCacheService | Provides a cache service for context information | +| ContextClient | Provides the ability for other microservices to interact with the CSServer group | +| ContextHAManager | Provide high-availability capabilities for ContextService | +| ListenerManager | The ability to provide a message bus | +| ContextSearch | Provides query entry | +| ContextService | Implements the overall execution logic of the context service | + +Datasource data source management +-------------------- + +Datasource provides the ability to connect to different data sources for other microservices. + +| Core Class | Core Function | +|-------------------|--------------------------| +| datasource-server | Provide the ability to connect to different data sources | + +InstanceLabel microservice management +----------------------- + +InstanceLabel provides registration and labeling functions for other microservices connected to linkis. + +| Core Class | Core Function | +|-----------------|--------------------------------| +| InsLabelService | Provides microservice registration and label management functions | + +Jobhistory historical task management +---------------------- + +Jobhistory provides users with linkis historical task query, progress, log display related functions, and provides a unified historical task view for administrators. + +| Core Class | Core Function | +|------------------------|----------------------| +| JobHistoryQueryService | Provide historical task query service | + +Variable user-defined variable management +-------------------------- + +Variable provides users with functions related to the storage and use of custom variables. + +| Core Class | Core Function | +|-----------------|-------------------------------------| +| VariableService | Provides functions related to the storage and use of custom variables | + +UDF user-defined function management +--------------------- + +UDF provides users with the function of custom functions, which can be introduced by users when writing code. + +| Core Class | Core Function | +|------------|------------------------| +| UDFService | Provide user-defined function service | \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/public-service.md b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/public-service.md new file mode 100644 index 00000000000..fc635e01fa5 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/feature/public-enhancement-services/public-service.md @@ -0,0 +1,23 @@ +--- +title: Public Service +sidebar_position: 2 +--- +## **Background** +Why do we need to add public enhanced capabilities after we use Linkis as a unified gateway or JobServer? This is after we actually developed multiple upper-level application tools, and found that if a UDF and variable debugging were defined in the IDE tool, after publishing to the scheduling tool, these UDFs and variables need to be redefined again. When some dependent jar packages, configuration files, etc. change, two places also need to be modified. +Aiming at these issues like the common context across upper-layer application tools, after we realized the unified entry of tasks as Linkis, we wondered whether Linkis could provide this public enhancement capability, and provide some common features that can be used by multiple application tools. The ability to reuse. Therefore, a layer of public enhanced service PES is designed at the Linkis layer. + + +## **Architecture diagram** + +![Diagram](/Images/Architecture/linkis-publicService-01.png) + +## **Architecture Introduction** + +The capabilities are now provided: + +- Provide unified data source capability: data sources are defined and managed uniformly at the Linkis layer, and application tools only need to use the data source name, and no longer need to maintain the connection information of the corresponding data source. And the meaning of the data source is the same between different tools. And it provides the query ability of the metadata of the corresponding data source. +- Provide public UDF capabilities: Unify the definition specifications and semantics of UDF and small functions, so that multiple tools can be used when defined in one place. +- The ability to provide a unified context: support the transfer of information between tasks, including the transfer of variables, result sets, and resource files between multiple tasks, and provide the ability to transfer context between tasks. +- The ability to provide unified materials: Provide unified materials, support shared access to these materials among multiple tools, and materials support storage of various file types, and support version control. +- Ability to provide unified configuration and variables: Provides unified configuration capabilities to support templated configuration of different engine parameter templates, custom variables, built-in commonly used system variables and time format variables, etc. +- Ability to provide public error codes: Provide unified error code capabilities, classify and code crops of commonly used computing storage engines and knowledge bases, and provide a convenient SDK for calling. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/overview.md b/versioned_docs/version-1.4.0/architecture/overview.md new file mode 100644 index 00000000000..8bc8eefde50 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/overview.md @@ -0,0 +1,22 @@ +--- +title: Overview +sidebar_position: 0 +--- + +Linkis 1.0 divides all microservices into three categories: public enhancement services, computing governance services, and microservice governance services. The following figure shows the architecture of Linkis 1.0. + +![Linkis1.0 Architecture Figure](/Images/Architecture/Linkis1.0-architecture.png) + +The specific responsibilities of each category are as follows: + +1. Public enhancement services are the material library services, context services, data source services and public services that Linkis 0.X has provided. +2. The microservice governance services are Spring Cloud Gateway, Eureka and Open Feign already provided by Linkis 0.X, and Linkis 1.0 will also provide support for Nacos +3. Computing governance services are the core focus of Linkis 1.0, from submission, preparation to execution, overall three stages to comprehensively upgrade Linkis' ability to perform control over user tasks. + +The following is a directory listing of Linkis1.0 architecture documents: + +1. For documents related to Linkis 1.0 public enhancement services, please read [Public Enhancement Services](feature/public-enhancement-services/overview.md). + +2. For documents related to Linkis1.0 microservice governance, please read [Microservice Governance](service-architecture/overview.md). + +3. For related documentation on computing governance services provided by Linkis1.0, please read [Computation Governance Services](feature/computation-governance-services/overview.md). \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/service-architecture/_category_.json b/versioned_docs/version-1.4.0/architecture/service-architecture/_category_.json new file mode 100644 index 00000000000..2f24e1bb970 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/service-architecture/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Service Architecture", + "position": 5.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/service-architecture/gateway.md b/versioned_docs/version-1.4.0/architecture/service-architecture/gateway.md new file mode 100644 index 00000000000..278162be277 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/service-architecture/gateway.md @@ -0,0 +1,39 @@ +--- +title: Gateway Design +sidebar_position: 2 +--- + +## Gateway Architecture Design + +#### Brief +The Gateway is the primary entry point for Linkis to accept client and external requests, such as receiving job execution requests, and then forwarding the execution requests to specific eligible Entrance services. +The bottom layer of the entire architecture is implemented based on "SpringCloudGateway". The upper layer is superimposed with module designs related to Http request parsing, session permissions, label routing and WebSocket multiplex forwarding. The overall architecture can be seen as follows. +### Architecture Diagram + +![Gateway diagram of overall architecture](/Images/Architecture/Gateway/gateway_server_global.png) + +#### Architecture Introduction +- gateway-core: Gateway's core interface definition module, mainly defines the "GatewayParser" and "GatewayRouter" interfaces, corresponding to request parsing and routing according to the request; at the same time, it also provides the permission verification tool class named "SecurityFilter". +- spring-cloud-gateway: This module integrates all dependencies related to "SpringCloudGateway", process and forward requests of the HTTP and WebSocket protocol types respectively. +- gateway-server-support: The driver module of Gateway, relies on the spring-cloud-gateway module to implement "GatewayParser" and "GatewayRouter" respectively, among which "DefaultLabelGatewayRouter" provides the function of label routing. +- gateway-httpclient-support: Provides a client-side generic class for Http to access Gateway services, which can be implemented based on more. +- instance-label: External instance label module, providing service interface named "InsLabelService" which used to create routing labels and associate with application instances. + +The detailed design involved is as follows: + +#### 1、Request Routing And Forwarding (With Label Information) +First, after the dispatcher of "SpringCloudGateway", the request enters the filter list of the gateway, and then enters the two main logic of "GatewayAuthorizationFilter" and "SpringCloudGatewayWebsocketFilter". +The filter integrates "DefaultGatewayParser" and "DefaultGatewayRouter" classes. From Parser to Router, execute the corresponding parse and route methods. +"DefaultGatewayParser" and "DefaultGatewayRouter" classes also contain custom Parser and Router, which are executed in the order of priority. +Finally, the service instance selected by the "DefaultGatewayRouter" is handed over to the upper layer for forwarding. +Now, we take the job execution request forwarding with label information as an example, and draw the following flowchart: +![Gateway Request Routing](/Images/Architecture/Gateway/gateway_server_dispatcher.png) + + +#### 2、WebSocket Connection Forwarding Management +By default, "Spring Cloud Gateway" only routes and forwards WebSocket request once, and cannot perform dynamic switching. +But under the Linkis's gateway architecture, each information interaction will be accompanied by a corresponding uri address to guide routing to different backend services. +In addition to the "WebSocketService" which is responsible for connecting with the front-end and the client, +and the "WebSocketClient" which is responsible for connecting with the backend service, a series of "GatewayWebSocketSessionConnection" lists are cached in the middle. +A "GatewayWebSocketSessionConnection" represents the connection between a session and multiple backend service instances. +![Gateway WebSocket Forwarding](/Images/Architecture/Gateway/gatway_websocket.png) diff --git a/versioned_docs/version-1.4.0/architecture/service-architecture/overview.md b/versioned_docs/version-1.4.0/architecture/service-architecture/overview.md new file mode 100644 index 00000000000..70511115a6a --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/service-architecture/overview.md @@ -0,0 +1,37 @@ +--- +title: Overview +sidebar_position: 0 +--- + +## **Background** + +Microservice governance includes three main microservices: Gateway, Eureka and Open Feign. +It is used to solve Linkis's service discovery and registration, unified gateway, request forwarding, inter-service communication, load balancing and other issues. +At the same time, Linkis 1.0 will also provide the supporting for Nacos; the entire Linkis is a complete microservice architecture and each business progress requires multiple microservices to complete. + +## **Architecture diagram** + +![](/Images/Architecture/linkis-microservice-gov-01.png) + +## **Architecture Introduction** + +1. Linkis Gateway +As the gateway entrance of Linkis, Linkis Gateway is mainly responsible for request forwarding, user access authentication and WebSocket communication. +The Gateway of Linkis 1.0 also added Label-based routing and forwarding capabilities. +A WebSocket routing and forwarder is implemented by Spring Cloud Gateway in Linkis, it is used to establish a WebSocket connection with the client. +After the connection is established, it will automatically analyze the client's WebSocket request and determine which backend microservice the request should be forward to through the rules, +then the request is forwarded to the corresponding backend microservice instance. +     [Linkis Gateway](gateway.md) + +2. Linkis Eureka +Mainly responsible for service registration and discovery. Eureka consists of multiple instances(service instances). These service instances can be divided into two types: Eureka Server and Eureka Client. +For ease of understanding, we divide Eureka Client into Service Provider and Service Consumer. Eureka Server provides service registration and discovery. +The Service Provider registers its own service with Eureka, so that service consumers can find it. +The Service Consumer obtains a listed of registered services from Eureka, so that they can consume services. + +3. Linkis has implemented a set of its own underlying RPC communication schema based on Feign. As the underlying communication solution, Linkis RPC integrates the SDK into the microservices in need. +A microservice can be both the request caller and the request receiver. +As the request caller, the Receiver of the target microservice will be requested through the Sender. +As the request receiver, the Receiver will be provided to process the request sent by the Sender in order to complete the synchronous response or asynchronous response. + +![](/Images/Architecture/linkis-microservice-gov-03.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/service-architecture/service_isolation.md b/versioned_docs/version-1.4.0/architecture/service-architecture/service_isolation.md new file mode 100644 index 00000000000..a31321bf6ac --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/service-architecture/service_isolation.md @@ -0,0 +1,197 @@ +--- +title: Service Isolation Design +sidebar_position: 9 +--- + +## 1. General +### 1.1 Requirements Background +     Linkis now performs load balancing based on the ribbon when it forwards services in the Gateway, but in some cases, there are some important business tasks that want to achieve service level isolation, if the service is based on the ribbon There will be problems in equilibrium. For example, tenant A wants his tasks to be routed to a specific Linkis-CG-Entrance service, so that when other instances are abnormal, the Entrance of service A will not be affected. +In addition, tenants and isolation of support services can also quickly isolate an abnormal service and support scenarios such as grayscale upgrades. + +### 1.2 Target +1. Support forwarding the service according to the routing label by parsing the label of the request +2. Tag Registration and Modification of Support Services + +## 2. Design +     This feature adds two modules, linkis-mg-gateway and instance-label, which are mainly modified points, designed to add the forwarding logic of Gateway, and instance-label to support services and labels register. + +### 2.1 Technical Architecture +     The overall technical architecture mainly modifies the point. The RestFul request needs to carry label parameter information such as routing label, and then the corresponding label will be parsed when the Gateway forwards to complete the route forwarding of the interface. The whole is shown in the figure below +![arc](/Images/Architecture/Gateway/service_isolation_arc.png) + +A few notes: +1. If there are multiple corresponding services marked with the same roteLabel, it will be forwarded randomly +2. If the corresponding routeLabel does not have a corresponding service, the interface fails directly +3. If the interface does not have a routeLabel, based on the original forwarding logic, it will not route to the service marked with a specific label + +### 2.2 Business Architecture +     This feature is mainly to complete the Restful tenant isolation and forwarding function. The modules designed by the function point are as follows: + +| Component name | First-level module | Second-level module | Function point | +|---|---|---|---| +| Linkis | MG | Gateway| Parse the route label in the restful request parameters, and complete the forwarding function of the interface according to the route label| +| Linkis | PS | InstanceLabel| InstanceLabel service, completes the association between services and labels| + +## 3. Module Design +### 3.1 Core execution flow +[Input] The input is the restful request requesting Gatway, and only the request with the roure label to be used in the parameter will be processed. +[Processing process] The Gateway will determine whether the request has a corresponding RouteLabel, and if it exists, it will be forwarded based on the RouteLabel. +The call sequence diagram is as follows: + +![Time](/Images/Architecture/Gateway/service_isolation_time.png) + + + +## 4. DDL: +```sql +DROP TABLE IF EXISTS `linkis_ps_instance_label`; +CREATE TABLE `linkis_ps_instance_label` ( + `id` int(20) NOT NULL AUTO_INCREMENT, + `label_key` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'string key', + `label_value` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'string value', + `label_feature` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'store the feature of label, but it may be redundant', + `label_value_size` int(20) NOT NULL COMMENT 'size of key -> value map', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + PRIMARY KEY (`id`), + UNIQUE KEY `label_key_value` (`label_key`,`label_value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +DROP TABLE IF EXISTS `linkis_ps_instance_info`; +CREATE TABLE `linkis_ps_instance_info` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `instance` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'structure like ${host|machine}:${port}', + `name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'equal application name in registry', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'create unix timestamp', + PRIMARY KEY (`id`), + UNIQUE KEY `instance` (`instance`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +DROP TABLE IF EXISTS `linkis_ps_instance_label_relation`; +CREATE TABLE `linkis_ps_instance_label_relation` ( + `id` int(20) NOT NULL AUTO_INCREMENT, + `label_id` int(20) DEFAULT NULL COMMENT 'id reference linkis_ps_instance_label -> id', + `service_instance` varchar(128) NOT NULL COLLATE utf8_bin COMMENT 'structure like ${host|machine}:${port}', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'update unix timestamp', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'create unix timestamp', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +```` +## 5. How to use: + +### 5.1 add route label for entrance + +```` +echo "spring.eureka.instance.metadata-map.route=et1" >> $LINKIS_CONF_DIR/linkis-cg-entrance.properties +sh $LINKIS_HOME/sbin/linkis-damemon.sh restart cg-entrance +```` + +![Time](/Images/Architecture/Gateway/service_isolation_time.png) + +### 5.2 Use route label +submit task: +```` +url:/api/v1/entrance/submit +{ + "executionContent": {"code": "echo 1", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "ip"}, + "labels": { + "engineType": "shell-1", + "userCreator": "peacewong-IDE", + "route": "et1" + } +} +```` +will be routed to a fixed service: +```` +{ + "method": "/api/entrance/submit", + "status": 0, + "message": "OK", + "data": { + "taskID": 45158, + "execID": "exec_id018030linkis-cg-entrancelocalhost:9205IDE_peacewong_shell_0" + } +} +```` + +or linkis-cli: + +```` +sh bin/linkis-cli -submitUser hadoop -engineType shell-1 -codeType shell -code "whoami" -labelMap route=et1 --gatewayUrl http://127.0.0.1:9101 +```` + +### 5.3 Use non-existing label +submit task: +```` +url:/api/v1/entrance/submit +{ + "executionContent": {"code": "echo 1", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "ip"}, + "labels": { + "engineType": "shell-1", + "userCreator": "peacewong-IDE", + "route": "et1" + } +} +```` + +will get the error +```` +{ + "method": "/api/rest_j/v1/entrance/submit", + "status": 1, + "message": "GatewayErrorException: errCode: 11011 ,desc: Cannot route to the corresponding service, URL: /api/rest_j/v1/entrance/submit RouteLabel: [{\"stringValue\":\"et2\",\" labelKey\":\"route\",\"feature\":null,\"modifiable\":true,\"featureKey\":\"feature\",\"empty\":false}] ,ip: localhost ,port: 9101 ,serviceKind: linkis-mg-gateway", + "data": { + "data": "{\r\n \"executionContent\": {\"code\": \"echo 1\", \"runType\": \"shell\"},\r\n \"params \": {\"variable\": {}, \"configuration\": {}},\r\n \"source\": {\"scriptPath\": \"ip\"},\r\ n \"labels\": {\r\n \"engineType\": \"shell-1\",\r\n \"userCreator\": \"peacewong-IDE\",\r\n \" route\": \"et2\"\r\n }\r\n}" + } +} +```` + +### 5.4 without label +submit task: +```` +url:/api/v1/entrance/submit +{ + "executionContent": {"code": "echo 1", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "ip"}, + "labels": { + "engineType": "shell-1", + "userCreator": "peacewong-IDE" + } +} +```` + +```` + +will route to untagged entranceservices +{ + "method": "/api/entrance/submit", + "status": 0, + "message": "OK", + "data": { + "taskID": 45159, + "execID": "exec_id018018linkis-cg-entrancelocalhost2:9205IDE_peacewong_shell_0" + } +} + +```` + +## 6. Non-functional design: + +### 6.1 Security +No security issues are involved, restful requires login authentication + +### 6.2 Performance +It has little impact on Gateway forwarding performance, and caches the corresponding label and instance data + +### 6.3 Capacity +not involving + +### 6.4 High Availability +not involving \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/architecture/task-flow.md b/versioned_docs/version-1.4.0/architecture/task-flow.md new file mode 100644 index 00000000000..115bb5c4f18 --- /dev/null +++ b/versioned_docs/version-1.4.0/architecture/task-flow.md @@ -0,0 +1,188 @@ +--- +title: Task Flow Description +sidebar_position: 0.1 +--- + + +> Linkis task execution is the core function of Linkis. It calls to Linkis's computing governance service, public enhancement service, and three-tier services of microservice governance. Now it supports the execution of tasks of OLAP, OLTP, Streaming and other engine types. This article will discuss OLAP The process of task submission, preparation, execution, and result return of the type engine is introduced. + +## Keywords: +LinkisMaster: The management service in the computing governance service layer of Linkis mainly includes several management and control services such as AppManager, ResourceManager, and LabelManager. Formerly known as LinkisManager service. + +Entrance: The entry service in the computing governance service layer, which completes the functions of task scheduling, status control, task information push, etc. + +Orchestrator: Linkis' orchestration service provides powerful orchestration and computing strategy capabilities to meet the needs of multiple application scenarios such as multi-active, active-standby, transaction, replay, current limiting, heterogeneous and mixed computing. At this stage, Orchestrator is relied on by the Entrance service. + +EngineConn (EC): Engine connector, responsible for accepting tasks and submitting them to underlying engines such as Spark, hive, Flink, Presto, trino, etc. for execution. + +EngineConnManager (ECM): Linkis' EC process management service, responsible for controlling the life cycle of EngineConn (start, stop). + +LinkisEnginePluginServer: This service is responsible for managing the startup materials and configuration of each engine, and also provides the startup command acquisition of each EngineConn, as well as the resources required by each EngineConn. + +PublicEnhencementService (PES): A public enhancement service, a module that provides functions such as unified configuration management, context service, material library, data source management, microservice management, and historical task query for other microservice modules. + +## 1. Linkis interactive task execution architecture +### 1.1, Task execution thinking +    Before the existing Linkis 1.0 task execution architecture, it has undergone many evolutions. From the very beginning, various FullGC caused the service to crash when there were many users, to how the scripts developed by users support multi-platform , multi-tenancy, strong control, high concurrent operation, we encountered the following problems: +1. How to support tens of thousands of concurrent tenants and isolate each other? +2. How to support context unification, user-defined UDFs, custom variables, etc. to support the use of multiple systems? +3. How to support high availability so that the tasks submitted by users can run normally? +4. How to support the underlying engine log, progress, and status of the task to be pushed to the front end in real time? +5. How to support multiple types of tasks to submit sql, python, shell, scala, java, etc. + +### 1.2, Linkis task execution design +    Based on the above five questions, Linkis divides the OLTP task into four stages, which are: +1. Submission stage: The APP is submitted to the CG-Entrance service of Linkis to the completion of the persistence of the task (PS-JobHistory) and various interceptor processing of the task (dangerous syntax, variable substitution, parameter checking) and other steps, and become a producer Consumer concurrency control; +2. Preparation stage: The task is scheduled by the Scheduler in Entrance to the Orchestrator module for task arrangement, and completes the EngineConn application to the LinkisMaster. During this process, the tenant's resources will be managed and controlled; +3. Execution stage: The task is submitted from Orchestrator to EngineConn for execution, and EngineConn specifically submits the underlying engine for execution, and pushes the task information to the caller in real time; +4. Result return stage: return results to the caller, support json and io streams to return result sets + The overall task execution architecture of Linkis is shown in the following figure: + ![arc](/Images/Architecture/Job_submission_preparation_and_execution_process/linkis_job_arc.png) + +## 2. Introduction to the task execution process +    First of all, let's give a brief introduction to the processing flow of OLAP tasks. An overall execution flow of the task is shown in the following figure: +![flow](/Images/Architecture/Job_submission_preparation_and_execution_process/linkis_job_flow.png) + +    The whole task involves all the services of all computing governance. After the task is forwarded to Linkis's population service Entrance through the Gateway, it will perform multi-level scheduling (producer-consumer mode) through the label of the task. The FIFO mode completes task scheduling and execution. Entrance then submits the task to Orchestrator for task scheduling and submission. Orchestrator will complete the EC application to LinkisMaster. During this process, resource management and engine version selection will be performed through the task Label. EC. Orchestrator then submits the orchestrated task to the EC for execution. The EC will push the job log, progress, resource usage and other information to the Entrance service and push it to the caller. Next, we will give a brief introduction to the execution process of the task based on the above figure and the four stages of the task (submit, prepare, execute, and return). + + +### 2.1 Job submission stage +    Job submission phase Linkis supports multiple types of tasks: SQL, Python, Shell, Scala, Java, etc., supports different submission interfaces, and supports Restful/JDBC/Python/Shell and other submission interfaces. Submitting tasks mainly includes task code, labels, parameters and other information. The following is an example of RestFul: +Initiate a Spark Sql task through the Restfu interface +````JSON +"method": "/api/rest_j/v1/entrance/submit", +"data": { + "executionContent": { + "code": "select * from table01", + "runType": "sql" + }, + "params": { + "variable": {// task variable + "testvar": "hello" + }, + "configuration": { + "runtime": {// task runtime params + "jdbc.url": "XX" + }, + "startup": { // ec start up params + "spark.executor.cores": "4" + } + } + }, + "source": { //task source information + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +```` +1. The task will first be submitted to Linkis's gateway linkis-mg-gateway service. Gateway will forward it to the corresponding Entrance service according to whether the task has a routeLabel. If there is no RouteLabel, it will be forwarded to an Entrance service randomly. +2. After Entrance receives the corresponding job, it will call the RPC of the JobHistory module in the PES to persist the job information, and parse the parameters and code to replace the custom variables, and submit them to the scheduler (default FIFO scheduling) ) The scheduler will group tasks by tags, and tasks with different tags do not affect scheduling. +3. After Entrance is consumed by the FIFO scheduler, it will be submitted to the Orchestrator for orchestration and execution, and the submission phase of the task is completed. + A brief description of the main classes involved: +```` +EntranceRestfulApi: Controller class of entry service, operations such as task submission, status, log, result, job information, task kill, etc. +EntranceServer: task submission entry, complete task persistence, task interception analysis (EntranceInterceptors), and submit to the scheduler +EntranceContext: Entrance's context holding class, including methods for obtaining scheduler, task parsing interceptor, logManager, persistence, listenBus, etc. +FIFOScheduler: FIFO scheduler for scheduling tasks +EntranceExecutor: The scheduled executor, after the task is scheduled, it will be submitted to the EntranceExecutor for execution +EntranceJob: The job task scheduled by the scheduler, and the JobRequest submitted by the user is parsed through the EntranceParser to generate a one-to-one correspondence with the JobRequest +```` +The task status is now queued + +### 2.2 Job preparation stage +    Entrance's scheduler will generate different consumers to consume tasks according to the Label in the Job. When the task is consumed and modified to Running, it will enter the preparation state, and the task will be prepared after the corresponding task. Phase begins. It mainly involves the following services: Entrance, LinkisMaster, EnginepluginServer, EngineConnManager, and EngineConn. The following services will be introduced separately. +#### 2.2.1 Entrance steps: +1. The consumer (FIFOUserConsumer) consumes the supported concurrent number configured by the corresponding tag, and schedules the task consumption to the Orchestrator for execution +2. First, Orchestrator arranges the submitted tasks. For ordinary hive and Spark single-engine tasks, it is mainly task parsing, label checking and verification. For multi-data source mixed computing scenarios, different tasks will be split and submitted to Different data sources for execution, etc. +3. In the preparation phase, another important thing for the Orchestrator is to request the LinkisMaster to obtain the EngineConn for executing the task. If LinkisMaster has a corresponding EngineConn that can be reused, it will return directly, if not, create an EngineConn. +4. Orchestrator gets the task and submits it to EngineConn for execution. The preparation phase ends and the job execution phase is entered. + A brief description of the main classes involved: + +```` +## Entrance +FIFOUserConsumer: The consumer of the scheduler, which will generate different consumers according to the tags, such as IDE-hadoop and spark-2.4.3. Consume submitted tasks. And control the number of tasks running at the same time, configure the number of concurrency through the corresponding tag: wds.linkis.rm.instance +DefaultEntranceExecutor: The entry point for task execution, which initiates a call to the orchestrator: callExecute +JobReq: The task object accepted by the scheduler, converted from EntranceJob, mainly including code, label information, parameters, etc. +OrchestratorSession: Similar to SparkSession, it is the entry point of the orchestrator. Normal singleton. +Orchestration: The return object of the JobReq orchestrated by the OrchestratorSession, which supports execution and printing of execution plans, etc. +OrchestrationFuture: Orchestration selects the return of asynchronous execution, including common methods such as cancel, waitForCompleted, and getResponse +Operation: An interface used to extend operation tasks. Now LogOperation for obtaining logs and ProgressOperation for obtaining progress have been implemented. + +## Orchestrator +CodeLogicalUnitExecTask: The execution entry of code type tasks. After the task is finally scheduled and run, the execute method of this class will be called. First, it will request EngineConn from LinkisMaster and then submit for execution. +DefaultCodeExecTaskExecutorManager: EngineConn responsible for managing code types, including requesting and releasing EngineConn +ComputationEngineConnManager: Responsible for LinkisMaster to connect, request and release ENgineConn +```` + +#### 2.2.2 LinkisMaster steps: + +1. LinkisMaster receives the request EngineConn request from the Entrance service for processing +2. Determine if there is an EngineConn that can be reused by the corresponding Label, and return directly if there is +3. If not, enter the process of creating EngineConn: +- First select the appropriate EngineConnManager service through Label. +- Then get the resource type and resource usage of this request EngineConn by calling EnginePluginServer, +- According to the resource type and resource, determine whether the corresponding Label still has resources, if so, enter the creation, otherwise throw a retry exception +- Request the EngineConnManager of the first step to start EngineConn +- Wait for the EngineConn to be idle, return the created EngineConn, otherwise judge whether the exception can be retried + +4. Lock the created EngineConn and return it to Entrance. Note that it will receive the corresponding request ID after sending the EC request for the asynchronous request Entrance. After the LinkisMaster request is completed, it will actively pass the corresponding Entrance service. + +A brief description of the main classes involved: +```` +## LinkisMaster +EngineAskEngineService: LinkisMaster is responsible for processing the engine request processing class. The main logic judges whether there is an EngineConn that can be reused by calling EngineReuseService, otherwise calling EngineCreateService to create an EngineConn +EngineCreateService: Responsible for creating EngineConn, the main steps are: + + +##LinkisEnginePluginServer +EngineConnLaunchService: Provides ECM to obtain the startup information of the corresponding engine type EngineConn +EngineConnResourceFactoryService: Provided to LinkisMaster to obtain the resources needed to start EngineConn corresponding to this task +EngineConnResourceService: Responsible for managing engine materials, including refreshing and refreshing all + +## EngineConnManager +AbstractEngineConnLaunchService: Responsible for starting the request to start the EngineConn by accepting the LinkisMaster request, and completing the start of the EngineConn engine +ECMHook: It is used to process the pre and post operations before and after EngineConn is started. For example, hive UDF Jar is added to the classPath started by EngineConn. +```` + + +It should be noted here that if the user has an available idle engine, the four steps 1, 2, 3, and 4 will be skipped; + +### 2.3 Job execution phase +    When the orchestrator in the Entrance service gets the EngineConn, it enters the execution phase. CodeLogicalUnitExecTask will submit the task to the EngineConn for execution, and the EngineConn will create different executors through the corresponding CodeLanguageLabel for execution. The main steps are as follows: +1. CodeLogicalUnitExecTask submits tasks to EngineConn via RPC +2. EngineConn determines whether there is a corresponding CodeLanguageLabel executor, if not, create it +3. Submit to Executor for execution, and execute by linking to the specific underlying engine execution, such as Spark submitting sql, pyspark, and scala tasks through sparkSession +4. The task status flow is pushed to the Entrance service in real time +5. By implementing log4jAppender, SendAppender pushes logs to Entrance service via RPC +6. Push task progress and resource information to Entrance in real time through timed tasks + +A brief description of the main classes involved: +```` +ComputationTaskExecutionReceiver: The service class used by the Entrance server orchestrator to receive all RPC requests from EngineConn, responsible for receiving progress, logs, status, and result sets pushed to the last caller through the ListenerBus mode +TaskExecutionServiceImpl: The service class for EngineConn to receive all RPC requests from Entrance, including task execution, status query, task Kill, etc. +ComputationExecutor: specific task execution parent class, such as Spark is divided into SQL/Python/Scala Executor +ComputationExecutorHook: Hook before and after Executor creation, such as initializing UDF, executing default UseDB, etc. +EngineConnSyncListener: ResultSetListener/TaskProgressListener/TaskStatusListener is used to monitor the progress, result set, and progress of the Executor during the execution of the task. +SendAppender: Responsible for pushing logs from EngineConn to Entrance +```` +### 2.4 Job result push stage +    This stage is relatively simple and is mainly used to return the result set generated by the task in EngineConn to the Client. The main steps are as follows: +1. First, when EngineConn executes the task, the result set will be written, and the corresponding path will be obtained by writing to the file system. Of course, memory cache is also supported, and files are written by default. +2. EngineConn returns the corresponding result set path and the number of result sets to Entrance +3. Entrance calls JobHistory to update the result set path information to the task table +4. Client obtains the result set path through task information and reads the result set + A brief description of the main classes involved: +```` +EngineExecutionContext: responsible for creating the result set and pushing the result set to the Entrance service +ResultSetWriter: Responsible for writing result sets to filesystems that support linkis-storage support, and now supports both local and HDFS. Supported result set types, table, text, HTML, image, etc. +JobHistory: Stores all the information of the task, including status, result path, indicator information, etc. corresponding to the entity class in the DB +ResultSetReader: The key class for reading the result set +```` + +## 3. Summary +    Above we mainly introduced the entire execution process of the OLAP task of the Linkis Computing Governance Service Group CGS. According to the processing process of the task request, the task is divided into four parts: submit, prepare, execute, and return the result stage. CGS is mainly designed and implemented according to these 4 stages, serves these 4 stages, and provides powerful and flexible capabilities for each stage. In the submission stage, it mainly provides a common interface, receives tasks submitted by upper-layer application tools, and provides basic parsing and interception capabilities; in the preparation stage, it mainly completes the parsing and scheduling of tasks through the orchestrator Orchestrator and LinkisMaster, and does Resource control, and the creation of EngineConn; in the execution stage, the connection with the underlying engine is actually completed through the engine connector EngineConn. Usually, each user needs to start a corresponding underlying engine connector EC to connect to a different underlying engine. . The computing task is submitted to the underlying engine for actual execution through EC, and information such as status, log, and result is obtained, and; in the result return stage, the result information of the task execution is returned, and various return modes are supported, such as: file Streams, JSON, JDBC, etc. The overall timing diagram is as follows: + +![time](/Images/Architecture/Job_submission_preparation_and_execution_process/linkis_job_time.png) diff --git a/versioned_docs/version-1.4.0/auth/_category_.json b/versioned_docs/version-1.4.0/auth/_category_.json new file mode 100644 index 00000000000..fc663db2a7a --- /dev/null +++ b/versioned_docs/version-1.4.0/auth/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Security Authentication", + "position": 6.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/auth/kerberos.md b/versioned_docs/version-1.4.0/auth/kerberos.md new file mode 100644 index 00000000000..5a1ecea8eb8 --- /dev/null +++ b/versioned_docs/version-1.4.0/auth/kerberos.md @@ -0,0 +1,97 @@ +--- +title: Kerberos +sidebar_position: 5 +--- + +## Kerberos authentication + +## Scenario 1 HDFS storage +If the hadoop cluster is used, such as the file used to store the result set +```shell script +# Result set logs and other file paths, used to store the result set files of the Job wds.linkis.filesystem.hdfs.root.path(linkis.properties) +HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis +``` +And kerberos authentication is enabled, corresponding kerberos configuration is required + +Modify the corresponding configuration of `linkis.properties` as follows +```properties +#Whether the kerberos authentication mode is enabled +wds.linkis.keytab.enable=true +#keytab places the directory, which stores the files of username.keytab of multiple users +wds.linkis.keytab.file=/appcom/keytab/ +#Whether to bring principle client authentication, the default value is false +wds.linkis.keytab.host.enabled=false +#principle authentication needs to bring the client IP +wds.linkis.keytab.host=127.0.0.1 +``` +Restart the service after modification + + +## Scenario 2 HDFS storage kerberos proxy authentication + +Hadoop2.0 version began to support the ProxyUser mechanism. The meaning is to use the user authentication information of User A to access the hadoop cluster in the name of User B. +For the server, it is considered that User B is accessing the cluster at this time, and the corresponding authentication of access requests (including the permissions of the HDFS file system and the permissions of YARN submitting task queues) is performed by User B. +User A is considered a superuser. + +The main difference from Scenario 1 is that it can solve the problem that each user needs to generate a keytab file. If kerberos proxy authentication is set, the proxy user's keytab file can be used for authentication. +Modify the corresponding configuration of `linkis.properties` as follows + +```properties +#Whether the kerberos authentication mode is enabled +wds.linkis.keytab.enable=true +#keytab places the directory, which stores the files of username.keytab of multiple users +wds.linkis.keytab.file=/appcom/keytab/ +#Whether to bring principle client authentication, the default value is false +wds.linkis.keytab.host.enabled=false +#principle authentication needs to bring the client IP +wds.linkis.keytab.host=127.0.0.1 + +#Enable kerberos proxy authentication +wds.linkis.keytab.proxyuser.enable=true + +#Use superuser to verify user authentication information +wds.linkis.keytab.proxyuser.superuser=hadoop + + + +``` +Restart the service after modification + +## Scenario 3 Queue manager checks yarn resource information +![yarn-normal](/Images-zh/auth/yarn-normal.png) +Will access the REST API interface provided by Yarn to provide ResourceManager +If the ResourceManager of yarn has enabled kerberos authentication, you need to configure kerberos-related authentication information + +Database table linkis_cg_rm_external_resource_provider +Insert yarn data information +```sql +INSERT INTO `linkis_cg_rm_external_resource_provider` +(`resource_type`, `name`, `labels`, `config`) VALUES +('Yarn', 'sit', NULL, +' + { + "rmWebAddress": "http://xx.xx.xx.xx:8088", + "hadoopVersion": "2.7.2", + "authorEnable": false, + "user":"hadoop","pwd":"123456", + "kerberosEnable":@YARN_KERBEROS_ENABLE, + "principalName": "@YARN_PRINCIPAL_NAME", + "keytabPath": "@YARN_KEYTAB_PATH" + "krb5Path": "@YARN_KRB5_PATH" + } +' +); + +``` +After the update, because the cache is used in the program, if you want to take effect immediately, you need to restart the `linkis-cg-linkismanager` service + +```shell script +sh sbin/linkis-daemon.sh restart cg-linkismanager +``` + + + +## Scenario 4 The hive data source in the data source function + +If the hive data source that needs to be connected and the corresponding hive cluster environment has kerberos authentication enabled, you need to upload the kerberos and keytab authentication file information when configuring the cluster environment. +![image](/Images-zh/auth/dsm-kerberos.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/auth/ldap.md b/versioned_docs/version-1.4.0/auth/ldap.md new file mode 100644 index 00000000000..844a8095e24 --- /dev/null +++ b/versioned_docs/version-1.4.0/auth/ldap.md @@ -0,0 +1,50 @@ +--- +title: LDAP +sidebar_position: 1 +--- +> LDAP (Lightweight Directory Access Protocol) configuration, after the default installation and deployment, only supports configured static user and password login (only one can be configured), if you need to support multi-user login, you can use LDAP + +## 1. Implementation logic introduction + +The default way to configure `linkis-mg-gateway.properties` + +```properties +#default username +wds.linkis.admin.user=hadoop +#default password +wds.linkis.admin.password=123456 +``` + +`org.apache.linkis.gateway.security.UserPwdAbstractUserRestful#tryLogin` during login request processing, +If the login user name/user password is inconsistent with the configured default value, LDAP mode will be used. +LDAP core processing `org.apache.linkis.gateway.security.LDAPUserRestful#login` is authenticated by calling jdk general ldap tool class. +`javax.naming.ldap.InitialLdapContext#InitialLdapContext(java.util.Hashtable, javax.naming.ldap.Control[])` + + +## 2. How to use + +> The premise is that there is an available LDAP service + +### 2.1 Step1 Enable ladp login password verification method + +Modify `linkis-mg-gateway.properties` configuration + +Fill in LDAP related parameters +```properties +##LDAP +#ldap service address +wds.linkis.ldap.proxy.url=ldap://localhost:1389/ +#Directory Name(DN) Directory composition of ldap +wds.linkis.ldap.proxy.baseDN==dc=linkis,dc=org +#Username formatting Generally, no configuration is required +wds.linkis.ldap.proxy.userNameFormat= +``` +### 2.2 Step2 Restart the service of linkis-mg-gateway + +After modifying the configuration, you need to restart the `linkis-mg-gateway` service `sh sbin/linkis-daemon.sh start mg-mgtaeway` to take effect + +## 3 Notes + +- The authentication type uses the simple mode in `java.naming.security.authentication` (security type, three values: none, simple or strong.) + +- For the introduction of ldap, please refer to [LDAP directory server introduction] (https://juejin.cn/post/6844903857311449102) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/auth/proxy.md b/versioned_docs/version-1.4.0/auth/proxy.md new file mode 100644 index 00000000000..65187a0e89f --- /dev/null +++ b/versioned_docs/version-1.4.0/auth/proxy.md @@ -0,0 +1,57 @@ +--- +title: proxy authentication +sidebar_position: 4 +--- + + +> This method allows the login user to be different from the actual user. The main function is to control that the user must be a real-name user when logging in, but a non-real-name user when actually using the big data platform. It is convenient to verify and control permissions. +> For example: when linkis executes the task submitted by the user, the linkis main process service will switch to the corresponding user through sudo -u ${submit user}, and then execute the corresponding engine start command, +> This requires creating a corresponding system user for each ${submit user} in advance, and configuring related environment variables. For new users, a series of environment initialization preparations are required, +> Frequent user changes will increase the cost of operation and maintenance, and there are too many users, it is impossible to configure resources for a single user, and resources cannot be well controlled. If A proxy can be implemented for the specified proxy user to execute, the execution entry can be uniformly converged to solve the problem of needing to initialize the environment. + +## 1. Implementation logic introduction + + +- Login users: users who directly log in to the system through username and password +- Proxy user: The user who actually performs operations as a login user is called a proxy user, and the proxy login user performs related operations + +For login cookie processing, parse out the login user and proxy user + +```html +The key of the proxy user's cookie is: linkis_user_session_proxy_ticket_id_v1 +Login user cookie: linkis_user_session_ticket_id_v1 + +``` +The relevant interface of linkis can identify the proxy user information based on the UserName information, and use the proxy user to perform various operations. And record the audit log, including the user's task execution operation, download operation +When the task is submitted for execution, the entrance entry service modifies the executed user as the proxy user + +## 2. How to use + +### 2.1 Step1 Turn on proxy mode +Specify the following parameters in `linkis.properties`: +```shell script +# Turn on proxy mode + wds.linkis.gateway.conf.enable.proxy.user=true + # Specify the proxy configuration file + wds.linkis.gateway.conf.proxy.user.config=proxy.properties +``` + + +In the conf directory, create a `proxy.properties` file with the following content: +```shell script +# The format is as follows: + ${LOGIN_USER}=${PROXY_USER} + # For example: + enjoyyin=hadoop +``` +If the existing proxy mode cannot meet your needs, you can also further modify: `org.apache.linkis.gateway.security.ProxyUserUtils`. + +### 2.2 Step2 Restart the service of linkis-mg-gateway + +After modifying the configuration, you need to restart the `linkis-mg-gateway` service `sh sbin/linkis-daemon.sh start mg-mgtaeway` to take effect + +## 3 Notes + +- Users are divided into proxy users and non-proxy users. Proxy users cannot be proxied to other users for execution +- It is necessary to control the list of login users and system users who can be proxied, prohibit any proxy, and avoid uncontrollable permissions. It is best to support the configuration of the database table, and it can be directly modified to take effect without restarting the service +- A separate record log file contains the operations of the proxy user, such as proxy execution, function update, etc. PublicService proxy user operations are all recorded in the log, which is convenient for auditing \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/auth/test.md b/versioned_docs/version-1.4.0/auth/test.md new file mode 100644 index 00000000000..1ac134498d5 --- /dev/null +++ b/versioned_docs/version-1.4.0/auth/test.md @@ -0,0 +1,76 @@ +--- +title: Password-Free +sidebar_position: 3 +--- +> In some scenarios, in order to facilitate development and debugging, and to access pages and interfaces conveniently, you can enable test mode configuration for secret-free authentication + +## 1. Implementation logic introduction + +Control through unified authentication processing filter: `org.apache.linkis.server.security.SecurityFilter` + +configuration item +```properties +# Whether to enable test mode +wds.linkis.test.mode=true +# Simulated user name for test mode +wds.linkis.test.user=hadoop +``` +Implemented pseudocode +```scala +val BDP_TEST_USER = CommonVars("wds.linkis.test.user", "") +val IS_TEST_MODE = CommonVars("wds. linkis. test. mode", false) + +if (IS_TEST_MODE. getValue) { + logger.info("test mode! login for uri: " + request.getRequestURI) + // Set the login user information to the user specified in the configuration + SecurityFilter.setLoginUser(response, BDP_TEST_USER) + true +} +``` + +## 2. How to use + +### 2.1 Step1 Open the test mode +Directly modify the configuration file `linkis.properties` (effective for all linkis services), modify the corresponding configuration as follows +```shell script +# Whether to enable test mode +wds.linkis.test.mode=true +# Simulated user name for test mode +wds.linkis.test.user=hadoop +``` + +If you only need to enable the test mode of a certain service, you can modify the corresponding service configuration item. +For example: only enable the test mode of `entrance` service +Directly modify the configuration file `linkis-cg-entrance.properties` (effective for the entry service of linkis), modify the corresponding configuration as follows +```shell script +# Whether to enable test mode +wds.linkis.test.mode=true +# Simulated user name for test mode +wds.linkis.test.user=hadoop +``` + +### 2.2 Step2 Restart the corresponding service + +After modifying the configuration, you need to restart the service to take effect + + +### 2.3 Step3 request verification + +After successfully restarting the service, you can directly request the http interface that originally required authentication, and you can request normally without additional authentication. +The management console can also access the content page without login authentication + + +## 3 Notes + +### 3.1 Value setting of wds.linkis.test.user +Because some interfaces will perform permission verification of user roles, such as: [Search historical EC information] interface: `/api/rest_j/v1/linkisManager/ecinfo/ecrHistoryList` +The roles are: + +|role name | permission description | configuration item | default value | +| -------- | -------- | ----- |----- | +|Administrator role|The highest authority, has all authority operations|`wds.linkis.governance.station.admin`|`hadoop`| +|Historical task role|Compared with ordinary users, you can also view all task list information of other users|`wds.linkis.jobhistory.admin`|`hadoop`| +|Normal role|Default role||| + +For tests in different scenarios, the set value of `wds.linkis.test.user` will be different and needs to be set according to the actual scenario. +If you need to access all interfaces, you need to configure it to the same value as `wds.linkis.governance.station.admin`, usually `hadoop` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/auth/token.md b/versioned_docs/version-1.4.0/auth/token.md new file mode 100644 index 00000000000..aaac0e3f0a0 --- /dev/null +++ b/versioned_docs/version-1.4.0/auth/token.md @@ -0,0 +1,113 @@ +--- +title: Token +sidebar_position: 2 +--- + +> Usually when the third-party system calls the linkis service, it usually authenticates through token + +## 1. Implementation logic introduction + +Control through unified authentication processing filter: `org.apache.linkis.server.security.SecurityFilter` + +Implemented pseudocode +```scala + +val TOKEN_KEY = "Token-Code" +val TOKEN_USER_KEY = "Token-User" + +/* TokenAuthentication.isTokenRequest by judging the request request: + 1. Whether the request header contains TOKEN_KEY and TOKEN_USER_KEY: getHeaders.containsKey(TOKEN_KEY) && getHeaders.containsKey(TOKEN_USER_KEY) + 2. Or request whether TOKEN_KEY and TOKEN_USER_KEY are included in the cookies: getCookies.containsKey(TOKEN_KEY) &&getCookies.containsKey(TOKEN_USER_KEY) +*/ + +if (TokenAuthentication.isTokenRequest(gatewayContext)) { + /* Perform token authentication + 1. Confirm whether to enable the token authentication configuration item `wds.linkis.gateway.conf.enable.token.auth` + 2. Extract the token tokenUser host information for authentication and verify the validity + */ + TokenAuthentication. tokenAuth(gatewayContext) + } else { + //Common username and password authentication +} +``` +Available tokens and corresponding ip-related information data are stored in the table `linkis_mg_gateway_auth_token`, +see [table analysis description] (../development/table/all#16-linkis_mg_gateway_auth_token) for details, non-real-time update, +Periodically `wds.linkis.token.cache.expire.hour` (default interval 12 hours) is refreshed into the service memory + + +## 2. How to use + +### 2.1 New Token + +Management console `Basic Data Management > Token Management` to add + +```text +Name: token name corresponds to Token-Code, such as: TEST-AUTH +User: The username corresponding to the token, that is, the perceived requesting user, will be used for log auditing. If there is no limit, it can be configured as * +Host: The host that can be accessed will perform the IP verification and filtering of the requester. If there is no limit, it can be configured as * +Valid days: If it is permanently valid, configure it as -1 +``` + +### 2.2 Native way +The constructed http request method needs to add `Token-Code`, `Token-User` parameters in the request header, + +#### Example + +Request address: +`http://127.0.0.1:9001/api/rest_j/v1/entrance/submit` + +body parameter: +```json +{ + "executionContent": {"code": "sleep 5s;echo pwd", "runType": "shell"}, + "params": {"variable": {}, "configuration": {}}, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.hql"}, + "labels": { + "engineType": "shell-1", + "userCreator": "hadoop-IDE", + "executeOnce": "false" + } +} +``` + +Request header header: +```text +Content-Type: application/json +Token-Code: BML-AUTH +Token-User: hadoop +``` + +### 2.3 The client uses token authentication + +The client authentication methods provided by linkis all support the Token strategy mode `new TokenAuthenticationStrategy()` + +For details, please refer to [SDK method](../user-guide/sdk-manual) + +#### Example +```java +// 1. build config: linkis gateway url + DWSClientConfig clientConfig = ((DWSClientConfigBuilder) (DWSClientConfigBuilder.newBuilder() + .addServerUrl("http://127.0.0.1:9001/") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connectionTimeOut + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new TokenAuthenticationStrategy()) // AuthenticationStrategy Linkis auth Token + .setAuthTokenKey("Token-Code") // set token key + .setAuthTokenValue("DSM-AUTH") // set token value + .setDWSVersion("v1") //linkis rest version v1 + .build(); +``` + +## 3 Notes + +### 3.1 token configuration +Supported tokens, the corresponding available users/applicable requester ip are controlled by the table `linkis_mg_gateway_auth_token`, +the loading is not updated in real time, and the caching mechanism is used + +### 3.2 Administrator permission token +For the restriction of high-risk operations, the token of the administrator role is required to operate, +and the format of the administrator token is `admin-xxx` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/deployment/_category_.json b/versioned_docs/version-1.4.0/deployment/_category_.json new file mode 100644 index 00000000000..4e2eb893599 --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deployment", + "position": 3.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/deployment/deploy-cluster.md b/versioned_docs/version-1.4.0/deployment/deploy-cluster.md new file mode 100644 index 00000000000..1e6ab05948b --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/deploy-cluster.md @@ -0,0 +1,173 @@ +--- +title: Cluster Deployment +sidebar_position: 1.1 +--- + +The stand-alone deployment method of Linkis is simple. Too many processes on the same server will put too much pressure on the server. In order to ensure high service availability in the production environment, it is recommended to use split deployment. +The choice of deployment plan is related to the company's user scale, user usage habits, and the number of simultaneous users of the cluster. Generally speaking, we will use the number of simultaneous users who use Linkis and the user's preference for the execution engine to make the choice of deployment method. . + +## 1. Computational model reference for multi-node deployment + +Each microservice of Linkis supports a multi-active deployment solution. Of course, different microservices play different roles in the system. Some microservices are called frequently and resources will be under high load. +**On the machine where EngineConnManager is installed, since the user's engine process will be started, the memory load of the machine will be relatively high, and the load of other types of microservices on the machine will be relatively low. +** For this type of microservice, we recommend starting multiple distributed deployments. The total resources dynamically used by Linkis can be calculated as follows. + +**EngineConnManager** uses total resources
+= total memory + total cores
+= **Number of people online at the same time \* (memory occupied by all types of engines) \*Maximum concurrent number of single user + number of people online at the same time \* +(The number of cores occupied by all types of engines) \*The maximum number of concurrency for a single user** + +E.g: +```html + +When only spark, hive, and python engines are used and the maximum number of concurrency for a single user is 1, the number of concurrent users is 50. +The driver memory of spark is 1G, the memory of hive client is 1G, and the python client is 1G. Each engine uses 1 core + +Total resources used by EngineConnManager (ECM) += 50 * (1+1+1) G *1 + 50 * (1+1+1) core *1 += 150G memory + 150 CPU cores +``` + +During distributed deployment, the memory occupied by the microservice itself can be calculated according to each 2G. For a large number of users, it is recommended to increase the memory of ps-publicservice to 6G, and it is recommended to reserve 10G of memory as a buffer. + +The following configuration assumes **Each user starts two engines at the same time as an example**, **For a machine with 64G memory**, the reference configuration is as follows: + +### 1.1 The number of people online at the same time is 10-50 +**EngineConnManager** Total resources used = total memory + total cores = +** Simultaneous online users \* (All types of engines occupy memory) \* Maximum concurrent number of single user + simultaneous online users \* +(The number of cores occupied by all types of engines) \*The maximum number of concurrency for a single user** + +Total memory: simultaneous online users 50 * single engine 1G memory * each user starts two engines at the same time 2 = 100G memory + +> **Server Configuration Recommended** 4 servers, named as S1, S2, S3, S4 + +| Service | Host name | Remark | +|----------------------|-----------|------------------| +| cg-engineconnmanager | S1、S2(共128G)| Deploy each machine individually | +| Other services | S3、S4 | Eureka High Availability Deployment | + +### 1.2 The number of people online at the same time is 50-100 + +Total memory: number of people online at the same time 100 * single engine 1G memory * each user starts two engines at the same time 2 = 200G memory + +> **Server configuration recommendation**: 6 servers named S1, S2, S3, S4, S5, S6 + +| Service | Host name | Remark | +|--------------------|-----------|------------- ----| +| cg-engineconnmanager | S1-S4 (total 256G) | Deploy each machine separately | +| Other services | S5, S6 | Eureka high availability deployment | + +### 1.3 Simultaneous users 100-300 + + +Total memory: 300 people online at the same time * 1G memory for a single engine * Each user starts two engines at the same time 2 = 600G memory + +**Server configuration recommendation**: 12 servers, named S1, S2..S12 respectively + +| Service | Host name | Remark | +|--------------------|-----------|------------- ----| +| cg-engineconnmanager | S1-S10 (total 640G) | Each machine is deployed separately | +| Other services | S11, S12 | Eureka high availability deployment | + +### 1.4 Simultaneous users 300-500 + +> **Server configuration recommendation**: 20 servers, named S1, S2..S20 respectively + +| Service | Host name | Remark | +|--------------------|-----------|------------- -------------------------------------------------- ---------------------------------| +| cg-engineconnmanager | S1-S18 | Each machine is deployed separately | +| Other services | S19, S20 | Eureka high-availability deployment, some microservices can consider expansion if the request volume is tens of thousands, and the current active-active deployment can support thousands of users in the line | + +### 1.5 The number of simultaneous users is more than 500 +> Estimated based on 800 people online at the same time +> **Server configuration recommendation**: 34 servers, named S1, S2..S34 + +| Service | Host name | Remark | +|--------------------|-----------|------------- -------------------------------------------------- ---------------------------------| +| cg-engineconnmanager | S1-S32 | Each machine is deployed separately | +| Other services | S33, S34 | Eureka high-availability deployment, some microservices can consider expansion if the request volume is tens of thousands, and the current active-active deployment can support thousands of users in the line | + +## 2. Process of distributed deployment + +>All services of Linkis support distributed and multi-cluster deployment. It is recommended to complete stand-alone deployment on one machine before distributed deployment, and ensure the normal use of Linkis functions. + +At present, the one-click installation script does not have good support for distributed deployment, and manual adjustment and deployment are required. For the specific distributed deployment, you can refer to the following steps, assuming that the user has completed the single-machine deployment on machine A. + + +### 2.1 Environment preparation for distributed deployment +Like server A, server B needs basic environment preparation, please refer to [Linkis environment preparation](deploy-quick#3-linkis%E7%8E%AF%E5%A2%83%E5%87%86%E5% A4%87) + +**Network Check** + +Check whether the service machines that need distributed deployment are connected to each other, and you can use the ping command to check +``` +ping IP +``` + +**Permission check** + +Check whether there is a hadoop user on each machine and whether the hadoop user has sudo authority. + +**Required Environmental Checks** + +Each linkis service depends on some basic environments before starting or when tasks are executed. Please check the basic environment of each machine according to the table below. For specific inspection methods, refer to [Linkis environment preparation] (deploy-quick#3-linkis%E7%8E%AF%E5 %A2%83%E5%87%86%E5%A4%87) + +|Service Name|Dependency Environment| +|-|-| +|mg-eureka|Java| +|mg-gateway|Java| +|ps-publicservice|Java、Hadoop| +|cg-linkismanager|Java| +|cg-entrance|Java| +|cg-engineconnmanager|Java, Hive, Spark, Python, Shell| + + +Note: If you need to use other non-default engines, you also need to check whether the environment of the corresponding engine on the machine where the cg-engineconnmanager service is located is OK. The engine environment can refer to each [engine in use](https://linkis.apache.org/zh- CN/docs/latest/engine-usage/overview) to check the pre-work. + +### 2.2 Eureka multi-active configuration adjustment + +Modify the Eureka configuration file on machine A, add the Eureka configuration addresses of all machines, and let the Eureka services register with each other. +On server A, make the following configuration changes, taking two Eureka clusters as an example. + +``` +Modify $LINKIS_HOME/conf/application-eureka.yml and $LINKIS_HOME/conf/application-linkis.yml configuration + +eureka: + client: + serviceUrl: + defaultZone: http:/eurekaIp1:port1/eureka/,http:/eurekaIp2:port2/eureka/ + + +Modify $LINKIS_HOME/conf/linkis.properties configuration + +wds.linkis.eureka.defaultZone=http:/eurekaIp1:port1/eureka/,http:/eurekaIp2:port2/eureka/ +``` + +### 2.3 Synchronization of installation materials +Create the same directory `$LINKIS_HOME` on all other machines as on machine A. On server A, package the successfully installed directory `$LINKIS_HOME` of linkis, then copy and decompress it to the same directory on other machines. +At this point, if the `sbin/linkis-start-all.sh` script is executed to start all services on server A and other machines, then all services have n instances, where n is the number of machines. You can visit the eureka service display page `http:/eurekaIp1:port1, or http:/eurekaIp2:port2` to view. + +### 2.4 Adjust startup script +According to the actual situation, determine the Linkis service that needs to be deployed on each machine, +For example, the microservice `linkis-cg-engineconnmanager` will not be deployed on server A, +Then modify the one-click start-stop script of server A, `sbin/linkis-start-all.sh`, `sbin/linkis-stop-all.sh`, and comment out the start-stop commands related to the `cg-engineconnmanager` service +```html +sbin/linkis-start-all.sh +#linkis-cg-linkismanage +#SERVER_NAME="cg-linkismanager" +#SERVER_IP=$MANAGER_INSTALL_IP +#startApp + +sbin/linkis-stop-all.sh +#linkis-cg-engineconnmanager(ecm) +#SERVER_NAME="cg-engineconnmanager" +#SERVER_IP=$ENGINECONNMANAGER_INSTALL_IP +#stopApp + +``` + +## 3. Notes +- When deploying separately, it is recommended to keep the installation directory of linkis consistent to facilitate unified management and control, and it is best to keep the relevant configuration files consistent +- If some servers and ports are occupied by other applications and cannot be used, you need to adjust the service port +- The multi-active deployment of mg-gateway currently does not support distributed login sessions, so a user’s request needs to be sent to the same gateway instance, which can be supported by nginx’s ip hash load balancing method +- The one-key start-stop script should be adjusted according to the actual situation. For microservices that are no longer deployed on the notebook server, the corresponding start-stop commands need to be commented out in the one-key start script. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/deployment/deploy-console.md b/versioned_docs/version-1.4.0/deployment/deploy-console.md new file mode 100644 index 00000000000..32d27162cf5 --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/deploy-console.md @@ -0,0 +1,126 @@ +--- +title: Console Deployment +sidebar_position: 1.2 +--- +``` +The linkis web service uses nginx as a static resource server. The access request process is as follows : +Linkis Management Console request -> Nginx ip:port-> Linkis-gateway ip:port-> Other services +``` +Linkis 1.0 provides a Linkis Console, which provides functions such as displaying Linkis' global history, modifying user parameters, managing ECM and microservices, etc. Before deploying the front-end management console, you need to deploy the Linkis back-end. Linkis deployment manual See: [Linkis Deployment Manual](deploy-quick.md) + +## 1. Preparation + +1. Download the web installation package from the release page of Linkis ([click here to enter the download page](https://linkis.apache.org/download/main/)), apache-linkis-xxx-incubating-web-bin. tar.gz +Manually decompress: tar -xvf apache-linkis-x.x.x-incubating-web-bin.tar.gz + +The decompression directory is as follows. +``` +├── config.sh +├── dist +├── install.sh +├── LICENSE +├── licenses +└── NOTICE +``` + +## 2. Deployment +    There are two deployment methods, automated deployment and manual deployment + +### 2.1 Automated deployment +#### 2.1.1 modify config.sh file (use vim or nano) + +```$xslt +#Configuring front-end ports +linkis_port="8088" + +#URL of the backend linkis gateway +linkis_url="http://localhost:9001" + +#linkis ip address, replace `127.0.0.1` to real ip address if neccssary +linkis_ipaddr=127.0.0.1 +``` + +#### 2.1.2 execute deployment script + + ```shell + #sudo permission is required to install nginx + sudo sh install.sh + ``` + +After execution, you can directly access it in Google browser: ```http://linkis_ipaddr:linkis_port``` where linkis_port is the port configured in config.sh, and linkis_ipaddr is the IP of the installation machine + +If the access fails: You can check the installation log which step went wrong + +### 2.2 Manual deployment +1. Install Nginx: ```sudo yum install nginx -y``` + +2. Modify the configuration file: sudo vi /etc/nginx/conf.d/linkis.conf +Add the following content: +``` +server { + listen 8080;# access port + server_name localhost; + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + location / { + root /appcom/Install/linkis/dist; # The directory where the front-end package is decompressed + index index.html index.html; + } + + location /api { + proxy_pass http://192.168.xxx.xxx:9001; # ip port of linkis-gateway service + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header x_real_ipP $remote_addr; + proxy_set_header remote_addr $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_connect_timeout 4s; + proxy_read_timeout 600s; + proxy_send_timeout 12s; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + #error_page 404 /404.html; + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } + +``` + +3. Copy the front-end package to the corresponding directory: ```/appcom/Install/linkis/dist; # The directory where the front-end package is decompressed ``` + +4. Start the service ```sudo systemctl restart nginx``` + +5. After execution, you can directly access it in Google browser: ```http://nginx_ip:nginx_port``` + +## 3. Common problems + +(1) Upload file size limit + +``` +sudo vi /etc/nginx/nginx.conf +``` + +Change upload size + +``` +client_max_body_size 200m +``` + + (2) Interface timeout + +``` +sudo vi /etc/nginx/conf.d/linkis.conf +``` + + +Change interface timeout + +``` +proxy_read_timeout 600s +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/deployment/deploy-quick.md b/versioned_docs/version-1.4.0/deployment/deploy-quick.md new file mode 100644 index 00000000000..71ebace6f7c --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/deploy-quick.md @@ -0,0 +1,786 @@ +--- +title: Stand-alone deployment +sidebar_position: 1 +--- + +## 1. First-time installation preparations + +### 1.1 Linux server + +**Hardware Requirements** +Install nearly 6 linkis microservices, at least 3G memory. The default jvm -Xmx memory size of each microservice is 512M (if the memory is not enough, you can try to reduce it to 256/128M, and you can also increase it if the memory is enough). + + +### 1.2 Add deployment user + +>Deployment user: The starting user of the linkis core process, and this user will be the administrator by default. The corresponding administrator login password will be generated during the deployment process, located in `conf/linkis-mg-gateway .properties`file +Linkis supports specifying users for submission and execution. The linkis main process service will switch to the corresponding user through `sudo -u ${linkis-user}`, and then execute the corresponding engine start command, so the user of the engine `linkis-engine` process is the executor of the task (so the deployment The user needs to have sudo authority, and it is password-free). + +Take hadoop users as an example (Many configuration users in linkis use hadoop users by default. It is recommended that first-time installers use hadoop users, otherwise many unexpected errors may be encountered during the installation process): + +First check whether there is already a hadoop user in the system, if it already exists, just authorize it directly, if not, create a user first, and then authorize. + +Check if hadoop user already exists +```shell script +$ id hadoop +uid=2001(hadoop) gid=2001(hadoop) groups=2001(hadoop) +``` + +If it does not exist, you need to create a hadoop user and join the hadoop user group +```shell script +$ sudo useradd hadoop -g hadoop +$ vi /etc/sudoers +#Secret-free configuration +hadoop ALL=(ALL) NOPASSWD: NOPASSWD: ALL +``` + +The following operations are performed under the hadoop user + + + +## 2. Configuration modification + +### 2.1 Installation package preparation + +- Method 1: From the official website [download address] (https://linkis.apache.org/zh-CN/download/main): https://linkis.apache.org/zh-CN/download/main +, download the corresponding installation package (project installation package and management console installation package). +- Method 2: Compile the project installation package and console installation package according to [Linkis Compilation and Packaging](../development/build) and [Front-end Console Compilation](../development/build-console). + +After uploading the installation package `apache-linkis-xxx-bin.tar.gz`, decompress the installation package + +```shell script +$ tar -xvf apache-linkis-xxx-bin.tar.gz +``` + +The directory structure after decompression is as follows +```shell script +-rw-r--r-- 1 hadoop hadoop 518192043 Jun 20 09:50 apache-linkis-xxx-bin.tar.gz +drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 bin //execute environment check and install script +drwxrwxr-x 2 hadoop hadoop 4096 Jun 20 09:56 deploy-config // Deployment dependent DB and other environment configuration information +drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 docker +drwxrwxr-x 4 hadoop hadoop 4096 Jun 20 09:56 helm +-rwxrwxr-x 1 hadoop hadoop 84732 Jan 22 2020 LICENSE +drwxr-xr-x 2 hadoop hadoop 20480 Jun 20 09:56 licenses +drwxrwxr-x 7 hadoop hadoop 4096 Jun 20 09:56 linkis-package // actual software package, including lib/service startup script tool/db initialization script/microservice configuration file, etc. +-rwxrwxr-x 1 hadoop hadoop 119503 Jan 22 2020 NOTICE +-rw-r--r-- 1 hadoop hadoop 11959 Jan 22 2020 README_CN.md +-rw-r--r-- 1 hadoop hadoop 12587 Jan 22 2020 README.md + +``` + +### 2.2 Configure database information + +`vim deploy-config/linkis-env.sh` + +```shell script +# Select linkis business database type, default mysql +# If using postgresql, please change to postgresql +# Note: The current configuration only applies to linkis>=1.4.0 +dbType=mysql +``` + +`vim deploy-config/db.sh` + +```shell script +# Linkis's own business database information - mysql +MYSQL_HOST=xx.xx.xx.xx +MYSQL_PORT=3306 +MYSQL_DB=linkis_test +MYSQL_USER=test +MYSQL_PASSWORD=xxxxx + +# Linkis's own business database information - postgresql +# Note: The following configuration is only applicable to linkis>=1.4.0 +PG_HOST=xx.xx.xx.xx +PG_PORT=5432 +PG_DB=linkis_test +PG_SCHEMA=linkis_test +PG_USER=test +PG_PASSWORD=123456 + +# Provide the DB information of the Hive metadata database. If the hive engine is not involved (or just a simple trial), it is not necessary to configure +#Mainly used together with scriptis, if not configured, it will try to get it through the configuration file in $HIVE_CONF_DIR by default +HIVE_META_URL="jdbc:mysql://10.10.10.10:3306/hive_meta_demo?useUnicode=true&characterEncoding=UTF-8" +HIVE_META_USER=demo # User of the HiveMeta metabase +HIVE_META_PASSWORD=demo123 # Password of the HiveMeta metabase +``` + + +### 2.3 Configure basic variables + +The file is located at `deploy-config/linkis-env.sh`. + +#### Deploy User +```shell script +deployUser=hadoop #The user who executes the deployment is the user created in step 1.2 +``` + +#### Basic directory configuration (optional) +:::caution Caution +Determine whether it needs to be adjusted according to the actual situation, and you can choose to use the default value +::: + + +```shell script + +# Specify the directory path used by the user, which is generally used to store the user's script files and log files, etc., and is the user's workspace. The corresponding configuration file configuration item is wds.linkis.filesystem.root.path(linkis.properties) +WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis + +# The result set log and other file paths are used to store the result set file of the Job wds.linkis.resultSet.store.path(linkis-cg-entrance.properties) //If the configuration of HDFS_USER_ROOT_PATH is not configured +RESULT_SET_ROOT_PATH=file:///tmp/linkis + +# Result set log and other file paths, used to store the result set file of Job wds.linkis.filesystem.hdfs.root.path(linkis.properties) +HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis + +# To store the working path of the execution engine, a local directory wds.linkis.engineconn.root.dir(linkis-cg-engineconnmanager.properties) where the deployment user has write permissions is required +ENGINECONN_ROOT_PATH=/appcom/tmp +``` + +#### Yarn's ResourceManager address + +:::caution Caution +If you need to use the Spark engine, you need to configure +::: + +```shell script + +#You can check whether it can be accessed normally by visiting http://xx.xx.xx.xx:8088/ws/v1/cluster/scheduler interface +YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088 +``` +When executing the spark task, you need to use the ResourceManager of yarn. Linkis defaults that permission verification is not enabled. If the ResourceManager has enabled password permission verification, please install and deploy. +Modify the database table `linkis_cg_rm_external_resource_provider` to insert yarn data information, for details, please refer to [Check whether the yarn address is configured correctly] (#811-Check whether the yarn address is configured correctly) + +#### Basic component environment information + +:::caution Caution +It can be configured through the user's system environment variables. If it is configured through the system environment variables, it can be commented out directly without configuration in the deploy-config/linkis-env.sh configuration file. +::: + +```shell script +##If you do not use Hive, Spark and other engines and do not rely on Hadoop, you do not need to configure the following environment variables + +#HADOOP +HADOOP_HOME=/appcom/Install/hadoop +HADOOP_CONF_DIR=/appcom/config/hadoop-config + +#Hive +HIVE_HOME=/appcom/Install/hive +HIVE_CONF_DIR=/appcom/config/hive-config + +#Spark +SPARK_HOME=/appcom/Install/spark +SPARK_CONF_DIR=/appcom/config/spark-config +``` + + +#### LDAP login configuration (optional) + +:::caution Caution +The default is to use a static user and password. The static user is the deployment user. The static password will randomly generate a password string during deployment and store it in `${LINKIS_HOME}/conf/linkis-mg-gateway.properties`(>=1.0. 3 version). +::: + + +```shell script +#LDAP configuration, by default Linkis only supports deployment user login, if you need to support multi-user login, you can use LDAP, you need to configure the following parameters: +#LDAP_URL=ldap://localhost:1389/ +#LDAP_BASEDN=dc=webank,dc=com +``` + + +#### JVM memory configuration (optional) +>Microservice starts jvm memory configuration, which can be adjusted according to the actual situation of the machine. If the machine has less memory resources, you can try to reduce it to 256/128M +```shell script +## java application default jvm memory +export SERVER_HEAP_SIZE="512M" +``` + +#### Installation directory configuration (optional) +> Linkis will eventually be installed in this directory, if not configured, it will be in the same directory as the current installation package by default + +```shell script +##The decompression directory and the installation directory need to be inconsistent +LINKIS_HOME=/appcom/Install/LinkisInstall +``` + +#### No HDFS mode deployment (optional >1.1.2 version support) + +> Deploy the Linkis service in an environment without HDFS to facilitate lighter learning, use and debugging. Deploying in HDFS mode does not support tasks such as hive/spark/flink engines + +Modify `linkis-env.sh` file, modify the following content +```bash +#Use [file://] path pattern instead of [hdfs://] pattern +WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis/ +HDFS_USER_ROOT_PATH=file:///tmp/linkis +RESULT_SET_ROOT_PATH=file:///tmp/linkis + +export ENABLE_HDFS=false +export ENABLE_HIVE=false +export ENABLE_SPARK=false +``` + +#### kerberos authentication (optional) + +> Linkis does not enable kerberos authentication by default. If the hive cluster used enables kerberos authentication, the following parameters need to be configured. + +Modify the `linkis-env.sh` file, the modified content is as follows +```bash +#HADOOP +HADOOP_KERBEROS_ENABLE=true +HADOOP_KEYTAB_PATH=/appcom/keytab/ +``` + +### 2.4 Configure Token +The file is located in `bin/install.sh` + +Linkis 1.3.2 version has changed the Token value to 32-bit random generation to ensure system security. For details, please refer to [Token Change Description](https://linkis.apache.org/zh-CN/docs/1.3.2/ feature/update-token/). + +Using randomly generated Token, you will encounter a lot of Token verification failure problems when connecting with [WDS other components](https://github.com/WeDataSphere/DataSphereStudio/blob/master/README-ZH.md) for the first time. It is recommended to install it for the first time When not using random generated Token, modify the following configuration to true. + +``` +DEBUG_MODE=true +``` + +### 2.5 Precautions + +**Full installation** + +For the full installation of the new version of Linkis, the install.sh script will automatically process the configuration file and keep the database Token consistent. Therefore, the Token of the Linkis service itself does not need to be modified. Each application can query and use the new token through the management console. + +**version upgrade** + +When the version is upgraded, the database Token is not modified, so there is no need to modify the configuration file and application Token. + +**Token expiration issue** + +When the Token token is invalid or has expired, you can check whether the Token is configured correctly. You can query the Token through the management console ==> Basic Data Management ==> Token Management. + +**Python version issue** +After Linkis is upgraded to 1.4.0, the default Spark version is upgraded to 3.x, which is not compatible with python2. Therefore, if you need to use the pyspark function, you need to make the following modifications. +1. Map python2 commands to python3 +``` +sudo ln -snf /usr/bin/python3 /usr/bin/python2 +``` +2. Spark engine connector configuration $LINKIS_HOME/lib/linkis-engineconn-plugins/spark/dist/3.2.1/conf/linkis-engineconn.properties Add the following configuration to specify the python installation path +``` +pyspark.python3.path=/usr/bin/python3 +``` + +## 3. Install and start + +### 3.1 Execute the installation script: + +```bash + sh bin/install.sh +``` + +The install.sh script will ask you if you want to initialize the database and import metadata. If you choose to initialize, the table data in the database will be cleared and reinitialized. + +**You must choose to clear the database for the first installation** + +:::tip note +- If an error occurs, and it is not clear what command to execute to report the error, you can add the -x parameter `sh -x bin/install.sh` to print out the log of the shell script execution process, which is convenient for locating the problem. +- Permission problem: `mkdir: cannot create directory 'xxxx': Permission denied`, please confirm whether the deployment user has read and write permissions for this path. +::: + +The prompt for successful execution is as follows: +```shell script +`Congratulations! You have installed Linkis xxx successfully, please use sh /data/Install/linkis/sbin/linkis-start-all.sh to start it! +Your default account password is [hadoop/5e8e312b4]` +``` + +### 3.2 Add mysql driver package + +:::caution Caution +Because the mysql-connector-java driver is under the GPL2.0 agreement, it does not meet the license policy of the Apache open source agreement. Therefore, starting from version 1.0.3, the official deployment package of the Apache version provided does not have mysql-connector-java-xxxjar by default. Dependency package (**If you install it through the integrated family bucket material package, you don’t need to add it manually**), you need to add dependencies to the corresponding lib package yourself when installing and deploying. You can check whether it exists in the corresponding directory. If it does not exist, you need to add it. + +::: + +Download mysql driver Take version 8.0.28 as an example: [Download link](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28. jar) + +Copy the mysql driver package to the lib package +``` +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ +``` +### 3.3 Add postgresql driver package (optional) +If you choose to use postgresql as the business database, you need to manually add the postgresql driver +Download postgresql driver Take version 42.5.4 as an example: [Download link](https://repo1.maven.org/maven2/org/postgresql/postgresql/42.5.4/postgresql-42.5.4.jar) +Copy the postgresql driver package to the lib package +``` +cp postgresql-42.5.4.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +cp postgresql-42.5.4.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ +``` +### 3.4 Configuration adjustment (optional) +> The following operations are related to the dependent environment. According to the actual situation, determine whether the operation is required + +#### 3.4.1 Yarn authentication + +When executing spark tasks, you need to use the ResourceManager of yarn, which is controlled by the configuration item `YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088`. +When performing installation and deployment, the `YARN_RESTFUL_URL=http://xx.xx.xx.xx:8088` information will be updated to `linkis_cg_rm_external_resource_provider` in the database table. By default, access to yarn resources does not require authorization verification. +If the resourcemanager of yarn has enabled the password authentication, please modify the yarn data information generated in the database table `linkis_cg_rm_external_resource_provider` after installation and deployment, +For details, please refer to [Check whether the yarn address is configured correctly] (#811-Check whether the yarn address is configured correctly). + +#### 3.4.2 session +If you are an upgrade to Linkis. Deploy DSS or other projects at the same time, but the version of linkis introduced in other software is <1.1.1 (mainly in the lib package, the linkis-module-xxxjar package of Linkis that depends on it <1.1.1), you need to modify the `$ {LINKIS_HOME}/conf/linkis.properties` file. +```shell +echo "wds.linkis.session.ticket.key=bdp-user-ticket-id" >> linkis.properties +``` + +#### 3.4.3 S3 mode +> Currently supports storing engine execution logs and results to the S3 file system +> +> Note: linkis does not adapt permissions to S3, so it cannot perform authorization operations on it + +`vim $LINKIS_HOME/conf/linkis.properties` +```shell script +# s3 file system +linkis.storage.s3.access.key=xxx +linkis.storage.s3.secret.key=xxx +linkis.storage.s3.endpoint=http://xxx.xxx.xxx.xxx:xxx +linkis.storage.s3.region=xxx +linkis.storage.s3.bucket=xxx +``` + +`vim $LINKIS_HOME/conf/linkis-cg-entrance.properties` +```shell script +wds.linkis.entrance.config.log.path=s3:///linkis/logs +wds.linkis.resultSet.store.path=s3:///linkis/results +``` + +### 3.5 Start the service +```shell script +sh sbin/linkis-start-all.sh +``` + +### 3.6 Modification of configuration after installation +After the installation is complete, if you need to modify the configuration (the configuration needs to be adjusted due to port conflicts or some configuration problems), you can re-execute the installation, or modify the configuration `${LINKIS_HOME}/conf/*properties` file of the corresponding service, Restart the corresponding service, such as: `sh sbin/linkis-daemon.sh start ps-publicservice`. + + +### 3.7 Check whether the service starts normally +Visit the eureka service page (http://eurekaip:20303), +By default, 6 Linkis microservices will be started, and the linkis-cg-engineconn service in the figure below will only be started for running tasks. +![Linkis1.0_Eureka](./images/eureka.png) + +```shell script +LINKIS-CG-ENGINECONNMANAGER Engine Management Service +LINKIS-CG-ENTRANCE computing governance entry service +LINKIS-CG-LINKISMANAGER Computing Governance Management Service +LINKIS-MG-EUREKA Microservice Registry Service +LINKIS-MG-GATEWAY Gateway Service +LINKIS-PS-PUBLICSERVICE Public Service +``` + +Note: In Linkis 1.3.1, LINKIS-PS-CS, LINKIS-PS-DATA-SOURCE-MANAGER, LINKIS-PS-METADATAMANAGER services have been merged into LINKIS-PS-PUBLICSERVICE, and LINKIS-CG-ENGINEPLUGIN services have been merged into LINKIS -CG-LINKISMANAGER. + +If any service is not started, you can check the detailed exception log in the corresponding log/${service name}.log file. + +### 3.8 Configure Token + +Linkis's original default Token is fixed and the length is too short, posing security risks. Therefore, Linkis 1.3.2 changes the original fixed Token to random generation, and increases the length of the Token. + +New Token format: application abbreviation - 32-bit random number, such as BML-928a721518014ba4a28735ec2a0da799. + +Token may be used in the Linkis service itself, such as executing tasks through Shell, uploading BML, etc., or it may be used in other applications, such as DSS, Qualitis and other applications to access Linkis. + +#### View Token +**View via SQL statement** +```sql +select * from linkis_mg_gateway_auth_token; +``` +**View via Admin Console** + +Log in to the management console -> basic data management -> token management +![](/Images/deployment/token-list.png) + +#### Check Token configuration + +When the Linkis service itself uses Token, the Token in the configuration file must be consistent with the Token in the database. Match by applying the short name prefix. + +$LINKIS_HOME/conf/linkis.properties file Token configuration + +``` +linkis.configuration.linkisclient.auth.token.value=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.client.common.tokenValue=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.bml.auth.token.value=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.context.client.auth.value=BML-928a721518014ba4a28735ec2a0da799 +wds.linkis.errorcode.auth.token=BML-928a721518014ba4a28735ec2a0da799 + +wds.linkis.client.test.common.tokenValue=LINKIS_CLI-215af9e265ae437ca1f070b17d6a540d + +wds.linkis.filesystem.token.value=WS-52bce72ed51741c7a2a9544812b45725 +wds.linkis.gateway.access.token=WS-52bce72ed51741c7a2a9544812b45725 + +wds.linkis.server.dsm.auth.token.value=DSM-65169e8e1b564c0d8a04ee861ca7df6e +``` + +$LINKIS_HOME/conf/linkis-cli/linkis-cli.properties file Token configuration +``` +wds.linkis.client.common.tokenValue=BML-928a721518014ba4a28735ec2a0da799 +``` + +When other applications use Token, they need to modify their Token configuration to be consistent with the Token in the database. + +## 4. Install the web front end +The web side uses nginx as the static resource server, and the access request process is: +`Linkis management console request->nginx ip:port->linkis-gateway ip:port->other services` + +### 4.1 Download the front-end installation package and decompress it +```shell script +tar -xvf apache-linkis-xxx-web-bin.tar.gz +``` + +### 4.2 Modify configuration config.sh +```shell script +#Access the port of the management console +linkis_port="8188" + +#linkis-mg-gateway service address +linkis_url="http://localhost:9020" +``` + +### 4.3 Execute the deployment script + +```shell script +# nginx needs sudo permission to install +sudo sh install.sh +``` +After installation, the nginx configuration file of linkis is in `/etc/nginx/conf.d/linkis.conf` by default +The log files of nginx are in `/var/log/nginx/access.log` and `/var/log/nginx/error.log` +An example of the generated nginx configuration file of the linkis management console is as follows: +```nginx + + server { + listen 8188;# If the access port is occupied, it needs to be modified + server_name localhost; + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + location / { + root /appcom/Install/linkis-web/dist; # static file directory + index index.html index.html; + } + location /ws { + proxy_pass http://localhost:9020;#The address of the backend Linkis + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + location /api { + proxy_pass http://localhost:9020; #The address of the backend Linkis + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header x_real_ipP $remote_addr; + proxy_set_header remote_addr $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_connect_timeout 4s; + proxy_read_timeout 600s; + proxy_send_timeout 12s; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + #error_page 404 /404.html; + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +``` + +If you need to modify the port or static resource directory, etc., please modify the `/etc/nginx/conf.d/linkis.conf` file and execute the `sudo nginx -s reload` command +:::caution Caution +- At present, the visualis function is not integrated. During the installation process, if you are prompted to fail to install linkis/visualis, you can ignore it. +- Check whether nginx starts normally: check whether the nginx process exists `ps -ef |grep nginx`. +- Check whether the configuration of nginx is correct `sudo nginx -T`. +- If the port is occupied, you can modify the service port `/etc/nginx/conf.d/linkis.conf`listen port value started by nginx, save and restart. +- If there is an interface 502 when accessing the management console, or `Unexpected token < in JSON at position 0` is abnormal, please confirm whether the linkis-mg-gateway is started normally. If it is started normally, check the linkis-mg-gateway configured in the nginx configuration file Whether the service address is correct. +::: + +### 4.4 Log in to the management console + +Browser login `http://xx.xx.xx.xx:8188/#/login` +Username/password can be checked in `{LINKIS_HOME}/conf/linkis-mg-gateway.properties`. +```shell script +wds.linkis.admin.user= #user +wds.linkis.admin.password= #password + +``` + +## 5. Verify basic functions +> Verify the corresponding engine tasks according to actual needs + +``` +#The version number of the engineType stitching of the engine must match the actual one. The following example is the default version number +#shell engine tasks +sh bin/linkis-cli -submitUser hadoop -engineType shell-1 -codeType shell -code "whoami" + +#hive engine tasks +sh bin/linkis-cli -submitUser hadoop -engineType hive-3.1.3 -codeType hql -code "show tables" + +#spark engine tasks +sh bin/linkis-cli -submitUser hadoop -engineType spark-3.2.1 -codeType sql -code "show tables" + +#python engine tasks +sh bin/linkis-cli -submitUser hadoop -engineType python-python2 -codeType python -code 'print("hello, world!")' +``` +If the verification fails, please refer to [Step 8] for troubleshooting. + +## 6. Installation of development tool IDE (Scriptis) (optional) +After installing the Scripti tool, you can write SQL, Pyspark, HiveQL and other scripts online on the web page. For detailed instructions, see [Tool Scriptis Installation and Deployment] (integrated/install-scriptis). + +## 7. Supported engines + +### 7.1 Engine adaptation list + +Please note: the separate installation package of Linkis only includes Python, Shell, Hive, and Spark by default. If there are other engine usage scenarios (such as jdbc/flink/sqoop, etc.), you can install them manually. For details, please refer to [EngineConnPlugin Engine Plugin installation documentation](install-engineconn). + +The list of supported engines adapted to this version is as follows: + +| Engine type| Adaptation situation| Whether the official installation package contains | +|---------------|-------------------|------| +| Python | >=1.0.0 Adapted | Contains | +| Shell | >=1.0.0 adapted | contains | +| Hive | >=1.0.0 adapted | contains | +| Spark | >=1.0.0 adapted | contains | +| Pipeline | >=1.0.0 Adapted | **Not Included** | +| JDBC | >=1.0.0 Adapted | **Not Included** | +| Flink | >=1.0.0 Adapted | **Excludes** | +| openLooKeng | >=1.1.1 Adapted | **Not Included** | +| Sqoop | >=1.1.2 Adapted | **Not Included** | +| Trino | >=1.3.2 Adapted | **Excluded** | +| Presto | >=1.3.2 Adapted | **Excluded** | +| Elasticsearch | >=1.3.2 Adapted | **Excludes** | +| Seatunnel | >=1.3.2 Adapted | **Not Included** | +| Impala | >=1.4.0 Adapted | **Excludes** | + + + +### 7.2 View deployed engines + +#### Method 1: View the engine lib package directory + +``` +$ tree linkis-package/lib/linkis-engineconn-plugins/ -L 3 +linkis-package/lib/linkis-engineconn-plugins/ +├──hive +│ ├── dist +│ │ └── 3.1.3 #version is 3.1.3 engineType is hive-3.1.3 +│ └── plugin +│ └── 3.1.3 +├── python +│ ├── dist +│ │ └── python2 +│ └── plugin +│ └── python2 #version is python2 engineType is python-python2 +├── shell +│ ├── dist +│ │ └── 1 +│ └── plugin +│ └── 1 +└── spark + ├── dist + │ └── 3.2.1 + └── plugin + └── 3.2.1 +``` + +#### Method 2: View the database table of linkis +```shell script +select * from linkis_cg_engine_conn_plugin_bml_resources +``` + + +## 8. Troubleshooting guidelines for common abnormal problems +### 8.1. Yarn queue check + +>If you need to use the spark/hive/flink engine + +After logging in, check whether the yarn queue resources can be displayed normally (click the button in the lower right corner of the page) (you need to install the front end first). + +Normal as shown in the figure below: +![yarn-normal](images/yarn-normal.png) + +If it cannot be displayed: You can adjust it according to the following guidelines + +#### 8.1.1 Check whether the yarn address is configured correctly +Database table `linkis_cg_rm_external_resource_provider`` +Insert yarn data information +```sql +INSERT INTO `linkis_cg_rm_external_resource_provider` +(`resource_type`, `name`, `labels`, `config`) VALUES +('Yarn', 'sit', NULL, +'{\r\n"rmWebAddress": "http://xx.xx.xx.xx:8088",\r\n"hadoopVersion": "3.3.4",\r\n"authorEnable":false, \r\n"user":"hadoop",\r\n"pwd":"123456"\r\n}' +); + +config field attribute + +"rmWebAddress": "http://xx.xx.xx.xx:8088", #Need to bring http and port +"hadoopVersion": "3.3.4", +"authorEnable":true, //Whether authentication is required You can verify the username and password by visiting http://xx.xx.xx.xx:8088 in the browser +"user": "user", //username +"pwd": "pwd"//password + +``` +After the update, because the cache is used in the program, if you want to take effect immediately, you need to restart the linkis-cg-linkismanager service. +```shell script +sh sbin/linkis-daemon.sh restart cg-linkismanager +``` + +#### 8.1.2 Check whether the yarn queue exists +Exception information: `desc: queue ide is not exists in YARN.` indicates that the configured yarn queue does not exist and needs to be adjusted. + +Modification method: `linkis management console/parameter configuration>global settings>yarn queue name [wds.linkis.rm.yarnqueue]`, modify a yarn queue that can be used, and the yarn queue to be used can be found at `rmWebAddress:http:// xx.xx.xx.xx:8088/cluster/scheduler`. + +View available yarn queues +- View yarn queue address: http://ip:8888/cluster/scheduler + +### 8.2 Check whether the engine material resources are uploaded successfully + +```sql +#Log in to the linkis database +select * from linkis_cg_engine_conn_plugin_bml_resources +``` + +Normally as follows: +![bml](images/bml.png) + +Check whether the material record of the engine exists (if there is an update, check whether the update time is correct) + +- If it does not exist or is not updated, first try to manually refresh the material resource (see [Engine Material Resource Refresh](install-engineconn#23-engine refresh) for details). +- Use `log/linkis-cg-linkismanager.log` to check the specific reason for the failure of the material. In many cases, it may be caused by the lack of permission in the hdfs directory. +- Check whether the gateway address configuration is correct. The configuration item `wds.linkis.gateway.url` in `conf/linkis.properties`. + +The material resources of the engine are uploaded to the hdfs directory by default as `/apps-data/${deployUser}/bml`. + +```shell script +hdfs dfs -ls /apps-data/hadoop/bml +#If there is no such directory, please manually create the directory and grant ${deployUser} read and write permissions +hdfs dfs -mkdir /apps-data +hdfs dfs -chown hadoop:hadoop /apps-data +``` + +### 8.3 Login password problem + +Linkis uses static users and passwords by default. Static users are deployment users. Static passwords will randomly generate a password string during deployment and store it in + +`${LINKIS_HOME}/conf/linkis-mg-gateway.properties` (>=version 1.0.3). + +### 8.4 version compatibility issues + +The engine supported by linkis by default, and the compatibility relationship with dss can be viewed in [this document](https://github.com/apache/linkis/blob/master/README.md). + + +### 8.5 How to locate server-side exception logs + +Linkis has many microservices. If you are not familiar with the system, sometimes you cannot locate the specific module that has an exception. You can search through the global log. +```shell script +tail -f log/* |grep -5n exception (or tail -f log/* |grep -5n ERROR) +less log/* |grep -5n exception (or less log/* |grep -5n ERROR) +``` + + +### 8.6 Execution engine task exception troubleshooting + +** step1: Find the startup deployment directory of the engine** + +- Method 1: If it is displayed in the execution log, you can view it on the management console as shown below: +![engine-log](images/engine-log.png) +- Method 2: If not found in method 1, you can find the `wds.linkis.engineconn.root.dir` parameter configured in `conf/linkis-cg-engineconnmanager.properties`, and this value is the directory where the engine starts and deploys. Subdirectories are segregated by user of the execution engine + +```shell script +# If you don't know the taskid, you can sort by time and choose ll -rt /appcom/tmp/${executed user}/${date}/${engine}/ +cd /appcom/tmp/${user executed}/${date}/${engine}/${taskId} +``` +The directory is roughly as follows +```shell script +conf -> /appcom/tmp/engineConnPublicDir/6a09d5fb-81dd-41af-a58b-9cb5d5d81b5a/v000002/conf #engine configuration file +engineConnExec.sh #generated engine startup script +lib -> /appcom/tmp/engineConnPublicDir/45bf0e6b-0fa5-47da-9532-c2a9f3ec764d/v000003/lib #engine-dependent packages +logs #Related logs of engine startup execution +``` + +**step2: Check the log of the engine** +```shell script +less logs/stdout +``` + +**step3: Try to execute the script manually (if needed)** +You can debug by trying to execute the script manually +``` +sh -x engineConnExec.sh +``` + +### 8.7 How to modify the port of the registration center eureka +Sometimes when the eureka port is occupied by other services and the default eureka port cannot be used, it is necessary to modify the eureka port. Here, the modification of the eureka port is divided into two cases: before the installation and after the installation. + +1. Modify the eureka port of the registration center before performing the installation +``` +1. Enter the decompression directory of apache-linkis-xxx-bin.tar.gz +2. Execute vi deploy-config/linkis-env.sh +3. Modify EUREKA_PORT=20303 to EUREKA_PORT=port number +``` +2. Modify the registry eureka port after installation +``` +1. Enter the ${LINKIS_HOME}/conf directory + +2. Execute grep -r 20303 ./* , the query results are as follows: + ./application-eureka.yml: port: 20303 + ./application-eureka.yml: defaultZone: http://ip:20303/eureka/ + ./application-linkis.yml: defaultZone: http://ip:20303/eureka/ + ./linkis-env.sh:EUREKA_PORT=20303 + ./linkis.properties:wds.linkis.eureka.defaultZone=http://ip:20303/eureka/ + +3. Change the port at the corresponding location to a new port, and restart all services sh restart sbin/linkis-start-all.sh +``` + + +### 8.8 Notes for CDH adaptation version + +CDH itself is not an official standard hive/spark package. When adapting, it is best to modify the hive/spark version dependencies in the linkis source code and recompile and deploy. +For details, please refer to the CDH adaptation blog post +[[Linkis1.0——Installation and stepping in the CDH5 environment]](https://mp.weixin.qq.com/s/__QxC1NoLQFwme1yljy-Nw) +[[DSS1.0.0+Linkis1.0.2——Trial record in CDH5 environment]](https://mp.weixin.qq.com/s/9Pl9P0hizDWbbTBf1yzGJA) +[[DSS1.0.0 and Linkis1.0.2 - Summary of JDBC engine-related issues]](https://mp.weixin.qq.com/s/vcFge4BNiEuW-7OC3P-yaw) +[[DSS1.0.0 and Linkis1.0.2——Summary of issues related to Flink engine]](https://mp.weixin.qq.com/s/VxZ16IPMd1CvcrvHFuU4RQ) + +### 8.9 Debugging of Http interface + +- Method 1 can enable [Guide to Free Login Mode](/docs/latest/api/login-api/#2 Login-free configuration) +- In method 2 postman, the cookie value of successful login on the request header + The cookie value can be obtained after successful login on the browser side + ![bml](images/bml-cookie.png) + +```shell script +Cookie: bdp-user-ticket-id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +``` +- Method 3 http request header to add a static Token token + Token is configured in conf/linkis.properties + Such as: TEST-AUTH=hadoop,root,user01 +```shell script +Token-Code: TEST-AUTH +Token-User: hadoop +``` + +### 8.10 Troubleshooting process for abnormal problems + +First, check whether the service/environment is started normally according to the above steps, and then check the basic problems according to some scenarios listed above. + +[QA document](https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq) Find out if there is a solution, link: https://docs.qq.com/doc/DSGZhdnpMV3lTUUxq +See if you can find a solution by searching the contents of the issue. +![issues](images/issues.png) +Through the official website document search, for some questions, you can search keywords on the official website, such as searching for "deployment". (If 404 appears, please refresh the browser) +![search](images/search.png) + + +## 9. How to obtain relevant information +Linkis official website documents are constantly being improved, and you can view related documents on this official website. + +Related blog posts are linked below. +- Linkis' technical blog collection https://github.com/apache/linkis/issues/1233 +- Public account technical blog post https://mp.weixin.qq.com/mp/homepage?__biz=MzI4MDkxNzUxMg==&hid=1&sn=088cbf2bbed1c80d003c5865bc92ace8&scene=18 +- Official website documentation https://linkis.apache.org/zh-CN/docs/latest/about/introduction +- bili technology sharing video https://space.bilibili.com/598542776?spm_id_from=333.788.b_765f7570696e666f.2 + diff --git a/versioned_docs/version-1.4.0/deployment/images/bml-cookie.png b/versioned_docs/version-1.4.0/deployment/images/bml-cookie.png new file mode 100644 index 00000000000..67dc0be98f8 Binary files /dev/null and b/versioned_docs/version-1.4.0/deployment/images/bml-cookie.png differ diff --git a/versioned_docs/version-1.4.0/deployment/images/bml.png b/versioned_docs/version-1.4.0/deployment/images/bml.png new file mode 100644 index 00000000000..ca9290f945d Binary files /dev/null and b/versioned_docs/version-1.4.0/deployment/images/bml.png differ diff --git a/versioned_docs/version-1.4.0/deployment/images/engine-log.png b/versioned_docs/version-1.4.0/deployment/images/engine-log.png new file mode 100644 index 00000000000..3a4c5ee0fb3 Binary files /dev/null and b/versioned_docs/version-1.4.0/deployment/images/engine-log.png differ diff --git a/versioned_docs/version-1.4.0/deployment/images/eureka.png b/versioned_docs/version-1.4.0/deployment/images/eureka.png new file mode 100644 index 00000000000..3b3f24a4b0e Binary files /dev/null and b/versioned_docs/version-1.4.0/deployment/images/eureka.png differ diff --git a/versioned_docs/version-1.4.0/deployment/images/issues.png b/versioned_docs/version-1.4.0/deployment/images/issues.png new file mode 100644 index 00000000000..b84a711452c Binary files /dev/null and b/versioned_docs/version-1.4.0/deployment/images/issues.png differ diff --git a/versioned_docs/version-1.4.0/deployment/images/search.png b/versioned_docs/version-1.4.0/deployment/images/search.png new file mode 100644 index 00000000000..632763a293b Binary files /dev/null and b/versioned_docs/version-1.4.0/deployment/images/search.png differ diff --git a/versioned_docs/version-1.4.0/deployment/images/yarn-normal.png b/versioned_docs/version-1.4.0/deployment/images/yarn-normal.png new file mode 100644 index 00000000000..fefc3110524 Binary files /dev/null and b/versioned_docs/version-1.4.0/deployment/images/yarn-normal.png differ diff --git a/versioned_docs/version-1.4.0/deployment/install-engineconn.md b/versioned_docs/version-1.4.0/deployment/install-engineconn.md new file mode 100644 index 00000000000..236757f125b --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/install-engineconn.md @@ -0,0 +1,84 @@ +--- +title: Installation EngineConn Plugin +sidebar_position: 3 +--- + +> This article mainly introduces the use of Linkis EngineConnPlugins, mainly from the aspects of compilation and installation. + +## 1. Compilation and packaging of EngineConnPlugins + +After Linkis 1.0, the engine is managed by EngineConnManager, and the EngineConnPlugin (ECP) supports real-time effectiveness. +In order to facilitate the EngineConnManager to be loaded into the corresponding EngineConnPlugin by labels, it needs to be packaged according to the following directory structure (take hive as an example): +``` +hive engine home directory, must be the name of the engine +│ ├── dist # Dependency and configuration required for engine startup, different versions of the engine need to be in this directory to prevent the corresponding version directory +│ │ └── 2.3.3 # Engine version +│ │ └── conf # Configuration file directory required by the engine +│ │ └── lib # Dependency package required by EngineConnPlugin +│ ├── plugin #EngineConnPlugin directory, this directory is used for engine management service package engine startup command and resource application +│ └── 2.3.3 # Engine version +│ └── linkis-engineplugin-hive-1.0.0.jar #Engine module package (only need to place a separate engine package) +``` +If you are adding a new engine, you can refer to hive's assembly configuration method, source code directory: linkis-engineconn-pluginshive/src/main/assembly/distribution.xml +## 2. Engine Installation +### 2.1 Plugin package installation +1.First, confirm the dist directory of the engine: wds.linkis.engineconn.home (get the value of this parameter from ${LINKIS_HOME}/conf/linkis.properties), this parameter is used by EngineConnPluginServer to read the configuration file that the engine depends on And third-party Jar packages. If the parameter (wds.linkis.engineconn.dist.load.enable=true) is set, the engine in this directory will be automatically read and loaded into the Linkis BML (material library). + +2.Second, confirm the engine Jar package directory: +wds.linkis.engineconn.plugin.loader.store.path, which is used by EngineConnPluginServer to read the actual implementation Jar of the engine. + +It is highly recommended specifying **wds.linkis.engineconn.home and wds.linkis.engineconn.plugin.loader.store.path as** the same directory, so that you can directly unzip the engine ZIP package exported by maven into this directory, such as: Place it in the ${LINKIS_HOME}/lib/linkis-engineconn-plugins directory. + +``` +${LINKIS_HOME}/lib/linkis-engineconn-plugins: +└── hive + └── dist + └── plugin +└── spark + └── dist + └── plugin +``` + +If the two parameters do not point to the same directory, you need to place the dist and plugin directories separately, as shown in the following example: + +``` +## dist directory +${LINKIS_HOME}/lib/linkis-engineconn-plugins/dist: +└── hive + └── dist +└── spark + └── dist +## plugin directory +${LINKIS_HOME}/lib/linkis-engineconn-plugins/plugin: +└── hive + └── plugin +└── spark + └── plugin +``` +### 2.2 Configuration modification of management console (optional) + +The configuration of the Linkis1.0 management console is managed according to the engine label. If the new engine has configuration parameters, you need to insert the corresponding configuration parameters in the Configuration, and you need to insert the parameters in three tables: + +``` +linkis_configuration_config_key: Insert the key and default values of the configuration parameters of the engin +linkis-manager_label: Insert engine label such as hive-1.2.1 +linkis_configuration_category: Insert the catalog relationship of the engine +linkis_configuration_config_value: Insert the configuration that the engine needs to display +``` + +If it is an existing engine and a new version is added, you can modify the version of the corresponding engine in the linkis_configuration_dml.sql file for execution + +### 2.3 Engine refresh + +1. The engine supports real-time refresh. After the engine is placed in the corresponding directory, Linkis1.0 provides a method to load the engine without shutting down the server, and just send a request to the linkis-engineconn-plugin-server service through the restful interface, that is, the actual deployment of the service Ip+port, the request interface is http://ip:port/api/rest_j/v1/rpc/receiveAndReply, the request method is POST, the request body is {"method":"/enginePlugin/engineConn/refreshAll"}. + +2. Restart refresh: the engine catalog can be forced to refresh by restarting + +``` +### cd to the sbin directory, restart linkis-engineconn-plugin-server +cd /Linkis1.0.0/sbin +## Execute linkis-daemon script +sh linkis-daemon.sh restart linkis-engine-plugin-server +``` + +3.Check whether the engine refresh is successful: If you encounter problems during the refresh process and need to confirm whether the refresh is successful, you can check whether the last_update_time of the linkis_engine_conn_plugin_bml_resources table in the database is the time when the refresh is triggered. diff --git a/versioned_docs/version-1.4.0/deployment/integrated/_category_.json b/versioned_docs/version-1.4.0/deployment/integrated/_category_.json new file mode 100644 index 00000000000..1b016691ad9 --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/integrated/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Integrated", + "position": 9 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/deployment/integrated/install-scriptis.md b/versioned_docs/version-1.4.0/deployment/integrated/install-scriptis.md new file mode 100644 index 00000000000..80f92b3be3a --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/integrated/install-scriptis.md @@ -0,0 +1,193 @@ +--- +title: Installation Scriptis Tool +sidebar_position: 4.1 +--- + +## 1 Introduction + +> After Apache Linkis >= 1.1.1 and DSS >= 1.1.0, scriptis can be deployed separately and used in conjunction with Linkis. Using the interactive analysis function of scriptis, you can write SQL, Pyspark, HiveQL, etc. online on web pages Scripts are submitted to Linkis for execution and support features such as UDFs, functions, resource management and custom variables. This article will introduce how to deploy the web component-scriptis separately, and use Apache Linkis through the scriptis web page. + + +Prerequisite: The Linkis service (backend and management desk service) has been successfully installed and can be used normally. The deployment process of Linkis can be found in [Quick Deployment of Apache Linkis](../deploy-quick.md) + +Example description: + +- The address of the linkis-gateway service is 10.10.10.10 and the port is 9001 +- Linkis console nginx is deployed on 10.10.10.10 port 8080 + +## 2. Environment preparation + +> Requires installation on first use + +### 2.1 Install node.js +```shell script +Download node.js and install it. Download address: http://nodejs.cn/download/ (It is recommended to use node v16 version) This step only needs to be executed for the first time +```` +### 2.2 Install learn +```shell script +#Wait for the installation to complete, the installation of liarn only needs to be executed when it is used for the first time +npm install lerna -g +```` + +## 3 Compile and deploy +### 3.1 Get scriptis code +> scriptis is a pure front-end project, integrated as a component in the DSS web code component, we only need to compile the DSS web project with a separate scriptis module + +```shell script +#Download >=dss 1.1.0 via git to compile script components +git clone -b branch-1.1.0 https://github.com/WeBankFinTech/DataSphereStudio +# Or directly download the zip package and unzip it +https://github.com/WeBankFinTech/DataSphereStudio/archive/refs/heads/branch-1.1.0.zip + +# enter the web directory +cd DataSphereStudio/web + +#This step is only required for the first use +lerna init + +#Add dependencies Note: This is not through npm install but lerna bootstrap needs to be installed first learn This step only needs to be executed for the first time +lerna bootstrap +```` + +### 3.2 Running the project locally (optional) + +> If you don't need to run the debug view locally, you can skip this step + +#### 3.2.1 Configure linkis-gateway service address configuration + +If you start the service locally, you need to configure the backend linkis-gateway service address in the code, in the `.env` file in the `web/packages/dss/` directory, +No configuration is required when packaging and deploying +```shell script +// Backend linkis-gatway service address +VUE_APP_HOST=http://10.10.10.10:9001 +VUE_APP_MN_CONFIG_PREFIX=http://10.10.10.10:9001/api/rest_j/v1 +```` +#### 3.2.2 Running the scriptis module + +```shell script +cd DataSphereStudio/web +# run scriptis component +npm run serve --module=scriptis --micro_module=scriptis +```` + +Open the browser and access the application script through the link `http://localhost:8080` (the default port for local requests is 8080), because it will request the remote linkis-gatway service interface, which will cause cross-domain problems, chrome browser To solve cross-domain problems, please refer to [Solving Chrome Cross-Domain Problems](https://www.jianshu.com/p/56b1e01e6b6a) + + +## 4 Packaging & deploying scriptis + +### 4.1 Packaging +```shell script +#Specify scriptis module +cd DataSphereStudio/web + +#After the command is executed successfully, a folder named `dist` will appear in the web directory, which is the component resource code of the packaged scriptis. We need to deploy the front-end resource to the nginx server where linkis-web is located +npm run build --module=scriptis --micro_module=scriptis +```` + +### 4.2 Deployment + +Upload the static resources compiled in step 3.1 to the server where the Linkis console is located, and store them in `/data/Install/scriptis-web/dist/`, +In the nginx server configuration where Linkis console is installed, add scriptis static resource access rules. The nginx configuration deployed by Linkis console is generally located in `/etc/nginx/conf.d/linkis.conf` + +```shell script + location /scripts { + alias /data/Install/scriptis-web/dist/ ; + index index.html ; +} +```` + +sudo vim `/etc/nginx/conf.d/linkis.conf` + +```shell script +server { + listen 8080;# access port + server_name localhost; + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + + location / { + root /appcom/Install/linkis-web/dist/; # static file directory + index index.html; + } + + location /scriptis { #scriptis resources are prefixed with scriptis to distinguish them from the linkis console + alias /data/Install/scriptis-web/dist/ ; #nginx scriptis static file storage path (customizable) + index index.html ; + } + + ...... + +location /api { + proxy_pass http://10.10.10.10:9001; address of #gatway + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header x_real_ipP $remote_addr; + proxy_set_header remote_addr $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_http_version 1.1; + proxy_connect_timeout 4s; + proxy_read_timeout 600s; + proxy_send_timeout 12s; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + + #error_page 404 /404.html; + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } + +```` +After modifying the configuration, reload the nginx configuration + +```shell script +sudo nginx -s reload +```` + +Note the difference between root and alias in the location configuration block in nginx +- The processing result of root is: root path + location path. +- The result of alias processing is: replace the location path with the alias path. +- alias is the definition of a directory alias, root is the definition of the topmost directory + +## 5 scriptis usage steps + +### 5.1 Log in to Linkis console normally +```shell script +#http://10.10.10.10:8080/#/ +http://nginxIp:port/#/ +```` +Because access to scriptis requires login verification, you need to log in first, obtain and cache cookies. + +### 5.2 Access the scriptis page after successful login + +```shell script +#http://10.10.10.10:8080/scriptis/#/home +http://nginxIp:port/scriptis/#/home +```` +`nginxIp`: The ip of the nginx server deployed by the Linkis console, `port`: the port number of the nginx configuration startup, `scriptis` is the location address of the nginx configuration for requesting the static files of the scriptis project (can be customized) + +### 5.3 Using scriptis + +Take creating a new sql query task as an example. + + +step1 Create a new script Select the script type as sql type + +![Rendering](/Images-zh/deployment/scriptis/new_script.png) + +step2 Enter the statement to be queried + +![Rendering](/Images-zh/deployment/scriptis/test_statement.png) + +step3 run + +![Rendering](/Images-zh/deployment/scriptis/running_results.png) + + +shep4 View Results + +![Rendering](/Images-zh/deployment/scriptis/design_sketch.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/deployment/integrated/involve-knife4j.md b/versioned_docs/version-1.4.0/deployment/integrated/involve-knife4j.md new file mode 100644 index 00000000000..dc2fd9316da --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/integrated/involve-knife4j.md @@ -0,0 +1,64 @@ +--- +title: Involve Knife4j +sidebar_position: 5.2 +--- + +## 1.Knife4j introduced +knife4j is an enhanced solution for generating API documentation for the Java MVC framework integration Swapper, formerly known as swagger-bootstrap-ui, named knife4j in the hope that it will be as small, lightweight, and powerful as a dagger! Its underlying layer is the encapsulation of Springfox, which is used in the same way as Springfox, but the interface document UI is optimized. + +**Core functionality:** + +- Document Description: According to the specification of Swagger, the description of the interface document is listed in detail, including the interface address, type, request example, request parameter, response example, response parameter, response code and other information, and the use of the interface is clear at a glance. +- Online debugging: Provides the powerful function of online interface joint debugging, automatically parses the current interface parameters, and includes form verification, and the call parameters can return the interface response content, headers, response time, response status codes and other information to help developers debug online. +## 2.Linkis integrates knif4j +### 2.1 Start knif4j in test mode +Modify the application-linkis.yml file setting to knife4j.production=false +```shell +knife4j: + enable: true + production: false +``` +Modify the linkis.properties file to open test mode +```shell +wds.linkis.test.mode=true +wds.linkis.test.user=hadoop +``` +After restarting all services, you can access the knife4j page via http://ip:port/api/rest_j/v1/doc .html +```shell +http://ip:port/api/rest_j/v1/doc.html +``` +### 2.2 Start knif4j in normal mode +Modify the application-linkis.yml file setting to knife4j.production=false +```shell +knife4j: + enable: true + production: false +``` +Modify the linkis.properties file to add wds.linkis.server.user.restful.uri.pass.auth +```shell +wds.linkis.server.user.restful.uri.pass.auth=/api/rest_j/v1/doc.html,/api/rest_j/v1/swagger-resources,/api/rest_j/v1/webjars,/api/rest_j/v1/v2/api-docs +``` +After restarting all services, you can access the knife4j page via http://ip:port/api/rest_j/v1/doc .html +```shell +http://ip:port/api/rest_j/v1/doc.html +``` +Since identity authentication is required when knife4j debugs each interface, the following cookie information needs to be manually added to the browser. +```shell +#User login ticket-id +bdp-user-ticket-id= +#Workspace ID +workspaceId= +#Internal request switch +dataworkcloud_inner_request=true +``` +Take the Chrome browser as an example +![](/Images/deployment/knife4j/Knife4j_addcookie.png) +## 3.Go to the Knife4j page +Access knife4j page via http://ip:port/api/rest_j/v1/doc.html +![](/Images/deployment/knife4j/Knife4j_home.png) +Click the interface name to display detailed interface documentation +![](/Images/deployment/knife4j/Knife4j_interface.png) +Click "Debug" and enter parameters to debug the interface +![](/Images/deployment/knife4j/Knife4j_debug.png) + +For detailed usage guidelines, please visit the knife4j official website to view:[https://doc.xiaominfo.com/knife4j/](https://doc.xiaominfo.com/knife4j/) diff --git a/versioned_docs/version-1.4.0/deployment/integrated/involve-prometheus.md b/versioned_docs/version-1.4.0/deployment/integrated/involve-prometheus.md new file mode 100644 index 00000000000..9bb5e06bff9 --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/integrated/involve-prometheus.md @@ -0,0 +1,325 @@ +--- +title: Involve Prometheus +sidebar_position: 5.1 +--- +This article describes how to enable Prometheus to monitor all running Linkis services. + +## 1. Introduction to Prometheus + +### 1.1 What is Prometheus + +Prometheus, a Cloud Native Computing Foundation project, is a systems and service monitoring system. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts when specified conditions are observed. + +In the context of microservice, it provides the service discovery feature, enabling to find targets dynamically from service register center, like Eureka, Consul, etc, and pull the metrics from API endpoint over http protocol. + +### 1.2 Prometheus Architecture + +This diagram illustrates the architecture of Prometheus and some of its ecosystem components: + +![](https://prometheus.io/assets/architecture.png) + +Prometheus scrapes metrics from instrumented jobs, either directly or via an intermediary push gateway for short-lived jobs. It stores all scraped samples locally and runs rules over this data to either aggregate and record new time series from existing data or generate alerts. Grafana or other API consumers can be used to visualize the collected data. + +![](/Images/deployment/monitoring/prometheus_architecture.jpg) + +In the context of Linkis, we will use Eureka (Service Discover)SD in Prometheus to retrieve scrape targets using the Eureka REST API. And Prometheus will periodically check the REST endpoint and create a target for every app instance. + +## 2. How to Enable Prometheus + +### 2.1 Enable Prometheus when installing Linkis + +Modify the configuration item `PROMETHEUS_ENABLE` in linkis-env.sh of Linkis. + +```bash +export PROMETHEUS_ENABLE=true +```` +After running the `install.sh`, it's expected to see the configuration related to `prometheus` is appended inside the following files: + +```yaml +## application-linkis.yml ## + +eureka: + instance: + metadata-map: + prometheus.path: ${prometheus.path:${prometheus.endpoint}} +... +management: + endpoints: + web: + exposure: + include: refresh,info,health,metrics,prometheus +```` + +```yaml +## application-eureka.yml ## + +eureka: + instance: + metadata-map: + prometheus.path: ${prometheus.path:/actuator/prometheus} +... +management: + endpoints: + web: + exposure: + include: refresh,info,health,metrics,prometheus +```` + +```yaml +## linkis.properties ## +... +wds.linkis.prometheus.enable=true +wds.linkis.server.user.restful.uri.pass.auth=/api/rest_j/v1/actuator/prometheus, +... +```` +Then inside each computation engine, like spark, flink or hive, it's needed to add the same configuration **manually**. +```yaml +## linkis-engineconn.properties ## +... +wds.linkis.prometheus.enable=true +wds.linkis.server.user.restful.uri.pass.auth=/api/rest_j/v1/actuator/prometheus, +... +```` +### 2.2 Enable Prometheus after installation +Modify`${LINKIS_HOME}/conf/application-linkis.yml`, add `prometheus` as exposed endpoints. +```yaml +## application-linkis.yml ## +management: + endpoints: + web: + exposure: + #Add prometheus + include: refresh,info,health,metrics,prometheus +``` +Modify`${LINKIS_HOME}/conf/application-eureka.yml`, add `prometheus` as exposed endpoints. +```yaml +## application-eureka.yml ## +management: + endpoints: + web: + exposure: + #Add prometheus + include: refresh,info,health,metrics,prometheus +```` +Modify`${LINKIS_HOME}/conf/linkis.properties`, remove the comment `#` before `prometheus.enable` +```yaml +## linkis.properties ## +... +wds.linkis.prometheus.enable=true +... +``` + +### 2.3 Start Linkis + +```bash +$ bash linkis-start-all.sh +```` + +After start the services, it's expected to access the prometheus endpoint of each microservice in the Linkis, for example, http://linkishost:9103/api/rest_j/v1/actuator/prometheus. + +:::caution 注意 +The prometheus endpoint of gateway/eureka don't include the prefix `api/rest_j/v1`, and the complete endpoint will be http://linkishost:9001/actuator/prometheus +::: + +## 3. Demo for Deploying the Prometheus, Alertmanager and Grafana +Usually the monitoring setup for a cloud native application will be deployed on kubernetes with service discovery and high availability (e.g. using a kubernetes operator like Prometheus Operator). To quickly prototype dashboards and experiment with different metric type options (e.g. histogram vs gauge) you may need a similar setup locally. This sector explains how to setup locally a Prometheus/Alert Manager and Grafana monitoring stack with Docker Compose. + +First, lets define a general component of the stack as follows: + +- An Alert Manager container that exposes its UI at 9093 and read its configuration from alertmanager.conf +- A Prometheus container that exposes its UI at 9090 and read its configuration from prometheus.yml and its list of alert rules from alert_rules.yml +- A Grafana container that exposes its UI at 3000, with list of metrics sources defined in grafana_datasources.yml and configuration in grafana_config.ini + +- The following docker-compose.yml file summaries the configuration of all those components: + +````yaml +## docker-compose.yml ## +version: "3" +networks: + default: + external: true + name: my-network +services: + prometheus: + image: prom/prometheus:latest + container_name: prometheus + volumes: + - ./config/prometheus.yml:/etc/prometheus/prometheus.yml + - ./config/alertrule.yml:/etc/prometheus/alertrule.yml + - ./prometheus/prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - "9090:9090" + + alertmanager: + image: prom/alertmanager:latest + container_name: alertmanager + volumes: + - ./config/alertmanager.yml:/etc/alertmanager/alertmanager.yml + ports: + - "9093:9093" + + grafana: + image: grafana/grafana:latest + container_name: grafana + environment: + - GF_SECURITY_ADMIN_PASSWORD=123456 + - GF_USERS_ALLOW_SIGN_UP=false + volumes: + - ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards + - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources + - ./grafana/grafana_data:/var/lib/grafana + ports: + - "3000:3000" +```` +Second, to define some alerts based on metrics in Prometheus, you can group then into an alert_rules.yml, so you could validate those alerts are properly triggered in your local setup before configuring them in the production instance. +As an example, the following configration convers the usual metrics used to monitor Linkis services. +- a. Down instance +- b. High Cpu for each JVM instance (>80%) +- c. High Heap memory for each JVM instance (>80%) +- d. High NonHeap memory for each JVM instance (>80%) +- e. High Waiting thread for each JVM instance (100) + +```yaml +## alertrule.yml ## +groups: + - name: LinkisAlert + rules: + - alert: LinkisNodeDown + expr: last_over_time(up{job="linkis", application=~"LINKISI.*", application!="LINKIS-CG-ENGINECONN"}[1m])== 0 + for: 15s + labels: + severity: critical + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} down" + description: "Linkis instance(s) is/are down in last 1m" + value: "{{ $value }}" + + - alert: LinkisNodeCpuHigh + expr: system_cpu_usage{job="linkis", application=~"LINKIS.*"} >= 0.8 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} cpu overload" + description: "CPU usage is over 80% for over 1min" + value: "{{ $value }}" + + - alert: LinkisNodeHeapMemoryHigh + expr: sum(jvm_memory_used_bytes{job="linkis", application=~"LINKIS.*", area="heap"}) by(instance) *100/sum(jvm_memory_max_bytes{job="linkis", application=~"LINKIS.*", area="heap"}) by(instance) >= 50 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} memory(heap) overload" + description: "Memory usage(heap) is over 80% for over 1min" + value: "{{ $value }}" + + - alert: LinkisNodeNonHeapMemoryHigh + expr: sum(jvm_memory_used_bytes{job="linkis", application=~"LINKIS.*", area="nonheap"}) by(instance) *100/sum(jvm_memory_max_bytes{job="linkis", application=~"LINKIS.*", area="nonheap"}) by(instance) >= 60 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} memory(nonheap) overload" + description: "Memory usage(nonheap) is over 80% for over 1min" + value: "{{ $value }}" + + - alert: LinkisWaitingThreadHigh + expr: jvm_threads_states_threads{job="linkis", application=~"LINKIS.*", state="waiting"} >= 100 + for: 1m + labels: + severity: warning + service: Linkis + instance: "{{ $labels.instance }}" + annotations: + summary: "instance: {{ $labels.instance }} waiting threads is high" + description: "waiting threads is over 100 for over 1min" + value: "{{ $value }}" +``` +**Note**: Since once the service instance is shutdown, it will not be one of the target of Prometheus Eureka SD, and `up` metrics will not return any data after a short time. Thus we will collect if the `up=0` in the last one minute to determine whether the service is alive or not. + +Third, and most importantly define Prometheus configuration in prometheus.yml file. This will defines: + +- the global settings like scrapping interval and rules evaluation interval +- the connection information to reach AlertManager and the rules to be evaluated +- the connection information to application metrics endpoint. +This is an example configration file for Linkis: +````yaml +## prometheus.yml ## +# my global config +global: + scrape_interval: 30s # By default, scrape targets every 15 seconds. + evaluation_interval: 30s # By default, scrape targets every 15 seconds. +alerting: + alertmanagers: + - static_configs: + - targets: ['alertmanager:9093'] +# Load and evaluate rules in this file every 'evaluation_interval' seconds. +rule_files: + - "alertrule.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + - job_name: 'prometheus' + static_configs: + - targets: ['localhost:9090'] + - job_name: linkis + eureka_sd_configs: + # the endpoint of your eureka instance + - server: {{linkis-host}}:20303/eureka + relabel_configs: + - source_labels: [__meta_eureka_app_name] + target_label: application + - source_labels: [__meta_eureka_app_instance_metadata_prometheus_path] + action: replace + target_label: __metrics_path__ + regex: (.+) +```` +Forth, the following configuration defines how alerts will be sent to external webhook. +```yaml +## alertmanager.yml ## +global: + resolve_timeout: 5m + +route: + receiver: 'webhook' + group_by: ['alertname'] + + # How long to wait to buffer alerts of the same group before sending a notification initially. + group_wait: 1m + # How long to wait before sending an alert that has been added to a group for which there has already been a notification. + group_interval: 5m + # How long to wait before re-sending a given alert that has already been sent in a notification. + repeat_interval: 12h + +receivers: +- name: 'webhook' + webhook_configs: + - send_resolved: true + url: {{your-webhook-url}} + +```` + +Finally, after defining all the configuration file as well as the docker compose file we can start the monitoring stack with `docker-compose up` + +## 4. Result display +On Prometheus page, it's expected to see all the Linkis service instances as shown below: +![](/Images/deployment/monitoring/prometheus_screenshot.jpg) + +When the Grafana is accessible, you need to import the prometheus as datasource in Grafana, and import the dashboard template with id 11378, which is normally used for springboot service(2.1+). +Then you can view one living dashboard of Linkis there. + +![](/Images/deployment/monitoring/grafana_screenshot.jpg) + +You can also try to integrate the Prometheus alter manager with your own webhook, where you can see if the alter message is fired. diff --git a/versioned_docs/version-1.4.0/deployment/integrated/involve-skywalking.md b/versioned_docs/version-1.4.0/deployment/integrated/involve-skywalking.md new file mode 100644 index 00000000000..d476ab6b3a9 --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/integrated/involve-skywalking.md @@ -0,0 +1,150 @@ +--- +title: Involve SkyWaling +sidebar_position: 5.0 +--- +This article describes how to enable SkyWalking when starting the Linkis service to facilitate subsequent distributed trace and troubleshooting. + +## 1. Introduction to SkyWalking + +### 1.1 What is SkyWalking + +SkyWalking is an open source observability platform used to collect, analyze, aggregate and visualize data from services and cloud native infrastructures. SkyWalking provides an easy way to maintain a clear view of your distributed systems, even across Clouds. It is a modern APM, specially designed for cloud native, container based distributed systems. + +### 1.2 SkyWalking Architecture + +The following figure is the overall architecture of SkyWalking. + +![](/Images/deployment/skywalking/SkyWalking_Architecture.png) + +SkyWalking is logically split into four parts: Probes, Platform backend, Storage and UI. +- **Probe**s collect data and reformat them for SkyWalking requirements (different probes support different sources). +- **Platform backend** supports data aggregation, analysis and streaming process covers traces, metrics, and logs. +- **Storage** houses SkyWalking data through an open/plugable interface. You can choose an existing implementation, such as ElasticSearch, H2, MySQL, TiDB, InfluxDB, or implement your own. Patches for new storage implementors welcome! +- **UI** is a highly customizable web based interface allowing SkyWalking end users to visualize and manage SkyWalking data. + +Using SkyWalking in Linkis requires that the user already has the Backend service and the corresponding Storage. The Probe can be integrated when the Linkis service is started. There are three main ways of Probe integration: + +- **Language based native agent**. These agents run in target service user spaces, such as a part of user codes. For example, the SkyWalking Java agent uses the `-javaagent` command line argument to manipulate codes in runtime, where `manipulate` means to change and inject user’s codes. Another kind of agents uses certain hook or intercept mechanism provided by target libraries. As you can see, these agents are based on languages and libraries. +- **Service Mesh probes**. Service Mesh probes collect data from sidecar, control plane in service mesh or proxy. In the old days, proxy is only used as an ingress of the whole cluster, but with the Service Mesh and sidecar, we can now perform observability functions. +- **3rd-party instrument library**. SkyWalking accepts many widely used instrument libraries data formats. It analyzes the data, transfers it to SkyWalking’s formats of trace, metrics or both. This feature starts with accepting Zipkin span data. See [Receiver for Zipkin traces](https://skywalking.apache.org/docs/main/latest/en/setup/backend/zipkin-trace) for more information. + +We used **Language based native agent** when Linkis integrated SkyWalking, that is, the method of java agent. Below we will show you how to enable SkyWalking in Linkis service. + + +## 2. Deploy the SkyWalking backend +The SkyWalking backend is a prerequisite for enabling SkyWalk. The following is a brief demonstration of how to install the SkyWalking backend. + +First download SkyWalking APM from SkyWalking's [Downloads](https://skywalking.apache.org/downloads/) page. + +![](/Images/deployment/skywalking/SkyWalking_APM_Download.png) + +After downloading, unzip it directly, and we get the following directory structure. +```bash +$ ls +bin config config-examples LICENSE licenses logs NOTICE oap-libs README.txt tools webapp +```` + +The backend uses the H2 in-memory database as the backend storage by default, and does not need to modify the configuration. Start as follows. + +Start Backend +```bash +$ bash bin/startup.sh +```` + +Start WebApp +```bash +$ bash bin/webappService.sh +```` + +The UI starts on port 8080 by default. You can also modify the listening port by modifying the webapp.yml file in the webapp directory. +````yaml +server: + port: 8080 + +spring: + cloud: + gateway: + routes: + - id: oap-route + uri: lb://oap-service + predicates: + - Path=/graphql/** + discovery: + client: + simple: + instances: + oap-service: + - uri: http://127.0.0.1:12800 + # - uri: http://: + # - uri: http://: + + mvc: + throw-exception-if-no-handler-found: true + + web: + resources: + add-mappings: true + +management: + server: + base-path: /manage +```` + +## 3. Linkis service start and enable SkyWalking + +It is assumed here that the service deployment of Linkis is relatively clear. If it is not clear, it can be asynchronous: + +To start SkyWalking in Linkis, you first need to download the Java agent of SkyWalking, we can download it from the [Downloads](https://skywalking.apache.org/downloads/) page. + +![](/Images/deployment/skywalking/SkyWalking_Agent_Download.png) + +After downloading, unzip it directly, the internal file structure is as follows: +```bash +tree skywalking-agent +$ skywalking-agent +├── LICENSE +├── NOTICE +├── activations +│ ├── apm-toolkit-kafka-activation-8.8.0.jar +│ ├── ... +├── bootstrap-plugins +│ ├── apm-jdk-http-plugin-8.8.0.jar +│ └── apm-jdk-threading-plugin-8.8.0.jar +├── config +│ └── agent.config +├── licenses +│ └── LICENSE-asm.txt +├── logs +├── optional-plugins +│ ├── apm-customize-enhance-plugin-8.8.0.jar +│ ├── ... +├── optional-reporter-plugins +│ ├── kafka-reporter-plugin-8.8.0.jar +│ ├── ... +├── plugins +│ ├── apm-activemq-5.x-plugin-8.8.0.jar +│ ├── ... +└── skywalking-agent.jar + +```` + +Modify the configuration item `SKYWALKING_AGENT_PATH` in linkis-env.sh of Linkis. Set it to the path to `skywalking-agent.jar`. +```bash +SKYWALKING_AGENT_PATH=/path/to/skywalking-agent.jar +```` + +Then start Linkis. + +```bash +$ bash linkis-start-all.sh +```` + +## 4. Result display + +The UI port of Linkis starts at port 8080 by default. After Linkis opens SkyWalking and opens the UI, if you can see the following picture, it means success. + +![](/Images/deployment/skywalking/SkyWalking_UI_Dashboard.png) + +![](/Images/deployment/skywalking/SkyWalking_UI_Dashboard2.png) + +![](/Images/deployment/skywalking/SkyWalking_Topology.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/deployment/integrated/sso-with-redis.md b/versioned_docs/version-1.4.0/deployment/integrated/sso-with-redis.md new file mode 100644 index 00000000000..cca146c9bbc --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/integrated/sso-with-redis.md @@ -0,0 +1,46 @@ +--- +title: Session Supports Redis Shared Storage +sidebar_position: 8 +--- +## 1.Background +Because the original login session does not support distributed storage, for all requests from the same user, nginx needs to forward the requests to the same gateway instance to process the requests normally. +The common solution is to support it by configuring ip hash load balancing on the ingress nginx. +However, in the ip hash method, if there is an expansion or contraction of the server, the hash values ​​of all client ips need to be recalculated, which will result in session loss. +Secondly, it is easy to cause data skew problems due to uneven node distribution. +In order to optimize the problems existing in the ip hash method, shared storage is implemented for the session in the login state. + +## 2.Implementation plan +Because session information is mainly identified by ticketId, and all external entrances are gateways, only the gateway module needs to be modified. +For the underlying shared storage, choose the mainstream in-memory database redis. For whether to start redis session storage, it supports configuration file control. +The key code change is `userTicketIdToLastAccessTime` of `org.apache.linkis.server.security.SSOUtils`. + +Request process: + +`User request -> nginx -> linkis-gateway -> linkis backend service` + + +## 3.How to use + +An available reids environment is required, and stand-alone redis and redis sentinel modes are supported. + +After installing and deploying Linkis, modify the configuration file `${LINKIS_HOME}/conf/linkis.properties` +```shell script +#Open redis cache configuration +linkis.session.redis.cache.enabled=true + + +#single vision +linkis.session.redis.host=127.0.0.1 +linkis.session.redis.port=6379 +linkis.session.redis.password=test123 + +# sentinel mode +linkis.session.redis.sentinel.master=sentinel-master-name +linkis.session.redis.sentinel.nodes=127.0.1.1:6381,127.0.2.1:6381,127.0.3.1:6381 +linkis.session.redis.password=test123 + +``` + +Just enable the gateway normally. After starting redis, for multiple gateway examples, you can use the nginx default load balancing mode when configuring on the nginx side. + + diff --git a/versioned_docs/version-1.4.0/deployment/version-adaptation.md b/versioned_docs/version-1.4.0/deployment/version-adaptation.md new file mode 100644 index 00000000000..0ab2dcf6e9a --- /dev/null +++ b/versioned_docs/version-1.4.0/deployment/version-adaptation.md @@ -0,0 +1,513 @@ +--- +title: Version Adaptation +sidebar_position: 8 +--- + +# Version Adaptation + +## 1. Function description + +Explain where manual modification is required for Apache, CDH, HDP and other version adaptations + +## 2. Compilation instruction + +Enter the root directory of the project and execute the following commands in sequence + +```text +mvn -N install +mvn clean install -Dmaven.test.skip=true +``` + +## 3. SQL Script Switch + +linkis-dist -> package -> linkis-dml.sql(db folder) + +Switch the corresponding engine version to the version you need. If the version you use is consistent with the official version, you do not need to modify this step + +for example: + +1. If Spark is 3.0.0, this is SET @ SPARK_ LABEL="spark-3.0.0"; +2. If hive is 2.1.1-cdh6.3.2, adjust 2.1.1 first_ Cdh6.3.2 (during construction), this is SET @ HIVE_ LABEL="hive-2.1.1_cdh6.3.2"; + +```sql +-- variable: +SET @SPARK_LABEL="spark-2.4.3"; +SET @HIVE_LABEL="hive-2.3.3"; +SET @PYTHON_LABEL="python-python2"; +SET @PIPELINE_LABEL="pipeline-1"; +SET @JDBC_LABEL="jdbc-4"; +SET @PRESTO_LABEL="presto-0.234"; +SET @IO_FILE_LABEL="io_file-1.0"; +SET @OPENLOOKENG_LABEL="openlookeng-1.5.0"; +``` + +## 4. Linkis official version + +| engine | version | +| ------ | ------- | +| hadoop | 2.7.2 | +| hive | 2.3.3 | +| spark | 2.4.3 | +| flink | 1.12.2 | + +## 5. Apache version adaptation + +### 5.1 Apache3.1.x version + +| engine | version | +| ------ | ------- | +| hadoop | 3.1.1 | +| hive | 3.1.2 | +| spark | 3.0.1 | +| flink | 1.13.2 | + +#### 5.1.1 The pom file of linkis + +For Linkis version < 1.3.2 +```xml +3.1.1 +2.12.10 +2.12 + + + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + + +``` +For Linkis version >= 1.3.2, we only need to set `scala.version` and `scala.binary.version` if necessary +```java +2.12.10 +2.12 +``` +Because we can directly compile with hadoop-3.3 or hadoop-2.7 profile. +Profile `hadoop-3.3` can be used for any hadoop3.x, default hadoop3.x version will be hadoop 3.3.1, +Profile `hadoop-2.7` can be used for any hadoop2.x, default hadoop2.x version will be hadoop 2.7.2, +other hadoop version can be specified by -Dhadoop.version=xxx +```text +mvn -N install +mvn clean install -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Phadoop-3.3 -Dhadoop.version=3.1.1 -Dmaven.test.skip=true +``` +#### 5.1.2 The pom file of linkis-hadoop-common + +For Linkis version < 1.3.2 +```xml + + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + +``` + +For Linkis version >= 1.3.2,`linkis-hadoop-common` module no need to change + +#### 5.1.3 The pom file of linkis-engineplugin-hive + +```xml +3.1.2 +``` + +#### 5.1.4 The pom file of linkis-engineplugin-spark + +For Linkis version < 1.3.2 +```xml +3.0.1 +``` + +For Linkis version >= 1.3.2 +```text +We can directly compile with spark-3.2 or spark-2.4-hadoop-3.3 profile, if we need to used with hadoop3, then profile hadoop-3.3 will be needed. +default spark3.x version will be spark 3.2.1. if we compile with spark-3.2 then scala version will be 2.12.15 by default, +so we do not need to set the scala version in Linkis project pom file(mentioned in 5.1.1). +if spark2.x used with hadoop3, for compatibility reason, profile `spark-2.4-hadoop-3.3` need to be activated. +``` +```text +mvn -N install +mvn clean install -Pspark-3.2 -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Pspark-2.4-hadoop-3.3 -Phadoop-3.3 -Dmaven.test.skip=true +``` + +#### 5.1.5 The pom file of flink-engineconn-flink + +```xml +1.13.2 +``` + +Since some classes of Flink 1.12.2 to 1.13.2 are adjusted, it is necessary to compile and adjust Flink. Select Scala version 2.12 for compiling Flink + +:::caution temporary plan + +Note that the following operations are all in flink + +Due to flink1.12.2 to 1.13.2, some classes are adjusted, so flink needs to be compiled and adjusted, and the version of scala selected for compiling flink is version 2.12(The scala version is based on the actual version used) + +flink compilation reference instruction: mvn clean install -DskipTests -P scala-2.12 -Dfast -T 4 -Dmaven.compile.fock=true + +::: + +```text +-- Note that the following classes are copied from version 1.12.2 to version 1.13.2 +org.apache.flink.table.client.config.entries.DeploymentEntry +org.apache.flink.table.client.config.entries.ExecutionEntry +org.apache.flink.table.client.gateway.local.CollectBatchTableSink +org.apache.flink.table.client.gateway.local.CollectStreamTableSink +``` + +#### 5.1.6 linkis-label-commo adjustment + +org.apache.linkis.manager.label.conf.LabelCommonConfig file adjustment + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "3.0.1"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "3.1.2"); +``` + +#### 5.1.7 linkis-computation-governance-common adjustment + +org.apache.linkis.governance.common.conf.GovernanceCommonConf file adjustment + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "3.0.1") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "3.1.2") +``` + +## 6. HDP version adaptation + +### 6.1 HDP3.0.1 version + +| engine | version | +| -------------- | ------- | +| hadoop | 3.1.1 | +| hive | 3.1.0 | +| spark | 2.3.2 | +| json4s.version | 3.2.11 | + +#### 6.1.1 The pom file of linkis + +For Linkis version < 1.3.2 +```xml +3.1.1 +3.2.11 + + + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + +``` + +For Linkis version >= 1.3.2, we only need to set `json4s.version` if necessary +```java +3.2.11 +``` +Because we can directly compile with hadoop-3.3 or hadoop-2.7 profile. +Profile `hadoop-3.3` can be used for any hadoop3.x, default hadoop3.x version will be hadoop 3.3.1, +Profile `hadoop-2.7` can be used for any hadoop2.x, default hadoop2.x version will be hadoop 2.7.2, +other hadoop version can be specified by -Dhadoop.version=xxx +```text +mvn -N install +mvn clean install -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Phadoop-3.3 -Dhadoop.version=3.1.1 -Dmaven.test.skip=true +``` + +#### 6.1.2 The pom file of linkis-engineplugin-hive + +```xml +3.1.0 +``` + +#### 6.1.3 The pom file of linkis-engineplugin-spark + +For Linkis version < 1.3.2 +```xml +2.3.2 +``` + +For Linkis version >= 1.3.2 +```text +We can directly compile with spark-3.2 profile, if we need to use with hadoop3, then profile hadoop-3.3 will be needed. +default spark3.x version will be spark 3.2.1. if we compile with spark-3.2 then scala version will be 2.12.15 by default, +so we do not need to set the scala version in Linkis project pom file(mentioned in 5.1.1). +if spark2.x used with hadoop3, for compatibility reason, profile `spark-2.4-hadoop-3.3` need to be activated. +``` +```text +mvn -N install +mvn clean install -Pspark-3.2 -Phadoop-3.3 -Dmaven.test.skip=true +mvn clean install -Pspark-2.4-hadoop-3.3 -Phadoop-3.3 -Dmaven.test.skip=true +``` + +#### 6.1.4 linkis-label-common adjustment + +org.apache.linkis.manager.label.conf.LabelCommonConfig file adjustment + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "2.3.2"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "3.1.0"); +``` + +#### 6.1.5 linkis-computation-governance-common adjustment + +org.apache.linkis.governance.common.conf.GovernanceCommonConf file adjustment + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "2.3.2") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "3.1.0") +``` + +## 7 CDH Version adaptation + +### 7.1 maven Configure address + +#### 7.1.1 setting file + +```xml + + + + nexus-aliyun + *,!cloudera + Nexus aliyun + http://maven.aliyun.com/nexus/content/groups/public + + + aliyunmaven + *,!cloudera + Alibaba Cloud Public Warehouse + https://maven.aliyun.com/repository/public + + + aliyunmaven + *,!cloudera + spring-plugin + https://maven.aliyun.com/repository/spring-plugin + + + maven-default-http-blocker + external:http:* + Pseudo repository to mirror external repositories initially using HTTP. + http://0.0.0.0/ + true + + +``` + +#### 7.1.2 The pom file of linkis + +```xml + + + cloudera + https://repository.cloudera.com/artifactory/cloudera-repos/ + + true + + + + + aliyun + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + +``` + +### 7.2 CDH5.12.1 version + +| engine | version | +| --------- | --------------- | +| hadoop | 2.6.0-cdh5.12.1 | +| zookeeper | 3.4.5-cdh5.12.1 | +| hive | 1.1.0-cdh5.12.1 | +| spark | 2.3.4 | +| flink | 1.12.4 | +| python | python3 | + +#### 7.2.1 The pom file of linkis + +```xml +2.6.0-cdh5.12.1 +3.4.5-cdh5.12.1 +2.11.8 +``` + +#### 7.2.2 The pom file of linkis-engineplugin-hive + +```xml +-- update +1.1.0-cdh5.12.1 +-- add +1.1.0_cdh5.12.1 +``` + +- update assembly under distribution.xml file + +```xml +/dist/v${package.hive.version}/lib +dist/v${package.hive.version}/conf +plugin/${package.hive.version} +``` + +- update CustomerDelimitedJSONSerDe file + + ``` + /* hive version is too low and needs to be noted + case INTERVAL_YEAR_MONTH: + { + wc = ((HiveIntervalYearMonthObjectInspector) oi).getPrimitiveWritableObject(o); + binaryData = Base64.encodeBase64(String.valueOf(wc).getBytes()); + break; + } + case INTERVAL_DAY_TIME: + { + wc = ((HiveIntervalDayTimeObjectInspector) oi).getPrimitiveWritableObject(o); + binaryData = Base64.encodeBase64(String.valueOf(wc).getBytes()); + break; + } + */ + ``` + +#### 7.2.3 The pom file of linkis-engineplugin-flink + +```xml +1.12.4 +``` + +#### 7.2.4 The pom file of linkis-engineplugin-spark + +```xml +2.3.4 +``` + +#### 7.2.5 The pom file of linkis-engineplugin-python + +```xml +python3 +``` + +#### 7.2.6 linkis-label-common adjustment + +org.apache.linkis.manager.label.conf.LabelCommonConfig file adjustment + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "2.3.4"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "1.1.0"); + + CommonVars.apply("wds.linkis.python.engine.version", "python3") +``` + +#### 7.2.7 linkis-computation-governance-common adjustment + +org.apache.linkis.governance.common.conf.GovernanceCommonConf file adjustment + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "2.3.4") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "1.1.0") + + val PYTHON_ENGINE_VERSION = CommonVars("wds.linkis.python.engine.version", "python3") +``` + +### 7.3 CDH6.3.2 + +| engine | version | +| ------ | -------------- | +| hadoop | 3.0.0-cdh6.3.2 | +| hive | 2.1.1-cdh6.3.2 | +| spark | 3.0.0 | + +#### 7.3.1 The pom file of linkis + +```xml +3.0.0-cdh6.3.2 +2.12.10 +``` + +#### 7.3.2 The pom file of linkis-hadoop-common + +```xml + + + org.apache.hadoop + hadoop-hdfs-client + +``` + +#### 7.3.3 The pom file of linkis-engineplugin-hive + +```xml +-- update +2.1.1-cdh6.3.2 +-- add +2.1.1_cdh6.3.2 +``` + +update assembly under distribution.xml file + +```xml +/dist/v${package.hive.version}/lib +dist/v${package.hive.version}/conf +plugin/${package.hive.version} +``` + +#### 7.3.4 The pom file of linkis-engineplugin-spark + +```xml +3.0.0 +``` + +#### 7.3.5 linkis-label-common adjustment + +org.apache.linkis.manager.label.conf.LabelCommonConfig file adjustment + +```java + public static final CommonVars SPARK_ENGINE_VERSION = + CommonVars.apply("wds.linkis.spark.engine.version", "3.0.0"); + + public static final CommonVars HIVE_ENGINE_VERSION = + CommonVars.apply("wds.linkis.hive.engine.version", "2.1.1_cdh6.3.2"); +``` + +#### 7.3.6 linkis-computation-governance-common adjustment + +org.apache.linkis.governance.common.conf.GovernanceCommonConf file adjustment + +```java + val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "3.0.0") + + val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "2.1.1_cdh6.3.2") +``` + +## 8 Compilation Skills + +- If the class is missing or the method in the class is missing, find the corresponding package dependency, and how to try to switch to the version with the corresponding package or class +- If the engine version needs to use -, use _ to replace, addto specify the replaced version, and use ${package.(engine name). version} in the corresponding engine distribution file to replace the original +- If sometimes there is a 403 problem when using Alibaba Cloud images to download the jars of guava, you can switch to Huawei, Tencent and other image warehouses \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/_category_.json b/versioned_docs/version-1.4.0/development/_category_.json new file mode 100644 index 00000000000..c65e667aab3 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Development", + "position": 10.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/build-console.md b/versioned_docs/version-1.4.0/development/build-console.md new file mode 100644 index 00000000000..a6fcd2d6dc3 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/build-console.md @@ -0,0 +1,80 @@ +--- +title: How to Build Console +sidebar_position: 3.0 +--- + +## Start the process + +### 1. Install Node.js +Download Node.js to your computer and install it. Download link: [http://nodejs.cn/download/](http://nodejs.cn/download/) (It is recommended to use the latest stable version) +**This step only needs to be performed the first time you use it. ** + +### 2. The installation project +Execute the following commands in the terminal command line: + +``` +git clone git@github.com:apache/linkis.git +cd linkis/web +npm install +``` + +Introduction to the instruction: +1. Pull the project package from the remote git repository to the local computer +2. Enter the web root directory of the project: cd Linkis/web +3. Dependencies required to install the project: npm install + +**This step only needs to be performed the first time you use it. ** + +### 3. Configuration +:::caution +If it is a local runtime, this step can be skipped. +::: +You need to make some configuration in the code, such as the back-end interface address, etc., such as the .env.development file in the root directory: + +``` +// back-end interface address +VUE_APP_MN_CONFIG_PREFIX=http://yourIp:yourPort/yourPath +``` + +For specific explanation of the configuration, please refer to the official vue-cli document: [Environment Variables and Modes](https://cli.vuejs.org/zh/guide/mode-and-env.html#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%92%8C%E6%A8%A1%E5%BC%8F) + +### 4. Package the project +You can package the project by executing the following commands on the terminal command line to generate compressed code: + +``` +npm run build +``` + +After the command is successfully executed, a "dist" folder and a "*-${getVersion()}-dist.zip" compressed file will appear in the project web directory. The directory dist/dist is the packaged code. You can Put the folder directly into your static server, or refer to the installation document and use the script to deploy and install. + +### 5. Run the project +If you want to run the project on a local browser and change the code to view the effect, you need to execute the following commands in the terminal command line: + +``` +npm run serve +``` + +In the browser (Chrome browser is recommended) to access the application through the link: [http://localhost:8080/](http://localhost:8080/). +When you run the project in this way, the effect of your code changes will be dynamically reflected in the browser. + +**Note: Because the project is developed separately from the front and back ends, when running on a local browser, the browser needs to be set to cross domains to access the back-end interface. For specific setting, please refer to [solve the chrome cross domain problem](https://www.jianshu.com/p/56b1e01e6b6a).** + + + + +### 6. Common problem + +#### 6.1 npm install cannot succeed +If you encounter this situation, you can use the domestic Taobao npm mirror: + +``` +npm install -g cnpm --registry=https://registry.npm.taobao.org +``` + +Then, replace the npm install command by executing the following command + +``` +cnpm install +``` + +Note that when the project is started and packaged, you can still use the npm run build and npm run serve commands \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/build-docker.md b/versioned_docs/version-1.4.0/development/build-docker.md new file mode 100644 index 00000000000..d4e4215355e --- /dev/null +++ b/versioned_docs/version-1.4.0/development/build-docker.md @@ -0,0 +1,136 @@ +--- +title: How to Build Docker Image +sidebar_position: 4.0 +--- + +## Linkis Image Components + +Starting from version 1.3.0, Linkis introduces some Docker images, and the Dockerfile files for all the images are in the `linkis-dist/docker` directory. + +Images currently included as below: + +### linkis-base + + - __Dockerfile__: + - File: linkis.Dockerfile + - Arguments, which can be overridden with the `-build-arg` option of the `docker build` command: + * JDK_VERSION: JDK version, default is 1.8.0-openjdk + * JDK_BUILD_REVISION: JDK release version, default is 1.8.0.332.b09-1.el7_9 + - __Description__: Linkis service Base image for Linkis service, mainly used for pre-installation of external libraries, initialization of system environment and directory. This image does not need to be updated frequently, and can be used to speed up the creation of Linkis images by using docker's image caching mechanism. + +### linkis + - __Dockerfile__: + - File Name: linkis.Dockerfile + - Arguments: + * LINKIS_VERSION: Linkis Version, default is 0.0.0 + * LINKIS_SYSTEM_USER: System user, default is hadoop + * LINKIS_SYSTEM_UID: System user UID, default is 9001 + * LINKIS_HOME: Linkis home directory, default is /opt/linkis , the binary packages and various scripts will be deployed here + * LINKIS_CONF_DIR: Linkis configuration directory, default is /etc/linkis-conf + * LINKIS_LOG_DIR: Linkis log directory, default is /var/logs/linkis + - __Description__: Linkis service image, it contains binary packages of all components of Apache Linkis and various scripts. + +### linkis-web + - __Dockerfile__: + - File Name: linkis.Dockerfile + - Arguments: + * LINKIS_VERSION: Linkis Version, default is 0.0.0 + * LINKIS_HOME: Linkis home directory, default is /opt/linkis , Web 相关的包会被放置在 ${LINKIS_HOME}-web 下 + - __Description__: Linkis Web Console image, it contains binary packages and various scripts for the Apache Linkis web console, which uses nginx as the web server. + +### linkis-ldh + - __Dockerfile__: + - File Name: ldh.Dockerfile + - Arguments: + * JDK_VERSION: JDK version, default is 1.8.0-openjdk + * JDK_BUILD_REVISION: JDK release version, default is 1.8.0.332.b09-1.el7_9 + * LINKIS_VERSION: Linkis Version, default is 0.0.0 + * MYSQL_JDBC_VERSION: MySQL JDBC version, default is 8.0.28 + * HADOOP_VERSION: Apache Hadoop version, default is 2.7.2 + * HIVE_VERSION: Apache Hive version, default is 2.3.3 + * SPARK_VERSION: Apache Spark version, default is 2.4.3 + * SPARK_HADOOP_VERSION: Hadoop version suffix of pre-build Apache Spark distrubtion package, default is 2.7. This value cannot be set arbitrarily, and must be consistent with the official release version of Apache Spark, otherwise the relevant component cannot be downloaded automatically. + * FLINK_VERSION: Apache Flink version, default is 1.12.2 + * ZOOKEEPER_VERSION: Apache Zookeeper version, default is 3.5.9 + - __Description__: LDH is a test-oriented image, LDH image provides a complete, pseudo-distributed mode Apache Hadoop runtime environment, including HDFS, YARN, HIVE, Spark, Flink and Zookeeper. you can easily pull up a full-featured Hadoop environment in the development environment for testing Linkis functionality. The ENTRYPOINT of LDH image is in `linkis-dist/docker/scripts/entry-point-ldh.sh`, some initialization operations, such as format HDFS, are done in this script. + +### Integrate with MySQL JDBC driver + +Due to MySQL licensing restrictions, the official Linkis image does not integrate the MySQL JDBC driver, as a result, users need to by themselves put the MySQL JDBC driver into the container before using the Linkis. To simplify this process, we provide a Dockerfile: + +- File Name: linkis-with-mysql-jdbc.Dockerfile +- Arguments: + * LINKIS_IMAGE: Linkis image name with tag, based on which to create a custom image containing the MySQL JDBC driver, default is `linkis:dev` + * LINKIS_HOME: Linkis home directory, default is /opt/linkis + * MYSQL_JDBC_VERSION: MySQL JDBC version, default is 8.0.28 + +## Build Linkis Images + +> Because some Bash scripts are used in the image creation process, Linkis image packaging is currently only supported under Linux/MaxOS. + +### Building images with Maven + +Liniks images can be created using Maven commands. + +1. Build image `linkis` + + ``` shell + # Building a Linkis image without MySQL JDBC + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true + # Building a Linkis image contains MySQL JDBC + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.with.jdbc=true + ``` + Note: + * The `linkis-base` image will be built on the first build of the `linkis` image, and will not be rebuilt if the Dockerfile has not been modified; + * Due to the syntax of the Maven POM file, `linkis.build.with.jdbc` is a pseudo-boolean arguments, in fact `-Dlinkis.build.with.jdbc=false` is the same as `-Dlinkis.build.with.jdbc=true`, If you want to express `-Dlinkis.build.with.jdbc=false`, please just remove this arguments. Other arguments are similar. + +2. Build image `linkis-web` + + ``` shell + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.web=true + ``` + +3. Build image `linkis-ldh` + + ``` shell + $> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.ldh=true + ``` + + Note: + * In the process of creating this image, we downloaded the pre-built binary distribution of each hadoop components from the official site [Apache Archives](https://archive.apache.org/dist/). However, due to the network environment in China or other nation/region which is slow to visit Apache site, this approach can be very slow. If you have a faster mirror site, you can manually download the corresponding packages from these sites and move them to the following directory `${HOME}/.linkis-build-cache` to solve this problem. + +All of the above Arguments can be used in combination, so if you want to build all the images at once, you can use the following command: + +``` shell +$> ./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.web=true -Dlinkis.build.ldh=true +``` + +### Building images with `docker build` command + +It is much convenient to build an image with maven, but the build process introduces a lot of repetitive compilation process, which cause the whole process is rather long. If you only adjust the internal structure of the image, such as directory structure, initialization commands, etc., you can use the `docker build` command to quickly build the image for testing after the first time using the Maven command to build the image. + +An example of building a `linkis-ldh` image using the `docker build` command is as follows: + +``` shell +$> docker build -t linkis-ldh:dev --target linkis-ldh -f linkis-dist/docker/ldh.Dockerfile linkis-dist/target + +[+] Building 0.2s (19/19) FINISHED + => [internal] load build definition from ldh.Dockerfile 0.0s + => => transferring dockerfile: 41B 0.0s + => [internal] load .dockerignore 0.0s + => => transferring context: 2B 0.0s + => [internal] load metadata for docker.io/library/centos:7 0.0s + => [ 1/14] FROM docker.io/library/centos:7 0.0s + => [internal] load build context 0.0s + => => transferring context: 1.93kB 0.0s + => CACHED [ 2/14] RUN useradd -r -s ... 0.0s + => CACHED [ 3/14] RUN yum install -y ... 0.0s + ... + => CACHED [14/14] RUN chmod +x /usr/bin/start-all.sh 0.0s + => exporting to image 0.0s + => => exporting layers 0.0s + => => writing image sha256:aa3bde0a31bf704413fb75673fc2894b03a0840473d8fe15e2d7f7dd22f1f854 0.0s + => => naming to docker.io/library/linkis-ldh:dev +``` + +For other images, please refer to the relevant profile in `linkis-dist/pom.xml`. diff --git a/versioned_docs/version-1.4.0/development/build.md b/versioned_docs/version-1.4.0/development/build.md new file mode 100644 index 00000000000..ff9b0737599 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/build.md @@ -0,0 +1,190 @@ +--- +title: How to Build +sidebar_position: 2.0 +--- + +## 1. Preparation +**Environment requirements:** Version of JDK must be higher than **JDK8**, **Oracle/Sun** and **OpenJDK** are both supported. + +After obtaining the project code from [github repository](https://github.com/apache/linkis) https://github.com/apache/linkis, use maven to compile the project installation package. + +### 1.1 Source code acquisition + +- Method 1: Obtain the source code of the project from [github repository](https://github.com/apache/linkis) https://github.com/apache/linkis. +- Method 2: Download the source code package of the required version from the [linkis official download page](https://linkis.apache.org/download/main) https://linkis.apache.org/download/main. + +**Notice** : The official recommended versions for compiling Linkis are hadoop-2.7.2, hive-1.2.1, spark-2.4.3, and Scala-2.11.12. + +If you want to compile Linkis with another version of Hadoop, Hive, Spark, please refer to: [How to Modify Linkis dependency of Hadoop, Hive, Spark](#5-how-to-modify-the-hadoop-hive-and-spark-versions-that-linkis-depends-on) + +### 1.2 Modify dependency configuration +:::caution Note +Because the mysql-connector-java driver is under the GPL2.0 agreement and does not meet the license policy of the Apache open source agreement, starting from version 1.0.3, the scope of the dependency on mysql-connector-java is test by default. If you compile by yourself , You can modify the scope that the mysql-connector-java of the top-level pom.xml depends on (just comment it out) +::: +```xml + + mysql + mysql-connector-java + ${mysql.connector.version} + + +``` + +## 2. Fully compile Linkis + + + +### step1 Compile for the first time (not the first time you can skip this step) + +**If you are compiling and using it locally for the first time, you must first execute the following command in the root directory of the Linkis source code package**: +```bash + cd linkis-x.x.x + mvn -N install +``` + +### step2 Execute compilation +Execute the following commands in the root directory of the Linkis source code package: + +```bash + cd linkis-x.x.x + mvn clean install + +``` + +### step3 Obtain the installation package +The compiled complete installation package is in the linkis-dist->target directory of the project: + +```bash + #Detailed path is as follows + linkis-x.x.x/linkis-dist/target/apache-linkis-x.x.x-incubating-bin.tar.gz +``` + +## 3. Compile a single module + +### step1 Compile for the first time (skip this step for non-first time) +**If you are compiling and using it locally for the first time, you must first execute the following command in the root directory of the Linkis source code package**: + +```bash + cd linkis-x.x.x + mvn -N install +``` +### step2 Enter the corresponding module to compile +Enter the corresponding module to compile, for example, if you want to recompile Entrance, the command is as follows: + +```bash + cd linkis-x.x.x/linkis-computation-governance/linkis-entrance + mvn clean install +``` + +### step3 Obtain the installation package +Get the installation package, there will be a compiled package in the ->target directory of the corresponding module: + +``` + linkis-x.x.x/linkis-computation-governance/linkis-entrance/target/linkis-entrance.x.x.x.jar +``` + +## 4. Compile an engine + +Here's an example of the Spark engine that builds Linkis: + +### step1 Compile for the first time (skip this step for non-first time) +**If you are using it locally for the first time, you must first execute the following command in the root directory of the Linkis source code package**: + +```bash + cd linkis-x.x.x + mvn -N install +``` +### step2 Enter the corresponding module to compile +Enter the directory where the Spark engine is located to compile and package, the command is as follows: + +```bash + cd linkis-x.x.x/linkis-engineconn-pluginsspark + mvn clean install +``` +### step3 Obtain the installation package +Get the installation package, there will be a compiled package in the ->target directory of the corresponding module: + +``` + linkis-x.x.x/linkis-engineconn-pluginsspark/target/linkis-engineplugin-spark-x.x.x.jar +``` + +How to install Spark engine separately? Please refer to [Linkis Engine Plugin Installation Document](../deployment/install-engineconn) + +## 5. How to modify the Hadoop, Hive, and Spark versions that Linkis depends on + +Please note: Hadoop is a big data basic service, Linkis must rely on Hadoop for compilation; +If you don't want to use an engine, you don't need to set the version of the engine or compile the engine plug-in. + +Specifically, the version of Hadoop can be modified in a different way than Spark, Hive, and other computing engines, as described below: + +### 5.1 How to modify the Hadoop version that Linkis depends on + +Enter the source package root directory of Linkis, and manually modify the Hadoop version information of the pom.xml file, as follows: + +```bash + cd linkis-x.x.x + vim pom.xml +``` + +```xml + + + 2.7.2 Modify the Hadoop version number here <--> + 2.11.12 + 1.8 + + +``` + +**Please note: If your hadoop version is hadoop3, you need to modify the pom file of linkis-hadoop-common** +Because under hadoop2.8, hdfs-related classes are in the hadoop-hdfs module, but in hadoop 3.X the corresponding classes are moved to the module hadoop-hdfs-client, you need to modify this file: +pom:Linkis/linkis-commons/linkis-hadoop-common/pom.xml +Modify the dependency hadoop-hdfs to hadoop-hdfs-client: +``` + + org.apache.hadoop + hadoop-hdfs + ${hadoop.version} + + Modify hadoop-hdfs to: + + org.apache.hadoop + hadoop-hdfs-client + ${hadoop.version} + +``` + +### 5.2 How to modify the Spark and Hive versions that Linkis depends on + +Here's an example of changing the version of Spark. Go to the directory where the Spark engine is located and manually modify the Spark version information of the pom.xml file as follows: + +```bash + cd linkis-x.x.x/linkis-engineconn-pluginsspark + vim pom.xml +``` + +```xml + + 2.4.3 Modify the Spark version number here <--> + +``` + +Modifying the version of other engines is similar to modifying the Spark version. First, enter the directory where the relevant engine is located, and manually modify the engine version information in the pom.xml file. + +Then please refer to [4. Compile an engine](#4-compile-an-engine) + +## 6. How to exclude the specified engines during fully compile +You can use the `-pl` option of `mvn` command, please refer below for details +``` +-pl,--projects Comma-delimited list of specified + reactor projects to build instead + of all projects. A project can be + specified by [groupId]:artifactId + or by its relative path. +``` +Implement the reverse selection by using `!` to exclude the given engines so that shorten the consumed time for fully compile. +Here we take flink, sqoop and hive as an example, and exclude them during fully compile: +``` +mvn clean install -Dmaven.test.skip=true \ +-pl '!linkis-engineconn-plugins/flink,!linkis-engineconn-plugins/sqoop,!linkis-engineconn-plugins/hive' +``` diff --git a/versioned_docs/version-1.4.0/development/config.md b/versioned_docs/version-1.4.0/development/config.md new file mode 100644 index 00000000000..2e025aa039d --- /dev/null +++ b/versioned_docs/version-1.4.0/development/config.md @@ -0,0 +1,131 @@ +--- +title: Configuration Parameters +sidebar_position: 10.0 +--- + +## 1. Parameter classification + +        Linkis parameters are mainly divided into the following three parts: +1. Linkis server parameters, mainly including the parameters of Linkis itself and the parameters of Spring +2. Parameters submitted by client calls such as Linkis SDK and Restful +3. Linkis console parameters + + +## 2. Linkis server parameters + +1. Parameters of Linkis itself +         The parameters of linkis itself can be set in the configuration file, or through environment variables and system properties. It is recommended to use the configuration file to set. + The Linkis configuration file format is as follows: +```shell +├── conf configuration directory +│ ├── application-eureka.yml +│ ├── application-linkis.yml +│ ├── linkis-cg-engineconnmanager-io.properties +│ ├── linkis-cg-engineconnmanager.properties +│ ├── linkis-cg-engineplugin.properties +│ ├── linkis-cg-entrance.properties +│ ├── linkis-cg-linkismanager.properties +│ ├── linkis.properties ── linkis global properties +│ ├── linkis-ps-bml.properties +│ ├── linkis-ps-cs.properties +│ ├── linkis-ps-datasource.properties +│ ├── linkis-ps-publicservice.properties +│ ├── log4j2.xml +```` +Each service will load two property configuration files, a common main configuration file linkis.properties, and a service configuration file linkis-serviceName.properties. The priority of the setting is that the service configuration file is higher than the main configuration file +It is recommended that general parameters be placed in the main configuration file, and personalized configuration files be placed in the service configuration file + +2. Spring parameters +         Linkis service is based on SpringBoot application, Spring related parameters can be set in application-linkis.yml or in linkis configuration file. The configuration in the linkis configuration file needs to be prefixed with spring. as follows: + +```shell +# spring port default +server.port=9102 +# in linkis conf need spring prefix +spring.server.port=9102 + +```` + +## 3. Linkis client parameters +        Linkis client parameters mainly refer to the parameters when the task is submitted, mainly the parameters specified in the submission interface. +1. How restful sets parameters: + +```shell +{ + "executionContent": {"code": "show tables", "runType": "sql"}, + "params": { // submit parameters + "variable":{ //Custom variables needed in the code + "k1":"v1" + }, + "configuration":{ + "special":{ //Special configuration parameters such as log path, result set path, etc. + "k2":"v2" + }, + "runtime":{ //Runtime parameters, execution configuration parameters, such as database connection parameters of JDBC engine, data source parameters of presto engine + "k3":"v3" + }, + "startup":{ //Startup parameters, such as memory parameters for starting EC, spark engine parameters, hive engine parameters, etc. + "k4":"v4" For example: spark.executor.memory:5G Set the Spark executor memory, the underlying Spark, hive and other engine parameters keyName are consistent with the native parameters + } + } + }, + "labels": { //Label parameters, support setting engine version, user and application + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +```` +2. How to set parameters in SDK: + +````java +JobSubmitAction jobSubmitAction = JobSubmitAction.builder() + .addExecuteCode(code) + .setStartupParams(startupMap) //Startup parameters, such as memory parameters for starting EC, spark engine parameters, hive engine parameters, etc., such as: spark.executor.memory:5G Set the Spark executor memory, the underlying Spark, hive and other engine parameters keyName is the same as the original parameter + .setRuntimeParams(runTimeMap) //Engine, execute configuration parameters, such as database connection parameters of JDBC engine, data source parameters of presto engine + .setVariableMap(varMap) //Custom variables needed in the code + .setLabels(labels) //Label parameters, support setting engine version, user and application, etc. + .setUser(user) //submit user + .addExecuteUser(user) // execute user + .build(); +```` +3. How linkis-cli sets parameters + +```shell +linkis-cli -runtieMap key1=value -runtieMap key2=value + -labelMap key1=value + -varMap key1=value + -startUpMap key1=value + +```` +Note: When submitting client parameters, only engine-related parameters, tag parameters, and Yarn queue settings can take effect. Other Linkis server-side parameters and resource limit parameters, such as task and engine concurrency parameters wds.linkis.rm.instances do not support task settings + +4. Common label parameters: + +```shell + Map labels = new HashMap(); + labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-2.4.3"); // Specify engine type and version + labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, user + "-IDE");// Specify the running user and your APPName + labels.put(LabelKeyConstant.CODE_TYPE_KEY, "sql"); // Specify the type of script to run: spark supports: sql, scala, py; Hive: hql; shell: sh; python: python; presto: psql + labels.put(LabelKeyConstant.JOB_RUNNING_TIMEOUT_KEY, "10000");//The job runs for 10s and automatically initiates Kill, the unit is s + labels.put(LabelKeyConstant.JOB_QUEUING_TIMEOUT_KEY, "10000");//The job is queued for more than 10s and automatically initiates Kill, the unit is s + labels.put(LabelKeyConstant.RETRY_TIMEOUT_KEY, "10000");//The waiting time for the job to retry due to resources and other reasons, the unit is ms. If it fails due to insufficient queue resources, it will initiate 10 retries at intervals by default + labels.put(LabelKeyConstant.TENANT_KEY,"hduser02");//Tenant label, if the tenant parameter is specified for the task, the task will be routed to a separate ECM machine + labels.put(LabelKeyConstant.EXECUTE_ONCE_KEY,"");//Execute the label once, this parameter is not recommended to be set. After setting, the engine will not reuse the task and the engine will end after running. Only a certain task parameter can be specialized. set up +```` + +## 4. Linkis console parameters +        Linkis management console parameters are convenient for users to specify resource limit parameters and default task parameters. The web interface provided is as follows: +Global configuration parameters: +![](/Images/development/linkis_global_conf.png) +It mainly includes the global queue parameter [wds.linkis.rm.yarnqueue], the Yarn queue used by the task by default, which can be specified in the client StartUPMap. +Resource limit parameters, these parameters do not support task settings, but can be adjusted by the management console. +```shell +Queue CPU usage upper limit [wds.linkis.rm.yarnqueue.cores.max], currently only supports limit the usage of total queue resources for Spark type tasks +Queue memory usage limit [wds.linkis.rm.yarnqueue.memory.max] +The upper limit of the global memory usage of each engine [wds.linkis.rm.client.memory.max] This parameter does not refer to the total memory that can only be used, but specifies the total memory usage of a specific engine of a Creator, such as limiting the IDE-SPARK task to only Can use 10G memory +The maximum number of global engine cores [wds.linkis.rm.client.core.max] This parameter does not refer to the total number of CPUs that can only be used, but specifies the total memory usage of a specific engine of a Creator, such as limiting IDE-SPARK tasks Can only use 10Cores +The maximum concurrent number of each engine in the world [wds.linkis.rm.instance], this parameter has two meanings, one is to limit how many a Creator-specific engine can start in total, and to limit the tasks that a Creator-specific engine task can run at the same time number +```` +Engine configuration parameters: +![](/Images/development/linkis_creator_ec_conf.png) +It mainly specifies the startup parameters and runtime parameters of the engine. These parameters can be set on the client side. It is recommended to use the client side for personalized submission settings. Only the default values ​​are set on the page. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/debug-with-helm-charts.md b/versioned_docs/version-1.4.0/development/debug-with-helm-charts.md new file mode 100644 index 00000000000..70e4c9187d3 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/debug-with-helm-charts.md @@ -0,0 +1,507 @@ +--- +title: Development & Debugging with Kubernetes +sidebar_position: 6.0 +--- + +## Preface + +This document describes how to use Kubernetes technology to simplify the development and debugging of Linkis projects. Before the introduction of Kubernetes tools, debugging Linkis was a very tedious and complex task, and sometimes it might be necessary to set up a Hadoop cluster for test. To improve this problem, we introduce an alternative approach , using Kubernetes technology, to create a Hadoop cluster on the development machine and pull up all Linkis services, which is a distributed environment and can be pulled up and destroyed at any time, and the developer connects to these services to performs step-by-step debugging through the JVM remote debugger. Here we use the following technologies: + +* Docker: A containerization technology to support the creation and use of Linux containers; +* Kubernetes: An open source platform that automates the deployment and management of Linux containers, Kubernetes also integrates networking, storage, security, telemetry and other services to provide a comprehensive container-based infrastructure; +* KinD: A tool that uses Docker containers as "Kubernetes nodes" to run local Kubernetes clusters; +* Helm: An open source package management tool on Kubernetes that manages user resources on Kubernetes via the Helm command line tool and installation package (Chart); + +## Introduction to Dependency Tools + +### Version Requirements + +* [Docker](https://docs.docker.com/get-docker/), minimum version v20.10.8+ +* [Kubernetes](https://kubernetes.io/docs/setup/), minimum version v1.21.0+ +* [Helm](https://helm.sh/docs/intro/install/), minimum version v3.0.0+. +* [KinD](https://kind.sigs.k8s.io/docs/user/quick-start/), minimum version v0.11.0+. + +### Introduction to Helm Charts + +Helm is an open source package management tool on Kubernetes. Helm's original goal was to provide users with a better way to manage all Kubernetes YAML files created on Kubernetes. When using Charts, the user provides a variable file, Helm uses the variables defined in this variable file to render the corresponding Chart, produce a Kubernetes YAML file, and then invoke the Kubernetes api to create the resources. Each Charts released to Kubernetes is called a Release, and a Chart can typically be installed multiple times into the same cluster, with a new Release being created each time it is installed. + +Helm is relatively simple to install, please refer to the official documentation for installation: [Installing Helm](https://helm.sh/docs/intro/install/) + +### Introduction to KinD + +Creating a Kubernetes test environment locally is a very common requirement, and the Kubernetes community offers a variety of solutions, such as MiniKube or MicroK8s. KinD, as the name suggests (Kubernetes in Docker), it uses Docker container to host nodes to create a test-oriented Kubernetes cluster. + +KinD Architecture + +![](/Images/development/kind-arc.png) + +Deploying KinD is also very easy, please refer to the official deployment documentation: [KinD Installation](https://kind.sigs.k8s.io/docs/user/quick-start/#installation), please install Docker before install KinD. + +> ⚠️ Note: +> KinD is a tool for testing purposes and cannot be used for production deployments. For example, KinD clusters cannot be used after the development machine is rebooted and need to be recreated (because KinD performs a series of initialization tasks after the Node container is created, which cannot be automatically reverted after the machine is rebooted). + +## Linkis Containerized Components + +### Linkis Images + +Linkis provides several images, all of which have their Dockerfile and related scripts in the `linkis-dist/docker` directory. Linkis images include the following. + +* `linkis`: The Linkis service image, which contains binary packages of all components of Apache Linkis and various scripts. +* `linkis-web`: Linkis Web console image, which contains the binary packages and various scripts of the Apache Linkis Web console, using nginx as the web server. +* `linkis-ldh`: LDH is a test-oriented image, LDH image provides a complete, pseudo-distributed mode Apache Hadoop runtime environment, including HDFS, YARN, HIVE, Spark, Flink and Zookeeper, can be easily pulled up in the development environment of a fully real Hadoop environment to test the functionality of Linkis. + +For details, please refer to: [Linkis Docker Image Package](https://linkis.apache.org/zh-CN/docs/latest/development/linkis_docker_build_instrument). + +### Linkis Helm Chart + +Linkis Helm Chart is a Helm installation package developed according to the Helm Chart specification and is located in the `linkis-dist/helm` directory. The module directory structure is as follows: + +``` shell +linkis-dist/helm +├── charts # Charts directory, currently only contains Linkis Helm Chart +│ └── linkis # Linkis Helm Chart directory +│ ├── Chart.yaml # - Chart metadata +│ ├── templates # - Chart template file containing Kubernetes YAML templates for all linkis components +│ │ ├── NOTES.txt # - Chart notes +│ │ ├── _helpers.tpl # - Chart variable helper templates +│ │ ├── configmap-init-sql.yaml # - Database initialization SQL script template +│ │ ├── configmap-linkis-config.yaml # - Linkis service configuration file template +│ │ ├── configmap-linkis-web-config.yaml # - Linkis Web Console configuration file template +│ │ ├── jobs.yaml # - Kubernetes Job template, currently only includes a database initialization job, the database +| | | # initialization SQL script will be executed by the job +│ │ ├── linkis-cg-engineconnmanager.yaml # - Linkis EngineConnManager deployment template, which is a Kubernetes Deployment type workload +│ │ ├── linkis-cg-engineplugin.yaml # - Linkis EngineConn deployment template, a Kubernetes Deployment type workload +│ │ ├── linkis-cg-entrance.yaml # - Linkis Entrance deployment template, a Kubernetes Deployment type workload +│ │ ├── linkis-cg-linkismanager.yaml # - Linkis Manager deployment template, a Kubernetes Deployment type workload +│ │ ├── linkis-mg-eureka.yaml # - Linkis Eureka deployment template, a Kubernetes Statefulset type workload +│ │ ├── linkis-mg-gateway.yaml # - Linkis Gateway deployment template, a Kubernetes Deployment type workload +│ │ ├── linkis-ps-publicservice.yaml # - Linkis PublicService deployment template, a Kubernetes Deployment type workload +│ │ ├── linkis-web.yaml # - Linkis Web Console deployment template, a Kubernetes Deployment type workload +│ │ └── serviceaccount.yaml # - Linkis related Kubernetes Service Account template +│ └── values.yaml # - Linkis Helm Chart variable file, which provides Linkis Local schema related variables by default +├── scripts # Some tool scripts to simplify development and debugging +│ ├── common.sh # - public scripts, defining some public methods and variables +│ ├── create-kind-cluster.sh # - Creates KinD clusters +│ ├── install-charts-with-ldh.sh # - Deploy Linkis service on KinD cluster, using On-LDH deployment method, calling install-linkis.sh +│ ├── install-charts.sh # - Deploy Linkis service on KinD cluster, use Local deployment method, call install-linkis.sh +│ ├── install-ldh.sh # - Deploy LDH deployments on KinD clusters +│ ├── install-linkis.sh # - Deploy the Linkis service on the KinD cluster, either in Local or On-LDH mode +│ ├── install-mysql.sh # - Deploy a MySQL instance on the KinD cluster +│ ├── login-pod.sh # - Login to a Pod and open Bash for interaction +│ ├── remote-debug-proxy.sh # - Turn on the JVM remote debug proxy +│ └── resources # - some resource files +│ ├── kind-cluster.yaml # - KinD cluster configuration, default is single Node +│ ├── ldh # - LDH related resource files +│ │ │ ├── configmaps # - LDH configuration files for each component +│ │ │ │ ├── configmap-flink.yaml # - Flink configuration file +│ │ │ │ ├── configmap-hadoop.yaml # - Hdfs & Yarn configuration file +│ │ │ ├── configmap-hive.yaml # - Hive configuration file +│ │ │ ├── configmap-spark.yaml # - Spark configuration file +│ │ │ └── configmap-zookeeper.yaml # - Zookeeper configuration file +│ │ └── ldh.yaml # - LDH Kubernetes YAML, used to deploy LDH instances on KinD +│ └── mysql.yaml # - MySQL Kubernetes YAML, for deploying MySQL instances on KinD + +``` + +This project provides a set of tool scripts for quickly creating a Linkis environment for development testing. For production deployment, you need to modify the `values.yaml` file according to the actual cluster, and then deploy it using the Helm CLI. There are two common approaches to deploying with the Helm CLI: + +1. deploy directly using the `helm install` command. This is suitable for non-customized deployments. +2. use the `helm template` command to generate Kubernetes YAML files, then manually modify these files, add custom configuration, and then deploy using the `kubectl apply` command. For advanced users who need to customize Kubernetes features that are not supported by Linkis Helm Charts, such as the need to use specific StorageClass or PVs. + +### LDH + +LDH is a Hadoop cluster image for testing purposes, which provides a pseudo-distributed hadoop cluster for quick testing of On Hadoop deployment mode. +This image contains the following hadoop components, and the default mode of the engine in LDH is on-yarn. + +* Hadoop 2.7.2 , included HDFS and YARN +* Hive 2.3.3 +* Spark 2.4.3 +* Flink 1.12.2 +* ZooKeeper 3.5.9 + +LDH will start some initialization operations, such as format hdfs, create the initialization directory on HDFS, etc., these operations are defined in `linkis-dist/docker/scripts/entry-point-ldh.sh` file, add, modify, delete some initialization operations need to recreate LDH image to take effect. + +In addition, the Hive component in LDH depends on external MySQL instance, you need to deploy MySQL instance first before you can use the Hive component in LDH. + +```shell +# Create a KinD cluster and deploy Linkis and LDH instances +$> sh ./scripts/create-kind-cluster.sh \ + && sh ./scripts/install-mysql.sh \ + && sh ./scripts/install-ldh.sh + +# Quick Experience on LDH +$> kubectl exec -it -n ldh $(kubectl get pod -n ldh -o jsonpath='{.items[0].metadata.name}') -- bash + +[root@ldh-96bdc757c-dnkbs /]# hdfs dfs -ls / +Found 4 items +drwxrwxrwx - root supergroup 0 2022-07-31 02:48 /completed-jobs +drwxrwxrwx - root supergroup 0 2022-07-31 02:48 /spark2-history +drwxrwxrwx - root supergroup 0 2022-07-31 02:49 /tmp +drwxrwxrwx - root supergroup 0 2022-07-31 02:48 /user + +[root@ldh-96bdc757c-dnkbs /]# beeline -u jdbc:hive2://ldh.ldh.svc.cluster.local:10000/ -n hadoop +Connecting to jdbc:hive2://ldh.ldh.svc.cluster.local:10000/ +Connected to: Apache Hive (version 2.3.3) +Driver: Hive JDBC (version 2.3.3) +Transaction isolation: TRANSACTION_REPEATABLE_READ +Beeline version 2.3.3 by Apache Hive +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> create database demo; +No rows affected (1.306 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> use demo; +No rows affected (0.046 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> create table t1 (id int, data string); +No rows affected (0.709 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> insert into t1 values(1, 'linikis demo'); +WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases. +No rows affected (5.491 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> select * from t1; ++--------+---------------+ +| t1.id | t1.data | ++--------+---------------+ +| 1 | linikis demo | ++--------+---------------+ +1 row selected (0.39 seconds) +0: jdbc:hive2://ldh.ldh.svc.cluster.local:100> !q + +[root@ldh-96bdc757c-dnkbs /]# spark-sql +22/07/31 02:53:18 INFO hive.metastore: Trying to connect to metastore with URI thrift://ldh.ldh.svc.cluster.local:9083 +22/07/31 02:53:18 INFO hive.metastore: Connected to metastore. +... +22/07/31 02:53:19 INFO spark.SparkContext: Running Spark version 2.4.3 +22/07/31 02:53:19 INFO spark.SparkContext: Submitted application: SparkSQL::10.244.0.6 +... +22/07/31 02:53:27 INFO yarn.Client: Submitting application application_1659235712576_0001 to ResourceManager +22/07/31 02:53:27 INFO impl.YarnClientImpl: Submitted application application_1659235712576_0001 +22/07/31 02:53:27 INFO cluster.SchedulerExtensionServices: Starting Yarn extension services with app application_1659235712576_0001 and attemptId None +22/07/31 02:53:28 INFO yarn.Client: Application report for application_1659235712576_0001 (state: ACCEPTED) +... +22/07/31 02:53:36 INFO yarn.Client: Application report for application_1659235712576_0001 (state: RUNNING) +... +Spark master: yarn, Application Id: application_1659235712576_0001 +22/07/31 02:53:46 INFO thriftserver.SparkSQLCLIDriver: Spark master: yarn, Application Id: application_1659235712576_0001 +spark-sql> use demo; +Time taken: 0.074 seconds +22/07/31 02:58:02 INFO thriftserver.SparkSQLCLIDriver: Time taken: 0.074 seconds +spark-sql> select * from t1; +... +1 linikis demo +2 linkis demo spark sql +Time taken: 3.352 seconds, Fetched 2 row(s) +spark-sql> quit; + +[root@ldh-96bdc757c-dnkbs /]# zkCli.sh +Connecting to localhost:2181 +Welcome to ZooKeeper! +JLine support is enabled +WATCHER:: + +WatchedEvent state:SyncConnected type:None path:null + +[zk: localhost:2181(CONNECTED) 0] get -s /zookeeper/quota + +cZxid = 0x0 +ctime = Thu Jan 01 00:00:00 UTC 1970 +mZxid = 0x0 +mtime = Thu Jan 01 00:00:00 UTC 1970 +pZxid = 0x0 +cversion = 0 +dataVersion = 0 +aclVersion = 0 +ephemeralOwner = 0x0 +dataLength = 0 +numChildren = 0 +[zk: localhost:2181(CONNECTED) 1] quit + +# Start a Flink job in per-job cluster mode +[root@ldh-96bdc757c-dnkbs /]# HADOOP_CLASSPATH=`hadoop classpath` flink run -t yarn-per-job /opt/ldh/current/flink/examples/streaming/TopSpeedWindowing.jar +# Start Flink jobs in session mode, +# Flink session is started when LDH Pod starts. +[root@ldh-96bdc757c-dnkbs /]# flink run /opt/ldh/current/flink/examples/streaming/TopSpeedWindowing.jar +Executing TopSpeedWindowing example with default input data set. +Use --input to specify file input. +Printing result to stdout. Use --output to specify output path. +... +``` + +### KinD Cluster + +The default KinD cluster description file used by the Linkis project is `linkis-dist/helm/scripts/resources/kind-cluster.yaml`, which creates a KinD cluster with one node by default. Multiple nodes can be added by remove the comments. + +> ⚠️Note that KinD clusters are for testing purposes only. + +``` yaml +# linkis-dist/helm/scripts/resources/kind-cluster.yaml +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: + - role: control-plane + extraMounts: + - hostPath: ${KIND_CLUSTER_HOST_PATH} # Points to a directory on the development machine. This directory + # is mapped to the `/data` directory in the Kind Node container, which + # Linkis Helm Charts uses by default as the data directory to mount into + # the Pod of each Linkis component. When Linkis is deployed in Local mode, + # all components actually use the same directory on the development machine + # as if they were on the same machine, thus emulating the behavior of Local + # mode. When deployed in On-Hadoop mode, this directory is not used. + containerPath: /data +# - role: worker # Remove comments to add 2 KinD nodes. Adding KinD nodes increases the time + # it takes to load Docker images to the KinD cluster, so it is not turned on + # by default. +# extraMounts: +# - hostPath: ${KIND_CLUSTER_HOST_PATH} +# containerPath: /data +# - role: worker +# extraMounts: +# - hostPath: ${KIND_CLUSTER_HOST_PATH} +# containerPath: /data + +``` + +## Developing and Debugging with Linkis Containerized Components + +The following steps describe how to develop and debug using Linkis containerized components (currently only supported for Linux and MacOS). Please confirm the following before proceeding. +1. whether the Docker engine is already installed on the development machine +2. whether Helm is installed on the development machine +3. whether KinD has been installed on the development machine +4. whether the Linkis image has been created as described in [Linkis Docker image packaging](https://linkis.apache.org/zh-CN/docs/latest/development/linkis_docker_build_instrument) + +### Create Debugging Environment + +This step will create a KinD cluster and deploy MySQL, Linkis and LDH instances on it. + +``` shell +$> cd linkis-dist/helm +$> sh ./scripts/create-kind-cluster.sh \ +> && sh ./scripts/install-mysql.sh \ +> && sh ./scripts/install-ldh.sh \ +> && sh ./scripts/install-charts-with-ldh.sh + +# Creating KinD cluster ... +- kind cluster config: /var/folders/9d/bb6ggdm177j25q40yf5d50dm0000gn/T/kind-XXXXX.Fc2dFJbG/kind-cluster.yaml +... +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: + - role: control-plane + extraMounts: + - hostPath: /var/folders/9d/bb6ggdm177j25q40yf5d50dm0000gn/T/kind-XXXXX.Fc2dFJbG/data + containerPath: /data +... +Creating cluster "test-helm" ... + ✓ Ensuring node image (kindest/node:v1.21.1) 🖼 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 +Set kubectl context to "kind-test-helm" +You can now use your cluster with: + +kubectl cluster-info --context kind-test-helm + +Have a nice day! 👋 +# Loading MySQL image ... +Image: "mysql:5.7" with ID "sha256:3147495b3a5ce957dee2319099a8808c1418e0b0a2c82c9b2396c5fb4b688509" not yet present on node "test-helm-control-plane", loading... +# Deploying MySQL ... +namespace/mysql created +service/mysql created +deployment.apps/mysql created +# LDH version: dev +# Loading LDH image ... +Image: "linkis-ldh:dev" with ID "sha256:aa3bde0a31bf704413fb75673fc2894b03a0840473d8fe15e2d7f7dd22f1f854" not yet present on node "test-helm-control-plane", loading... +# Deploying LDH ... +namespace/ldh created +configmap/flink-conf created +configmap/hadoop-conf created +configmap/hive-conf created +configmap/spark-conf created +configmap/zookeeper-conf created +service/ldh created +deployment.apps/ldh created +# Loading Linkis image ... +Image: "linkis:dev" with ID "sha256:0dfa7882c4216305a80cf57efa8cfb483d006bae5ba931288ffb8025e1db4e58" not yet present on node "test-helm-control-plane", loading... +Image: "linkis-web:dev" with ID "sha256:1dbe0e9319761dbe0e93197665d38077cb2432b8b755dee834928694875c8a22" not yet present on node "test-helm-control-plane", loading... +# Installing linkis, image tag=dev,local mode=false ... +NAME: linkis-demo +NAMESPACE: linkis +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +... + +--- +Welcome to Apache Linkis (v1.3.0)! + +.___ .___ .______ .____/\ .___ .________ +| | : __|: \ : / \: __|| ___/ +| | | : || ||. ___/| : ||___ \ +| |/\ | || | || \ | || / +| / \| ||___| || \| ||__:___/ +|______/|___| |___||___\ /|___| : v1.3.0 + \/ + +Linkis builds a layer of computation middleware between upper applications and underlying engines. +Please visit https://linkis.apache.org/ for details. + +Enjoy! +configmap/flink-conf created +configmap/hadoop-conf created +configmap/hive-conf created +configmap/spark-conf created +configmap/zookeeper-conf created + +$> kubectl get pods -n ldh -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +ldh-6648554447-ml2bn 1/1 Running 0 6m25s 10.244.0.6 test-helm-control-plane + +$> kubectl get pods -n linkis -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +init-db-bcp85 0/1 Completed 0 4m52s 10.244.0.14 test-helm-control-plane +linkis-demo-cg-engineconnmanager-659bf85689-ddvhw 1/1 Running 1 4m52s 10.244.0.7 test-helm-control-plane +linkis-demo-cg-engineplugin-98bd6945-tsgjl 1/1 Running 1 4m52s 10.244.0.10 test-helm-control-plane +linkis-demo-cg-entrance-858f74c868-xrd82 1/1 Running 0 4m52s 10.244.0.12 test-helm-control-plane +linkis-demo-cg-linkismanager-6f96f69b8b-ns6st 1/1 Running 0 4m52s 10.244.0.11 test-helm-control-plane +linkis-demo-mg-eureka-0 1/1 Running 0 4m52s 10.244.0.13 test-helm-control-plane +linkis-demo-mg-gateway-68ddb8c547-xgvhn 1/1 Running 0 4m52s 10.244.0.15 test-helm-control-plane +linkis-demo-ps-publicservice-6bbf99fcd7-sc922 1/1 Running 0 4m52s 10.244.0.8 test-helm-control-plane +linkis-demo-web-554bd7659f-nmdjl 1/1 Running 0 4m52s 10.244.0.9 test-helm-control-plane + +``` + +### Debugging Components + +#### Enable Port Forwarding + +Each component has a JVM remote debug port of 5005 within the container, and these ports are mapped to different ports on the host as follows. +* mg-eureka: 5001 +* mg-gateway: 5002 +* ps-publicservice: 5004 +* cg-linkismanager: 5007 +* cg-entrance: 5008 +* cg-engineconnmanager: 5009 +* cg-engineplugin: 5010 + +In addition, the Web Console is mapped to port 8087 on the host, which can be accessed by typing `http://localhost:8087` in your browser. + +``` shell +$> ./scripts/remote-debug-proxy.sh start +- starting port-forwad for [web] with mapping [local->8087:8087->pod] ... +- starting port-forwad for [mg-eureka] with mapping [local->5001:5005->pod] ... +- starting port-forwad for [mg-gateway] with mapping [local->5002:5005->pod] ... +- starting port-forwad for [ps-publicservice] with mapping [local->5004:5005->pod] ... +- starting port-forwad for [cg-linkismanager] with mapping [local->5007:5005->pod] ... +- starting port-forwad for [cg-entrance] with mapping [local->5008:5005->pod] ... +- starting port-forwad for [cg-engineconnmanager] with mapping [local->5009:5005->pod] ... +- starting port-forwad for [cg-engineplugin] with mapping [local->5010:5005->pod] .. + +$> ./scripts/remote-debug-proxy.sh list +user 10972 0.0 0.1 5052548 31244 s001 S 12:57AM 0:00.10 kubectl port-forward -n linkis pod/linkis-demo-cg-engineplugin-98bd6945-tsgjl 5010:5005 --address=0.0.0.0 +user 10970 0.0 0.1 5053060 30988 s001 S 12:57AM 0:00.12 kubectl port-forward -n linkis pod/linkis-demo-cg-engineconnmanager-659bf85689-ddvhw 5009:5005 --address=0.0.0.0 +user 10968 0.0 0.1 5054084 30428 s001 S 12:57AM 0:00.10 kubectl port-forward -n linkis pod/linkis-demo-cg-entrance-858f74c868-xrd82 5008:5005 --address=0.0.0.0 +user 10966 0.0 0.1 5053316 30620 s001 S 12:57AM 0:00.11 kubectl port-forward -n linkis pod/linkis-demo-cg-linkismanager-6f96f69b8b-ns6st 5007:5005 --address=0.0.0.0 +user 10964 0.0 0.1 5064092 31152 s001 S 12:57AM 0:00.10 kubectl port-forward -n linkis pod/linkis-demo-ps-publicservice-6bbf99fcd7-sc922 5004:5005 --address=0.0.0.0 +user 10962 0.0 0.1 5051012 31244 s001 S 12:57AM 0:00.12 kubectl port-forward -n linkis pod/linkis-demo-mg-gateway-68ddb8c547-xgvhn 5002:5005 --address=0.0.0.0 +user 10960 0.0 0.1 5053060 31312 s001 S 12:57AM 0:00.13 kubectl port-forward -n linkis pod/linkis-demo-mg-eureka-0 5001:5005 --address=0.0.0.0 + +... + +# After debugging is complete, you can stop port forwarding with the following command +$> ./scripts/remote-debug-proxy.sh stop +- stopping port-forward for [web] with mapping [local->8087:8087->pod] ... +- stopping port-forward for [mg-eureka] with mapping [local->5001:5005->pod] ... +- stopping port-forward for [mg-gateway] with mapping [local->5002:5005->pod] ... +- stopping port-forward for [ps-publicservice] with mapping [local->5004:5005->pod] ... +- stopping port-forward for [cg-linkismanager] with mapping [local->5007:5005->pod] ... +- stopping port-forward for [cg-entrance] with mapping [local->5008:5005->pod] ... +- stopping port-forward for [cg-engineconnmanager] with mapping [local->5009:5005->pod] ... +- stopping port-forward for [cg-engineplugin] with mapping [local->5010:5005->pod] ... +``` + +#### Configure the IDE for Remote Debugging + +Configure the IDE as follows to enable remote debugging: + +![](/Images/development/kube-jvm-remote-debug.png) + +Turn on remote debugger +![](/Images/development/kube-jvm-remote-debug-start.png) + +Set a breakpoint and submit a job for debugging + +``` shell +$> ./scripts/login-pod.sh mg-gateway + +- login [mg-gateway]'s bash ... +bash-4.2$ ./bin/./linkis-cli -engineType shell-1 -codeType shell -code "echo \"hello\" " -submitUser hadoop -proxyUser hadoop +=====Java Start Command===== +exec /etc/alternatives/jre/bin/java -server -Xms32m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/linkis/logs/linkis-cli -XX:ErrorFile=/opt/linkis/logs/linkis-cli/ps_err_pid%p.log -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -classpath /opt/linkis/conf/linkis-cli:/opt/linkis/lib/linkis-computation-governance/linkis-client/linkis-cli/*:/opt/linkis/lib/linkis-commons/public-module/*: -Dconf.root=/etc/linkis-conf -Dconf.file=linkis-cli.properties -Dlog.path=/opt/linkis/logs/linkis-cli -Dlog.file=linkis-client..log.20220925171540947077800 org.apache.linkis.cli.application.LinkisClientApplication '-engineType shell-1 -codeType shell -code echo "hello" -submitUser hadoop -proxyUser hadoop' +... +``` +![](/Images/development/kube-jvm-remote-debug-breakpoint.png) + + +### Clean Up the Environment + +After debugging, you can use the following command to clean up the entire environment: + +``` shell +$> kind delete clusters test-helm +Deleted clusters: ["test-helm"] +``` + +### Other Useful Operations + +#### Fetch Logs + +``` bash +$> kubectl logs -n linkis linkis-demo-cg-engineconnmanager-659bf85689-ddvhw -f + ++ RUN_IN_FOREGROUND=true ++ /opt/linkis/sbin/linkis-daemon.sh start cg-engineconnmanager +Start to check whether the cg-engineconnmanager is running +Start server, startup script: /opt/linkis/sbin/ext/linkis-cg-engineconnmanager +=====Java Start Command===== +java -DserviceName=linkis-cg-engineconnmanager -Xmx512M -XX:+UseG1GC -Xloggc:/var/logs/linkis/linkis-cg-engineconnmanager-gc.log -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -cp /etc/linkis-conf:/opt/linkis/lib/linkis-commons/public-module/*:/opt/linkis/lib/linkis-computation-governance/linkis-cg-engineconnmanager/* org.apache.linkis.ecm.server.LinkisECMApplication --eureka.instance.prefer-ip-address=true --eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} 2>&1 +OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N +Listening for transport dt_socket at address: 5005 +16:32:41.101 [main] INFO org.apache.linkis.common.conf.BDPConfiguration$ - ******************* Notice: The Linkis configuration file is linkis.properties ! ******************* +16:32:41.130 [main] INFO org.apache.linkis.common.conf.BDPConfiguration$ - *********************** Notice: The Linkis serverConf file is linkis-cg-engineconnmanager.properties ! ****************** +16:32:41.222 [main] INFO org.apache.linkis.LinkisBaseServerApp - Ready to start linkis-cg-engineconnmanager with args: --eureka.instance.prefer-ip-address=true +--eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} +... +``` + +#### Entry into the Component Pod + +Use `. /scripts/login-pod.sh ` to access the component's Pod to open a Bash for interactive operation, where the component name can be : + +* cg-engineconnmanager +* cg-engineplugin +* cg-entrance +* cg-linkismanager +* mg-eureka +* mg-gateway +* ps-publicservice +* web + +``` bash +$> ./scripts/login-pod.sh cg-engineconnmanager +- login [cg-engineconnmanager]'s bash ... +bash-4.2$ pwd +/opt/linkis +bash-4.2$ env |grep LINKIS +LINKIS_DEMO_PS_PUBLICSERVICE_SERVICE_HOST=127.0.0.1 +LINKIS_DEMO_CG_LINKISMANAGER_PORT_9101_TCP_PROTO=tcp +LINKIS_DEMO_WEB_PORT_8087_TCP_PORT=8087 +... +LINKIS_CLIENT_CONF_DIR=/etc/linkis-conf +bash-4.2$ ps aux |grep linkis +hadoop 1 0.0 0.0 11708 2664 ? Ss 16:32 0:00 /bin/bash /opt/linkis/sbin/linkis-daemon.sh start cg-engineconnmanager +hadoop 10 0.0 0.0 11708 2624 ? S 16:32 0:00 sh /opt/linkis/sbin/ext/linkis-cg-engineconnmanager +hadoop 11 0.0 0.0 11712 2536 ? S 16:32 0:00 sh /opt/linkis/sbin/ext/linkis-common-start +hadoop 12 4.0 3.2 4146404 400084 ? Sl 16:32 0:35 java -DserviceName=linkis-cg-engineconnmanager -Xmx512M -XX:+UseG1GC -Xloggc:/var/logs/linkis/linkis-cg-engineconnmanager-gc.log -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -cp /etc/linkis-conf:/opt/linkis/lib/linkis-commons/public-module/*:/opt/linkis/lib/linkis-computation-governance/linkis-cg-engineconnmanager/* org.apache.linkis.ecm.server.LinkisECMApplication --eureka.instance.prefer-ip-address=true --eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} +bash-4.2$ exit +exit +``` + diff --git a/versioned_docs/version-1.4.0/development/debug.md b/versioned_docs/version-1.4.0/development/debug.md new file mode 100755 index 00000000000..bc28d394883 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/debug.md @@ -0,0 +1,474 @@ +--- +title: Debug Guide +sidebar_position: 5.0 +--- + +> Introduction: This article records in detail how to configure and start various microservices of Linkis in IDEA, and implement the submission and execution of scripts such as JDBC, Python, and Shell. On Mac OS, each microservice of Linkis supports local debugging. +> However, on Windows OS, the linkis-cg-engineconnmanager service does not support local debugging for the time being. You can refer to the remote debugging documentation in Section 4 below for debugging. + +

Linkis before version 1.0.3 has not yet entered the apache incubation, the organization still belongs to webank, the package name of the main class is `com.webank.wedatasphere.linkis`, when debugging, pay attention to the distinction .

+ +## 1. Code debugging environment + +- jdk1.8 +- maven3.5+ + +## 2. Prepare the code and compile + +```shell +git clone git@github.com:apache/linkis.git +cd linkis +git checkout dev-1.2.0 +```` + +Clone the source code of Linkis to the local and open it with IDEA. When you open the project for the first time, the dependency jar package required for the compilation of the Linkis project will be downloaded from the maven repository. When the dependent jar package is loaded, run the following compile and package command. + +```shell +##If the corresponding version has been released, you can skip this step. The released version-related dependencies have been deployed to the maven central repository +mvn -N install +mvn clean install -DskipTests +```` + +After the compilation command runs successfully, the compiled installation package can be found in the directory linkis/linkis-dist/target/: apache-linkis-version-incubating-bin.tar.gz + +## 3. Configure and start the service + +### 3.1 add mysql-connector-java to the classpath + +If the mysql driver class cannot be found during the service startup process, you can add mysql-connector-java-version.jar to the classpath of the corresponding service module. + +At present, the services that rely on mysql and the corresponding pom.xml paths are as follows: + +- linkis-mg-gateway: linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-server-support/pom.xml +- linkis-ps-publicservice: linkis-public-enhancements/pom.xml +- linkis-cg-linkismanage: linkis-computation-governance/linkis-manager/linkis-application-manager/pom.xml +- linkis-cg-engineplugin: linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/pom.xml + +The way to add to the dependency is as follows, modify the pom.xml file of the corresponding service to add the mysql dependency, +````xml + + mysql + mysql-connector-java + ${mysql.connector.version} + +```` +At the same time, it is necessary to keep whether the scope of mysql-connector-java dependency is set to test according to the `` of pom.xml. If so, comments are required for local debugging + +### 3.2 Adjust log4j2.xml configuration + +Under the Linkis source code folder, in the subdirectory linkis-dist/package/conf, are some default configuration files of Linkis. First, edit the log4j2.xml file, and add the configuration of log output to the console. + +![log4j2.xml](/Images/development/debug/log4j.png) + +Only the configuration content that needs to be added is posted here. + +````xml + + + + + + + + + + + + + +```` +__Note:__linkis.properties needs to modify the parameters of the corresponding jdbc + +### 3.3 Start the eureka service + +Linkis' services rely on Eureka as the registry, so we need to start the Eureka service first. The Eureka service can be started locally or remotely. After ensuring that each service can access Eureka's IP and port, you can start to start other microservices. + +Inside Linkis, the application name and configuration file are set through the -DserviceName parameter, so -DserviceName is a VM startup parameter that must be specified. + +You can use the "-Xbootclasspath/a: configuration file path" command to append the configuration file to the end of the bootstrap class path, that is, add the dependent configuration file to the classpath. + +By checking Include dependencies with "Provided" scope, you can introduce provided-level dependency packages during debugging. + +![eureka](/Images/development/debug/eureka.png) + +Parameter explanation: + +```shell +[service name] +linkis-mg-eureka + +[Use classpath of module] +linkis-eureka + +[Main Class] +org.apache.linkis.eureka.SpringCloudEurekaApplication + +[VM Opitons] +-DserviceName=linkis-mg-eureka -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[Program arguments] +--spring.profiles.active=eureka --eureka.instance.preferIpAddress=true +```` + +Note that the local path involved in the debugging configuration needs to be modified to the path set by yourself; +The path writing rule in Windows is: D:\{YourPathPrefix}\linkis\linkis-dist\package\conf +(The same applies to the following microservices) + +If you don't want the default 20303 port, you can modify the port configuration: + +```shell +File path: conf/application-eureka.yml +Modify the port: +server: + port: 8080 ##Starting port +```` + +After the above settings are completed, run the Application directly. After successful startup, you can view the eureka service list through http://localhost:20303/. + +![eureka-web](/Images/development/debug/eureka-web.png) + +### 3.4 Start linkis-mg-gateway + +linkis-mg-gateway is the service gateway of Linkis, and all requests will be forwarded to the corresponding service through the gateway. +Before starting the server, you first need to edit the conf/linkis-mg-gateway.properties configuration file and add the administrator username and password. The username must be the same as the mac username you are currently logged in to. + +````properties +wds.linkis.admin.user=leojie +wds.linkis.admin.password=123456 +```` + +Set the startup Application of linkis-mg-gateway + +![gateway-app](/Images/development/debug/gateway.png) + +Parameter explanation: + +```shell +[Service Name] +linkis-mg-gateway + +[Use classpath of module] +linkis-gateway-server-support + +[VM Opitons] +-DserviceName=linkis-mg-gateway -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.gateway.springcloud.LinkisGatewayApplication +```` + +After the above settings are completed, the Application can be run directly. + +### 3.5 Start linkis-ps-publicservice + +publicservice is a public enhancement service of Linkis, a module that provides functions such as unified configuration management, context service, material library, data source management, microservice management and historical task query for other microservice modules. + +Set the startup Application of linkis-ps-publicservice + +![publicservice-app](/Images/development/debug/publicservice.png) + +Parameter explanation: +```shell +[Service Name] +linkis-ps-publicservice + +[Module Name] +linkis-public-enhancements + +[VM Opitons] +-DserviceName=linkis-ps-publicservice -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.filesystem.LinkisPublicServiceApp + +[Add provided scope to classpath] +By checking Include dependencies with "Provided" scope, you can introduce provided-level dependency packages during debugging. +```` + +When starting publicservice directly, you may encounter the following errors: + +![publicservice-debug-error](/Images/development/debug/publicservice-debug-error.png) + +You need to add the publicly dependent modules to the classpath of the linkis-public-enhancements module, and modify the pom of pes to add the following dependencies: +linkis-public-enhancements/pom.xml +````xml + + org.apache.linkis + linkis-dist + ${project.version} + + + + mysql + mysql-connector-java + ${mysql.connector.version} + + +```` + +After completing the above configuration, restart the Application of publicservice + +### 3.6 Start linkis-cg-linkismanager + +![cg-linkismanager-APP](/Images/development/debug/cg-linkismanager-APP.png) + +Parameter explanation: + +```shell +[Service Name] +linkis-cg-linkismanager + +[Use classpath of module] +linkis-application-manager + +[VM Opitons] +-DserviceName=linkis-cg-linkismanager -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.manager.am.LinkisManagerApplication + +[Add provided scope to classpath] +By checking Include dependencies with "Provided" scope, you can introduce provided-level dependency packages during debugging. +```` + +### 3.7 Start linkis-cg-entrance + +![cg-entrance-APP](/Images/development/debug/cg-entrance-APP.png) + +Parameter explanation: + +```shell +[Service Name] +linkis-cg-entrance + +[Use classpath of module] +linkis-entrance + +[VM Opitons] +-DserviceName=linkis-cg-entrance -Xbootclasspath/a:D:\yourDir\linkis\linkis-dist\package\conf + +[main Class] +org.apache.linkis.entrance.LinkisEntranceApplication + +[Add provided scope to classpath] +By checking Include dependencies with "Provided" scope, you can introduce provided-level dependency packages during debugging. +```` + +### 3.8 Start linkis-cg-engineconnmanager + +![engineconnmanager-app](/Images/development/debug/engineconnmanager-app.png) + +Parameter explanation: + +```shell +[Service Name] +linkis-cg-engineconnmanager + +[Use classpath of module] +linkis-engineconn-manager-server + +[VM Opitons] +-DserviceName=linkis-cg-engineconnmanager -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf -DJAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/ + +[main Class] +org.apache.linkis.ecm.server.LinkisECMApplication + +[Add provided scope to classpath] +By checking Include dependencies with "Provided" scope, you can introduce provided-level dependency packages during debugging. +```` + +-DJAVA_HOME is to specify the path of the java command used by ecm to start the engine. If the version in the default JAVA environment variable meets your needs, this configuration can be omitted. + +Debugging the linkis-cg-engineconnmanager module only supports Mac OS and Linux systems. + +### 3.9 Key Configuration Modifications + +The above operation only completes the configuration of the application startup of each Linkis microservice. In addition, in the configuration file loaded when the Linkis service starts, some key configurations also need to be modified in a targeted manner, otherwise the process of starting the service or script execution Some errors will be encountered. The key configuration modifications are summarized as follows: + +#### 3.9.1 conf/linkis.properties + +````properties +# linkis underlying database connection parameter configuration +wds.linkis.server.mybatis.datasource.url=jdbc:mysql://yourip:3306/linkis?characterEncoding=UTF-8 +wds.linkis.server.mybatis.datasource.username=your username +wds.linkis.server.mybatis.datasource.password=your password + +# Set the bml material storage path to not hdfs +wds.linkis.bml.is.hdfs=false +wds.linkis.bml.local.prefix=/Users/leojie/software/linkis/data/bml + +wds.linkis.home=/Users/leojie/software/linkis + +# Set the administrator username, your local username +wds.linkis.governance.station.admin=leojie + +# Set the prefer ip address +linkis.discovery.prefer-ip-address=true + +# Set the debug enable +wds.linkis.engineconn.debug.enable=true +```` + +Before configuring linkis underlying database connection parameters, please create linkis database and run linkis-dist/package/db/linkis_ddl.sql and linkis-dist/package/db/linkis_dml.sql to initialize all tables and data. + +The directory structure of wds.linkis.home={YourPathPrefix}/linkis is as follows, only the lib directory and the conf directory are placed in it. When the engine process starts, the conf and lib paths in wds.linkis.home will be added to the classpath. If wds.linkis.home is not specified, an exception that the directory cannot be found may be encountered. + +![linkis-home](/Images/development/debug/linkis-home.png) + +#### 3.9.2 conf/linkis-cg-entrance.properties + +````properties +# The log directory of the entrance service execution task +wds.linkis.entrance.config.log.path=file:///{YourPathPrefix}/linkis/data/entranceConfigLog + +# The result set is saved in the directory, the local user needs read and write permissions +wds.linkis.resultSet.store.path=file:///{YourPathPrefix}/linkis/data/resultSetDir +```` + +#### 3.9.3 conf/linkis-cg-engineconnmanager.properties + +````properties +wds.linkis.engineconn.root.dir={YourPathPrefix}/linkis/data/engineconnRootDir +```` + +If you do not modify it, you may encounter an exception that the path does not exist. + +#### 3.9.4 conf/linkis-cg-engineplugin.properties + +````properties +wds.linkis.engineconn.home={YourPathPrefix}/linkis/linkis-engineconn-plugins/shell/target/out + +wds.linkis.engineconn.plugin.loader.store.path={YourPathPrefix}/linkis/linkis-engineconn-plugins/shell/target/out +```` + +The two configurations here are mainly to specify the root directory of the engine storage, and the main purpose of specifying it as target/out is that after the engine-related code or configuration changes, the engineplugin service can be restarted directly to take effect. + +### 3.10 Set sudo password-free for the current user + +When the engine is started, sudo needs to be used to execute the shell command to start the engine process. The current user on the mac generally needs to enter a password when using sudo. Therefore, it is necessary to set the sudo password-free for the current user. The setting method is as follows: + +```shell +sudo chmod u-w /etc/sudoers +sudo visudo +Replace #%admin ALL=(ALL) AL with %admin ALL=(ALL) NOPASSWD: ALL +save file exit +```` + +### 3.11 Service Test + +Make sure that the above services are all successfully started, and then test and submit the shell script job in postman. + +First visit the login interface to generate a cookie: + +![login](/Images/development/debug/login.png) + +Then submit the shell code for execution + +POST: http://127.0.0.1:9001/api/rest_j/v1/entrance/submit + +body parameter: + +````json +{ + "executionContent": { + "code": "echo 'hello'", + "runType": "shell" + }, + "params": { + "variable": { + "testvar": "hello" + }, + "configuration": { + "runtime": {}, + "startup": {} + } + }, + "source": { + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + "engineType": "shell-1", + "userCreator": "leojie-IDE" + } +} +```` + +Results of the: + +````json +{ + "method": "/api/entrance/submit", + "status": 0, + "message": "OK", + "data": { + "taskID": 1, + "execID": "exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0" + } +} +```` + +Finally, check the running status of the task and get the running result set: + +GET http://127.0.0.1:9001/api/rest_j/v1/entrance/exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0/progress + +````json +{ + "method": "/api/entrance/exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0/progress", + "status": 0, + "message": "OK", + "data": { + "progress": 1, + "progressInfo": [], + "execID": "exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0" + } +} +```` + +GET http://127.0.0.1:9001/api/rest_j/v1/jobhistory/1/get + +GET http://127.0.0.1:9001/api/rest_j/v1/filesystem/openFile?path=file:///Users/leojie/software/linkis/data/resultSetDir/leojie/linkis/2022-07-16/ 214859/IDE/1/1_0.dolphin + +````json +{ + "method": "/api/filesystem/openFile", + "status": 0, + "message": "OK", + "data": { + "metadata": "NULL", + "totalPage": 0, + "totalLine": 1, + "page": 1, + "type": "1", + "fileContent": [ + [ + "hello" + ] + ] + } +} +```` + +## 4. Remote debugging service guide + +Based on the code location that needs debugging, determine the corresponding service it belongs to. Use the startup script linkis-daemon.sh and configure the remote debugging port specifically for that service during startup. + +### 4.1 Identify the service where the package that needs to be debugged is located + +Identify the service where the package that needs to be debugged is located (If you are not sure about the service name, check in ${LINKIS_HOME}/sbin/linkis-start-all.sh) + +### 4.2 Restart the service needs to be debugged + +```shell +sh linkis-daemon.sh restart ps-publicservice debug-5005 +``` +observe the outputting starting shell command,check if it contains `-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005`, which means it starts remote debug port successfully. + +### 4.3 Compiler configuration remote debugging + +Open the window as shown below and configure the remote debugging port, service, and module +![c-debug](images/c-debug.png) + +### 4.4 Start debugging + +Click the debug button, and the following information appears, indicating that you can start debugging +![debug](images/debug.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/_category_.json b/versioned_docs/version-1.4.0/development/development-specification/_category_.json new file mode 100644 index 00000000000..0851e30ec0f --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Development Specification", + "position": 11.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/api.md b/versioned_docs/version-1.4.0/development/development-specification/api.md new file mode 100644 index 00000000000..a82ddeca259 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/api.md @@ -0,0 +1,148 @@ +--- +title: API Specification +sidebar_position: 4 +--- + + > When Contributor contributes new RESTful interfaces to Linkis, it is required to follow the following interface specifications for interface development. + + + +## 1. HTTP or WebSocket ? + + + +Linkis currently provides two interfaces: HTTP and WebSocket. + + + +WebSocket advantages over HTTP: + + + +- Less stress on the server + +- More timely information push + +- Interactivity is more friendly + + + +Correspondingly, WebSocket has the following disadvantages: + + + +- The WebSocket may be disconnected while using + +- Higher technical requirements on the front end + +- It is generally required to have a front-end degradation handling mechanism + + + +**We generally strongly recommend that Contributor provide the interface using WebSocket as little as possible if not necessary;** + + + +**If you think it is necessary to use WebSocket and are willing to contribute the developed functions to Linkis, we suggest you communicate with us before the development, thank you!** + + + +## 2. URL specification + + + +``` + +/api/rest_j/v1/{applicationName}/.+ + +/api/rest_s/v1/{applicationName}/.+ + +``` + + + +**Convention** : + + + +- rest_j indicates that the interface complies with the Jersey specification + +- REST_S indicates that the interface complies with the SpringMVC REST specification + +- v1 is the version number of the service. ** version number will be updated with the Linkis version ** + +- {applicationName} is the name of the micro-service + + + +## 3. Interface request format + + + +```json + +{ + +"method":"/api/rest_j/v1/entrance/execute", + +"data":{}, + +"WebsocketTag" : "37 fcbd8b762d465a0c870684a0261c6e" / / WebSocket requests require this parameter, HTTP requests can ignore + +} + +``` + + + +**Convention** : + + + +- method: The requested RESTful API URL. + +- data: The specific data requested. + +- WebSocketTag: The unique identity of a WebSocket request. This parameter is also returned by the back end for the front end to identify. + + + +## 4. Interface response format + + + +```json + +{" method ":"/API/rest_j/v1 / project/create ", "status" : 0, "message" : "creating success!" ,"data":{}} + +``` + + + +**Convention** : + + + +- method: Returns the requested RESTful API URL, mainly for the WebSocket mode. + +- status: Returns status information, where: -1 means not login, 0 means success, 1 means error, 2 means failed validation, and 3 means no access to the interface. + +- data: Returns the specific data. + +- message: Returns a prompt message for the request. If status is not 0, message will return an error message, where data may have a stack trace field, and return the specific stack information. + + + +In addition: Different status cause different HTTP status code, under normal circumstances: + + + +- When status is 0, the HTTP status code is 200 + +- When the status is -1, the HTTP status code is 401 + +- When status is 1, the HTTP status code is 400 + +- When status is 2, the HTTP status code is 412 + +- When status is 3, the HTTP status code is 403 \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/commit-message.md b/versioned_docs/version-1.4.0/development/development-specification/commit-message.md new file mode 100644 index 00000000000..e9c6d87ff47 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/commit-message.md @@ -0,0 +1,100 @@ +--- +title: Commit Message Notice +sidebar_position: 2 +--- +>This article is quoted from https://dolphinscheduler.apache.org/en-us/docs/dev/user_doc/contribute/join/commit-message.html + +### 1.Preface + +A good commit message can help other developers (or future developers) quickly understand the context of related changes, and can also help project managers determine whether the commit is suitable for inclusion in the release. But when we checked the commit logs of many open source projects, we found an interesting problem. Some developers have very good code quality, but the commit message record is rather confusing. When other contributors or learners are viewing the code, it can’t be intuitively understood through commit log. +The purpose of the changes before and after the submission, as Peter Hutterer said:Re-establishing the context of a piece of code is wasteful. We can’t avoid it completely, so our efforts should go to reducing it as much as possible. Commit messages can do exactly that and as a result, a commit message shows whether a developer is a good collaborator. Therefore, DolphinScheduler developed the protocol in conjunction with other communities and official Apache documents. + +### 2.Commit Message RIP + +#### 2.1 Clearly modify the content + +A commit message should clearly state what issues (bug fixes, function enhancements, etc.) the submission solves, so that other developers can better track the issues and clarify the optimization during the version iteration process. + +#### 2.2 Associate the corresponding Pull Request or Issue + +When our changes are large, the commit message should best be associated with the relevant Issue or Pull Request on GitHub, so that our developers can quickly understand the context of the code submission through the associated information when reviewing the code. If the current commit is for an issue, then the issue can be closed in the Footer section. + +#### 2.3 Unified format + +The formatted CommitMessage can help provide more historical information for quick browsing, and it can also generate a Change Log directly from commit. + +Commit message should include three parts: Header, Body and Footer. Among them, Header is required, Body and Footer can be omitted. + +##### Header + +The header part has only one line, including three fields: type (required), scope (optional), and subject (required). + +[DS-ISSUE number][type] subject + +(1) Type is used to indicate the category of commit, and only the following 7 types are allowed. + +- feat:New features +- fix:Bug fixes +- docs:Documentation +- style: Format (does not affect changes in code operation) +- refactor:Refactoring (It is not a new feature or a code change to fix a bug) +- test:Add test +- chore:Changes in the build process or auxiliary tools + +If the type is feat and fix, the commit will definitely appear in the change log. Other types (docs, chore, style, refactor, test) are not recommended. + +(2) Scope + +Scope is used to indicate the scope of commit impact, such as server, remote, etc. If there is no suitable scope, you can use \*. + +(3) subject + +Subject is a short description of the purpose of the commit, no more than 50 characters. + +##### Body + +The body part is a detailed description of this commit, which can be divided into multiple lines, and the line break will wrap with 72 characters to avoid automatic line wrapping affecting the appearance. + +Note the following points in the Body section: + +- Use the verb-object structure, note the use of present tense. For example, use change instead of changed or changes + +- Don't capitalize the first letter + +- The end of the sentence does not need a ‘.’ (period) + +##### Footer + +Footer only works in two situations + +(1) Incompatible changes + +If the current code is not compatible with the previous version, the Footer part starts with BREAKING CHANGE, followed by a description of the change, the reason for the change, and the migration method. + +(2) Close Issue + +If the current commit is for a certain issue, you can close the issue in the Footer section, or close multiple issues at once. + +##### For Example + +``` +[Linkis-001][docs-en] add commit message + +- commit message RIP +- build some conventions +- help the commit messages become clean and tidy +- help developers and release managers better track issues + and clarify the optimization in the version iteration + +This closes #001 +``` + +### 3.Reference documents + +[Dolphinscheduler Commit Message](https://dolphinscheduler.apache.org/zh-cn/docs/dev/user_doc/contribute/join/commit-message.html) + +[Commit message format](https://cwiki.apache.org/confluence/display/GEODE/Commit+Message+Format) + +[On commit messages-Peter Hutterer](http://who-t.blogspot.com/2009/12/on-commit-messages.html) + +[RocketMQ Community Operation Conventions](https://mp.weixin.qq.com/s/LKM4IXAY-7dKhTzGu5-oug) diff --git a/versioned_docs/version-1.4.0/development/development-specification/concurrent.md b/versioned_docs/version-1.4.0/development/development-specification/concurrent.md new file mode 100644 index 00000000000..9eeb78304be --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/concurrent.md @@ -0,0 +1,10 @@ +--- +title: Concurrent Specification +sidebar_position: 5 +--- + +1. [**Compulsory**] Make sure getting a singleton object to be thread-safe. Operating inside singletons should also be kept thread-safe. +2. [**Compulsory**] Thread resources must be provided through the thread pool, and it is not allowed to explicitly create threads in the application. +3. SimpleDateFormat is a thread-unsafe class. It is recommended to use the DataUtils utility class. +4. [**Compulsory**] At high concurrency, synchronous calls should consider the performance cost of locking. If you can use lockless data structures, don't use locks. If you can lock blocks, don't lock the whole method body. If you can use object locks, don't use class locks. +5. [**Compulsory**] Use ThreadLocal as less as possible. Everytime using ThreadLocal and it holds an object which needs to be closed, remember to close it to release. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/exception-catch.md b/versioned_docs/version-1.4.0/development/development-specification/exception-catch.md new file mode 100644 index 00000000000..27a96e980c4 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/exception-catch.md @@ -0,0 +1,10 @@ +--- +title: Exception Catch Specification +sidebar_position: 3 +--- + +1. [**Mandatory**] For the exception of each small module, a special exception class should be defined to facilitate the subsequent generation of error codes for users. It is not allowed to throw any RuntimeException or directly throw Exception. +2. Try not to try-catch a large section of code. This is irresponsible. Please distinguish between stable code and non-stable code when catching. Stable code refers to code that will not go wrong anyway. For the catch of unstable code, try to distinguish the exception types as much as possible, and then do the corresponding exception handling. +3. [**Mandatory**] The purpose of catching an exception is to handle it. Don't throw it away without handling it. If you don't want to handle it, please throw the exception to its caller. Note: Do not use e.printStackTrace() under any circumstances! The outermost business users must deal with exceptions and turn them into content that users can understand. +4. The finally block must close the resource object and the stream object, and try-catch if there is an exception. +5. [**Mandatory**] Prevent NullPointerException. The return value of the method can be null, and it is not mandatory to return an empty collection, or an empty object, etc., but a comment must be added to fully explain under what circumstances the null value will be returned. RPC and SpringCloud Feign calls all require non-empty judgments. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/how-to-write-unit-test-code.md b/versioned_docs/version-1.4.0/development/development-specification/how-to-write-unit-test-code.md new file mode 100644 index 00000000000..9f8159c43b8 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/how-to-write-unit-test-code.md @@ -0,0 +1,393 @@ +--- +title: How to Write Unit Test Code +sidebar_position: 10 +--- + +## 1.Frame Selection + +Junit5 + mockito + Jacobo + H2 local database + +Idea enhancement plugin + +- JUnitGenerator V2. 0 standard module for generating test cases +- Create the allnewset object and set the default value for allnewset +- The association mapping between mybatisx DAO and mapper is easy to view + +### 1.1 Configure the Template of JUnit in Idea + +```properties + +######################################################################################## +## +## Available variables: +## $entryList.methodList - List of method composites +## $entryList.privateMethodList - List of private method composites +## $entryList.fieldList - ArrayList of class scope field names +## $entryList.className - class name +## $entryList.packageName - package name +## $today - Todays date in MM/dd/yyyy format +## +## MethodComposite variables: +## $method.name - Method Name +## $method.signature - Full method signature in String form +## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) +## $method.paramNames - List of Strings representing the method's parameters' names +## $method.paramClasses - List of Strings representing the method's parameters' classes +## +## You can configure the output class name using "testClass" variable below. +## Here are some examples: +## Test${entry.ClassName} - will produce TestSomeClass +## ${entry.className}Test - will produce SomeClassTest +## +######################################################################################## +## +## title case +#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end +## Initial lowercase custom down +#macro (down $strIn)$strIn.valueOf($strIn.charAt(0)).toLowerCase()$strIn.substring(1)#end +## Iterate through the list and generate testcase for every entry. +#foreach ($entry in $entryList) +#set( $testClass="${entry.className}Test") +## + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package $entry.packageName; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * ${entry.className} Tester +*/ +public class $testClass { + + @Autowired + private ${entry.className} #down(${entry.className}); + + @BeforeEach + @DisplayName("Each unit test method is executed once before execution") + public void before() throws Exception { + } + + @AfterEach + @DisplayName("Each unit test method is executed once before execution") + public void after() throws Exception { + } + +#foreach($method in $entry.methodList) + + @Test + @DisplayName("Method description: ...") + public void test#cap(${method.name})() throws Exception { + //TODO: Test goes here... + } + +#end + +#foreach($method in $entry.privateMethodList) + + @Test + @DisplayName("Method description: ...") + public void test#cap(${method.name})() throws Exception { + //TODO: Test goes here... + #foreach($string in $method.reflectionCode) + $string + #end + } + +#end +} +#end + +``` + +![test-0](../images/test-0.png) + +1. Configure test class generation path + + Original configuration: ${sourcepath}/test/${package}/${filename} + Modified configuration: ${sourcepath}/..//test/java/${PACKAGE}/${FILENAME} + + As shown in the figure: + ![test-1](../images/test-1.png) + +2. Select class -> right click -> generate -> JUnit test to generate a test class + + ![test-2](../images/test-2.png) + + +## 2.Unit Test Criteria + +### 2.1 Catalogue And Naming Citeria + +- 1. Unit test code directory + It must be written in the following project directory: src/test/java. It is not allowed to write in the business code directory. + Note: this directory will be skipped during source code compilation, while the unit test framework scans this directory by default. The test configuration file must be placed under the src/test/resources file + +- 2. The package name of the test class should be consistent with the package name of the tested class + Example: + Business class: src/main/java/org/apache/linkis/jobhistory/dao/JobDetailMapper.java + Corresponding test class:src/main/java/org/apache/linkis/jobhistory/dao/JobDetailMapperTest java + +- 3. Naming and definition specification of test class: use test as the suffix of class name + The test class is named as follows: + Tested business + test, tested interface + test, tested class + test + +- 4. Specification for naming and defining test cases: use test as the prefix of method names + The naming rule of test cases is: test + method name. Avoid using names that have no meaning in test1 and test2. Secondly, necessary function and method annotations are required. + +### 2.2 Unit Coding Specifications + +- 1. System is not allowed to be used in unit test Out for human flesh verification, or if judgment for verification (log can be used for Key log output). Assertion assert must be used for verification. + +- 2. Maintain the independence of unit testing. In order to ensure that unit tests are stable, reliable and easy to maintain, unit test cases must not call each other or rely on the order of execution. + Counterexample: method2 needs to rely on the execution of method1 and take the execution result as the input of method2 + +- 3. Unit tests must be repeatable and not affected by the external environment. + Note: unit tests are usually put into continuous integration. Unit tests will be executed every time there is code check in. If the single test depends on the external environment (network, service, middleware, etc.), it is easy to lead to the unavailability of the continuous integration mechanism. + Positive example: in order not to be affected by the external environment, it is required to change the relevant dependencies of the tested class into injection when designing the code, and inject a local (memory) implementation or mock implementation with a dependency injection framework such as spring during testing. + +- 4. Incremental code ensures that the unit test passes. + Note: the new code must supplement the unit test. If the new code affects the original unit test, please correct it + +- 5. For unit testing, it is necessary to ensure that the test granularity is small enough to help accurately locate the problem. Single test granularity is generally at the method level (very few scenarios such as tool classes or enumeration classes can be at the class level). + Note: only with small test granularity can we locate the error location as soon as possible. Single test is not responsible for checking cross class or cross system interaction logic, which is the field of integration testing. + +## 3.Use of Assertions + + The result verification of all test cases must use the assertion pattern + use Assertions.assertEquals + Assertions.assertEquals(expectedJobDetail, actualJobDetail) + + The assertions assertion of junit5 is preferred, and the assertions of assertij are allowed in very few scenarios + Comparison of objects before/after updating common scene databases + Asserting the usingrecursive comparison pattern using assertj's assertThat + Assertions.assertThat(actualObject).usingRecursiveComparison().isEqualTo(expectedObject); + + +### 3.1 Junit5 General Assertion + +| Method | description | remarks | +|--------|-------------|-------------| +|Assertequals | judge whether two objects or two original types are equal| | +|Assertnotequals | judge whether two objects or two original types are not equal| | +|Asserttrue | judge whether the given Boolean value is true| | +|Assertfalse | judge whether the given Boolean value is false| | +|AssertNull | judge whether the given object reference is null| | +|AssertNotNull | judge whether the given object reference is not null| | +|Assert all | multiple judgment logics are processed together. As long as one error is reported, the overall test will fail| | + +### 3.2 Junit5 Combined Assertion and Exception Assertion + +**Composite assertion** +The assertall method can process multiple judgment logics together. As long as one error is reported, the overall test will fail: + ```java + @Test + @DisplayName("assert all") + public void all() { + //Multiple judgments are executed together. Only when all judgments are passed can they be considered as passed + assertAll("Math", + () -> assertEquals(2, 1 + 1), + () -> assertTrue(1 > 0) + ); + } + ``` + +**Exception assertion** + +Assertions. The assertthrows method is used to test whether the executable instance throws an exception of the specified type when executing the execute method; +If the execute method does not throw an exception during execution, or the exception thrown is inconsistent with the expected type, the test will fail; +Example: + + ```java + @Test + @DisplayName("Assertion of exception") + void exceptionTesting() { + // When the execute method is executed, if an exception is thrown and the type of the exception is the first parameter of assertthrows (here is arithmeticexception. Class) + // The return value is an instance of an exception + Exception exception = assertThrows(ArithmeticException.class, () -> Math.floorDiv(1,0)); + log.info("assertThrows pass,return instance:{}", exception.getMessage()); + } + ``` + +### 3.3 Assertion Usage Criteria + +**Object instance equality assertion** + +1. Is it the same object instance + +```html +Use junitd's assertions assertEquals +Assertions.assertEquals(expectedJobDetail, actualJobDetail) +``` + +Not the same instance, but whether the attribute values of the comparison instance are exactly equal +AssertJ + +```html +Comparison of objects before/after updating common scene databases +Asserting the usingrecursive comparison pattern using assertj's assertthat +Assertions. assertThat(actualObject). usingRecursiveComparison(). isEqualTo(expectedObject); +``` + +2. Assertion of set results such as list +The size of the result set needs to be asserted +Scope or specific size +Each object in the result set needs assertion, which is recommended to be used in combination with the predicate of stream mode +Example: + +```java +ArrayList jobRespProtocolArrayList=service. batchChange(jobDetailReqBatchUpdate); +//List is matched with the predicate of stream for assertion judgment +Predicate statusPrecate = e -> e.getStatus()==0; +assertEquals(2, jobRespProtocolArrayList.size()); +assertTrue(jobRespProtocolArrayList.stream(). anyMatch(statusPrecate)); +``` + +## 4.Mock simulation return data + +Sometimes we just test some apis or service modules, where the service or dao returns null values for some methods by default, but if the logic includes the judgment or secondary value of the returned null object, it is to throw some exceptions + +Example: + +```java + PageInfo pageInfo = + udfService.getManagerPages(udfName, udfTypes, userName, curPage, pageSize); + message = Message.ok(); + // The pageInfo here is null, and subsequent get methods will have exceptions + message.data("infoList", pageInfo.getList()); + message.data("totalPage", pageInfo.getPages()); + message.data("total", pageInfo.getTotal()); +``` + +Example of mock simulation data: + +```java + PageInfo pageInfo = new PageInfo<>(); + pageInfo.setList(new ArrayList<>()); + pageInfo.setPages(10); + pageInfo.setTotal(100); + // For udfService.getManagerPages method passes parameters arbitrarily, and the simulation returns the pageInfo object + // With this simulation data, the above example will not have exceptions when executing the get method + Mockito.when( + udfService.getManagerPages( + Mockito.anyString(), + Mockito.anyCollection(), + Mockito.anyString(), + Mockito.anyInt(), + Mockito.anyInt())) + .thenReturn(pageInfo); +``` + +## 5.Compilation of Unit Test + +### 5.1 Class Division + +It can be roughly classified according to the major functions of the class + +-The controller of the HTTP service provided by the controller cooperates with mockmvc for unit testing +-Service layer of service business logic code +-Dao and Dao layer of database operation +-Util tool function class is a common function tool +-Exception class is a custom exception class +-Enum class +-Entity class is used for DB interaction and parameter VO object and other entity classes processed by methods (if there are other user-defined functions besides normal get set, unit test is required) + + +### 5.2 Unit Test of Controller class +Using mockmvc + +It mainly verifies the requestmethod method of interface request, basic parameters and expected return results. +Main scenarios: scenarios with and without unnecessary parameters are abnormal + +```java + @Test + public void testList() throws Exception { + //Bring unnecessary parameters + MultiValueMap paramsMap = new LinkedMultiValueMap<>(); + paramsMap.add("startDate", String.valueOf(System.currentTimeMillis())); + MvcResult mvcResult = mockMvc.perform(get("/jobhistory/list") + .params(paramsMap)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + + Message res = JsonUtils.jackson().readValue(mvcResult.getResponse().getContentAsString(), Message.class); + assertEquals(res.getStatus(), MessageStatus.SUCCESS()); + logger.info(mvcResult.getResponse().getContentAsString()); + + //Without unnecessary parameters + mvcResult = mockMvc.perform(get("/jobhistory/list")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + + res = JsonUtils.jackson().readValue(mvcResult.getResponse().getContentAsString(), Message.class); + assertEquals(res.getStatus(), MessageStatus.SUCCESS()); + + logger.info(mvcResult.getResponse().getContentAsString()); + } + +``` + +### 5.3 Unit Test of Server class + //todo + +### 5.4 Unit Test of Dao class + +Use H2 database, application. In the configuration file In properties, you need to configure the basic information of H2 database and the relevant path information of mybatis + +```properties +#h2 database configuration +spring.datasource.driver-class-name=org.h2.Driver +# Script to connect database +spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=true +#Script to initialize database tables +spring.datasource.schema=classpath:create.sql +#Script to initialize data for database tables +spring.datasource.data=classpath:data.sql +spring.datasource.username=sa +spring.datasource.password= +spring.datasource.hikari.connection-test-query=select 1 +spring.datasource.hikari.minimum-idle=5 +spring.datasource.hikari.auto-commit=true +spring.datasource.hikari.validation-timeout=3000 +spring.datasource.hikari.pool-name=linkis-test +spring.datasource.hikari.maximum-pool-size=50 +spring.datasource.hikari.connection-timeout=30000 +spring.datasource.hikari.idle-timeout=600000 +spring.datasource.hikari.leak-detection-threshold=0 +spring.datasource.hikari.initialization-fail-timeout=1 + +#配置mybatis-plus的mapper信息 因为使用的是mybatis-plus,使用mybatis-plus +mybatis-plus.mapper-locations=classpath:org/apache/linkis/jobhistory/dao/impl/JobDetailMapper.xml,classpath:org/apache/linkis/jobhistory/dao/impl/JobHistoryMapper.xml +mybatis-plus.type-aliases-package=org.apache.linkis.jobhistory.entity +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +``` + +List is configured with predicate of stream to make assertion judgment and write specification + +1. Use @Transactional and @Rollback to realize data rollback and avoid data pollution +2. Each DaoTest should have a public method for creating and initializing data (or the way of importing data CSV) to prepare data. For related queries, updates, deletions and other operations, the public method should be called first to prepare data +3. Create test data. If an attribute value is a self increasing ID, it should not be assigned +4. The test data created shall be consistent with the actual sample data as far as possible +5. When updating the data test, if the field allows, please prefix it with 'modify original value' diff --git a/versioned_docs/version-1.4.0/development/development-specification/license.md b/versioned_docs/version-1.4.0/development/development-specification/license.md new file mode 100644 index 00000000000..051b19a2096 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/license.md @@ -0,0 +1,165 @@ +--- +title: License Notes +sidebar_position: 0.1 +--- + +> Note: This article applies to Apache projects only. +>This article refers to the Dolphinscheduler project's License Instructions document https://dolphinscheduler.apache.org/zh-cn/docs/dev/user_doc/contribute/join/DS-License.html + +The open source projects under the ASF (Apache Foundation) have extremely strict requirements for the license. When you contribute code to Linkis, you must follow the Apache rules. In order to avoid the contributors wasting too much time on the license, +This article will explain the ASF-License and how to avoid the license risk when participating in the Linkis project development. + +## 1.License file directory description + +License related can be divided into 3 parts +- The main scenarios that need to be paid attention to are: in the project source code, the resources are directly included in the project (such as the direct use of video files, sample files, code JAVA of other projects, additions, icons, audio sources) and other files, and modifications made on the basis ) +- The packaging of the project will be packaged and released. The main scenarios that need to be paid attention to are: the running and installation dependencies of the dependent jar packages in the dependencies, and the pom, that is, the packaging of the dependencies, will be packaged in +- The situation that the material installation package of the management console needs to be paid attention to: the additional dependency packages that are dependent on the front-end web are configured through linkweb/package.json + +[Linkis source code](https://github.com/apache/linkis) The directory related to the license is as follows +```shell script +# the outermost directory starts + +├── LICENSE //LICENSE of the project source code Some files without asf header or the introduction of external resources need to be marked here +├── NOTICE //The NOTICE of the project source code generally does not change +├── licenses //Introduction of third-party component licenses at the project source level +│ └── LICENSE-py4j-0.10.9.5-src.txt +├── linkis-dist +│ └── release-docs +│ ├── LICENSE //Summary of license information of the third-party jar packages that depend on the compiled installation package +│ ├── licenses //Details of the license information corresponding to the third-party jar package dependent on the compiled installation package +│ │ ├── LICENSE-log4j-api.txt +│ │ ├── LICENSE-log4j-core.txt +│ │ ├── LICENSE-log4j-jul.txt +│ │ ├── LICENSE-xxxx.txt +│ └── NOTICE //A summary of NOTICE of dependent third-party jar packages in the compiled installation package +├── linkis-web + └── release-docs + ├── LICENSE //LICENSE information summary of the third-party npm dependencies of the front-end web compilation and installation package + ├── licenses //The license information corresponding to the third-party npm dependencies of the front-end web compilation and installation package is detailed + │ ├── LICENSE-vuedraggable.txt + │ ├── LICENSE-vue-i18n.txt + │ ├── LICENSE-vue.txt + │ ├── LICENSE-vuescroll.txt + │ └── LICENSE-xxxx.txt + └── NOTICE //A summary of NOTICE dependent on third-party npm for front-end web compilation and installation packages + + + +```` + + +## 2.How to legally use third-party open source software on Linkis + +When the code you submit has the following scenarios: + +- Scenario 1. The source code has added(removed) third-party code or static resources. For example, the source code directly uses a code file of another project, and adds text, css, js, pictures, icons, audio and video files. , and modifications made on a third-party basis. +- Scenario 2. The runtime dependencies of the project are added(removed) (runtime dependencies:the final compilation and packaging will be packaged into the released installation package) + +- The imported file in Scenario 1 must be a Class A License of [ASF Third Party License Policy](https://apache.org/legal/resolved.html) +- The dependencies introduced in Scenario 2 must be Class A/Class B licenses in [ASF Third Party License Policy](https://apache.org/legal/resolved.html), not Class C licenses + +We need to know the NOTICE/LICENSE of the files introduced by our project or jar dependencies, (most open source projects will have NOTICE files), these must be reflected in our project. In Apache's words, "Work" shall be mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work. + +### 2.1 Example Scenario 1 +For example, the third-party file `linkis-engineconn-plugins/python/src/main/py4j/py4j-0.10.7-src.zip` is introduced into the source code + +Find the source branch of the version corresponding to py4j-0.10.7-src.zip, if there is no `LICENSE/NOTICE` file in the corresponding version branch, select the main branch +- The project source code is located at: https://github.com/bartdag/py4j/tree/0.10.7/py4j-python +- LICENSE file: https://github.com/bartdag/py4j/blob/0.10.7/py4j-python/LICENSE.txt +- NOTICE file: none + +The license information of `py4j-0.10.7-src.zip` needs to be specified in the `linkis/LICENSE` file. +The detailed license.txt file corresponding to `py4j-0.10.7-src.zip` is placed in the same level directory `linkis-engineconn-plugins/python/src/main/py4j/LICENSE-py4j-0.10 .7-src.txt` +Since https://github.com/bartdag/py4j/tree/0.10.7/py4j-python does not have a NOTICE file, there is no need to append to the `linkis/NOTICE` file. + +### 2.2 Example Scene 2 + +The compilation of the project depends on `org.apache.ant:ant:1.9.1`, and ant-1.9.1.jar will be compiled and installed in the final package `target/apache-linkis-xxx-incubating-bin/linkis-package/lib `medium +You can decompress ant-1.9.1.jar and extract the LICENSE/NOTICE file from the jar package. If not, you need to find the corresponding version source code +Find the source branch of the version corresponding to py4j-0.10.7-src.zip, if the corresponding version branch is not available, select the main branch +- The project source code is located at: https://github.com/apache/ant/tree/rel/1.9.1 +- LICENSE file: https://github.com/apache/ant/blob/rel/1.9.1/LICENSE +- NOTICE file: https://github.com/apache/ant/blob/rel/1.9.1/NOTICE + +The license information of `ant-1.9.1.jar` needs to be specified in the `linkis/LICENSE-binary` file. +The detailed license.txt file corresponding to `ant-1.9.1.jar` is placed in `licenses-binary/LICENSE-ant.txt` +The detailed notice.txt corresponding to `ant-1.9.1.jar` is appended to the `NOTICE-binary` file + +Regarding the specific open source protocol usage protocols, I will not introduce them one by one here. If you are interested, you can check them yourself. + +## 3.License detection rules +We build a license-check script for our own project to ensure that we can avoid license problems as soon as we use it. + +When we need to add new Jars or other external resources, we need to follow these steps: + +* Add the jar name + version you need in tool/dependencies/known-dependencies.txt. +* Add relevant license information in linkis-web/release-docs/LICENSE (depending on the actual situation). +* Append the relevant NOTICE file to linkis-web/release-docs/NOTICE (determined according to the actual situation). This file must be consistent with the NOTICE file in the code version repository of the dependencies. + +:::caution Note +If the scenario is to remove, then the corresponding reverse operation of the above steps needs to remove the corresponding LICENSE/NOTICE content in the corresponding file. In short, it is necessary to ensure that these files are consistent with the data of the actual source code/compiled package +- known-dependencies.txt +- LICENSE/LICENSE-binary/LICENSE-binary-ui +- NOTICE/NOTICE-binary/NOTICE-binary-ui +::: + + +** check dependency license fail** + +After compiling, execute the tool/dependencies/diff-dependenies.sh script to verify +```` +--- /dev/fd/63 2020-12-03 03:08:57.191579482 +0000 ++++ /dev/fd/62 2020-12-03 03:08:57.191579482 +0000 +@@ -1,0 +2 @@ ++HikariCP-java6-2.3.13.jar +@@ -16,0 +18 @@ ++c3p0-0.9.5.2.jar +@@ -149,0 +152 @@ ++mchange-commons-java-0.2.11.jar +Error: Process completed with exit code 1. +```` +Generally speaking, the work of adding a jar is often not so easy to end, because it often depends on various other jars, and we also need to add corresponding licenses for these jars. +In this case, we will get the error message of check dependency license fail in check. As above, we are missing the license statement of HikariCP-java6-2.3.13, c3p0, etc. +Follow the steps to add jar to add it. + + +## 4.Appendix +Attachment: Mail format of new jar +```` +[VOTE][New/Remove Jar] jetcd-core(registry plugin support etcd3 ) + + +(state the purpose, and what the jar needs to be added) +Hi, the registry SPI will provide the implementation of etcd3. Therefore, we need to introduce a new jar (jetcd-core, jetcd-launcher (test)), which complies with the Apache-2.0 License. I checked his related dependencies to make sure it complies with the license of the Apache project. + +new or remove jar : + +jetcd-core version -x.x.x license apache2.0 +jetcd-launcher (test) version -x.x.x license apache2.0 + +Dependent jar (which jars it depends on, preferably the accompanying version, and the relevant license agreement): +grpc-core version -x.x.x license XXX +grpc-netty version -x.x.x license XXX +grpc-protobuf version -x.x.x license XXX +grpc-stub version -x.x.x license XXX +grpc-grpclb version -x.x.x license XXX +netty-all version -x.x.x license XXX +failsafe version -x.x.x license XXX + +If it is a new addition, the email needs to attach the following content +Related addresses: mainly github address, license file address, notice file address, maven central warehouse address + +github address: https://github.com/etcd-io/jetcd +license: https://github.com/etcd-io/jetcd/blob/master/LICENSE +notice: https://github.com/etcd-io/jetcd/blob/master/NOTICE + +Maven repository: +https://mvnrepository.com/artifact/io.etcd/jetcd-core +https://mvnrepository.com/artifact/io.etcd/jetcd-launcher +```` + +## 5.Reference articles +* [COMMUNITY-LED DEVELOPMENT "THE APACHE WAY"](https://apache.org/dev/licensing-howto.html) +* [ASF 3RD PARTY LICENSE POLICY](https://apache.org/legal/resolved.html) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/log.md b/versioned_docs/version-1.4.0/development/development-specification/log.md new file mode 100644 index 00000000000..f30c5e656a7 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/log.md @@ -0,0 +1,12 @@ +--- +title: Log Specification +sidebar_position: 2 +--- + +1. [**Convention**] Linkis chooses SLF4J and Log4J2 as the log printing framework, removing the logback in the Spring-Cloud package. Since SLF4J will randomly select a logging framework for binding, it is necessary to exclude bridging packages such as SLF4J-LOG4J after introducing new Maven packages in the future, otherwise log printing will be a problem. However, if the newly introduced Maven package depends on a package such as Log4J, do not exclude, otherwise the code may run with an error. +2. [**Configuration**] The log4j2 configuration file is default to log4j2.xml and needs to be placed in the classpath. If springcloud combination is needed, "logging:config:classpath:log4j2-spring.xml"(the location of the configuration file) can be added to application.yml. +3. [**Compulsory**] The API of the logging system (log4j2, Log4j, Logback) cannot be used directly in the class. For Scala code, force inheritance from Logging traits is required. For Java, use LoggerFactory.GetLogger(getClass). +4. [**Development Convention**] Since engineConn is started by engineConnManager from the command line, we specify the path of the log configuration file on the command line, and also modify the log configuration during the code execution. In particular, redirect the engineConn log to the system's standard out. So the log configuration file for the EngineConn convention is defined in the EnginePlugin and named log4j2-engineConn.xml (this is the convention name and cannot be changed). +5. [**Compulsory**] Strictly differentiate log levels. Fatal logs should be thrown and exited using System.out(-1) when the SpringCloud application is initialized. Error-level exceptions are those that developers must care about and handle. Do not use them casually. The WARN level is the logs of user action exceptions and some logs to troubleshoot bugs later. INFO is the key process log. Debug is a mode log, write as little as possible. +6. [**Compulsory**] Requirements: Every module must have INFO level log; Every key process must have INFO level log. The daemon thread must have a WARN level log to clean up resources, etc. +7. [**Compulsory**] Exception information should include two types of information: crime scene information and exception stack information. If not, then throw it by keyword. Example: logger.error(Parameters/Objects.toString + "_" + e.getMessage(), e); \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/mapper-xml.md b/versioned_docs/version-1.4.0/development/development-specification/mapper-xml.md new file mode 100644 index 00000000000..24f9d2e1fb8 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/mapper-xml.md @@ -0,0 +1,159 @@ +--- +title: Mapper XML Specification +sidebar_position: 10 +--- + +> Contributor contributes new data tables to Apache Linkis. When writing Mapper XML, the following specifications must be followed for development. + +## 1.Basically follow the specifications +- In mapper.xml namespace is equal to java interface address +- The method name in the java interface is the same as the id of the statement in XML +- The input parameter type of the method in the java interface is the same as the type specified by the parameterType of the statement in XML +- The return value type of the method in the java interface is the same as the type specified by the resultType of the statement in XML +- All mysql keywords in XML use lowercase uniformly +- Abstract SQL fragments for excessive query fields +- It is recommended to use Integer for the integer return value type, which can distinguish between unassigned and 0 cases. For example, if the return value is determined to be a number, int can be used. Other data types are similar. +- For placeholders, use #{name} instead of ${name}. Fuzzy query can use CONCAT('%',#{sname},'%') +- For sql statement writing, no annotation method is used, and it is uniformly written in the XML file + +## 2.Method name specification + +|Method Name|Description|Core Points|Recommendations| +|:---- |:--- |:--- |:--- | +|insert | New data | If it is an auto-incrementing primary key, it should return the primary key ID| | +|deleteById | Delete data according to the primary key ID | sql adds limit 1 by default to prevent multiple deletion of data | This method is not recommended, it is recommended to logically delete | +|updateById | Modify data according to the primary key ID | sql adds limit 1 by default to prevent multiple data modification | | +|selectById | Query data by primary key | Query a piece of data | | +|selectByIdForUpdate | Query data according to the primary key lock | Query a piece of data by locking, for transaction processing | | +|queryListByParam | Query data list according to input conditions | Multi-parameter query list | | +|queryCountByParam | The total number of queries based on input conditions | The number of multi-parameter queries | | + +## 3.parameterType specification +The java interface must contain @Param, and the XML can not contain parameterType +### 3.1 basic type +````java +// java interface +User selectUserById(@Param("id") Integer id); +// XML file + +```` +### 3.2 Collection type +````java +// java interface +List userListByIds(@Param("ids") List ids); +// XML file + +```` +### 3.3 Map type +````java +// java interface +User queryByParams(@Param("map") Map parasms); +// XML file + +```` +### 3.4 Entity Type +````java +// java interface +User queryByUser(@Param("user") User user); +// XML file + +```` +### 3.5 Multiple parameter types +````java +// java interface +User queryByIdAndName(@Param("id") Integer id, @Param("name") String name); +// XML file + +```` +## 4.XML file writing example +Use spaces and indentation reasonably to enhance readability. Examples of various types of SQL statements are as follows +```sql + + + -- add a statement + + insert into user (id, name) + values ​​(1, 'z3'); + + + -- delete statement + + delete from user + where name = #{name} + and id = #{id} + + + -- modify the statement + + update user + set name = #{name} + where id = #{id} + + + -- Check for phrases + + + -- sql fragment + + id, + name + + -- Quote + + + -- resultMap + + + + + -- Quote + + + -- conditional judgment + + name = #{name} + + + -- sub query + + +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/overview.md b/versioned_docs/version-1.4.0/development/development-specification/overview.md new file mode 100644 index 00000000000..908252021a7 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/overview.md @@ -0,0 +1,17 @@ +--- +title: Overview +sidebar_position: 0 +--- + +In order to standardize Linkis's community development environment, improve the output quality of subsequent development iterations of Linkis, and standardize the entire development and design process of Linkis, it is strongly recommended that Contributors follow the following development specifications: +- [License Notes](license.md) +- [Programming Specification](programming-specification.md) +- [Log Specification](log.md) +- [Exception Handling Specification](exception-catch.md) +- [API Specification](api.md) +- [Concurrency Specification](concurrent.md) +- [Path Specification](path-usage.md) +- [Test Specification](unit-test.md) +- [version and new feature specification](version-feature-specifications.md) + +**Note**: The development specifications of the initial version of Linkis1.0 are relatively brief, and will continue to be supplemented and improved with the iteration of Linkis. Contributors are welcome to provide their own opinions and comments. diff --git a/versioned_docs/version-1.4.0/development/development-specification/path-usage.md b/versioned_docs/version-1.4.0/development/development-specification/path-usage.md new file mode 100644 index 00000000000..f988a3b9a2c --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/path-usage.md @@ -0,0 +1,20 @@ +--- +title: Path Usage Specification +sidebar_position: 6 +--- + +Please note: Linkis provides a unified Storage module, so you must follow the Linkis path specification when using the path or configuring the path in the configuration file. + + + +1. [**Compulsory**]When using a file path, whether it is local, HDFS, or HTTP, the schema information must be included. Among them: + + - The Scheme header for local file is: file:///; + + - The Scheme header for HDFS is: hdfs:///; + + - The Scheme header for HTTP is: http:///. + + + +2. There should be no special characters in the path. Try to use the combination of English characters, underline and numbers. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/programming-specification.md b/versioned_docs/version-1.4.0/development/development-specification/programming-specification.md new file mode 100644 index 00000000000..b9180105edf --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/programming-specification.md @@ -0,0 +1,98 @@ +--- +title: Programming Specification +sidebar_position: 1 +--- +## 1. Naming Convention +1. [**Mandatory**] Do not use Chinese pinyin and unintelligible abbreviations +2. For basic Java naming conventions, please refer to [naming-conventions](https://alibaba.github.io/Alibaba-Java-Coding-Guidelines/#naming-conventions) +3. [Constraints] There is a scalastyle style configuration file in linkis, if it does not conform to the specification, you need to rename it according to the scalastyle style +4. [**Mandatory**] Configuration files, startup file, process name, configuration keys,etc. also need to comply with naming conventions, which are as follows: + +|Classification| Style| Specifications| Examples| +|:---- |:--- |:--- |:--- | +|Configuration file|Separated by lowercase'-'| linkis-classification level (ps/cg/mg)-service name.propertis| linkis-cg-linkismanager.properties| +|Start-stop script|Separated by lowercase'-'| linkis-classification level-service name| linkis-cg-linkismanager| +|Module directory|Separated by lowercase'-'| The module directory must be below the corresponding classification level, and the module name is a subdirectory| linkis-public-enhancements/linkis-bml| +|Process naming|Camel case naming| Start with Linkis and end with service name| LinkisBMLApplication| +|Configuration Key Naming|Separated by lowercase'.'| linkis+module name+keyName| linkis.bml.hdfs.prefix| + +## 2. Annotation Protocol +1. [**Mandatory**] The class, class attribute, interface method must be commented, and the comment must use the Javadoc specification, using the format of `/**content*/` +2. [**Mandatory**] All abstract methods (including methods in interfaces) must be annotated with Javadoc. In addition to return values, parameters, and exception descriptions, they must also indicate what the method does and what functions it implements +3. [**Mandatory**] All abstract methods (including methods in interfaces) must be annotated with Javadoc, indicating what the method does and does in addition to return values, parameters, and exception descriptions. + + + +4. [**Mandatory**] method inside a single line comment, a separate line above the comment statement, use // comment. Multi-line comments inside methods use /* */ comments, aligned with code. + + + +Example: + +```java + +// Store the reflection relation between parameter variable like 'T' and type like + +Map< String, Type> typeVariableReflect = new HashMap< > (a); +``` + +5. [**Mandatory**] All enumeration type fields must have a comment stating the purpose of each data item. + + + +Example: + +```java +/** + * to monitor node status info + */ +public enum NodeHealthy { + + /** + * healthy status + */ + Healthy, + + /** + * EM identifies itself as UnHealthy or + * The manager marks it as abnormal in the status of UnHealthy processing engine. + * The manager requests all engines to withdraw forcibly (engine suicide). + */ + UnHealthy, + + /** + * The engine is in the alarm state, but can accept tasks + */ + WARN, + + /** + * The stock is available and can accept tasks. When the EM status is not reported for the last n heartbeats, + * the Engine that has been started is still normal and can accept tasks + */ + StockAvailable, + + /** + * The stock is not available. Tasks cannot be accepted + */ + StockUnavailable; +``` + +6. [Recommendation] At the same time of code modification, comments should also be modified, especially parameters, return values, exceptions, core logic, etc. + +7. [Recommendation] Delete any unused fields, methods, and inner classes from the class; Remove any unused parameter declarations and internal variables from the method. + +8. Carefully comment out code. Specify above, rather than simply commenting it out. If no, delete it. There are two possibilities for the code to be commented out: 1) The code logic will be restored later. 2) Never use it. The former without the comment information, it is difficult to know the annotation motivation. The latter suggestion IS deleted directly CAN, if NEED to consult historical code, log in code WAREHOUSE can. + + +Example: + +```java + public static final CommonVars TUNING_CLASS = + CommonVars.apply( + "wds.linkis.cs.ha.class", "org.apache.linkis.cs.highavailable.DefaultContextHAManager"); + // The following comment code should be removed + // public static final CommonVars TUNING_CLASS = + // CommonVars.apply("wds.linkis.cs.ha.class","org.apache.linkis.cs.persistence.ProxyMethodA"); +``` + +9. [Reference] for annotation requirements: first, can accurately reflect the design ideas and code logic; Second, be able to describe the business meaning, so that other programmers can quickly understand the information behind the code. A large piece of code with no comments at all is like a book to the reader. The comments are for the reader, even after a long time, they can clearly understand the thinking at that time. The comments are also for the successor to see, so that he can quickly take over his work. diff --git a/versioned_docs/version-1.4.0/development/development-specification/release-notes.md b/versioned_docs/version-1.4.0/development/development-specification/release-notes.md new file mode 100644 index 00000000000..0d98b30d074 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/release-notes.md @@ -0,0 +1,42 @@ +--- +title: Release-Notes Writing Specification +sidebar_position: 9 +--- +Before each version is released, the release-notes for this version need to be organized by the release manager or developer to briefly describe the specific changes included in the new version update. + +In order to maintain uniformity and facilitate writing, the following specifications are formulated: +- A summary of the version is required, a few sentences summarizing the core main changes of this version +- According to the changed function points, it is classified into four categories: new features/enhancement points/fixed functions/others +- Include a thank you column: students who have contributed to this version, in addition to issue/pr, and any students who have participated in this version discussion/community Q&A/comment suggestion +- Specification of each note: `[Service name abbreviation-L1 maven module name][Linkis-pr/issues serial number] This change briefly describes the information, you can generally know the change of this function through the description information.` `[Service name abbreviation -L1 maven module name]` as a label, the example is as follows +- Under the same category (new features/enhancement points/fixed functions/others), the service names with the same name are put together and sorted in ascending order of pr/issues serial number +- Corresponding English documents are required + +```` +Service name abbreviation: The change of this pr, at the code level, the corresponding service name abbreviation of the main service +For example, a pr made bug fixes to the JDBC engine, which is a JDBC module under the linkis-cg-engineconn service +EG:[EC-Jdbc][[Linkis-1851]](https://github.com/apache/linkis/issues/1851) Fix the jdbc engine, when there are multiple sql statements in one task execution, it cannot be executed normally The problem +If the L1-module does not exist, or it is the adjustment of the entire service level, the lower-level module may not be written, such as Entrance +```` + +## Common notes tags +```html +linkis-mg-eureka Eureka +linkis-mg-gateway Gateway +linkis-cg-linkismanager LM +linkis-cg-engineconnplugin ECP +linkis-cg-engineconnmanager ECM +linkis-cg-engineconn EC +linkis-cg-entrance Entrance +linkis-ps-publicservice PS +linkis-ps-cs CS +linkis-ps-metadatamanager MDM +linkis-ps-data-source-query DSQ + +Web console Web +Install Install +Install-Scripts Install-Scripts +Install-SQL Install-Sql +Install-Web Install-Web +Common module Common +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/unit-test.md b/versioned_docs/version-1.4.0/development/development-specification/unit-test.md new file mode 100644 index 00000000000..09074c0bc6a --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/unit-test.md @@ -0,0 +1,12 @@ +--- +title: Test Specification +sidebar_position: 7 +--- + +1. [**Mandatory**] Tool classes and internal interfaces of services must have test case. +2. [**Mandatory**] Unit testing needs to be able to be automated (triggered by mvn compilation), independence (unit test cases cannot call each other), and repeatable execution (can be executed multiple times, with the same result) +3. [**Mandatory**] A test case should only test one method. +4. [**Mandatory**] Test case exceptions cannot be caught and need to be thrown upwards. +5. [**Mandatory**] The unit test code must be written in the following project directory: src/test/java or scala, and it is not allowed to be written in other records. +6. [Recommended] Unit testing needs to consider boundary conditions, such as the end of the month and February. +7. [Recommended] For database-related unit tests, consider data rollback. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/development-specification/version-feature-specifications.md b/versioned_docs/version-1.4.0/development/development-specification/version-feature-specifications.md new file mode 100644 index 00000000000..0e9bec91030 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/development-specification/version-feature-specifications.md @@ -0,0 +1,25 @@ +--- +title: Version and New Feature Specification +sidebar_position: 8 +--- + +## 1. New version specification +When you need a new version, you need to follow the steps below: +1. [Mandatory] The new version must be organized for PMC members and developers to discuss, and meeting minutes must be recorded and sent to the mailing list +2. [Mandatory] The scope of the new version of the feature list requires email voting. 3+ PMC members approval is required and the approval votes are greater than the negative votes +3. [Mandatory] After the version is voted on, the corresponding version needs to be established on GitHub [Project](https://github.com/apache/linkis/projects) +4. [Mandatory] Each feature needs to send a separate mailing list to explain the design reasons and design ideas +5. [Mandatory] The mailing list needs to be sent to installation, database, configuration modification +6. [Recommended] One feature corresponds to one issue corresponds to one PR +7. [Mandatory] Each version requires CICD to pass and test cases to pass before the version can be released +8. [Constraints] Each version needs to have a corresponding leader, and the leader needs to manage related issues and PRs, and hold discussions, actively respond to emails, confirm plans, track progress, etc. + + +## 2. New feature specification +When you add new features, you need to follow the steps below: +1. [Mandatory] New features need to send emails to vote, and attach design reasons and design ideas +2. [Mandatory] New features need to be added to the version corresponding to GitHub [Project](https://github.com/apache/linkis/projects) +3. [Mandatory] The mailing list needs to be sent to installation, database, configuration modification +4. [Mandatory] New features must add new documents +5. [Mandatory] New features need to add corresponding unit tests, [Unit Test Specification](https://linkis.apache.org/community/development-specification/unit-test) +6. [Recommended] One feature corresponds to one issue corresponds to one PR \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/directory-structure.md b/versioned_docs/version-1.4.0/development/directory-structure.md new file mode 100644 index 00000000000..b8863a83ff4 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/directory-structure.md @@ -0,0 +1,291 @@ +--- +title: Directory Structure +sidebar_position: 0 +--- + +> linkis code hierarchy structure, as well as package structure and deployment directory structure description description, if you explain, if you want to explain, if you want to know more about each module module module module + +## 1. Source code directory structure + +```html +├── docs +│ ├── configuration //linkis configuration item documents for all modules +│ ├── errorcode // error code document of all modules of linkis +│ ├── configuration-change-records.md +│ ├── index.md +│ ├── info-1.1.3.md +│ ├── info-1.2.1.md +│ ├── info-1.3.1.md +│ └── trino-usage.md +├── linkis-commons //Core abstraction, which contains all common modules +│ ├── linkis-common //Common module, many built-in common tools +│ ├── linkis-hadoop-common +│ ├── linkis-httpclient //Java SDK top-level interface further encapsulates httpclient +│ ├── linkis-module // The top-level public module of linkis service involves parameters and service initialization when the service starts, unified Restful processing, login status verification, etc. +│ ├── linkis-mybatis //Mybatis module of SpringCloud +│ ├── linkis-protocol //Some interfaces and entity classes of service request/response +│ ├── linkis-rpc //RPC module, complex two-way communication based on Feign +│ ├── linkis-scheduler //General scheduling module +│ ├── linkis-storage //File operation tool set +├── linkis-computation-governance //Computation governance service +│ ├── linkis-client //Java SDK, users can directly access Linkis through Client +│ ├── linkis-computation-governance-common +│ ├── linkis-engineconn +│ ├── linkis-engineconn-manager +│ ├── linkis-entrance //General underlying entrance module +│ ├── linkis-jdbc-driver //You can use linkis to connect in a similar way to jdbc sdk +│ ├── linkis-manager +├── linkis-dist //The final step of compiling and packaging, integrating all lib packages and installation and deployment script configuration, etc. +│ ├── bin +│ │ ├── checkEnv.sh +│ │ ├── common.sh +│ │ └── install.sh //Installation script +│ ├── deploy-config +│ │ ├── db.sh //database configuration +│ │ └── linkis-env.sh //linkis startup related configuration +│ ├── docker +│ │ └── scripts +│ ├── helm +│ │ ├── charts +│ │ ├── scripts +│ │ ├── README_CN.md +│ │ └── README.md +│ ├── package +│ │ ├── bin +│ │ ├── conf +│ │ ├── db +│ │ └── sbin +│ ├── release-docs +│ │ ├── licenses +│ │ ├── LICENSE +│ │ └── NOTICE +│ ├── src +│ └── pom.xml +├── linkis-engineconn-plugins // engine +│ ├── elasticsearch +│ ├── flink +│ ├──hive +│ ├── io_file +│ ├── jdbc +│ ├── open look +│ ├── pipeline +│ ├── presto +│ ├── python +│ ├── seat tunnel +│ ├── shell +│ ├── spark +│ ├── sqoop +├── linkis-extensions // extension function enhancement plug-in module +│ ├── linkis-io-file-client // function extension to linkis-storage +├── linkis-orchestrator //Service orchestration +│ ├── linkis-code-orchestrator +│ ├── linkis-computation-orchestrator +│ ├── linkis-orchestrator-core +├── linkis-public-enhancements //public enhancement services +│ ├── linkis-baseddata-manager +│ ├── linkis-bml // material library +│ ├── linkis-configuration +│ ├── linkis-context-service //unified context +│ ├── linkis-datasource //data source service +│ ├── linkis-error-code +│ ├── linkis-instance-label +│ ├── linkis-jobhistory +│ ├── linkis-ps-common-lock +│ ├── linkis-script-dev +│ ├── linkis-udf +│ ├── linkis-variable +├── linkis-spring-cloud-services //Microservice Governance +│ ├── linkis-service-discovery +│ ├── linkis-service-gateway //Gateway Gateway +├── linkis-web //linkis management console code +│ ├── release-docs +│ │ ├── licenses +│ │ └── LICENSE +│ ├── src +│ ├── config.sh +│ ├── install.sh +│ ├── package.json +│ ├── pom.xml +│ └── vue.config.js +├── tool +│ ├── dependencies +│ │ ├── known-dependencies.txt +│ │ └── regenerate_konwn_dependencies_txt.sh +│ ├── code-style-idea.xml +│ ├── license-header +│ └── modify_license.sh +├── CONTRIBUTING_CN.md +├── CONTRIBUTING.md +├── linkis-tree.txt +├── mvnw +├── mvnw.cmd +├── pom.xml +├── README_CN.md +├── README.md +└── scalastyle-config.xml + +``` + +## 2. Installation package directory structure +```html + +├── bin +│ ├── checkEnv.sh ── environment variable detection +│ ├── common.sh ── some public shell functions +│ └── install.sh ── Main script for Linkis installation +├── deploy-config +│ ├── db.sh //Database connection configuration +│ └── linkis-env.sh //Related environment configuration information +├── docker +├── helm +├── licenses +├── linkis-package //Microservice-related startup configuration files, dependencies, scripts, linkis-cli, etc. +│ ├── bin +│ ├── conf +│ ├── db +│ ├── lib +│ └── sbin +├── NOTICE +├── LICENSE +├── README_CN.md +└── README.md + +``` + +## 3. Directory structure after deployment + + +```html +├── bin ── linkis-cli Shell command line program used to submit tasks to Linkis +│ ├── linkis-cli +│ ├── linkis-cli-hive +│ ├── linkis-cli-pre +│ ├── linkis-cli-spark-sql +│ ├── linkis-cli-spark-submit +│ └── linkis-cli-sqoop +├── conf configuration directory +│ ├── application-eureka.yml +│ ├── application-linkis.yml ── Microservice general yml +│ ├── linkis-cg-engineconnmanager.properties +│ ├── linkis-cg-engineplugin.properties +│ ├── linkis-cg-linkismanager.properties +│ │── linkis-cli +│ │ ├── linkis-cli.properties +│ │ └── log4j2.xml +│ ├── linkis-env.sh ── linkis environment variable configuration +│ ├── linkis-mg-gateway.properties +│ ├── linkis.properties ── The global coordination of linkis services, all microservices will be loaded and used when starting +│ ├── linkis-ps-publicservice.properties +│ ├── log4j2.xml +├── db Database DML and DDL file directory +│ ├── linkis_ddl.sql ── database table definition SQL +│ ├── linkis_dml.sql ── database table initialization SQL +│ └── module ── Contains DML and DDL files of each microservice +│ └── upgrade ── Incremental DML/DDL for each version +├── lib lib directory +│ ├── linkis-commons ── Public dependency package When most services start (except linkis-mg-gateway) -cp path parameter will load this directory +│ ├── linkis-computation-governance ── lib directory of computing governance module +│ ├── linkis-engineconn-plugins ── lib directory of all engine plugins +│ ├── linkis-public-enhancements ── lib directory of public enhancement services +│ └── linkis-spring-cloud-services ── SpringCloud lib directory +├── logs log directory +│ ├── linkis-cg-engineconnmanager-gc.log +│ ├── linkis-cg-engineconnmanager.log +│ ├── linkis-cg-engineconnmanager.out +│ ├── linkis-cg-engineplugin-gc.log +│ ├── linkis-cg-engineplugin.log +│ ├── linkis-cg-engineplugin.out +│ ├── linkis-cg-entrance-gc.log +│ ├── linkis-cg-entrance.log +│ ├── linkis-cg-entrance.out +│ ├── linkis-cg-linkismanager-gc.log +│ ├── linkis-cg-linkismanager.log +│ ├── linkis-cg-linkismanager.out +│ ├── linkis-cli +│ │ ├── linkis-client.hadoop.log.20220409162400037523664 +│ │ ├── linkis-client.hadoop.log.20220409162524417944443 +│ ├── linkis-mg-eureka-gc.log +│ ├── linkis-mg-eureka.log +│ ├── linkis-mg-eureka.out +│ ├── linkis-mg-gateway-gc.log +│ ├── linkis-mg-gateway.log +│ ├── linkis-mg-gateway.out +│ ├── linkis-ps-publicservice-gc.log +│ ├── linkis-ps-publicservice.log +│ └── linkis-ps-publicservice.out +├── pid The process ID of all microservices +│ ├── linkis_cg-engineconnmanager.pid ── engine manager microservice +│ ├── linkis_cg-engineconnplugin.pid ── engine plugin microservice +│ ├── linkis_cg-entrance.pid ── engine entry microservice +│ ├── linkis_cg-linkismanager.pid ── linkis manager microservice +│ ├── linkis_mg-eureka.pid ── eureka microservice +│ ├── linkis_mg-gateway.pid ──gateway microservice +│ └── linkis_ps-publicservice.pid ── public microservice +└── sbin Microservice startup and shutdown script directory +├── ext ──The start and stop script directory of each microservice +  ├── linkis-daemon.sh ── Quickly start, stop, and restart a single microservice script +├── linkis-start-all.sh ── Start all microservice scripts with one click +└── linkis-stop-all.sh ── Stop all microservice scripts with one click +``` +### 3.1 Configuration item modification + +After executing Linkis installation, all configuration items are located in the conf directory, +If you need to modify the configuration items, after modifying the `${LINKIS_HOME}/conf/*properties` file, restart the corresponding service, +For example: `sh sbin/linkis-daemon.sh start ps-publicservice`. +If you modify the public configuration file `application-eureka.yml/application-linkis.yml/linkis.properties`, you need to restart all services `sh sbin/linkis-start-all.sh` + +### 3.2 Microservice start and stop + +All microservice names are as follows: + ``` +├── linkis-cg-engineconnmanager engine management service +├── linkis-cg-engineplugin engine plugin management service +├── linkis-cg-entrance computing governance entry service +├── linkis-cg-linkismanager computing governance management service +├── linkis-mg-eureka microservice registry service +├── linkis-mg-gateway Linkis gateway service +├── linkis-ps-publicservice public service + ``` + +**Microservice Abbreviation**: + +| Abbreviation | Full name in English | Full name in Chinese | + |------|-------------------------|------------| +| cg | Computation Governance | Computing Governance | +| mg | Microservice Covernance | Microservice Governance | +| ps | Public Enhancement Service | Public Enhancement Service | + + + +``` +# Start all microservices at once: + + sh linkis-start-all.sh + +# Shut down all microservices at once + + sh linkis-stop-all.sh + +# Start a single microservice (the service name needs to remove the linkis prefix, such as: mg-eureka) + + sh linkis-daemon.sh start service-name + + For example: sh linkis-daemon.sh start mg-eureka + +# Shut down a single microservice + + sh linkis-daemon.sh stop service-name + + For example: sh linkis-daemon.sh stop mg-eureka + +# Restart a single microservice + + sh linkis-daemon.sh restart service-name + + For example: sh linkis-daemon.sh restart mg-eureka +# View the status of a single microservice + + sh linkis-daemon.sh status service-name + + For example: sh linkis-daemon.sh status mg-eureka +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/images/c-debug.png b/versioned_docs/version-1.4.0/development/images/c-debug.png new file mode 100644 index 00000000000..d5edce7fe24 Binary files /dev/null and b/versioned_docs/version-1.4.0/development/images/c-debug.png differ diff --git a/versioned_docs/version-1.4.0/development/images/c-port.png b/versioned_docs/version-1.4.0/development/images/c-port.png new file mode 100644 index 00000000000..2c0a8cb420f Binary files /dev/null and b/versioned_docs/version-1.4.0/development/images/c-port.png differ diff --git a/versioned_docs/version-1.4.0/development/images/debug.png b/versioned_docs/version-1.4.0/development/images/debug.png new file mode 100644 index 00000000000..4c0a9e39e4e Binary files /dev/null and b/versioned_docs/version-1.4.0/development/images/debug.png differ diff --git a/versioned_docs/version-1.4.0/development/images/test-0.png b/versioned_docs/version-1.4.0/development/images/test-0.png new file mode 100644 index 00000000000..3ebe85fe283 Binary files /dev/null and b/versioned_docs/version-1.4.0/development/images/test-0.png differ diff --git a/versioned_docs/version-1.4.0/development/images/test-1.png b/versioned_docs/version-1.4.0/development/images/test-1.png new file mode 100644 index 00000000000..3ebe85fe283 Binary files /dev/null and b/versioned_docs/version-1.4.0/development/images/test-1.png differ diff --git a/versioned_docs/version-1.4.0/development/images/test-2.png b/versioned_docs/version-1.4.0/development/images/test-2.png new file mode 100644 index 00000000000..95ad650c167 Binary files /dev/null and b/versioned_docs/version-1.4.0/development/images/test-2.png differ diff --git a/versioned_docs/version-1.4.0/development/new-engine-conn.md b/versioned_docs/version-1.4.0/development/new-engine-conn.md new file mode 100644 index 00000000000..fd8537782f4 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/new-engine-conn.md @@ -0,0 +1,477 @@ +--- +title: Quickly Implement New Engine +sidebar_position: 7.0 +--- + +## 1. Linkis new engine function code implementation + +Implementing a new engine is actually implementing a new EngineConnPlugin (ECP) engine plugin. Specific steps are as follows: + +### 1.1 Create a new maven module and introduce the maven dependency of ECP + +![maven dep](/Images/EngineConnNew/engine_jdbc_dependency.png) + +```xml + + org.apache.linkis + linkis-engineconn-plugin-core + ${linkis.version} + + +``` + +### 1.2 Implement the main interface of ECP + +- **EngineConnPlugin:** When starting EngineConn, first find the corresponding EngineConnPlugin class, and use this as the entry point to obtain the implementation of other core interfaces, which is the main interface that must be implemented. + +- **EngineConnFactory:** Implementing the logic of how to start an engine connector and how to start an engine executor is an interface that must be implemented. + - Implement the createEngineConn method: return an EngineConn object, where getEngine returns an object that encapsulates the connection information with the underlying engine, and also contains the Engine type information. + - For engines that only support a single computing scenario, inherit SingleExecutorEngineConnFactory, implement createExecutor, and return the corresponding Executor. + - For engines that support multi-computing scenarios, you need to inherit MultiExecutorEngineConnFactory and implement an ExecutorFactory for each computation type. EngineConnPlugin will obtain all ExecutorFactory through reflection, and return the corresponding Executor according to the actual situation. +- **EngineConnResourceFactory:** It is used to limit the resources required to start an engine. Before the engine starts, it will apply for resources from Linkis Manager based on this. Not required, GenericEngineResourceFactory can be used by default. +- **EngineLaunchBuilder:** It is used to encapsulate the necessary information that EngineConnManager can parse into startup commands. Not required, you can directly inherit JavaProcessEngineConnLaunchBuilder. + +### 1.3 Implement the engine Executor executor logic + +Executor is an executor. As a real computing scene executor, it is an actual computing logic execution unit and an abstraction of various specific capabilities of the engine. It provides various services such as locking, accessing status, and obtaining logs. And according to the actual needs, Linkis provides the following derived Executor base classes by default. The class names and main functions are as follows: + +- **SensibleExecutor:** + - Executor has multiple states, allowing Executor to switch states + - After the Executor switches states, operations such as notifications are allowed +- **YarnExecutor:** Refers to the Yarn type engine, which can obtain applicationId, applicationURL and queue. +- **ResourceExecutor:** means that the engine has the ability to dynamically change resources, and provides the requestExpectedResource method, which is used to apply for a new resource from the RM every time you want to change the resource; and the resourceUpdate method, which is used each time the engine actually uses the resource When changes occur, report the resource situation to RM. +- **AccessibleExecutor:** is a very important Executor base class. If the user's Executor inherits this base class, it means that the Engine can be accessed. Here, it is necessary to distinguish between the state() of SensibleExecutor and the getEngineStatus() method of AccessibleExecutor: state() is used to obtain the engine status, and getEngineStatus() will obtain the Metric data of basic indicators such as the status, load, and concurrency of the engine. +- At the same time, if AccessibleExecutor is inherited, the Engine process will be triggered to instantiate multiple EngineReceiver methods. EngineReceiver is used to process RPC requests from Entrance, EM and LinkisMaster, making the engine an accessible engine. If users have special RPC requirements, they can communicate with AccessibleExecutor by implementing the RPCService interface. +- **ExecutableExecutor:** is a resident Executor base class. The resident Executor includes: Streaming application in the production center, steps specified to run in independent mode after being submitted to Schedulelis, business applications for business users, etc. +- **StreamingExecutor:** Streaming is a streaming application, inherited from ExecutableExecutor, and needs to have the ability to diagnose, do checkpoint, collect job information, and monitor alarms. +- **ComputationExecutor:** is a commonly used interactive engine Executor, which handles interactive execution tasks and has interactive capabilities such as status query and task kill. +- **ConcurrentComputationExecutor:** User concurrent engine Executor, commonly used in JDBC type engines. When executing scripts, the administrator account starts the engine instance, and all users share the engine instance. + +## 2. Take the JDBC engine as an example to explain the implementation steps of the new engine in detail + +This chapter takes the JDBC engine as an example to explain the implementation process of the new engine in detail, including engine code compilation, installation, database configuration, management console engine label adaptation, and the new engine script type extension in Scripts and the task node extension of the new workflow engine, etc. . + +### 2.1 Concurrency engine setting default startup user + +The abstract class inherited from the core class `JDBCEngineConnExecutor` in the JDBC engine is `ConcurrentComputationExecutor`, and the abstract class inherited from the core class `XXXEngineConnExecutor` in the calculation engine is `ComputationExecutor`. This leads to the biggest difference between the two: the JDBC engine instance is started by the administrator user and shared by all users to improve the utilization of machine resources; while the script of the computing engine type is submitted, an engine instance will be started under each user. , the engine instances between users are isolated from each other. This will not be elaborated here, because whether it is a concurrent engine or a computing engine, the additional modification process mentioned below should be consistent. + +Correspondingly, if your new engine is a concurrent engine, then you need to pay attention to this class: AMConfiguration.scala, if your new engine is a computing engine, you can ignore it. + +```scala +object AMConfiguration { + // If your engine is a multi-user concurrent engine, then this configuration item needs to be paid attention to + val MULTI_USER_ENGINE_TYPES = CommonVars("wds.linkis.multi.user.engine.types", "jdbc,ck,es,io_file,appconn") + + private def getDefaultMultiEngineUser(): String = { + // This should be to set the startup user when the concurrent engine is pulled up. The default jvmUser is the startup user of the engine service Java process. + val jvmUser = Utils.getJvmUser + s"""{jdbc:"$jvmUser", presto: "$jvmUser" es: "$jvmUser", ck:"$jvmUser", appconn:"$jvmUser", io_file:"root"}""" + } +} +``` + +### 2.2 New engine type extension + +In the class `JDBCEngineConnFactory` that implements the `ComputationSingleExecutorEngineConnFactory` interface, the following two methods need to be implemented: + +```scala +override protected def getEngineConnType: EngineType = EngineType.JDBC + +override protected def getRunType: RunType = RunType.JDBC +``` + +Therefore, it is necessary to add variables corresponding to JDBC in EngineType and RunType. + +```scala +// EngineType.scala is similar to the variable definition of the existing engine, adding JDBC related variables or code +object EngineType extends Enumeration with Logging { + val JDBC = Value("jdbc") +} + +def mapStringToEngineType(str: String): EngineType = str match { + case _ if JDBC.toString.equalsIgnoreCase(str) => JDBC +} + +// RunType.scla中 +object RunType extends Enumeration { + val JDBC = Value("jdbc") +} +``` + +### 2.3 Version number settings in the JDBC engine tab + +```scala +// Add the version configuration of JDBC in LabelCommonConfig +public class LabelCommonConfig { + public final static CommonVars JDBC_ENGINE_VERSION = CommonVars.apply("wds.linkis.jdbc.engine.version", "4"); +} + +// Supplement the matching logic of jdbc in the init method of EngineTypeLabelCreator +// If this step is not done, when the code is submitted to the engine, the version number will be missing from the engine tag information +public class EngineTypeLabelCreator { +private static void init() { + defaultVersion.put(EngineType.JDBC().toString(), LabelCommonConfig.JDBC_ENGINE_VERSION.getValue()); + } +} +```` + +### 2.4 Types of script files that are allowed to be opened by the script editor + +Follow configuration items:wds.linkis.storage.file.type + +```scala +object LinkisStorageConf{ + val FILE_TYPE = CommonVars("wds.linkis.storage.file.type", "dolphin,sql,scala,py,hql,python,out,log,text,sh,jdbc,ngql,psql,fql").getValue +} +``` + +### 2.5 Configure JDBC script variable storage and parsing + +If this operation is not done, the variables in the JDBC script cannot be stored and parsed normally, and the code execution will fail when ${variable} is directly used in the script! + +![变量解析](/Images/EngineConnNew/variable_resolution.png) + + +```scala +// Maintain the variable relationship between codeType and runType through CODE_TYPE_AND_RUN_TYPE_RELATION in the CodeAndRunTypeUtils tool class + +val CODE_TYPE_AND_RUN_TYPE_RELATION = CommonVars("wds.linkis.codeType.runType.relation", "sql=>sql|hql|jdbc|hive|psql|fql,python=>python|py|pyspark,java=>java,scala=>scala,shell=>sh|shell") +``` + +Refer to PR:https://github.com/apache/linkis/pull/2047 + +### 2.6 Add JDBC engine text prompts or icons to the Linkis administrator console interface engine manager + +web/src/dss/module/resourceSimple/engine.vue + +```js +methods: { + calssifyName(params) { + switch (params) { + case 'jdbc': + return 'JDBC'; + ...... + } + } + // 图标过滤 + supportIcon(item) { + const supportTypes = [ + ...... + { rule: 'jdbc', logo: 'fi-jdbc' }, + ]; + } +} +``` + +The final effect presented to the user: + +![JDBC类型引擎](/Images/EngineConnNew/jdbc_engine_view.png) + +### 2.7 Compile, package, install and deploy the JDBC engine + +An example command for JDBC engine module compilation is as follows: + +```shell +cd /linkis-project/linkis-engineconn-pluginsjdbc + +mvn clean install -DskipTests +```` + +When compiling a complete project, the new engine will not be added to the final tar.gz archive by default. If necessary, please modify the following files: + +linkis-dist/package/src/main/assembly/assembly.xml + +```xml + + + ...... + + + ../../linkis-engineconn-pluginsjdbc/target/out/ + + lib/linkis-engineconn-plugins/ + + **/* + + + +``` + +Then run the compile command in the project root directory: + +```shell +mvn clean install -DskipTests +```` + +After successful compilation, find out.zip in the directories of linkis-dist/target/apache-linkis-1.x.x-incubating-bin.tar.gz and linkis-engineconn-pluginsjdbc/target/. + +Upload the out.zip file to the Linkis deployment node and extract it to the Linkis installation directory /lib/linkis-engineconn-plugins/: + +![引擎安装](/Images/EngineConnNew/engine_set_up.png) + +Don't forget to delete out.zip after decompression, so far the engine compilation and installation are completed. + +### 2.8 JDBC engine database configuration + +Select Add Engine in the console + +![添加引擎](/Images/EngineConnNew/add_engine_conf.png) + + +If you want to support engine parameter configuration on the management console, you can modify the database according to the JDBC engine SQL example. + +The JDBC engine is used here as an example. After the engine is installed, if you want to run the new engine code, you need to configure the database of the engine. Take the JDBC engine as an example, please modify it according to the situation of the new engine you implemented yourself. + +The SQL reference is as follows: + +```sql +SET @JDBC_LABEL="jdbc-4"; + +SET @JDBC_ALL=CONCAT('*-*,',@JDBC_LABEL); +SET @JDBC_IDE=CONCAT('*-IDE,',@JDBC_LABEL); +SET @JDBC_NODE=CONCAT('*-nodeexecution,',@JDBC_LABEL); + +-- JDBC +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', '范围:1-20,单位:个', 'jdbc引擎最大并发数', '2', 'NumInterval', '[1,20]', '0', '0', '1', '队列资源', 'jdbc'); + +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.driver', '取值范围:对应JDBC驱动名称', 'jdbc驱动名称','', 'None', '', '0', '0', '1', '数据源配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.url', '例如:jdbc:hive2://127.0.0.1:10000', 'jdbc连接地址', 'jdbc:hive2://127.0.0.1:10000', 'None', '', '0', '0', '1', '数据源配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.version', '取值范围:jdbc3,jdbc4', 'jdbc版本','jdbc4', 'OFT', '[\"jdbc3\",\"jdbc4\"]', '0', '0', '1', '数据源配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.max', '范围:1-20,单位:个', 'jdbc引擎最大连接数', '10', 'NumInterval', '[1,20]', '0', '0', '1', '数据源配置', 'jdbc'); + +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.auth.type', '取值范围:SIMPLE,USERNAME,KERBEROS', 'jdbc认证方式', 'USERNAME', 'OFT', '[\"SIMPLE\",\"USERNAME\",\"KERBEROS\"]', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.username', 'username', '数据库连接用户名', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.password', 'password', '数据库连接密码', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.principal', '例如:hadoop/host@KDC.COM', '用户principal', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.keytab.location', '例如:/data/keytab/hadoop.keytab', '用户keytab文件路径', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.proxy.user.property', '例如:hive.server2.proxy.user', '用户代理配置', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc'); + +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.cores', '取值范围:1-8,单位:个', 'jdbc引擎初始化核心个数', '1', 'NumInterval', '[1,8]', '0', '0', '1', 'jdbc引擎设置', 'jdbc'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', '取值范围:1-8,单位:G', 'jdbc引擎初始化内存大小', '1g', 'Regex', '^([1-8])(G|g)$', '0', '0', '1', 'jdbc引擎设置', 'jdbc'); + +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@JDBC_ALL, 'OPTIONAL', 2, now(), now()); + +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) + (select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'jdbc' and label_value = @JDBC_ALL); + +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@JDBC_IDE, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@JDBC_NODE, 'OPTIONAL', 2, now(), now()); + + + +select @label_id := id from linkis_cg_manager_label where `label_value` = @JDBC_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @JDBC_NODE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + + +-- jdbc default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) + (select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @JDBC_ALL); +``` + +If you want to reset the database configuration data of the engine, the reference files are as follows, please modify and use as needed: + +```sql +-- Clear the initialization data of the jdbc engine +SET @JDBC_LABEL="jdbc-4"; + +SET @JDBC_ALL=CONCAT('*-*,',@JDBC_LABEL); +SET @JDBC_IDE=CONCAT('*-IDE,',@JDBC_LABEL); +SET @JDBC_NODE=CONCAT('*-nodeexecution,',@JDBC_LABEL); + +delete from `linkis_ps_configuration_config_value` where `config_label_id` in + (select `relation`.`engine_type_label_id` AS `config_label_id` FROM `linkis_ps_configuration_key_engine_relation` relation INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @JDBC_ALL); + + +delete from `linkis_ps_configuration_key_engine_relation` +where `engine_type_label_id` in + (select label.id FROM `linkis_ps_configuration_config_key` config + INNER JOIN `linkis_cg_manager_label` label + ON config.engine_conn_type = 'jdbc' and label_value = @JDBC_ALL); + + +delete from `linkis_ps_configuration_category` +where `label_id` in (select id from `linkis_cg_manager_label` where `label_value` in(@JDBC_IDE, @JDBC_NODE)); + + +delete from `linkis_ps_configuration_config_key` where `engine_conn_type` = 'jdbc'; + +delete from `linkis_cg_manager_label` where `label_value` in (@JDBC_ALL, @JDBC_IDE, @JDBC_NODE); + +``` + +Final effect: + +![JDBC引擎](/Images/EngineConnNew/jdbc_engine_conf_detail.png) + +After this configuration, when linkis-cli and Scripts submit the engine script, the tag information of the engine and the connection information of the data source can be correctly matched, and then the newly added engine can be pulled up. + +### 2.9 Added JDBC script type and icon information in DSS Scripts + +If you use the Scripts function of DSS, you also need to make some small changes to the front-end files of the web in the dss project. The purpose of the changes is to support creating, opening, and executing JDBC engine script types in Scripts, as well as implementing the corresponding engine. Icons, fonts, etc. + +#### 2.9.1 scriptis.js + +web/src/common/config/scriptis.js + +```js +{ + rule: /\.jdbc$/i, + lang: 'hql', + executable: true, + application: 'jdbc', + runType: 'jdbc', + ext: '.jdbc', + scriptType: 'jdbc', + abbr: 'jdbc', + logo: 'fi-jdbc', + color: '#444444', + isCanBeNew: true, + label: 'JDBC', + isCanBeOpen: true +}, +``` + +#### 2.9.2 Script copy support + +web/src/apps/scriptis/module/workSidebar/workSidebar.vue + +```js +copyName() { + let typeArr = ['......', 'jdbc'] +} +``` + +#### 2.9.3 Logo and font color matching + +web/src/apps/scriptis/module/workbench/title.vue + +```js + data() { + return { + isHover: false, + iconColor: { + 'fi-jdbc': '#444444', + }, + }; + }, +``` + +web/src/apps/scriptis/module/workbench/modal.js + +```js +let logoList = [ + { rule: /\.jdbc$/i, logo: 'fi-jdbc' }, +]; +``` + +web/src/components/tree/support.js + +```js +export const supportTypes = [ + // Probably useless here + { rule: /\.jdbc$/i, logo: 'fi-jdbc' }, +] +``` + +Engine icon display + +web/src/dss/module/resourceSimple/engine.vue + +```js +methods: { + calssifyName(params) { + switch (params) { + case 'jdbc': + return 'JDBC'; + ...... + } + } + // 图标过滤 + supportIcon(item) { + const supportTypes = [ + ...... + { rule: 'jdbc', logo: 'fi-jdbc' }, + ]; + } +} +``` + +web/src/dss/assets/projectIconFont/iconfont.css + +```css +.fi-jdbc:before { + content: "\e75e"; +} +``` + +The control here should be: + +![引擎图标](/Images/EngineConnNew/jdbc_engine_logo.png) + +Find an svg file of the engine icon + +web/src/components/svgIcon/svg/fi-jdbc.svg + +If the new engine needs to contribute to the community in the future, the svg icons, fonts, etc. corresponding to the new engine need to confirm the open source agreement to which they belong, or obtain their copyright license. + +### 2.10 Workflow adaptation of DSS + +The final result: + +![工作流适配](/Images/EngineConnNew/jdbc_job_flow.png) + +Save the definition data of the newly added JDBC engine in the dss_workflow_node table, refer to SQL: + +```sql +-- Engine task node basic information definition +insert into `dss_workflow_node` (`id`, `name`, `appconn_name`, `node_type`, `jump_url`, `support_jump`, `submit_to_scheduler`, `enable_copy`, `should_creation_before_node`, `icon`) values('18','jdbc','-1','linkis.jdbc.jdbc',NULL,'1','1','1','0','svg文件'); + +-- The svg file corresponds to the new engine task node icon + +-- Classification and division of engine task nodes +insert into `dss_workflow_node_to_group`(`node_id`,`group_id`) values (18, 2); + +-- Basic information (parameter attribute) binding of the engine task node +INSERT INTO `dss_workflow_node_to_ui`(`workflow_node_id`,`ui_id`) VALUES (18,45); + +-- The basic information related to the engine task node is defined in the dss_workflow_node_ui table, and then displayed in the form of a form on the right side of the above figure. You can expand other basic information for the new engine, and then it will be automatically rendered by the form on the right. +``` + +web/src/apps/workflows/service/nodeType.js + +```js +import jdbc from '../module/process/images/newIcon/jdbc.svg'; + +const NODETYPE = { + ...... + JDBC: 'linkis.jdbc.jdbc', +} + +const ext = { + ...... + [NODETYPE.JDBC]: 'jdbc', +} + +const NODEICON = { + [NODETYPE.JDBC]: { + icon: jdbc, + class: {'jdbc': true} + }, +} +``` + +Add the icon of the new engine in the web/src/apps/workflows/module/process/images/newIcon/ directory + +web/src/apps/workflows/module/process/images/newIcon/jdbc + +Also when contributing to the community, please consider the lincese or copyright of the svg file. + +## 3. Chapter Summary + +The above content records the implementation process of the new engine, as well as some additional engine configurations that need to be done. At present, the expansion process of a new engine is still relatively cumbersome, and it is hoped that the expansion and installation of the new engine can be optimized in subsequent versions. + + + diff --git a/versioned_docs/version-1.4.0/development/new-microservice.md b/versioned_docs/version-1.4.0/development/new-microservice.md new file mode 100644 index 00000000000..cd5e14be036 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/new-microservice.md @@ -0,0 +1,377 @@ +--- +title: How to Develop A New Microservice +sidebar_position: 8.0 +--- + +> This article introduces how to develop, debug and deploy a new microservice in the local area based on the existing Linkis microservice architecture, so as to facilitate the need for logs of new applications. + +Mind mapping: + +![mind-Mapping](/Images/deployment/microservice/thinking.png) + +## 1. New microservice development + +> This article introduces the new microservice `linkis-new-microservice` as an example. How to create and register a new microservice belonging to linkis in IDEA + +**Software requirements** +- jdk1.8 +- maven3.5+ + +### 1.1 Create a new submodule + +**Note**: The new sub-module under which module is not fixed and depends on the situation. Generally, it is divided and confirmed by service group. Here is just an example. + +- Right click under the linkis-public-enhancements module + +![new-module](/Images/deployment/microservice/new-module.png) + +- Select maven and click Nex to next step + +![maven-module](/Images/deployment/microservice/maven-module.png) + +- Enter the module name and click Finsh + +![name-module](/Images/deployment/microservice/name-module.png) + +- Created successfully + +![created-successfully](/Images/deployment/microservice/created-successfully.png) + +#### 1.1.1 Modify the pom.xml file of the linkis-new-microservice module + +**path**: linkis-public-enhancements/linkis-new-microservice/pom.xml + +``` +## Add the public dependency module of linkis and the mybatis module dependency (if it does not involve database operations, you can not add mybatis) + + org.apache.linkis + linkis-module + ${project.version} + + + org.ow2.asm + asm + + + + + + org.apache.linkis + linkis-mybatis + ${project.version} + +``` + +#### 1.1.2 Add configuration files corresponding to new services + +> The configuration file is named according to linkis-service name.properties, and placed in the `linkis-dist/package/conf/` directory. When the service starts, the linkis.properties general configuration file and the linkis-service name.properties configuration file will be loaded + +Add `linkis-new-microservice.properties` configuration file + +**path**: linkis-dist/package/conf/linkis-new-microservice.properties + +``` properties +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +## If you do not need to provide interface Api, you do not need to add this configuration +##restful +wds.linkis.server.restful.scan.packages=org.apache.linkis.newmicroservice.server.restful + +## mybatis Configuration of data manipulation items +wds.linkis.server.mybatis.mapperLocations=classpath*:org/apache/linkis/newmicroservice/server/dao/mapper/*.xml +wds.linkis.server.mybatis.typeAliasesPackage=org.apache.linkis.newmicroservice.server.domain +wds.linkis.server.mybatis.BasePackage=org.apache.linkis.newmicroservice.server.dao + + +## Never use the same port as other services +spring.server.port=9208 + +``` + + +#### 1.1.4 Enable debug mode + +> It is convenient to debug the interface, no need to verify the login status + +**path**: linkis-dist/package/conf/linkis.properties + +![test-mode](/Images/deployment/microservice/test-mode.png) + +``` properties +wds.linkis.test.mode=true # Turn on test mode +wds.linkis.test.user=hadoop # Specify which user to proxy all requests to in test mode + +``` + +### 1.2 Code Development + +To make it easier for everyone to learn, let's take creating a simple API interface as an example. + +#### 1.2.1 Create a new interface class + +![new-microservice](/Images/deployment/microservice/new-microservice.png) + +``` java +package org.apache.linkis.newmicroservice.server.restful; + + +import io.swagger.annotations.ApiOperation; +import org.apache.linkis.server.Message; +import org.springframework.web.bind.annotation.*; + +import io.swagger.annotations.Api; + +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "newmicroservice") +@RestController +@RequestMapping(path = "/newmicroservice") +public class NewMicroservice { + + + @ApiOperation(value = "establish", httpMethod = "GET") + @RequestMapping(path = "establish", method = RequestMethod.GET) + public Message list() { + Map<String,String> map=new HashMap<>(); + map.put("NewMicroservice","Hello! This is a new microservice I registered(这是我注册的一个新的微服务)"); + return Message.ok("").data("map", map); + } + +} +``` + +#### 1.2.2 new startup class + +![maven-module](/Images/deployment/microservice/start-up.png) + +``` java + +package org.apache.linkis.newmicroservice.server; + +import org.apache.linkis.LinkisBaseServerApp; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class LinkisNewMicroserviceApplication { + + private static final Log logger = LogFactory.getLog(LinkisNewMicroserviceApplication.class); + + public static void main(String[] args) throws ReflectiveOperationException { + logger.info("Start to running LinkisNewmicroserviceApplication"); + LinkisBaseServerApp.main(args); + } +} +``` + +### 1.3 Start eureka service + +The specific guidelines for this step have been written in the [Debugging Guidelines](../development/debug) document and can be directly accessed, so I won’t introduce too much here + + +### 1.4 Start the new microservice locally + +Set the startup Application of linkis-new-microservice + +![commissioning-service](/Images/deployment/microservice/commissioning-service.png) + +parameter explanation: + +```shell +[Service Name] +linkis-new-microservice + +[Module Name] +linkis-new-microservice + +[VM Opitons] +-DserviceName=linkis-new-microservice -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf + +[main Class] +org.apache.linkis.newmicroservice.server.LinkisNewmicroserviceApplication + +[Add provided scope to classpath] +By checking Include dependencies with “Provided” scope, you can introduce provided-level dependency packages during debugging. +``` + +> After the above settings are completed, the Application can be run directly. After running successfully, open the browser and enter the url of the eureka registration center + +``` text + http://ip:port/ +``` + +![new-service](/Images/deployment/microservice/new-service.png) + +> When the linkis-new-microservice service appears in the eureka registration center, the local registration of the new microservice is successful. + +### 1.5 Postman for interface debugging + +**URL**: http://ip:port/api/rest_j/v1/newmicroservice/establish + +![postman-test](/Images/deployment/microservice/postman-test.png) + + +## 2. Package deployment +> Packaging and deployment mainly has two stages. The first step is that after the module is packaged by maven, the dependencies required by the module will be packaged into the corresponding target directory of the module linkis-new-microservice/target/out/lib. +> The second step is to assemble the complete final deployment installation package, you need to automatically copy `linkis-new-microservice/target/out/lib` to `linkis-dist/target/apache-linkis-x.x.x-incubating-bin/linkis - under package/lib` + +### 2.1 Modify the distribution.xml under the new service + +**path**: linkis-public-enhancements/linkis-new-microservice/src/main/assembly/distribution.xml + +![new-distribution](/Images/deployment/microservice/new-distribution.png) + +> Since there are many dependencies that need to be excluded, only part of the code is posted here + +``` xml + + antlr:antlr:jar + aopalliance:aopalliance:jar + com.fasterxml.jackson.core:jackson-annotations:jar + com.fasterxml.jackson.core:jackson-core:jar + +``` + +> Here is an explanation of why you need to add `excludes`, because the service startup script linkis-dist/package/sbin/ext/linkis-common-start generally loads the general lib by default + +![common-start](/Images/deployment/microservice/common-start.png) + +> Therefore, when packaging service dependencies, existing lib packages can be excluded. For details, please refer to linkis-computation-governance/linkis-entrance/src/main/assembly/distribution.xml + +### 2.2 Modify distribution.xml under linkis-dist + +**path**: linkis-dist/src/main/assembly/distribution.xml + + +> Add fileSet configuration, changing the configuration is mainly to control the output linkis-new-microservice service package when compiling and packaging + +![fileset](/Images/deployment/microservice/fileset.png) + +> Only the configuration content that needs to be added is posted here. + +``` xml + + + ../linkis-public-enhancements/linkis-new-microservice/target/out/lib + + + linkis-package/lib/linkis-public-enhancements/linkis-new-microservice + + + **/* + + + +``` + +### 2.3 Run configuration script for the service + +![new-configuration](/Images/deployment/microservice/new-configuration.png) + +``` text + +#!/usr/bin/env bash +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# description: manager start cmd +# +# Modified for Linkis 1.0.0 + + +export SERVER_SUFFIX="linkis-public-enhancements/linkis-new-microservice" + + +export SERVER_CLASS=org.apache.linkis.newmicroservice.server.LinkisNewMicroserviceApplication + +#export DEBUG_PORT= + +export COMMON_START_BIN=$LINKIS_HOME/sbin/ext/linkis-common-start +if [[ ! -f "${COMMON_START_BIN}" ]]; then + echo "The $COMMON_START_BIN does not exist!" + exit 1 +else + sh $COMMON_START_BIN +fi + +``` + + +### 2.4 linkis-start-all.sh configuration modification + +**path**: linkis-dist/package/sbin/linkis-start-all.sh + +![start-script](/Images/deployment/microservice/start-script.png) + +> Only the configuration content that needs to be added is posted here. + +``` text + ## startApp + #linkis-new-microservice + SERVER_NAME="new-microservice" + startApp +``` + +![detection-script](/Images/deployment/microservice/detection-script.png) + +> Only the configuration content that needs to be added is posted here. + +``` text + ##checkServer + #linkis-new-microservice + SERVER_NAME="new-microservice" + checkServer +``` + +### 2.5 linkis-stop-all.sh configuration modification + +**path**:linkis-dist/package/sbin/linkis-stop-all.sh + +![stop-script](/Images/deployment/microservice/stop-script.png) + +> Only the configuration content that needs to be added is posted here. + +``` text + ## stopApp + #linkis-new-microservice + export SERVER_NAME="new-microservice" + stopApp +``` + +### 2.6 Installation package preparation + +The specific guidelines for this step have been written in the [backend compilation](../development/build) document and can be directly accessed, so I won’t introduce too much here + +### 2.7 Server Deployment + +Here is an example of single-machine deployment, and the specific guidance of this step has been written in the [Single-machine deployment](../deployment/deploy-quick) document and can be accessed directly, so I won’t introduce it here + +After the installation and deployment is successful, you can directly visit the eureka registration center in the browser to see if the center has successfully registered the linkis-new-microservice service. If the registration is successful, the creation of a new microservice is successful. + +![new-service](/Images/deployment/microservice/new-service.png) diff --git a/versioned_docs/version-1.4.0/development/swwager.md b/versioned_docs/version-1.4.0/development/swwager.md new file mode 100644 index 00000000000..ca736a55fca --- /dev/null +++ b/versioned_docs/version-1.4.0/development/swwager.md @@ -0,0 +1,261 @@ +--- +title: Swagger Annotation +sidebar_position: 9.0 +--- + +## 1. Scope of swagger annotations +| API| Scope | Where to use | +| -------- | -------- | ----- | +|@Api|Protocol set description|Used on the controller class| +|@ApiOperation|Protocol description|Used in controller methods| +|@ApiImplicitParams|Non-object parameter set|Used in controller methods| +|@ApiImplicitParam|Non-object parameter description|Used in methods of @ApiImplicitParams| +|@ApiResponses|Response set|Used in the controller's method| +|@ApiResponse|Response|Used in @ApiResponses| +|@ApiModel|Describe the meaning of the returned object|Used in the returned object class| +|@ApiModelProperty|Object property|Used on the fields of the parameter object| +|@ApiParam|Protocol description|Used on methods, parameters, fields of classes| + +## 2. @Api +Use the location to use on the class to describe the request class. Identifies a Controller class is the Swagger document class. + +### 2.1 Attributes of annotations + +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|String|""|Description, meaningless. | +|tags|String[]|""|Grouping| +|basePath|String|""|Base Path| +|protocols|String|int|Request Protocol| +|authorizations|Authorization[]|@Authorization(value = "")|Configuration for advanced feature authentication| +|hidden|boolean|false|Is it hidden (not displayed, the default is false)| + + +### 2.2 The difference between attribute value and tags + +The value attribute is used to describe both the role of the class and the role of the method; + +The tags attribute is used for grouping both on classes and methods, but the effect of grouping is very different: + +When tags act on a class, the global methods are grouped, that is, multiple copies are made according to the tags attribute value. At this time, the tags value on the method is invalid, and the effect of matching or not matching the tags on the method is the same. + +When tags act on a method, they will be grouped according to the tags values ​​of all methods of the current class, with a finer granularity. + +### 2.3 How to use +Note: The difference between java and scala in @Api annotation + +````java +*java +@Api(tags = "Swagger test related interface") +@RestController + +*scala +@Api(tags = Array("Swagger test related interface")) +@RestController +```` + + +## 3. @ApiOperation +Used in methods, to describe the request method. +### 3.1 Attributes of annotations + +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|String|""|Description| +|notes|String|""| Detailed description| +|tags|String[]|""|Grouping| +|response|Class|Void.class|Response parameter type| +|responseReference|String[]|""|Specifies a reference to the response type, local/remote reference, and will override any other specified response() class| +|httpMethod|String|""|http request method, such as: GET, HEAD, POST, PUT, DELETE, OPTION, SPATCH| +|hidden|boolean|false|whether hidden (not displayed) defaults to false| +|code|int|200|http status code| +|extensions|Extension[]|@Extension(properties = @ExtensionProperty(name = "", value = "")|Extension Properties| + +### 3.2 How to use + +````java +@GetMapping("test1") +@ApiOperation(value = "test1 interface", notes = "test1 interface detailed description") +public ApiResult test1(@RequestParam String aa, @RequestParam String bb, @RequestParam String cc) { + return ApiUtil.success("success"); +} +```` + +## 4. @ApiImplicitParams + +Commonly used in methods to describe the request parameter list. +The value attribute can contain multiple @ApiImplicitParam, and describe each participant in detail. + +### 4.1 Attributes of annotations +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|String|""|Description| + +## 5. @ApiImplicitParams + +Used in methods to describe request parameters. When multiple parameters need to be described, it is used as a property of @ApiImplicitParams. + +### 5.1 Attributes of annotations +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|String|""|Description| +|name|String|""|Parameter Description| +|defaultValue|String|""|default value| +|allowableValues|String|""|Parameter allowable values| +|required|boolean|false|Required, default false| +|access|String|""|Parameter Filter| +|allowMultiple|boolean|false|Whether the parameter can accept multiple values ​​by appearing multiple times, the default is not allowed| +|dataType|String|""|The data type of the parameter, which can be a class name or a primitive data type| +|dataTypeClass|Class|Void.class| The data type of the parameter, overriding dataType| if provided +|paramType|String|""|Parameter type, valid values ​​are path, query, body, header, form| +|example|String|""|Parameter example of non-body type| +|examples|Example|@Example(value = @ExampleProperty(mediaType = "", value = ""))|Parameter example of body type| +|type|String|""|Add functionality to override detected types| +|format|String|""|Add the function to provide custom format format| +|readOnly|boolean|false|Adds features designated as read-only| + +### 5.2 How to use + +````java +@GetMapping("test1") +@ApiOperation(value = "test1 interface", notes = "test1 interface detailed description") +@ApiImplicitParams(value = { + @ApiImplicitParam(name = "aa",value = "aa description",defaultValue = "1",allowableValues ​​= "1,2,3",required = true), + @ApiImplicitParam(name = "bb",value = "bb description",defaultValue = "1",allowableValues ​​= "1,2,3",required = true), + @ApiImplicitParam(name = "cc",value = "Description of cc",defaultValue = "2",allowableValues ​​= "1,2,3",required = true), + +}) +```` + +## 6. @ApiParam + +Used in fields of methods, parameters, and classes to describe request parameters. + +### 6.1 Attributes of annotations +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|String|""|Description| +|name|String|""|Parameter Description| +|defaultValue|String|""|default value| +|allowableValues|String|""|Parameter allowable values| +|required|boolean|false|Required, default false| +|access|String|""|Parameter Filter| +|allowMultiple|boolean|false|Whether the parameter can accept multiple values ​​by appearing multiple times, the default is not allowed| +|dataType|String|""|The data type of the parameter, which can be a class name or a primitive data type| +|dataTypeClass|Class|Void.class| The data type of the parameter, overriding dataType| if provided +|paramType|String|""|Parameter type, valid values ​​are path, query, body, header, form| +|example|String|""|Parameter example of non-body type| +|examples|Example|@Example(value = @ExampleProperty(mediaType = "", value = ""))|Parameter example of body type| +|type|String|""|Add functionality to override detected types| +|format|String|""|Add the function to provide custom format format| +|readOnly|boolean|false|Adds features designated as read-only| + +### 6.2 How to use + +````java +@GetMapping("test2") +@ApiOperation(value = "test2 interface", notes = "test2 interface detailed description") +public ApiResult test2(@ApiParam(value = "aa description") @RequestParam String aa, @ApiParam(value = "bb description") @RequestParam String bb) { + return ApiUtil.success(new TestRes()); +} +```` + +## 7. @ApiModel + +Used in classes to describe requests, response classes, and entity classes. + +### 7.1 Attributes of annotations +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|String|""| is an alternative name to provide the model, by default, the class name is used| +|description|String|""|Class description| +|parent|Class parent|Void.class|Provides a parent class for the model to allow describing inheritance relationships| +|discriminatory|String|""|Supports model inheritance and polymorphism, using the name of the discriminator's field, you can assert which subtype to use| +|subTypes|boolean|false|Required, default false| +|access|Class parent|Void.class| Array of subtypes inherited from this model| +|reference|boolean|false|Specifies a reference to the corresponding type definition, overriding any other metadata specified| + +## 8 @ApiModelProperty + +Used in classes to describe requests, response classes, and entity classes. + +### 8.1 Attributes of annotations +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|String|""|Attribute Description| +|name|String|""|Override property name| +|allowableValues|String|""|Parameter allowable values| +|access|String|""|Filter Attribute| +|required|boolean|false|Required, default false| +|dataType|String|""|The data type of the parameter, which can be a class name or a primitive data type| +|hidden|boolean|false| Hidden| +|readOnly|String|""|Add functionality designated as read-only| +|reference|String|""|Specifies a reference to the corresponding type definition, overriding any other metadata specified| +|allowEmptyValue|boolean|false|Allow empty values| +|example|String|""|Example value for attribute| + +### 8.2 How to use + +Note: The difference between java and scala in the use of @ApiModelProperty annotation + +````java +*java entity class +@Data +@ApiModel(description = "Test request class") +public class TestReq { + + @ApiModelProperty(value = "User ID",required = true) + private Long userId; + @ApiModelProperty(value = "Username", example = "Zhang San") +} + +*scala entity class +@Data +@ApiModel(description = "Test response class") +public class TestRes { + @(ApiModelProperty @field)("User ID") + private Long userId; + @(ApiModelProperty @field)("Username") +} +```` + + +## 9. @ApiResponses + +Used on methods and classes to describe the response status code list. + +### 9.1 Attributes of annotations +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|value|ApiResponse[]|""|Description of response status code list| + +## 10. @ApiResponse + +Used in the method to describe the response status code. Generally used as a property of @ApiResponses. + +### 10.1 Attributes of annotations +| Property Name | Property Type | Property Default Value | Property Description | +| -------- | -------- | ----- |----- | +|code|int|""|Response HTTP Status Code| +|message|String|""|Description of the response| +|response|Class|Void.class|An optional response class used to describe the message payload, corresponding to the schema field of the response message object| +|reference|String|""|Specifies a reference to the response type, the specified application can make a local reference, or a remote reference, will be used as is, and will override any specified response() class| +|responseHeaders|ResponseHeader[]|@ResponseHeader(name = "", response = Void.class)|List of possible response headers| +|responseContainer|String|""|Declare the container of the response, valid values ​​are List, Set, Map, any other value will be ignored| + + +### 10.2 How to use + +````java +@GetMapping("test2") +@ApiOperation(value = "test2 interface", notes = "test2 interface detailed description") +@ApiResponses(value = { + @ApiResponse(code = 200, message = "Request successful", responseHeaders = {@ResponseHeader(name = "header1", description = "description of header1",response = String.class)}), + @ApiResponse(code = 401, message = "No permission"), + @ApiResponse(code = 403, message = "Access forbidden") +}) +public ApiResult test2(@ApiParam(value = "aa description") @RequestParam String aa, @ApiParam(value = "bb description") @RequestParam String bb) { + return ApiUtil.success(new TestRes()); +} + +```` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/table/_category_.json b/versioned_docs/version-1.4.0/development/table/_category_.json new file mode 100644 index 00000000000..f513fce7bc2 --- /dev/null +++ b/versioned_docs/version-1.4.0/development/table/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Table Structure", + "position": 12.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/development/table/all.md b/versioned_docs/version-1.4.0/development/table/all.md new file mode 100644 index 00000000000..0268ce99e2c --- /dev/null +++ b/versioned_docs/version-1.4.0/development/table/all.md @@ -0,0 +1,5 @@ +--- +title: Tables Message +sidebar_position: 2 +--- +## todo diff --git a/versioned_docs/version-1.4.0/development/table/udf-table.md b/versioned_docs/version-1.4.0/development/table/udf-table.md new file mode 100644 index 00000000000..1bb6786c6db --- /dev/null +++ b/versioned_docs/version-1.4.0/development/table/udf-table.md @@ -0,0 +1,99 @@ +--- +title: UDF Table Structure +sidebar_position: 2 +--- + +## 1. linkis_ps_udf_baseinfo + +The basic information table of udf function, which stores basic information such as udf name/type + +| number | name | description | type | key | empty | extra | default value | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | primary key auto-increment id | bigint(20) | PRI | NO | auto_increment | | +| 2 | `create_user` | create user | varchar(50) | | NO | | | +| 3 | `udf_name` | udf name | varchar(255) | | NO | | | +| 4 | `udf_type` | udf type | int(11) | | YES | | 0 | +| 5 | `tree_id` | id of linkis_ps_udf_tree | bigint(20) | | NO | | | +| 6 | `create_time` | creation time | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 7 | `update_time` | update time | timestamp | | NO | | CURRENT_TIMESTAMP | +| 8 | `sys` | source system | varchar(255) | | NO | | ide | +| 9 | `cluster_name` | Cluster name, not used yet, default is all | varchar(255) | | NO | | | +| 10 | `is_expire` | Expired or not | bit(1) | | YES | | | +| 11 | `is_shared` | Is it shared | bit(1) | | YES | | | + + +udf_type +```` +udf_type 0: udf function - generic +udf_type 2: udf function - spark + +udf_type 3: custom function - python function +udf_type 4: custom function - scala function +```` + +## 2. linkis_ps_udf_manager + +The administrator user table of the udf function, with sharing permissions, only the front end of the udf administrator has a shared entry + +| number | name | description | type | key | empty | extra | default value | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `user_name` | | varchar(20) | | YES | | | + +## 3. linkis_ps_udf_shared_info + +udf shared record table + +| number | name | description | type | key | empty | extra | default value | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | id of linkis_ps_udf_baseinfo | bigint(20) | | NO | | | +| 3 | `user_name` | username used by the share | varchar(50) | | NO | | | + +## 4. linkis_ps_udf_tree + +Tree-level record table for udf classification + +| number | name | description | type | key | empty | extra | default value | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `parent` | parent category | bigint(20) | | NO | | | +| 3 | `name` | Class name of the function | varchar(100) | | YES | | | +| 4 | `user_name` | username | varchar(50) | | NO | | | +| 5 | `description` | description information | varchar(255) | | YES | | | +| 6 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 7 | `update_time` | | timestamp | | NO | | CURRENT_TIMESTAMP | +| 8 | `category` | category distinction udf / function | varchar(50) | | YES | | | + +## 5. linkis_ps_udf_user_load + +Whether udf is the configuration loaded by default + +| number | name | description | type | key | empty | extra | default value | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | id of linkis_ps_udf_baseinfo | int(11) | | NO | | | +| 3 | `user_name` | user owned | varchar(50) | | NO | | | + +## 6. linkis_ps_udf_version + +udf version information table + +| number | name | description | type | key | empty | extra | default value | +|------ |------ |------ |------ |------ |------ |------ |------ | +| 1 | `id` | | bigint(20) | PRI | NO | auto_increment | | +| 2 | `udf_id` | id of linkis_ps_udf_baseinfo | bigint(20) | | NO | | | +| 3 | `path` | The local path of the uploaded script/jar package | varchar(255) | | NO | | | +| 4 | `bml_resource_id` | Material resource id in bml | varchar(50) | | NO | | | +| 5 | `bml_resource_version` | bml material version | varchar(20) | | NO | | | +| 6 | `is_published` | whether to publish | bit(1) | | YES | | | +| 7 | `register_format` | registration format | varchar(255) | | YES | | | +| 8 | `use_format` | use format | varchar(255) | | YES | | | +| 9 | `description` | Version description | varchar(255) | | NO | | | +| 10 | `create_time` | | timestamp | | NO | on update CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | +| 11 | `md5` | | varchar(100) | | YES | | | + + +## ER diagram + +![image](/Images-zh/table/udf.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/_category_.json b/versioned_docs/version-1.4.0/engine-usage/_category_.json new file mode 100644 index 00000000000..a682853ef7e --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Engine Usage", + "position": 5.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/elasticsearch.md b/versioned_docs/version-1.4.0/engine-usage/elasticsearch.md new file mode 100644 index 00000000000..f8eda6a1c84 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/elasticsearch.md @@ -0,0 +1,243 @@ +--- +title: ElasticSearch Engine +sidebar_position: 11 +--- + +This article mainly introduces the installation, usage and configuration of the `ElasticSearch` engine plugin in `Linkis`. + +## 1. Preliminary work +### 1.1 Engine installation + +If you want to use the `ElasticSearch` engine on your `Linkis` service, you need to install the `ElasticSearch` service and make sure the service is available. + +### 1.2 Service Authentication +Use the following command to verify whether the `ElasticSearch` engine service is available. If the service has enabled user authentication, you need to add `--user username:password` +``` +curl [--user username:password] http://ip:port/_cluster/healty?pretty +``` +The following output means that the `ElasticSearch` service is available, note that the cluster `status` is `green` +```json +{ + "cluster_name" : "docker-cluster", + "status" : "green", + "timed_out" : false, + "number_of_nodes" : 1, + "number_of_data_nodes" : 1, + "active_primary_shards" : 7, + "active_shards" : 7, + "relocating_shards" : 0, + "initializing_shards" : 0, + "unassigned_shards" : 0, + "delayed_unassigned_shards" : 0, + "number_of_pending_tasks" : 0, + "number_of_in_flight_fetch" : 0, + "task_max_waiting_in_queue_millis" : 0, + "active_shards_percent_as_number" : 100.0 +} +``` +## 2. Engine plugin installation + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (maven environment is required) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/elasticsearch/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/elasticsearch/target/out/ +``` + +[EngineConnPlugin Engine Plugin Installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine plug-in package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── elasticsearch +│ ├── dist +│ │ └── 7.6.2 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 7.6.2 +``` +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check if the engine is refreshed successfully +You can check whether the `last_update_time` of this table in the `linkis_engine_conn_plugin_bml_resources` in the database is the time when the refresh is triggered. + +```sql +#Login to the linkis database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. Engine usage + +### 3.1 Submit tasks through `Linkis-cli` +**`-codeType` parameter description** +- `essql`: Execute `ElasticSearch` engine tasks through `SQL` scripts +- `esjson`: Execute `ElasticSearch` engine tasks through `JSON` script + +**`essql` method example** + +**Note:** Using this form, the `ElasticSearch` service must install the SQL plug-in, please refer to the installation method: https://github.com/NLPchina/elasticsearch-sql#elasticsearch-762 +```shell + sh ./bin/linkis-cli -submitUser Hadoop \ + -engineType elasticsearch-7.6.2 -codeType essql \ + -code '{"sql": "select * from kibana_sample_data_ecommerce limit 10' \ + -runtimeMap linkis.es.http.method=GET \ + -runtimeMap linkis.es.http.endpoint=/_sql \ + -runtimeMap linkis.es.datasource=hadoop \ + -runtimeMap linkis.es.cluster=127.0.0.1:9200 +``` + +**`esjson` style example** +```shell +sh ./bin/linkis-cli -submitUser Hadoop \ +-engineType elasticsearch-7.6.2 -codeType esjson \ +-code '{"query": {"match": {"order_id": "584677"}}}' \ +-runtimeMap linkis.es.http.method=GET \ +-runtimeMap linkis.es.http.endpoint=/kibana_sample_data_ecommerce/_search \ +-runtimeMap linkis.es.datasource=hadoop \ +-runtimeMap linkis.es.cluster=127.0.0.1:9200 +``` + +More `Linkis-Cli` command parameter reference: [`Linkis-Cli` usage](../user-guide/linkiscli-manual.md) + +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description + +| Configuration | Default | Required | Description | +| ------------------------ | ------------------- | ---| ------------------------------------------- | +| linkis.es.cluster | 127.0.0.1:9200 | yes | ElasticSearch cluster, multiple nodes separated by commas | +| linkis.es.datasource | hadoop |是 | ElasticSearch datasource | +| linkis.es.username | none | no | ElasticSearch cluster username | +| linkis.es.password | none | no | ElasticSearch cluster password | +| linkis.es.auth.cache | false | No | Whether the client caches authentication | +| linkis.es.sniffer.enable | false | No | Whether the client enables sniffer | +| linkis.es.http.method | GET |No| Call method | +| linkis.es.http.endpoint | /_search | No | Endpoint called by JSON script | +| linkis.es.sql.endpoint | /_sql | No | Endpoint called by SQL script | +| linkis.es.sql.format | {"query":"%s"} |No | Template called by SQL script, %s is replaced with SQL as the request body to request Es cluster | +| linkis.es.headers.* | None | No | Client Headers Configuration | +| linkis.engineconn.concurrent.limit | 100|No| Maximum concurrent engine | + +### 4.2 Configuration modification +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.2.1 Management console configuration + +![](./images/es-manage.png) + +Note: After modifying the configuration under the `IDE` tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE -submitUser hadoop \ +-engineType elasticsearch-7.6.2 -codeType esjson \ +-code '{"query": {"match": {"order_id": "584677"}}}' \ +-runtimeMap linkis.es.http.method=GET \ +-runtimeMap linkis.es.http.endpoint=/kibana_sample_data_ecommerce/_search +``` + +#### 4.2.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "select * from kibana_sample_data_ecommerce limit 10;", "runType": "essql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.es.cluster":"http://127.0.0.1:9200", + "linkis.es.datasource":"hadoop", + "linkis.es.username":"", + "linkis.es.password":"" + } + } + }, + "labels": { + "engineType": "elasticsearch-7.6.2", + "userCreator": "hadoop-IDE" + } +} +``` + +#### 4.2.3 File Configuration +Configure by modifying the `linkis-engineconn.properties` file in the directory `${LINKIS_HOME}/lib/linkis-engineconn-plugins/elasticsearch/dist/7.6.2/conf/`, as shown below: + +![](./images/es-config.png) + +### 4.3 Engine related data sheet + +`Linkis` is managed through the engine tag, and the data table information involved is shown below. + +``` +linkis_ps_configuration_config_key: key and default values ​​of configuration parameters inserted into the engine +linkis_cg_manager_label: Insert engine label such as: elasticsearch-7.6.2 +linkis_ps_configuration_category: Insert the directory association of the engine +linkis_ps_configuration_config_value: The configuration that the insertion engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data related to the engine in the table is as follows + +```sql +-- set variable +SET @ENGINE_LABEL="elasticsearch-7.6.2"; +SET @ENGINE_ALL=CONCAT('*-*,',@ENGINE_LABEL); +SET @ENGINE_IDE=CONCAT('*-IDE,',@ENGINE_LABEL); +SET @ENGINE_NAME="elasticsearch"; + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from `linkis_cg_manager_label` where label_value = @ENGINE_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.cluster', 'eg: http://127.0.0.1:9200', 'connection address', 'http://127.0.0.1:9200', 'None', '', @ENGINE_NAME , 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.datasource', 'Connection Alias', 'Connection Alias', 'hadoop', 'None', '', @ENGINE_NAME, 0, 0, 1, 'Datasource Configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.username', 'username', 'ES cluster username', 'No', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.password', 'password', 'ES cluster password', 'None', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.auth.cache', 'Does the client cache authentication', 'Does the client cache authentication', 'false', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.sniffer.enable', 'Whether the client enables sniffer', 'Whether the client enables sniffer', 'false', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.http.method', 'call method', 'HTTP request method', 'GET', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.http.endpoint', '/_search', 'JSON script Endpoint', '/_search', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.sql.endpoint', '/_sql', 'SQL script Endpoint', '/_sql', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.sql.format', 'The template called by the SQL script, replace %s with SQL as the request body to request the Es cluster', 'request body', '{"query":"%s"}', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.es.headers.*', 'Client Headers Configuration', 'Client Headers Configuration', 'None', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.engineconn.concurrent.limit', 'engine max concurrency', 'engine max concurrency', '100', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source conf') ; + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as config_key_id, label.id AS engine_type_label_id FROM `linkis_ps_configuration_config_key` config +INNER JOIN `linkis_cg_manager_label` label ON config.engine_conn_type = @ENGINE_NAME and label_value = @ENGINE_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select relation.config_key_id AS config_key_id, '' AS config_value, relation.engine_type_label_id AS config_label_id FROM `linkis_ps_configuration_key_engine_relation` relation +INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @ENGINE_ALL); + +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/flink.md b/versioned_docs/version-1.4.0/engine-usage/flink.md new file mode 100644 index 00000000000..cd876ef8419 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/flink.md @@ -0,0 +1,191 @@ +--- +title: Flink Engine +sidebar_position: 8 +--- + +# Flink engine usage documentation + +This article mainly introduces the installation, use and configuration of the `flink` engine plugin in `Linkis`. + +## 1. Preliminary work +### 1.1 Engine environment configuration + +If you want to use the `Flink` engine on your server, you need to ensure that the following environment variables are set correctly and that the user who started the engine has these environment variables. + +### 1.2 Engine Verification + +It is strongly recommended that you check these environment variables for the executing user before executing `flink` tasks. The specific way is +``` +sudo su -${username} +echo ${JAVA_HOME} +echo ${FLINK_HOME} +``` + +| Environment variable name | Environment variable content | Remarks | +|-----------------|----------------|-------------- -----------------------------| +| JAVA_HOME | JDK installation path | Required | +| HADOOP_HOME | Hadoop installation path | Required | +| HADOOP_CONF_DIR | Hadoop configuration path | Linkis starts the Flink on yarn mode adopted by the Flink engine, so yarn support is required. | +| FLINK_HOME | Flink installation path | Required | +| FLINK_CONF_DIR | Flink configuration path | Required, such as ${FLINK_HOME}/conf | +| FLINK_LIB_DIR | Flink package path | Required, ${FLINK_HOME}/lib | + + +## 2. Engine plugin installation + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (requires a `maven` environment) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/flink/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/flink/target/out/ +``` + +[EngineConnPlugin engine plugin installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine plug-in package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── big +│ ├── dist +│ │ └── 1.12.2 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 1.12.2 +``` +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check if the engine is refreshed successfully +You can check whether the `last_update_time` of this table in the `linkis_engine_conn_plugin_bml_resources` in the database is the time when the refresh is triggered. + +```sql +#Login to the linkis database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + + +## 3. Use of Flink engine + +The `Flink` engine of `Linkis` is started by `flink on yarn`, so the queue used by the user needs to be specified, as shown in the figure below. + +![yarn](./images/yarn-conf.png) + +### 3.1 Submit tasks through `Linkis-cli` + +```shell +sh ./bin/linkis-cli -engineType flink-1.12.2 \ +-codeType sql -code "show tables" \ +-submitUser hadoop -proxyUser hadoop +``` + +More `Linkis-Cli` command parameter reference: [`Linkis-Cli` usage](../user-guide/linkiscli-manual.md) + +### 3.2 Submitting tasks via `ComputationEngineConn` + +`FlinkSQL` can support a variety of data sources, such as `binlog, kafka, hive`, etc. If you want to use these data sources in `Flink` code, you need to put these `connector` plugin `jar` packages into In the `lib` of the `flink` engine, and restart the `EnginePlugin` service of `Linkis`. If you want to use `binlog` as a data source in your `FlinkSQL`, then you need to place `flink-connector-mysql-cdc-1.1.1.jar` in the `lib` of the `flink` engine. + +In order to facilitate sampling and debugging, we have added the `fql` script type in `Scriptis`, which is specially used to execute `FlinkSQL`. But you need to ensure that your `DSS` has been upgraded to `DSS1.0.0`. After upgrading to `DSS1.0.0`, you can directly enter `Scriptis` to create a new `fql` script for editing and execution. + +Writing example of `FlinkSQL`, taking `binlog` as an example +```sql +CREATE TABLE mysql_binlog ( + id INT NOT NULL, + name STRING, + age INT +) WITH ( + 'connector' = 'mysql-cdc', + 'hostname' = 'ip', + 'port' = 'port', + 'username' = 'username', + 'password' = 'password', + 'database-name' = 'dbname', + 'table-name' = 'tablename', + 'debezium.snapshot.locking.mode' = 'none' -- it is recommended to add, otherwise the lock table will be required +); +select * from mysql_binlog where id > 10; +``` +When debugging using the `select` syntax in `Scriptis`, the `Flink` engine will have an automatic `cancel` mechanism, that is, when the specified time or the number of lines sampled reaches the specified number, the `Flink` engine will Actively cancel the task and persist the obtained result set, and then the front end will call the interface to open the result set to display the result set on the front end. + +### 3.3 Submitting tasks via `OnceEngineConn` + +`OnceEngineConn` is used to officially start `Flink` streaming applications, specifically by calling `LinkisManager` `createEngineConn` interface through `LinkisManagerClient`, and sending the code to the created `Flink` engine, and then The `Flink` engine starts to execute, and this method can be called by other systems, such as `Streamis`. The usage of `Client` is also very simple, first create a `maven` project, or introduce the following dependencies in your project. +```xml + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` +Then create a `scala` test file, click execute, and the parsing from a `binlog` data is completed and inserted into a table in another mysql database. But it should be noted that you must create a `resources` directory in the `maven` project, place a `linkis.properties` file, and specify the `gateway` address and `api` version of `linkis`, such as +```properties +wds.linkis.server.version=v1 +wds.linkis.gateway.url=http://ip:9001/ +``` +```java +object OnceJobTest { + def main(args: Array[String]): Unit = { + val sql = """CREATE TABLE mysql_binlog ( + | id INT NOT NULL, + | name STRING, + | age INT + |) WITH ( + | 'connector' = 'mysql-cdc', + | 'hostname' = 'ip', + | 'port' = 'port', + | 'username' = '${username}', + | 'password' = '${password}', + | 'database-name' = '${database}', + | 'table-name' = '${tablename}', + | 'debezium.snapshot.locking.mode' = 'none' + |); + |CREATE TABLE sink_table ( + | id INT NOT NULL, + | name STRING, + | age INT, + | primary key(id) not enforced + |) WITH ( + | 'connector' = 'jdbc', + | 'url' = 'jdbc:mysql://${ip}:port/${database}', + | 'table-name' = '${tablename}', + | 'driver' = 'com.mysql.jdbc.Driver', + | 'username' = '${username}', + | 'password' = '${password}' + |); + |INSERT INTO sink_table SELECT id, name, age FROM mysql_binlog; + |""".stripMargin + val onceJob = SimpleOnceJob.builder().setCreateService("Flink-Test").addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY, "flink-1.12.2") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY, "hadoop-Streamis").addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY, "once") + .addStartupParam(Configuration.IS_TEST_MODE.key, true) + // .addStartupParam("label." + LabelKeyConstant.CODE_TYPE_KEY, "sql") + .setMaxSubmitTime(300000) + .addExecuteUser("hadoop").addJobContent("runType", "sql").addJobContent("code", sql).addSource("jobName", "OnceJobTest") + .build() + onceJob.submit() + println(onceJob.getId) + onceJob.waitForCompleted() + System.exit(0) + } +} +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/hive.md b/versioned_docs/version-1.4.0/engine-usage/hive.md new file mode 100644 index 00000000000..aac1f8d8556 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/hive.md @@ -0,0 +1,291 @@ +--- +title: Hive Engine +sidebar_position: 2 +--- + +This article mainly introduces the installation, usage and configuration of the `Hive` engine plugin in `Linkis`. + +## 1. Preliminary work +### 1.1 Environment configuration before engine use + +If you want to use the `hive` engine on your server, you need to ensure that the following environment variables have been set correctly and the engine startup user has these environment variables. + +It is strongly recommended that you check these environment variables for the executing user before executing `hive` tasks. + +| Environment variable name | Environment variable content | Remarks | +|-----------------|----------------|------| +| JAVA_HOME | JDK installation path | Required | +| HADOOP_HOME | Hadoop installation path | Required | +| HADOOP_CONF_DIR | Hadoop configuration path | required | +| HIVE_CONF_DIR | Hive configuration path | required | + +### 1.1 Environment verification +``` +# link hive +bin/hive + +# test command +show databases; + +# Being able to link successfully and output database information normally means that the environment configuration is successful +hive (default)> show databases; +OK +databases_name +default +``` + +## 2. Engine plugin installation [default engine](./overview.md) + +The binary installation package released by `linkis` includes the `Hive` engine plug-in by default, and users do not need to install it additionally. + +The version of `Hive` supports `hive1.x` and `hive2.x`. The default is to support `hive on MapReduce`. If you want to change to `Hive on Tez`, you need to modify it according to this `pr`. + + + +The `hive` version supported by default is 3.1.3, if you want to modify the `hive` version, you can find the `linkis-engineplugin-hive` module, modify the \ tag, and then compile this module separately Can + +[EngineConnPlugin engine plugin installation](../deployment/install-engineconn.md) + +## 3. Engine usage + +### 3.1 Submitting tasks via `Linkis-cli` + +```shell +sh ./bin/linkis-cli -engineType hive-3.1.3 \ +-codeType hql -code "show databases" \ +-submitUser hadoop -proxyUser hadoop +``` + +More `Linkis-Cli` command parameter reference: [`Linkis-Cli` usage](../user-guide/linkiscli-manual.md) + +### 3.2 Submit tasks through Linkis SDK + +`Linkis` provides `SDK` of `Java` and `Scala` to submit tasks to `Linkis` server. For details, please refer to [JAVA SDK Manual](../user-guide/sdk-manual.md). +For the `Hive` task, you only need to modify `EngineConnType` and `CodeType` parameters in `Demo`: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "hive-3.1.3"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "hql"); // required codeType +``` + +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description +| Configuration | Default | Required | Description | +| ------------------------ | ------------------- | ---| ------------------------------------------- | +| wds.linkis.rm.instance | 10 | no | engine maximum concurrency | +| wds.linkis.engineconn.java.driver.memory | 1g | No | engine initialization memory size | +| wds.linkis.engineconn.max.free.time | 1h | no | engine idle exit time | + +### 4.2 Queue resource configuration +The `MapReduce` task of `hive` needs to use `yarn` resources, so a queue needs to be set + +![yarn](./images/yarn-conf.png) + +### 4.3 Configuration modification +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.3.1 Management Console Configuration + +![hive](./images/hive-config.png) + +Note: After modifying the configuration under the `IDE` tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType hive-3.1.3 -codeType hql \ +-code "show databases" \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.3.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "show databases;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.rm.instance":"10" + } + } + }, + "labels": { + "engineType": "hive-3.1.3", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.4 Engine related data table + +`Linkis` is managed through engine tags, and the data table information involved is as follows. + +``` +linkis_ps_configuration_config_key: Insert the key and default values ​​​​of the configuration parameters of the engine +linkis_cg_manager_label: insert engine label such as: hive-3.1.3 +linkis_ps_configuration_category: Insert the directory association of the engine +linkis_ps_configuration_config_value: The configuration that the insertion engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data related to the engine in the table is as follows + +```sql +-- set variable +SET @HIVE_LABEL="hive-3.1.3"; +SET @HIVE_ALL=CONCAT('*-*,',@HIVE_LABEL); +SET @HIVE_IDE=CONCAT('*-IDE,',@HIVE_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @HIVE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @HIVE_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @HIVE_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', 'range: 1-20, unit: piece', 'hive engine maximum concurrent number', '10', 'NumInterval', '[1,20]', '0 ', '0', '1', 'Queue resource', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', 'Value range: 1-10, unit: G', 'hive engine initialization memory size', '1g', 'Regex', '^([ 1-9]|10)(G|g)$', '0', '0', '1', 'hive engine settings', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('hive.client.java.opts', 'hive client process parameters', 'jvm parameters when the hive engine starts','', 'None', NULL, '1', '1', '1', 'hive engine settings', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('mapred.reduce.tasks', 'Range: -1-10000, unit: number', 'reduce number', '-1', 'NumInterval', '[-1,10000]', '0', '1', '1', 'hive resource settings', 'hive'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.max.free.time', 'Value range: 3m,15m,30m,1h,2h', 'Engine idle exit time','1h', 'OFT', '[\ "1h\",\"2h\",\"30m\",\"15m\",\"3m\"]', '0', '0', '1', 'hive engine settings', ' hive'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'hive' and label_value = @HIVE_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @HIVE_ALL); +``` + +## 5. Hive modification log display +The default log interface does not display `application_id` and the number of `task` completed, users can output the log according to their needs +The code blocks that need to be modified in the `log4j2-engineconn.xml/log4j2.xml` configuration file in the engine are as follows +1. Need to add under the `appenders` component +```xml + + + +``` +2. Need to add under `root` component +```xml + +``` +3. Need to add under `loggers` component +```xml + + + +``` +After making the above related modifications, the log can add task `task` progress information, which is displayed in the following style +``` +2022-04-08 11:06:50.228 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Status: Running (Executing on YARN cluster with App id application_1631114297082_432445) +2022-04-08 11:06:50.248 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: -/- Reducer 2: 0/1 +2022-04-08 11:06:52.417 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 0/1 Reducer 2: 0/1 +2022-04-08 11:06:55.060 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 0(+1)/1 Reducer 2: 0/1 +2022-04-08 11:06:57.495 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 1/1 Reducer 2: 0(+1)/1 +2022-04-08 11:06:57.899 INFO [Linkis-Default-Scheduler-Thread-3] SessionState 1111 printInfo - Map 1: 1/1 Reducer 2: 1/1 +``` + +An example of a complete `xml` configuration file is as follows: +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/images/check-seatunnel.png b/versioned_docs/version-1.4.0/engine-usage/images/check-seatunnel.png new file mode 100644 index 00000000000..982c227195b Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/check-seatunnel.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/datasourceconntest.png b/versioned_docs/version-1.4.0/engine-usage/images/datasourceconntest.png new file mode 100644 index 00000000000..2c25accb032 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/datasourceconntest.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/datasourcemanage.png b/versioned_docs/version-1.4.0/engine-usage/images/datasourcemanage.png new file mode 100644 index 00000000000..f6be867c90d Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/datasourcemanage.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/es-config.png b/versioned_docs/version-1.4.0/engine-usage/images/es-config.png new file mode 100644 index 00000000000..d06c2b878ba Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/es-config.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/es-manage.png b/versioned_docs/version-1.4.0/engine-usage/images/es-manage.png new file mode 100644 index 00000000000..f4a4616a528 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/es-manage.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/historical_information.png b/versioned_docs/version-1.4.0/engine-usage/images/historical_information.png new file mode 100644 index 00000000000..6c10cd71b7c Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/historical_information.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/hive-config.png b/versioned_docs/version-1.4.0/engine-usage/images/hive-config.png new file mode 100644 index 00000000000..f9b15cc8b5d Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/hive-config.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/hive-run.png b/versioned_docs/version-1.4.0/engine-usage/images/hive-run.png new file mode 100644 index 00000000000..287b1abfdef Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/hive-run.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/jdbc-config.png b/versioned_docs/version-1.4.0/engine-usage/images/jdbc-config.png new file mode 100644 index 00000000000..b9ef60ee794 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/jdbc-config.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/jdbc-run.png b/versioned_docs/version-1.4.0/engine-usage/images/jdbc-run.png new file mode 100644 index 00000000000..fe51598b235 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/jdbc-run.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/job_state.png b/versioned_docs/version-1.4.0/engine-usage/images/job_state.png new file mode 100644 index 00000000000..cadf1d1cd90 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/job_state.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/muti-data-source-usage.png b/versioned_docs/version-1.4.0/engine-usage/images/muti-data-source-usage.png new file mode 100644 index 00000000000..cc017a53935 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/muti-data-source-usage.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/new_pipeline_script.png b/versioned_docs/version-1.4.0/engine-usage/images/new_pipeline_script.png new file mode 100644 index 00000000000..8a1b59ce29e Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/new_pipeline_script.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/openlookeng-config.png b/versioned_docs/version-1.4.0/engine-usage/images/openlookeng-config.png new file mode 100644 index 00000000000..c30b764ed52 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/openlookeng-config.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/pipeline-conf.png b/versioned_docs/version-1.4.0/engine-usage/images/pipeline-conf.png new file mode 100644 index 00000000000..b531d31f790 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/pipeline-conf.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/presto-console.png b/versioned_docs/version-1.4.0/engine-usage/images/presto-console.png new file mode 100644 index 00000000000..f39242cf298 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/presto-console.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/presto-file.png b/versioned_docs/version-1.4.0/engine-usage/images/presto-file.png new file mode 100644 index 00000000000..49c00b99656 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/presto-file.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/presto-psql.png b/versioned_docs/version-1.4.0/engine-usage/images/presto-psql.png new file mode 100644 index 00000000000..505f0a7a8c1 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/presto-psql.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/pyspakr-run.png b/versioned_docs/version-1.4.0/engine-usage/images/pyspakr-run.png new file mode 100644 index 00000000000..c80c85bae00 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/pyspakr-run.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/python-conf.png b/versioned_docs/version-1.4.0/engine-usage/images/python-conf.png new file mode 100644 index 00000000000..3417af1c1e1 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/python-conf.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/python-config.png b/versioned_docs/version-1.4.0/engine-usage/images/python-config.png new file mode 100644 index 00000000000..a6c6f08b833 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/python-config.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/python-run.png b/versioned_docs/version-1.4.0/engine-usage/images/python-run.png new file mode 100644 index 00000000000..65467afca15 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/python-run.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/queue-set.png b/versioned_docs/version-1.4.0/engine-usage/images/queue-set.png new file mode 100644 index 00000000000..46f7e2c40bd Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/queue-set.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/scala-run.png b/versioned_docs/version-1.4.0/engine-usage/images/scala-run.png new file mode 100644 index 00000000000..7c01aadcdf8 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/scala-run.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/shell-run.png b/versioned_docs/version-1.4.0/engine-usage/images/shell-run.png new file mode 100644 index 00000000000..734bdb22dce Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/shell-run.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/spark-conf.png b/versioned_docs/version-1.4.0/engine-usage/images/spark-conf.png new file mode 100644 index 00000000000..0b7ce439f5e Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/spark-conf.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/sparksql-run.png b/versioned_docs/version-1.4.0/engine-usage/images/sparksql-run.png new file mode 100644 index 00000000000..f0b1d1bcaf2 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/sparksql-run.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/to_write.png b/versioned_docs/version-1.4.0/engine-usage/images/to_write.png new file mode 100644 index 00000000000..e75ab0638e4 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/to_write.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/trino-config.png b/versioned_docs/version-1.4.0/engine-usage/images/trino-config.png new file mode 100644 index 00000000000..b6dc459a2f1 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/trino-config.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/workflow.png b/versioned_docs/version-1.4.0/engine-usage/images/workflow.png new file mode 100644 index 00000000000..3a5919f2594 Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/workflow.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/images/yarn-conf.png b/versioned_docs/version-1.4.0/engine-usage/images/yarn-conf.png new file mode 100644 index 00000000000..46f7e2c40bd Binary files /dev/null and b/versioned_docs/version-1.4.0/engine-usage/images/yarn-conf.png differ diff --git a/versioned_docs/version-1.4.0/engine-usage/impala.md b/versioned_docs/version-1.4.0/engine-usage/impala.md new file mode 100644 index 00000000000..8fa24bf0b03 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/impala.md @@ -0,0 +1,219 @@ +--- +title: Impala +sidebar_position: 12 +--- + +This article mainly introduces the installation, usage and configuration of the `Impala` engine plugin in `Linkis`. + +## 1. Pre-work + +### 1.1 Environment installation + +If you want to use the Impala engine on your server, you need to prepare the Impala service and provide connection information, such as the connection address of the Impala cluster, SASL user name and password, etc. + +### 1.2 Environment verification + +Execute the impala-shell command to get the following output, indicating that the impala service is available. +``` +[root@8f43473645b1 /]# impala-shell +Starting Impala Shell without Kerberos authentication +Connected to 8f43473645b1:21000 +Server version: impalad version 2.12.0-cdh5.15.0 RELEASE (build 23f574543323301846b41fa5433690df32efe085) +***************************************************** ********************************* +Welcome to the Impala shell. +(Impala Shell v2.12.0-cdh5.15.0 (23f5745) built on Thu May 24 04:07:31 PDT 2018) + +When pretty-printing is disabled, you can use the '--output_delimiter' flag to set +the delimiter for fields in the same row. The default is ','. +***************************************************** ********************************* +[8f43473645b1:21000] > +``` + +## 2. Engine plugin deployment + +Before compiling the `Impala` engine, the `Linkis` project needs to be fully compiled, and the default installation and deployment package released by `Linkis` does not include this engine plug-in by default. + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (requires `maven` environment) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/impala/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/impala/target/out/ +``` +[EngineConnPlugin Engine Plugin Installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── impala +│ ├── dist +│ │ └── 3.4.0 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 3.4.0 +``` + +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check whether the engine is refreshed successfully +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#login to `linkis` database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3 Engine usage + +### 3.1 Submit tasks through `Linkis-cli` + +```shell +sh ./bin/linkis-cli -submitUser impala \ +-engineType impala-3.4.0 -code 'show databases;' \ +-runtimeMap linkis.es.http.method=GET \ +-runtimeMap linkis.impala.servers=127.0.0.1:21050 +``` + +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description + +| Configuration | Default | Description | Required | +| ----------------------------------------- | ---------- ----------- | -------------------------------------- ----- | -------- | +| linkis.impala.default.limit | 5000 | Yes | The limit on the number of returned items in the query result set | +| linkis.impala.engine.user | ${HDFS_ROOT_USER} | yes | default engine startup user | +| linkis.impala.user.isolation.mode | false | yes | start the engine in multi-user mode | +| linkis.impala.servers | 127.0.0.1:21050 | is | Impala server address, separated by ',' | +| linkis.impala.maxConnections | 10 | Yes | Maximum number of connections to each Impala server | +| linkis.impala.ssl.enable | false | yes | whether to enable SSL connection | +| linkis.impala.ssl.keystore.type | JKS | No | SSL Keystore type | +| linkis.impala.ssl.keystore | null | No | SSL Keystore path | +| linkis.impala.ssl.keystore.password | null | No | SSL Keystore password | +| linkis.impala.ssl.truststore.type | JKS | No | SSL Truststore type | +| linkis.impala.ssl.truststore | null | No | SSL Truststore path | +| linkis.impala.ssl.truststore.password | null | No | SSL Truststore password | +| linkis.impala.sasl.enable | false | yes | whether to enable SASL authentication | +| linkis.impala.sasl.mechanism | PLAIN | 否 | SASL Mechanism | +| linkis.impala.sasl.authorizationId | null | 否 | SASL AuthorizationId | +| linkis.impala.sasl.protocol | LDAP | 否 | SASL Protocol | +| linkis.impala.sasl.properties | null | No | SASL Properties: key1=value1,key2=value2 | +| linkis.impala.sasl.username | ${impala.engine.user}| 否 | SASL Username | +| linkis.impala.sasl.password | null | No | SASL Password | +| linkis.impala.sasl.password.cmd | null | No | SASL Password get command | +| linkis.impala.heartbeat.seconds | 1 | yes | task status update interval | +| linkis.impala.query.timeout.seconds | 0 | No | Task execution timeout | +| linkis.impala.query.batchSize | 1000 | yes | result set fetch batch size | +| linkis.impala.query.options | null | No | Query submission parameters: key1=value1,key2=value2 | + +### 4.2 Configuration modification + +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.2.1 Task interface configuration +Submit the task interface and configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "show databases;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.impala.servers"="127.0.0.1:21050" + } + } + }, + "labels": { + "engineType": "impala-3.4.0", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 Engine related data table + +`Linkis` is managed through engine tags, and the data table information involved is as follows. + +``` +linkis_ps_configuration_config_key: Insert the key and default values ​​​​of the configuration parameters of the engine +linkis_cg_manager_label: insert engine label such as: impala-3.4.0 +linkis_ps_configuration_category: Insert the directory association of the engine +linkis_ps_configuration_config_value: Insert the configuration that the engine needs to display +linkis_ps_configuration_key_engine_relation: the relationship between configuration items and engines +``` + +The initial data related to the engine in the table is as follows + + +```sql +-- set variable +SET @ENGINE_LABEL="impala-3.4.0"; +SET @ENGINE_IDE=CONCAT('*-IDE,',@ENGINE_LABEL); +SET @ENGINE_ALL=CONCAT('*-*,',@ENGINE_LABEL); +SET @ENGINE_NAME="impala"; + +-- add impala engine to IDE +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @ENGINE_IDE, 'OPTIONAL', 2, now(), now()); +select @label_id := id from `linkis_cg_manager_label` where label_value = @ENGINE_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- insert configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.default.limit', 'result result set limit of query', 'result set limit', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1 , 'Data Source Configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.engine.user', 'Default engine startup user', 'Default startup user', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'Data source configuration' ); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.user.isolation.mode', 'Start engine in multi-user mode', 'Multi-user mode', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, ' Datasource configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.servers', 'Impala server address', 'service address', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.maxConnections ', 'The maximum number of connections to each Impala server', 'Maximum number of connections', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.enable', 'Enable SSL connection', 'Enable SSL', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'Data source configuration') ; +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.keystore.type', 'SSL Keystore类型', 'SSL Keystore类型', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.keystore', 'SSL Keystore路径', 'SSL Keystore路径', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.keystore.password', 'SSL Keystore密码', 'SSL Keystore密码', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.truststore.type', 'SSL Truststore类型', 'SSL Truststore类型', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.truststore', 'SSL Truststore路径', 'SSL Truststore路径', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.ssl.truststore.password', 'SSL Truststore密码', 'SSL Truststore密码', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.enable', 'whether to enable SASL authentication', 'enable SASL', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source configuration') ; +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.mechanism', 'SASL Mechanism', 'SASL Mechanism', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.authorizationId', 'SASL AuthorizationId', 'SASL AuthorizationId', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.protocol', 'SASL Protocol', 'SASL Protocol', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.properties', 'SASL Properties: key1=value1,key2=value2', 'SASL Properties', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.username', 'SASL Username', 'SASL Username', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.password', 'SASL Password', 'SASL Password', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.sasl.password.cmd', 'SASL Password get command', 'SASL Password get command', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.heartbeat.seconds', 'Task status update interval', 'Task status update interval', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'Data source configuration '); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.query.timeout.seconds', 'Task execution timeout', 'Task execution timeout', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.query.batchSize', 'result set acquisition batch size', 'result set acquisition batch size', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'Datasource Configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.impala.query.options', 'Query submission parameters: key1=value1,key2=value2', 'Query submission parameters', 'null', 'None', '', @ENGINE_NAME, 0, 0, 1, 'Data source configuration'); +-- impala engine -* +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as config_key_id, label.id AS engine_type_label_id FROM `linkis_ps_configuration_config_key` config +INNER JOIN `linkis_cg_manager_label` label ON config.engine_conn_type = @ENGINE_NAME and label_value = @ENGINE_ALL); +-- impala engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select relation.config_key_id AS config_key_id, '' AS config_value, relation.engine_type_label_id AS config_label_id FROM `linkis_ps_configuration_key_engine_relation` relation +INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @ENGINE_ALL); +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/jdbc.md b/versioned_docs/version-1.4.0/engine-usage/jdbc.md new file mode 100644 index 00000000000..d579aae88b8 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/jdbc.md @@ -0,0 +1,275 @@ +--- +title: JDBC Engine +sidebar_position: 7 +--- + +This article mainly introduces the installation, use and configuration of the `JDBC` engine plugin in `Linkis`. + +## 1. Preliminary work +### 1.1 Environment Installation + +If you want to use `JDBC` engine on your server, you need to prepare `JDBC` connection information, such as `MySQL` database connection address, username and password, etc. + +### 1.2 Environment verification (take `Mysql` as an example) +``` +mysql -uroot -P 3306 -h 127.0.0.1 -p 123456 +``` +The output of the following information means that the `JDBC` connection information is available +``` +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 9 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> +``` + +## 2. Engine plugin installation + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[`Linkis` engine plugin download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (requires a `maven` environment) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/jdbc/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/jdbc/target/out/ +``` + +[`EngineConnPlugin` engine plugin installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine plug-in package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── jdbc +│ ├── dist +│ │ └── 4 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 4 +``` + +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check whether the engine is refreshed successfully + +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#Login to the `linkis` database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. Engine usage + +### 3.1 Submit tasks through `Linkis-cli` + +```shell +sh ./bin/linkis-cli -engineType jdbc-4 \ +-codeType jdbc -code "show tables" \ +-submitUser hadoop -proxyUser hadoop \ +-runtimeMap wds.linkis.jdbc.connect.url=jdbc:mysql://127.0.0.1:3306/linkis_db \ +-runtimeMap wds.linkis.jdbc.driver=com.mysql.jdbc.Driver \ +-runtimeMap wds.linkis.jdbc.username=test \ +-runtimeMap wds.linkis.jdbc.password=123456 +``` + +More `Linkis-Cli` command parameter reference: [`Linkis-Cli` usage](../user-guide/linkiscli-manual.md) + +### 3.2 Submitting tasks through `Linkis SDK` + +`Linkis` provides `SDK` of `Java` and `Scala` to submit tasks to `Linkis` server. For details, please refer to [JAVA SDK Manual](../user-guide/sdk-manual.md). For the `JDBC` task, you only need to modify `EngineConnType` and `CodeType` parameters in `Demo`: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "jdbc-4"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "jdbc"); // required codeType +``` + +### 3.3 Multiple data source support +Starting from `Linkis 1.2.0`, it provides support for multiple data sources in the `JDBC` engine. First, we can manage different data sources in the console. Address: Log in to the management console-->Data source management-->Add data source + +![](./images/datasourcemanage.png) + +Figure 3-3 Data source management + +![](./images/datasourceconntest.png) + +Figure 3-4 Data source connection test + +After the data source is added, you can use the multi-data source switching function of the `JDBC` engine. There are two ways: +1. Specify the data source name parameter through the interface parameter +Example parameters: +```json +{ + "executionContent": { + "code": "show databases", + "runType": "jdbc" + }, + "params": { + "variable": {}, + "configuration": { + "startup": {}, + "runtime": { + "wds.linkis.engine.runtime.datasource": "test_mysql" + } + } + }, + "source": { + "scriptPath": "" + }, + "labels": { + "engineType": "jdbc-4", + "userCreator": "hadoop-IDE" + } +} +``` + +Parameter: `wds.linkis.engine.runtime.datasource` is a configuration with a fixed name, do not modify the name definition at will + +2. Use the `Scripts` code of `DSS` to submit the entry drop-down to filter the data sources that need to be submitted, as shown in the figure below: +![](./images/muti-data-source-usage.png) +Currently `dss-1.1.0` does not support drop-down selection of data source name, `PR` is under development, you can wait for the subsequent release or pay attention to related `PR`: +(https://github.com/WeBankFinTech/DataSphereStudio/issues/940) + + +Function description of multiple data sources: + +1) In the previous version, the `JDBC` engine's support for data sources was not perfect, especially when used with Scripts, the `JDBC` script type can only bind a set of `JDBC` engine parameters of the console. +When we need to switch multiple data sources, we can only modify the connection parameters of the `JDBC` engine, which is troublesome. + +2) To cooperate with data source management, we introduce the multi-data source switching function of `JDBC` engine, which can realize that only setting the data source name can submit jobs to different `JDBC` services, and ordinary users do not need to +It maintains the connection information of the data source, avoids the complicated configuration, and also meets the security requirements of the data source connection password and other configurations. + +3) The data sources set in the multi-data source management can be loaded by the `JDBC` engine only after they have been released and have not expired, otherwise different types of exception prompts will be fed back to the user. + +4) The loading priority of `JDBC` engine parameters is: task submission parameters > data source selection parameters > console JDBC engine parameters + + +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description + +| Configuration | Default | Required | Description | +| ------------------------ | ------------------- | ---| ------------------------------------------- | +| wds.linkis.jdbc.connect.url | jdbc:mysql://127.0.0.1:10000 | yes | jdbc connection address | +| wds.linkis.jdbc.driver | no | yes | jdbc connection driver | +| wds.linkis.jdbc.username | no | yes | database connection username | +| wds.linknis.jdbc.password | no | yes | database link password | +| wds.linkis.jdbc.connect.max | 10 | No | The maximum number of jdbc engine connections | +| wds.linkis.jdbc.version | jdbc4 | no | jdbc version | + +### 4.2 Configuration modification +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + + +#### 4.2.1 Management console configuration + +![jdbc](./images/jdbc-config.png) + +Note: After modifying the configuration under the `IDE` tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType jdbc-4 -codeType jdbc \ +-code "show tables" \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "show databases;", "runType": "jdbc"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.jdbc.connect.url":"jdbc:mysql://127.0.0.1:3306/test", + "wds.linkis.jdbc.driver":"com.mysql.jdbc.Driver", + "wds.linkis.jdbc.username":"test", + "wds.linkis.jdbc.password":"test23" + } + } + }, + "labels": { + "engineType": "jdbc-4", + "userCreator": "hadoop-IDE" + } +} +``` +### 4.3 Engine related data sheet + +`Linkis` is managed through engine tags, and the data table information involved is as follows. + +``` +linkis_ps_configuration_config_key: key and default values ​​of configuration parameters inserted into the engine +linkis_cg_manager_label: Insert engine label such as: jdbc-4 +linkis_ps_configuration_category: The directory association relationship of the insertion engine +linkis_ps_configuration_config_value: The configuration that the insertion engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data related to the engine in the table is as follows + +```sql +-- set variable +SET @JDBC_LABEL="jdbc-4"; +SET @JDBC_ALL=CONCAT('*-*,',@JDBC_LABEL); +SET @JDBC_IDE=CONCAT('*-IDE,',@JDBC_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @JDBC_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @JDBC_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @JDBC_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.url', 'For example: jdbc:mysql://127.0.0.1:10000', 'jdbc connection address', 'jdbc:mysql://127.0.0.1:10000', 'Regex', '^\\s*jdbc:\\w+://([^:]+)(:\\d+)(/[^\\?]+)?(\\?\\S* )?$', '0', '0', '1', 'Datasource configuration', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.driver', 'For example: com.mysql.jdbc.Driver', 'jdbc connection driver', '', 'None', '', '0', '0', '1 ', 'User Configuration', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.version', 'Value range: jdbc3,jdbc4', 'jdbc version','jdbc4', 'OFT', '[\"jdbc3\",\"jdbc4\"]' , '0', '0', '1', 'userconfig', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.username', 'username', 'Database connection username', '', 'None', '', '0', '0', '1', 'User configuration', 'jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.password', 'password', 'Database connection password', '', 'None', '', '0', '0', '1', 'User configuration', ' jdbc'); +insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.max', 'range: 1-20, unit: piece', 'jdbc engine maximum number of connections', '10', 'NumInterval', '[1,20]', '0', '0', '1', 'Datasource configuration', 'jdbc'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'jdbc' and label_value = @JDBC_ALL); + +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @JDBC_ALL); +``` diff --git a/versioned_docs/version-1.4.0/engine-usage/openlookeng.md b/versioned_docs/version-1.4.0/engine-usage/openlookeng.md new file mode 100644 index 00000000000..cfc29676cdd --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/openlookeng.md @@ -0,0 +1,211 @@ +--- +title: OpenLooKeng Engine +sidebar_position: 8 +--- + +This article mainly introduces the installation, usage and configuration of the openLooKeng engine plugin in `Linkis` `. + +## 1. Environmental Requirements + +### 1.1 Environment Installation + +If you wish to deploy the `openLooKeng` engine, you need to prepare a working `openLooKeng` environment. + +### 1.2 Service Authentication + +```shell +# Prepare hetu-cli +wget https://download.openlookeng.io/1.5.0/hetu-cli-1.5.0-executable.jar +mv hetu-cli-1.5.0-executable.jar hetu-cli +chmod +x hetu-cli + +# link service +./hetu-cli --server 127.0.0.1:9090 --catalog tpcds --schema default + +# Execute query statement +lk:default> select d_date_sk, d_date_id, d_date, d_month_seq from tpcds.sf1.date_dim order by d_date limit 5; + +# Get the following output to represent the service is available + d_date_sk | d_date_id | d_date | d_month_seq +-------------+--------+------------+------ ------- + 2415022 | AAAAAAAAOKJNECAA | 1900-01-02 | 0 + 2415023 | AAAAAAAAPKJNECAA | 1900-01-03 | 0 + 2415024 | AAAAAAAAALJNECAA | 1900-01-04 | 0 + 2415025 | AAAAAAAABLJNECAA | 1900-01-05 | 0 + 2415026 | AAAAAAAACLJNECAA | 1900-01-06 | 0 +(5 rows) + +Query 20221110_043803_00011_m9gmv, FINISHED, 1 node +Splits: 33 total, 33 done (100.00%) +0:00 [73K rows, 0B] [86.8K rows/s, 0B/s] +``` + +## 2. Engine plugin installation + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (requires a `maven` environment) + +``` +# compile +${linkis_code_dir}/linkis-enginepconn-pugins/engineconn-plugins/openlookeng/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/openlookeng/target/out/ +``` +[EngineConnPlugin Engine Plugin Installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine plug-in package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── openlookeng +│ ├── dist +│ │ └── 1.5.0 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 1.5.0 +``` + +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check whether the engine is refreshed successfully +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#Login to the `linkis` database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. The use of the engine + +### 3.1 Submitting tasks via `Linkis-cli` + +```shell +sh ./bin/linkis-cli -engineType openlookeng-1.5.0 \ +-codeType sql -code 'select * from tpcds.sf1.date_dim;' \ +-submitUser hadoop -proxyUser hadoop \ +-runtimeMap linkis.openlookeng.url=http://127.0.0.1:8080 +``` + +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +### 3.2 Submitting tasks through `Linkis SDK` + +`Linkis` provides `SDK` of `Java` and `Scala` to submit tasks to `Linkis` server. For details, please refer to [JAVA SDK Manual](../user-guide/sdk-manual.md). +For `JDBC` tasks you only need to modify the `EngineConnType` and `CodeType` parameters in `Demo`: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "openlookeng-1.5.0"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "sql"); // required codeType +``` + +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description +| Configuration | Default | Required | Description | +| ------------------------ | ------------------- | ---| ------------------------------------------- | +| linkis.openlookeng.url | http://127.0.0.1:8080 | yes | link address | +| linkis.openlookeng.catalog | system | yes | catalog | +| linkis.openlookeng.source | global | no | source | + +### 4.2 Configuration modification +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.2.1 Management console configuration + +![](./images/openlookeng-config.png) + +Note: After modifying the configuration under the IDE label, you need to specify -creator IDE to take effect (other labels are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType openlookeng-1.5.0 -codeType sql \ +-code 'select * from tpcds.sf1.date_dim;' \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "select * from tpcds.sf1.date_dim;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.openlookeng.url":"http://127.0.0.1:9090" + } + } + }, + "labels": { + "engineType": "openlookeng-1.5.0", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 Engine related data sheet + +`Linkis` is managed through the engine tag, and the data table information involved is shown below. + +``` +linkis_ps_configuration_config_key: key and default values ​​of configuration parameters inserted into the engine +linkis_cg_manager_label: insert engine label such as: openlookeng-1.5.0 +linkis_ps_configuration_category: Insert the directory association of the engine +linkis_ps_configuration_config_value: Insert the configuration that the engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data related to the engine in the table is as follows + +```sql +-- set variable +SET @OPENLOOKENG_LABEL="openlookeng-1.5.0"; +SET @OPENLOOKENG_ALL=CONCAT('*-*,',@OPENLOOKENG_LABEL); +SET @OPENLOOKENG_IDE=CONCAT('*-IDE,',@OPENLOOKENG_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @OPENLOOKENG_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @OPENLOOKENG_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @OPENLOOKENG_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.url', 'eg: http://127.0.0.1:8080', 'connection address', 'http://127.0.0.1:8080', 'Regex', '^\\s *http://([^:]+)(:\\d+)(/[^\\?]+)?(\\?\\S*)?$', 'openlookeng', 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.catalog', 'catalog', 'catalog', 'system', 'None', '', 'openlookeng', 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.openlookeng.source', 'source', 'source', 'global', 'None', '', 'openlookeng', 0, 0, 1, 'data source conf'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'openlookeng' and label_value = @OPENLOOKENG_ALL); + +-- openlookeng default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @OPENLOOKENG_ALL); + +``` diff --git a/versioned_docs/version-1.4.0/engine-usage/overview.md b/versioned_docs/version-1.4.0/engine-usage/overview.md new file mode 100644 index 00000000000..0ba409a4d46 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/overview.md @@ -0,0 +1,27 @@ +--- +title: Overview +sidebar_position: 0 +--- +## 1 Overview +As a powerful computing middleware, Linkis can easily interface with different computing engines. By shielding the usage details of different computing engines, Linkis provides a set of unified user interface upwards. +The operation and maintenance cost of deploying and applying Linkis' big data platform is greatly reduced. At present, Linkis has connected several mainstream computing engines, which basically cover the data requirements of production. +In order to provide better scalability, Linkis also provides relevant interfaces for accessing new engines, which can be used to access new computing engines. + +The engine is a component that provides users with data processing and analysis capabilities. Currently, it has been connected to the Linkis engine, including mainstream big data computing engines such as Spark, Hive, and Presto, as well as engines with scripting capabilities such as python and Shell. +DataSphereStudio is a one-stop data operation platform connected to Linkis. Users can easily use the engine supported by Linkis in DataSphereStudio to complete interactive data analysis tasks and workflow tasks. + +Supported engines and version information are as follows: + +| Engine | Default Engine | Default Version | +|--------------| -- | ---- | +| [Spark](./spark.md) | Yes | 3.2.1 | +| [Hive](./hive.md) | yes | 3.1.3 | +| [Python](./python.md) | yes | python2 | +| [Shell](./shell.md) | Yes | 1 | +| [JDBC](./jdbc.md) | No | 4 | +| [Flink](./flink.md) | No | 1.12.2 | +| [openLooKeng](./openlookeng.md) | No | 1.5.0 | +| [Pipeline](./pipeline.md) | No | 1 | +| [Presto](./presto.md) | No | 0.234 | +| [Sqoop](./sqoop.md) | No | 1.4.6 | +| [Elasticsearch](./elasticsearch.md) | No | 7.6.2 | \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/pipeline.md b/versioned_docs/version-1.4.0/engine-usage/pipeline.md new file mode 100644 index 00000000000..b1fdbbcf556 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/pipeline.md @@ -0,0 +1,175 @@ +--- +title: Pipeline Engine +sidebar_position: 10 +--- +`Pipeline` is mainly used to import and export files. This article mainly introduces the installation, use and configuration of the `Hive` engine plugin in `Linkis`. + +## 1. Engine plugin installation + +### 1.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (maven environment is required) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/pipeline/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/pipeline/target/out/ +``` +[EngineConnPlugin engine plugin installation](../deployment/install-engineconn.md) + +### 1.2 Uploading and loading of engine plugins + +Upload the engine plug-in package in 1.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── pipeline +│ ├── dist +│ │ └── 1 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 1 +``` +### 1.3 Engine refresh + +#### 1.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 1.3.2 Check if the engine is refreshed successfully +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#Log in to the linkis database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 2 Engine usage + +Because the `pipeline` engine is mainly used to import and export files, now we assume that importing files from A to B is an introduction case + +### 2.1 Submit tasks through `Linkis-cli` + +```shell +sh bin/linkis-cli -submitUser Hadoop \ +-engineType pipeline-1 -codeType pipeline \ +-code "from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv" +``` +`from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv` This content is explained in 2.3 + +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +## 3. Engine configuration instructions + +### 3.1 Default configuration description + +| Configuration | Default | Required | Description | +| ------------------------ | ------------------- | ---| ------------------------------------------- | +| pipeline.output.mold | csv | no | result set export type | +| pipeline.field.split | , |no | csv separator | +| pipeline.output.charset | gbk | no | result set export character set | +| pipeline.output.isoverwrite | true | no | overwrite | +| wds.linkis.rm.instance | 3 | No | Maximum concurrent number of pipeline engines | +| pipeline.output.shuffle.null.type | NULL | No | Null replacement | +| wds.linkis.engineconn.java.driver.memory | 2g | no | pipeline engine initialization memory size | + +### 4.2 Configuration modification +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.2.1 Management console configuration + +![](./images/pipeline-conf.png) + +Note: After modifying the configuration under the `IDE` tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh bin/linkis-cli -creator IDE \ +-submitUser hadoop \ +-engineType pipeline-1 \ +-codeType pipeline \ +-code "from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv" +``` + +#### 4.2.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "from hdfs:///000/000/000/A.dolphin to file:///000/000/000/B.csv", "runType": "pipeline"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "pipeline.output.mold":"csv", + "pipeline.output.charset":"gbk" + } + } + }, + "labels": { + "engineType": "pipeline-1", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 Engine related data sheet + +`Linkis` is managed through engine tags, and the data table information involved is as follows. + +``` +linkis_ps_configuration_config_key: key and default values ​​of configuration parameters inserted into the engine +linkis_cg_manager_label: insert engine label such as: pipeline-1 +linkis_ps_configuration_category: The directory association relationship of the insertion engine +linkis_ps_configuration_config_value: Insert the configuration that the engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data related to the engine in the table is as follows + +```sql +-- set variable +SET @PIPELINE_LABEL="pipeline-1"; +SET @PIPELINE_ALL=CONCAT('*-*,',@PIPELINE_LABEL); +SET @PIPELINE_IDE=CONCAT('*-IDE,',@PIPELINE_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PIPELINE_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PIPELINE_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @PIPELINE_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.mold', 'Value range: csv or excel', 'Result set export type','csv', 'OFT', '[\"csv\",\"excel\"]' , '0', '0', '1', 'pipeline engine settings', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.field.split', 'value range:, or \\t', 'csv delimiter',',', 'OFT', '[\",\",\"\\\\ t\"]', '0', '0', '1', 'pipeline engine settings', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.charset', 'value range: utf-8 or gbk', 'result set export character set','gbk', 'OFT', '[\"utf-8\",\" gbk\"]', '0', '0', '1', 'pipeline engine settings', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.isoverwrite', 'Value range: true or false', 'Whether to overwrite','true', 'OFT', '[\"true\",\"false\"]', '0', '0', '1', 'pipeline engine settings', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', 'Range: 1-3, Unit: Piece', 'Maximum concurrent number of pipeline engines','3', 'NumInterval', '[1,3]', '0 ', '0', '1', 'pipeline engine settings', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', 'value range: 1-10, unit: G', 'pipeline engine initialization memory size','2g', 'Regex', '^([ 1-9]|10)(G|g)$', '0', '0', '1', 'pipeline resource settings', 'pipeline'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('pipeline.output.shuffle.null.type', 'Value range: NULL or BLANK', 'Null value replacement','NULL', 'OFT', '[\"NULL\",\"BLANK\ "]', '0', '0', '1', 'pipeline engine settings', 'pipeline'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'pipeline' and label_value = @PIPELINE_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @PIPELINE_ALL); + +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/presto.md b/versioned_docs/version-1.4.0/engine-usage/presto.md new file mode 100644 index 00000000000..ac2959d9def --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/presto.md @@ -0,0 +1,231 @@ +--- +title: Presto Engine +sidebar_position: 11 +--- + +This article mainly introduces the installation, usage and configuration of the Presto engine plugin in `Linkis` . + + +## 1. Preliminary work + +### 1.1 Engine installation + +If you want to use the `Presto` engine on your `Linkis` service, you need to install the `Presto` service and make sure the service is available. + +### 1.2 Service Authentication + +```shell +# prepare presto-cli +wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.234/presto-cli-0.234-executable.jar +mv presto-cli-0.234-executable.jar presto-cli +chmod + x presto-cli + +# execute task +./presto-cli --server localhost:8082 --execute 'show tables from system.jdbc' + +# Get the following output to indicate that the service is available +"attributes" +"catalogs" +"columns" +"procedure_columns" +"procedures" +"pseudo_columns" +"schemas" +"super_tables" +"super_types" +"table_types" +"tables" +"types" +"udts" +``` + +## 2. Engine plugin deployment + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (maven environment is required) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/presto/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/presto/target/out/ +``` +[EngineConnPlugin Engine Plugin Installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── soon +│ ├── dist +│ │ └── 0.234 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 0.234 +``` + +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check if the engine is refreshed successfully +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#Login to the `linkis` database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3 The use of the engine + +### 3.1 Submit tasks through `Linkis-cli` + +```shell + sh ./bin/linkis-cli -engineType presto-0.234 \ + -codeType psql -code 'show tables;' \ + -submitUser hadoop -proxyUser hadoop +``` + +If the management console, task interface, and configuration file are not configured (see 4.2 for the configuration method), they can be configured through the `-runtimeMap` attribute in the `Linkis-cli` client + +```shell +sh ./bin/linkis-cli -engineType presto-0.234 \ +-codeType tsql -code 'show tables;' \ +-runtimeMap wds.linkis.presto.url=http://127.0.0.1:8080 \ +-runtimeMap wds.linkis.presto.catalog=hive \ +-runtimeMap wds.linkis.presto.schema=default \ +-submitUser hadoop -proxyUser hadoop +``` + +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.url', 'Presto 集群连接', 'presto连接地址', 'http://127.0.0.1:8080', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.catalog', '查询的 Catalog ', 'presto连接的catalog', 'hive', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.schema', '查询的 Schema ', '数据库连接schema', '', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.source', '查询使用的 source ', '数据库连接source', '', 'None', NULL, @PRESTO_NAME, 0, 0, 1, '数据源配置'); + +### 4.1 Default Configuration Description + +| Configuration | Default | Description | Required | +| -------------------------------------- | ---------- ----------- | -------------------------------------- ----- | -------- | +| wds.linkis.presto.url | http://127.0.0.1:8080 | Presto Cluster Connection | true | +| wds.linkis.presto.username | default | Presto cluster username | false | +| wds.linkis.presto.password | none | Presto cluster password | false | +| wds.linkis.presto.catalog | system | Query Catalog | true | +| wds.linkis.presto.schema | None | Schema to query | true | +| wds.linkis.presto.source | global | source used for query | false | +| presto.session.query_max_total_memory | 8GB | query uses maximum memory | false | +| wds.linkis.presto.http.connectTimeout | 60 | Presto client connect timeout (unit: second) | false | +| wds.linkis.presto.http.readTimeout | 60 | Presto client read timeout (unit: seconds) | false | +| wds.linkis.engineconn.concurrent.limit | 100 | The maximum number of concurrent Presto engines | false | + +### 4.2 Configuration modification + +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.2.1 Management console configuration + +![](./images/presto-console.png) + +Note: After modifying the configuration under the `IDE` tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType presto-0.234 -codeType tsql \ +-code 'show tables;' \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "show teblas;", "runType": "psql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.presto.url":"http://127.0.0.1:9090", + "wds.linkis.presto.catalog ":"hive", + "wds.linkis.presto.schema ":"default", + "wds.linkis.presto.source ":"" + } + } + }, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.sql"}, + "labels": { + "engineType": "presto-0.234", + "userCreator": "hadoop-IDE" + } +} +``` + +#### 4.2.3 File Configuration +Configure by modifying the `linkis-engineconn.properties` file in the directory `install path/lib/linkis-engineconn-plugins/presto/dist/0.234/conf/`, as shown below: + +![](./images/presto-file.png) + +### 4.3 Engine related data sheet + +`Linkis` is managed through the engine tag, and the data table information involved is shown below. + +``` +linkis_ps_configuration_config_key: key and default values ​​of configuration parameters inserted into the engine +linkis_cg_manager_label: Insert engine label such as: presto-0.234 +linkis_ps_configuration_category: The directory association relationship of the insertion engine +linkis_ps_configuration_config_value: Insert the configuration that the engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data related to the engine in the table is as follows + + +```sql +-- set variable +SET @PRESTO_LABEL="presto-0.234"; +SET @PRESTO_ALL=CONCAT('*-*,',@PRESTO_LABEL); +SET @PRESTO_IDE=CONCAT('*-IDE,',@PRESTO_LABEL); +SET @PRESTO_NAME="presto"; + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@PRESTO_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType',@PRESTO_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from `linkis_cg_manager_label` where `label_value` = @PRESTO_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.url', 'Presto cluster connection', 'presto connection address', 'http://127.0.0.1:8080', 'None', NULL, @PRESTO_NAME, 0, 0, 1 , 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.catalog', 'Query's Catalog', 'presto-connected catalog', 'hive', 'None', NULL, @PRESTO_NAME, 0, 0, 1, 'Datasource configuration') ; +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.schema', 'Query Schema', 'Database connection schema', '', 'None', NULL, @PRESTO_NAME, 0, 0, 1, 'data source conf'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('wds.linkis.presto.source', 'source for query', 'database connection source', '', 'None', NULL, @PRESTO_NAME, 0, 0, 1, 'data source conf'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = @PRESTO_NAME and label_value = @PRESTO_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @PRESTO_ALL); +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/python.md b/versioned_docs/version-1.4.0/engine-usage/python.md new file mode 100644 index 00000000000..905ad56ad67 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/python.md @@ -0,0 +1,182 @@ +--- +title: Python Engine +sidebar_position: 5 +--- + +This article mainly introduces the installation, use and configuration of the `Python` engine plugin in `Linkis`. + +## 1. Preliminary work +### 1.1 Environment Installation + +If you want to use the `python` engine on your server, you need to ensure that the user's `PATH` has the `python` execution directory and execution permissions. + +### 1.2 Environment verification +``` +python --version +``` +Normal output of `Python` version information means `Python` environment is available +``` +Python 3.6.0 +``` + +## 2. Engine plugin installation [default engine](./overview.md) + +The binary installation package released by `linkis` includes the `Python` engine plug-in by default, and users do not need to install it additionally. + +[EngineConnPlugin Engine Plugin Installation](../deployment/install-engineconn.md) + +## 3. Engine usage + +### 3.1 Submitting tasks via `Linkis-cli` + +```shell +sh ./bin/linkis-cli -engineType python-python2 \ +-codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop +``` +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +### 3.2 Submit tasks through `Linkis SDK` + +`Linkis` provides `SDK` of `Java` and `Scala` to submit tasks to `Linkis` server. For details, please refer to [JAVA SDK Manual](../user-guide/sdk-manual.md). For` For Python` tasks, you only need to modify `EngineConnType` and `CodeType` parameters. + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "python-python2"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "python"); // required codeType +``` + +## 4. Engine configuration instructions + +### 4.1 Configuration modification +The `Python` engine plug-in supports `python2` and `python3`, you can simply change the configuration to complete the switch of `Python` version without recompiling the `python` engine version. The `Python` engine supports a variety of configuration modification methods, the specific operations are as follows. + +#### 4.1.1 Display designation through command parameters (only the current command takes effect) + +```shell +#1: Submit tasks via cli to switch versions, and set the version python.version=python3 at the end of the command (python3: the name of the file generated when creating a soft link, which can be customized) +sh ./bin/linkis-cli -engineType python-python2 \ +-codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop \ +-confMap python.version=python3 + +#2: The cli method is used to submit tasks for version switching, and the command is set to add the version path python.version=/usr/bin/python (/usr/bin/python: the path to the file generated when creating a soft link) +sh ./bin/linkis-cli -engineType python-python2 \ +-codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop \ +-confMap python.version=/usr/bin/python + +``` + +#### 4.1.2 Management console configuration + +![](./images/python-config.png) + +Note: After modifying the configuration under the IDE tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE -engineType \ +python-python2 -codeType python -code "print(\"hello\")" \ +-submitUser hadoop -proxyUser hadoop \ +-confMap python.version=python3 +``` + +#### 4.2.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "print(\"hello\")", "runType": "python"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "python.version":"python2", + "wds.linkis.engineconn.max.free.time":"1h" + } + } + }, + "labels": { + "engineType": "python-python2", + "userCreator": "IDE" + } +} +``` + +#### 4.2.3 File Configuration +Configure by modifying the `linkis-engineconn.properties` file in the directory `${LINKIS_HOME}/lib/linkis-engineconn-plugins/python/dist/python2/conf/`, as shown below: + +![](./images/python-conf.png) + +### 4.3 Engine related data sheet + +`Linkis` is managed through engine tags, and the data table information involved is as follows. + +``` +linkis_ps_configuration_config_key: Insert the key and default values ​​​​of the configuration parameters of the engine +linkis_cg_manager_label: Insert engine label such as: python-python2 +linkis_ps_configuration_category: Insert the directory association of the engine +linkis_ps_configuration_config_value: The configuration that the insertion engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data related to the engine in the table is as follows + +```sql +-- set variable +SET @PYTHON_LABEL="python-python2"; +SET @PYTHON_ALL=CONCAT('*-*,',@PYTHON_LABEL); +SET @PYTHON_IDE=CONCAT('*-IDE,',@PYTHON_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PYTHON_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @PYTHON_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @PYTHON_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.client.memory.max', 'Value range: 1-100, unit: G', 'Python driver memory upper limit', '20G', 'Regex', '^([ 1-9]\\d{0,1}|100)(G|g)$', '0', '0', '1', 'queue resource', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.client.core.max', 'Value range: 1-128, unit: a', 'Python drive core number upper limit', '10', 'Regex', '^( ?:[1-9]\\d?|[1234]\\d{2}|128)$', '0', '0', '1', 'queue resource', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', 'Range: 1-20, unit: a', 'Python engine maximum concurrent number', '10', 'NumInterval', '[1,20]', '0 ', '0', '1', 'queue resource', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.java.driver.memory', 'value range: 1-2, unit: G', 'python engine initialization memory size', '1g', 'Regex', '^([ 1-2])(G|g)$', '0', '0', '1', 'python engine settings', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('python.version', 'Value range: python2,python3', 'python version','python2', 'OFT', '[\"python3\",\"python2\"]', '0' , '0', '1', 'python engine settings', 'python'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.max.free.time', 'Value range: 3m,15m,30m,1h,2h', 'Engine idle exit time','1h', 'OFT', '[\ "1h\",\"2h\",\"30m\",\"15m\",\"3m\"]', '0', '0', '1', 'python engine settings', ' python'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'python' and label_value = @PYTHON_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @PYTHON_ALL); +``` + + +### 4.4 other python code demo + +```python +import pandas as pd + +data = {'name': ['aaaaaa', 'bbbbbb', 'cccccc'], 'pay': [4000, 5000, 6000]} +frame = pd.DataFrame(data) +show.show(frame) + + +print('new reuslt') + +from matplotlib import pyplot as plt + +x=[4,8,10] +y=[12,16,6] +x2=[6,9,11] +y2=[6,15,7] +plt.bar(x,y,color='r',align='center') +plt.bar(x2,y2,color='g',align='center') +plt.show() + +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/seatunnel.md b/versioned_docs/version-1.4.0/engine-usage/seatunnel.md new file mode 100644 index 00000000000..4de3b20b4c9 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/seatunnel.md @@ -0,0 +1,254 @@ +--- +title: Seatunnel Engine +sidebar_position: 14 +--- + +This article mainly introduces the installation, usage and configuration of the `Seatunnel` engine plugin in `Linkis`. + +## 1. Pre-work + +### 1.1 Engine installation + +If you want to use `Seatunnel` engine on your `Linkis` service, you need to install `Seatunnel` engine. Moreover, `Seatunnel` depends on the `Spark` or `Flink` environment. Before using the `linkis-seatunnel` engine, it is strongly recommended to run through the `Seatunnel` environment locally. + +`Seatunnel 2.1.2` download address: https://dlcdn.apache.org/seatunnel/2.1.2/apache-seatunnel-incubating-2.1.2-bin.tar.gz + +| Environment variable name | Environment variable content | Required or not | +|-----------------|----------------|-------------- -----------------------------| +| JAVA_HOME | JDK installation path | Required | +| SEATUNNEL_HOME | Seatunnel installation path | required | +|SPARK_HOME| Spark installation path| Seatunnel needs to run based on Spark | +|FLINK_HOME| Flink installation path| Seatunnel execution is based on Flink | + +Table 1-1 Environment configuration list + +| Linkis variable name| variable content| required | +| --------------------------- | --------------------- -------------------------------------- | ------------ --------------------------------------------------- | +| wds.linkis.engine.seatunnel.plugin.home | Seatunnel installation path | Yes | + +### 1.2 Engine Environment Verification + +Take the execution of `Spark` tasks as an example + +```shell +cd $SEATUNNEL_HOME +./bin/start-seatunnel-spark.sh --master local[4] --deploy-mode client --config ./config/spark.batch.conf.template +``` +The output is as follows: + +![](./images/check-seatunnel.png) + +## 2. Engine plugin deployment + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (requires `maven` environment) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/seatunnel/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/seatunnel/target/out/ +``` +[EngineConnPlugin Engine Plugin Installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── seat tunnel +│ ├── dist +│ │ └── 2.1.2 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 2.1.2 +``` + +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check whether the engine is refreshed successfully +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#login to `linkis` database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3. Engine usage + +### 3.1 Submit tasks through `Linkis-cli` + + +```shell +sh ./bin/linkis-cli --mode once -code 'test' -engineType seatunnel-2.1.2 -codeType sspark -labelMap userCreator=hadoop-seatunnel -labelMap engineConnMode=once -jobContentMap code='env { + spark.app.name = "SeaTunnel" + spark.executor.instances = 2 + spark.executor.cores = 1 + spark.executor.memory = "1g" + } + source { + Fake { + result_table_name = "my_dataset" + } + } + transform {} + sink {Console {}}' -jobContentMap master=local[4] -jobContentMap deploy-mode=client -sourceMap jobName=OnceJobTest -submitUser hadoop -proxyUser hadoop +``` + +### 3.2 Submit tasks through OnceEngineConn + +OnceEngineConn calls LinkisManager's createEngineConn interface through LinkisManagerClient, and sends the code to the created Seatunnel engine, and then Seatunnel engine starts to execute. The use of Client is also very simple, first create a new maven project, or introduce the following dependencies in the project + +```xml + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` + +**Example Code** +```java +package org.apache.linkis.computation.client; +import org.apache.linkis.common.conf.Configuration; +import org.apache.linkis.computation.client.once.simple.SubmittableSimpleOnceJob; +import org.apache.linkis.computation.client.utils.LabelKeyUtils; +public class SeatunnelOnceJobTest { + public static void main(String[] args) { + LinkisJobClient.config().setDefaultServerUrl("http://ip:9001"); + String code = + "\n" + + "env {\n" + + " spark.app.name = \"SeaTunnel\"\n" + + "spark.executor.instances = 2\n" + + "spark.executor.cores = 1\n" + + " spark.executor.memory = \"1g\"\n" + + "}\n" + + "\n" + + "source {\n" + + "Fake {\n" + + " result_table_name = \"my_dataset\"\n" + + " }\n" + + "\n" + + "}\n" + + "\n" + + "transform {\n" + + "}\n" + + "\n" + + "sink {\n" + + " Console {}\n" + + "}"; + SubmittableSimpleOnceJob onceJob = + LinkisJobClient.once() + .simple() + .builder() + .setCreateService("seatunnel-Test") + .setMaxSubmitTime(300000) + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY(), "seatunnel-2.1.2") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY(), "hadoop-seatunnel") + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY(), "once") + .addStartupParam(Configuration.IS_TEST_MODE().key(), true) + .addExecuteUser("hadoop") + .addJobContent("runType", "sspark") + .addJobContent("code", code) + .addJobContent("master", "local[4]") + .addJobContent("deploy-mode", "client") + .addSource("jobName", "OnceJobTest") + .build(); + onceJob. submit(); + System.out.println(onceJob.getId()); + onceJob. waitForCompleted(); + System.out.println(onceJob.getStatus()); + LinkisJobMetrics jobMetrics = onceJob. getJobMetrics(); + System.out.println(jobMetrics.getMetrics()); + } +} +``` +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description + +| Configuration | Default | Description | Required | +| ----------------------------------------- | ---------- ----------- | -------------------------------------- ----- | -------- | +| wds.linkis.engine.seatunnel.plugin.home | /opt/linkis/seatunnel | Seatunnel installation path | true | +### 4.2 Configuration modification + +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.2.1 Client Configuration Parameters + +```shell +sh ./bin/linkis-cli --mode once-code 'test' \ +-engineType seatunnel-2.1.2 -codeType sspark\ +-labelMap userCreator=hadoop-seatunnel -labelMap engineConnMode=once \ +-jobContentMap code='env { + spark.app.name = "SeaTunnel" + spark.executor.instances = 2 + spark.executor.cores = 1 + spark.executor.memory = "1g" + } + source { + Fake { + result_table_name = "my_dataset" + } + } + transform {} + sink {Console {}}' -jobContentMap master=local[4] \ + -jobContentMap deploy-mode=client \ + -sourceMap jobName=OnceJobTest\ + -runtimeMap wds.linkis.engine.seatunnel.plugin.home=/opt/linkis/seatunnel \ + -submitUser hadoop -proxyUser hadoop +``` + +#### 4.2.2 Task interface configuration +Submit the task interface and configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": 'env { + spark.app.name = "SeaTunnel" + spark.executor.instances = 2 + spark.executor.cores = 1 + spark.executor.memory = "1g" + } + source { + Fake { + result_table_name = "my_dataset" + } + } + transform {} + sink {Console {}}', + "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.engine.seatunnel.plugin.home":"/opt/linkis/seatunnel" + } + } + }, + "labels": { + "engineType": "seatunnel-2.1.2", + "userCreator": "hadoop-IDE" + } +} +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/shell.md b/versioned_docs/version-1.4.0/engine-usage/shell.md new file mode 100644 index 00000000000..4fe69970e9d --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/shell.md @@ -0,0 +1,55 @@ +--- +title: Shell Engine +sidebar_position: 6 +--- + +This article mainly introduces the installation, usage and configuration of the `Shell` engine plug-in in `Linkis`. + +## 1. Preliminary work + +### 1.1 Environment installation +If you want to use the `shell` engine on your server, you need to ensure that the user's `PATH` has the executable directory and execution permission of `bash`. + +### 1.2 Environment verification +``` +echo $SHELL +``` +The following information is output to indicate that the shell environment is available +``` +/bin/bash +``` +or +``` +/bin/sh +``` + +## 2. Engine plugin installation [default engine](./overview.md) + +The `Shell` engine plugin is included in the binary installation package released by `linkis` by default, and users do not need to install it additionally. + +[EngineConnPlugin engine plugin installation](../deployment/install-engineconn.md) + +## 3. Engine usage + +### 3.1 Submit tasks through `Linkis-cli` + +```shell +sh ./bin/linkis-cli -engineType shell-1 \ +-codeType shell -code "echo \"hello\" " \ +-submitUser hadoop -proxyUser hadoop +``` +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +### 3.2 Submit tasks through Linkis SDK + +`Linkis` provides `SDK` for `Java` and `Scala` to submit tasks to the `Linkis` server. For details, please refer to [JAVA SDK Manual](../user-guide/sdk-manual.md). For the `Shell` task you only need to modify the `EngineConnType` and `CodeType` parameters in the `Demo`: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "shell-1"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "shell"); // required codeType +``` +## 4. Engine configuration instructions + +The `shell` engine can generally set the maximum memory of the engine `JVM`. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/spark.md b/versioned_docs/version-1.4.0/engine-usage/spark.md new file mode 100644 index 00000000000..2c9c90b56a0 --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/spark.md @@ -0,0 +1,289 @@ +--- +title: Spark Engine +sidebar_position: 1 +--- + +This article mainly introduces the installation, use and configuration of the `Spark` engine plugin in `Linkis`. + +## 1. Preliminary work +### 1.1 Engine installation + +If you wish to use the `spark` engine on your server, you need to ensure that the following environment variables are set correctly and that the engine's starting user has these environment variables. + +It is strongly recommended that you check these environment variables for the executing user before executing a `spark` job. + +| Environment variable name | Environment variable content | Remarks | +|-----------------|----------------|-------------- -----------------------------| +| JAVA_HOME | JDK installation path | Required | +| HADOOP_HOME | Hadoop installation path | Required | +| HADOOP_CONF_DIR | Hadoop configuration path | required | +| HIVE_CONF_DIR | Hive configuration path | required | +| SPARK_HOME | Spark installation path | Required | +| SPARK_CONF_DIR | Spark configuration path | Required | +| python | python | It is recommended to use anaconda's python as the default python | + +### 1.2 Environment verification +Verify that `Spark` is successfully installed by `pyspark` +``` +pyspark + +#After entering the pyspark virtual environment, the spark logo appears, indicating that the environment is successfully installed +Welcome to + ______ + /__/__ ___ _____/ /__ + _\ \/ _ \/ _ `/ __/ '_/ + /__ / .__/\_,_/_/ /_/\_\ version 3.2.1 + /_/ + +Using Python version 2.7.13 (default, Sep 30 2017 18:12:43) +SparkSession available as 'spark'. +``` + +## 2. Engine plugin installation [default engine](./overview.md) + +The `Spark` engine plugin is included in the binary installation package released by `linkis` by default, and users do not need to install it additionally. + +In theory `Linkis` supports all versions of `spark2.x` and above. The default supported version is `Spark3.2.1`. If you want to use another version of `spark`, such as `spark2.1.0`, you just need to modify the version of the plugin `spark` and compile it. Specifically, you can find the `linkis-engineplugin-spark` module, change the value of the `` tag in the `maven` dependency to 2.1.0, and then compile this module separately. + +[EngineConnPlugin engine plugin installation](../deployment/install-engineconn.md) + +## 3. Using the `spark` engine + +### 3.1 Submitting tasks via `Linkis-cli` + +```shell +# codeType correspondence py-->pyspark sql-->sparkSQL scala-->Spark scala +sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType sql -code "show databases" -submitUser hadoop -proxyUser hadoop + +# You can specify the yarn queue in the submission parameter by -confMap wds.linkis.yarnqueue=dws +sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType sql -confMap wds.linkis.yarnqueue=dws -code "show databases" -submitUser hadoop -proxyUser hadoop +``` +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +### 3.2 Submitting tasks through `Linkis SDK` + +`Linkis` provides `SDK` of `Java` and `Scala` to submit tasks to `Linkis` server. For details, please refer to [JAVA SDK Manual](../user-guide/sdk-manual.md). +For `Spark` tasks you only need to modify the `EngineConnType` and `CodeType` parameters in `Demo`: + +```java +Map labels = new HashMap(); +labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-3.2.1"); // required engineType Label +labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "sql"); // required codeType py,sql,scala +``` + +You can also submit scala and python code: +````java + +//scala +labels.put(LabelKeyConstant.CODE_TYPE_KEY, "scala"); +code: +val df=spark.sql("show tables") +show(df) +//pyspark +/labels.put(LabelKeyConstant.CODE_TYPE_KEY, "py"); +code: +df=spark.sql("show tables") +show(df) +```` + + +### 3.3 Submitting tasks by submitting the jar package + +Through `OnceEngineConn` submit tasks (through the spark-submit submit jar package mission), submission for reference `org.apache.linkis.com putation.Client.SparkOnceJobTest`. + +```java +public class SparkOnceJobTest { + + public static void main(String[] args) { + + LinkisJobClient.config().setDefaultServerUrl("http://127.0.0.1:9001"); + + String submitUser = "linkis"; + String engineType = "spark"; + + SubmittableSimpleOnceJob onceJob = + // region + LinkisJobClient.once().simple().builder() + .setCreateService("Spark-Test") + .setMaxSubmitTime(300000) + .setDescription("SparkTestDescription") + .addExecuteUser(submitUser) + .addJobContent("runType", "jar") + .addJobContent("spark.app.main.class", "org.apache.spark.examples.JavaWordCount") + // Parameters obtained from the submitted jar package + .addJobContent("spark.app.args", "hdfs:///tmp/test_word_count.txt") // WordCount test file + .addLabel("engineType", engineType + "-2.4.7") + .addLabel("userCreator", submitUser + "-IDE") + .addLabel("engineConnMode", "once") + .addStartupParam("spark.app.name", "spark-submit-jar-test-linkis") // Application Name on yarn + .addStartupParam("spark.executor.memory", "1g") + .addStartupParam("spark.driver.memory", "1g") + .addStartupParam("spark.executor.cores", "1") + .addStartupParam("spark.executor.instance", "1") + .addStartupParam("spark.app.resource", "hdfs:///tmp/spark/spark-examples_2.11-2.3.0.2.6.5.0-292.jar") + .addSource("jobName", "OnceJobTest") + .build(); + // endregion + onceJob.submit(); + onceJob.waitForCompleted(); //A temporary network interruption may cause an exception. It is recommended to modify the SDK later. If the SDK is in use at this stage, exception handling is required. + // Temporary network failure will cause exceptions. It is recommended to modify the SDK later. For use at this stage, exception handling is required + onceJob.waitForCompleted(); + } +} +``` + +### 3.4 Submitting tasks with `Restful API` + +Scripts type includes `sql`、`scala`、`python`、`data_calc(content type is json)`. + +[Restful API Usage](../api/linkis-task-operator.md) + +```http request +POST /api/rest_j/v1/entrance/submit +Content-Type: application/json +Token-Code: dss-AUTH +Token-User: linkis + +{ + "executionContent": { + // script content, type: sql, python, scala, json + "code": "show databases", + // script type: sql, py(pyspark), scala, data_calc(json) + "runType": "sql" + }, + "params": { + "variable": { + }, + "configuration": { + // spark startup parameters, not required + "startup": { + "spark.executor.memory": "1g", + "spark.driver.memory": "1g", + "spark.executor.cores": "1", + "spark.executor.instances": 1 + } + } + }, + "source": { + // not required, file:/// or hdfs:/// + "scriptPath": "file:///tmp/hadoop/test.sql" + }, + "labels": { + // pattern:engineType-version + "engineType": "spark-3.2.1", + // userCreator: linkis is username。IDE is system that be configed in Linkis。 + "userCreator": "linkis-IDE" + } +} +``` + +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description +| Configuration | Default | Required | Description | +| ------------------------ | ------------------- | ---| ------------------------------------------- | +| wds.linkis.rm.instance | 10 |No| Maximum number of concurrent engines | +| spark.executor.cores | 1 |No| Number of spark executor cores | +| spark.driver.memory | 1g | no | maximum concurrent number of spark executor instances | +| spark.executor.memory | 1g | No | spark executor memory size | +| wds.linkis.engineconn.max.free.time | 1h | No | Engine idle exit time | +| spark.python.version | python2 | no | python version | + +### 4.2 Queue resource configuration +Because the execution of `spark` requires queue resources, you need to set up a queue that you can execute. + +![yarn](./images/yarn-conf.png) + + +### 4.3 Configuration modification +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.3.1 Management Console Configuration +Users can customize settings, such as the number of `spark` sessions `executor` and `executor` memory. These parameters are for users to set their own `spark` parameters more freely, and other `spark` parameters can also be modified, such as the `python` version of `pyspark`, etc. +![spark](./images/spark-conf.png) + +Note: After modifying the configuration under the `IDE` tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE \ +-engineType spark-3.2.1 -codeType sql \ +-code "show databases" \ +-submitUser hadoop -proxyUser hadoop +``` + +#### 4.3.2 Task interface configuration +Submit the task interface, configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "show databases;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "wds.linkis.rm.instance":"10" + } + } + }, + "labels": { + "engineType": "spark-3.2.1", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.4 Engine related data sheet + +`Linkis` is managed through the engine tag, and the data table information involved is shown below. + +``` +linkis_ps_configuration_config_key: Insert the key and default values ​​​​of the configuration parameters of the engine +linkis_cg_manager_label: insert engine label such as: spark-3.2.1 +linkis_ps_configuration_category: The directory association relationship of the insertion engine +linkis_ps_configuration_config_value: The configuration that the insertion engine needs to display +linkis_ps_configuration_key_engine_relation: The relationship between the configuration item and the engine +``` + +The initial data in the table related to the `spark` engine is as follows + +```sql +-- set variable +SET @SPARK_LABEL="spark-3.2.1"; +SET @SPARK_ALL=CONCAT('*-*,',@SPARK_LABEL); +SET @SPARK_IDE=CONCAT('*-IDE,',@SPARK_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @SPARK_ALL, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @SPARK_IDE, 'OPTIONAL', 2, now(), now()); + +select @label_id := id from linkis_cg_manager_label where `label_value` = @SPARK_IDE; +insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.rm.instance', 'Range: 1-20, unit: each', 'Maximum concurrent number of spark engine', '10', 'NumInterval', '[1,20]', '0 ', '0', '1', 'queue resources', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.executor.instances', 'value range: 1-40, unit: individual', 'maximum concurrent number of spark executor instances', '1', 'NumInterval', '[1,40]', '0', '0', '2', 'spark resource settings', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.executor.cores', 'Value range: 1-8, unit: number', 'Number of spark executor cores', '1', 'NumInterval', '[1,8]', ' 0', '0', '1','spark resource settings', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.executor.memory', 'value range: 1-15, unit: G', 'spark executor memory size', '1g', 'Regex', '^([1-9]|1 [0-5])(G|g)$', '0', '0', '3', 'spark resource settings', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.driver.cores', 'Value range: only 1, unit: number', 'Number of spark driver cores', '1', 'NumInterval', '[1,1]', '0 ', '1', '1', 'spark resource settings', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.driver.memory', 'value range: 1-15, unit: G', 'spark driver memory size','1g', 'Regex', '^([1-9]|1[ 0-5])(G|g)$', '0', '0', '1', 'spark resource settings', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.engineconn.max.free.time', 'Value range: 3m,15m,30m,1h,2h', 'Engine idle exit time','1h', 'OFT', '[\ "1h\",\"2h\",\"30m\",\"15m\",\"3m\"]', '0', '0', '1', 'spark engine settings', ' spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.pd.addresses', NULL, NULL, 'pd0:2379', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.addr', NULL, NULL, 'tidb', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.password', NULL, NULL, NULL, 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.port', NULL, NULL, '4000', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.tispark.tidb.user', NULL, NULL, 'root', 'None', NULL, '0', '0', '1', 'tidb设置', 'spark'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('spark.python.version', 'Value range: python2,python3', 'python version','python2', 'OFT', '[\"python3\",\"python2\"]', ' 0', '0', '1', 'spark engine settings', 'spark'); + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config +INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'spark' and label.label_value = @SPARK_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation +INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @SPARK_ALL); + +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/sqoop.md b/versioned_docs/version-1.4.0/engine-usage/sqoop.md new file mode 100644 index 00000000000..32d243de6fc --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/sqoop.md @@ -0,0 +1,473 @@ +--- +title: Sqoop Engine +sidebar_position: 9 +--- + +This article mainly introduces the installation, usage and configuration of the `Sqoop` engine plugin in `Linkis`. + +## 1. Preliminary work +### 1.1 Environment Installation + +The `Sqoop` engine mainly depends on the `Hadoop` basic environment. If the node needs to deploy the `Sqoop` engine, you need to deploy the `Hadoop` client environment, and ![Download](https://archive.apache.org/dist/sqoop /) Install the `Sqoop` client. + +### 1.2 Environment verification +Before executing the `Sqoop` task, use the native `Sqoop` to execute the test task on the node to check whether the node environment is normal. +```shell script +#Verify whether the sqoop environment is available Reference example: Import the /user/hive/warehouse/hadoop/test_linkis_sqoop file data of hdfs into the mysql table test_sqoop + +sqoop export \ +--connect jdbc:mysql://10.10.10.10/test \ +--username test \ +--password test123\ +--table test_sqoop \ +--columns user_id,user_code,user_name,email,status \ +--export-dir /user/hive/warehouse/hadoop/test_linkis_sqoop \ +--update-mode allowinsert \ +--verbose ; +``` + +| Environment variable name | Environment variable content | Remarks | +|-----------------|----------------|-------------- -----------------------------| +| JAVA_HOME | JDK installation path | Required | +| HADOOP_HOME | Hadoop installation path | Required | +| HADOOP_CONF_DIR | Hadoop configuration path | required | +| SQOOP_HOME | Sqoop installation path | Required | +| SQOOP_CONF_DIR | Sqoop configuration path | not required | +| HCAT_HOME | HCAT configuration path | not required | +| HBASE_HOME | HBASE configuration path | not required | + + +| Linkis System Parameters | Parameters | Remarks | +| ------------------------------------- | --------------------- ---------- | --------------------------------------- --------------------- | +| wds.linkis.hadoop.site.xml | Set sqoop to load hadoop parameter file location | Generally, no separate configuration is required, the default value is "core-site.xml;hdfs-site.xml;yarn-site.xml;mapred-site. xml" | +| sqoop.fetch.status.interval | Set the interval for obtaining sqoop execution status | Generally, no separate configuration is required, the default value is 5s | + + +## 2. Engine plugin deployment + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (requires a `maven` environment) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/sqoop/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/sqoop/target/out/ +``` + +[EngineConnPlugin engine plugin installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── sqoop +│ ├── dist +│ │ └── 1.4.6 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 1.4.6 +``` + +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check if the engine is refreshed successfully +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#Login to the `linkis` database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3 `Sqoop` engine usage + +### 3.1 Submitting tasks via `Linkis-cli` +#### 3.1.1 `hdfs` file export to `mysql` + +```shell +sh linkis-cli-sqoop export \ +-D mapreduce.job.queuename=ide\ +--connect jdbc:mysql://10.10.10.10:9600/testdb\ +--username password@123 \ +--password password@123 \ +--table test_sqoop_01_copy \ +--columns user_id,user_code,user_name,email,status \ +--export-dir /user/hive/warehouse/hadoop/test_linkis_sqoop_2 \ +--update-mode allowinsert --verbose ; +``` + +#### 3.1.2 `mysql` data import to `hive` library +```shell script +`mysql` is imported into `hive` library `linkis_test_ind.test_import_sqoop_1`, table `test_import_sqoop_1` does not exist, need to add parameter `--create-hive-table` + +sh linkis-cli-sqoop import -D mapreduce.job.queuename=dws\ +--connect jdbc:mysql://10.10.10.10:3306/casion_test\ +--username hadoop\ +--password password@123 \ +--table test_sqoop_01 \ +--columns user_id,user_code,user_name,email,status \ +--fields-terminated-by ',' \ +--hive-import --create-hive-table \ +--hive-database casionxia_ind\ +--hive-table test_import_sqoop_1 \ +--hive-drop-import-delims \ +--delete-target-dir \ +--input-null-non-string '\\N' \ +--input-null-string '\\N' \ +--verbose ; + + +`mysql` is imported into the `hive` library `linkis_test_ind.test_import_sqoop_1`, the table `test_import_sqoop_1` exists to remove the parameter `--create-hive-table` + +sh linkis-cli-sqoop import -D mapreduce.job.queuename=dws\ +--connect jdbc:mysql://10.10.10.10:9600/testdb\ +--username testdb \ +--password password@123 \ +--table test_sqoop_01 \ +--columns user_id,user_code,user_name,email,status \ +--fields-terminated-by ',' \ +--hive-import \ +--hive-database linkis_test_ind \ +--hive-table test_import_sqoop_1 \ +--hive-overwrite \ +--hive-drop-import-delims \ +--delete-target-dir \ +--input-null-non-string '\\N' \ +--input-null-string '\\N' \ +--verbose ; + +``` + +### 3.2 Submit tasks through `OnceEngineConn` + +The usage of `OnceEngineConn` is to call the `createEngineConn` interface of `LinkisManager` through `LinkisManagerClient`, and send the code to the created `Sqoop` engine, and then the `Sqoop` engine starts to execute, which can be performed by other systems. Calls such as `Exchangeis`. The usage of `Client` is also very simple, first create a `maven` project, or introduce the following dependencies into your project +```xml + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` +**Test case:** + +```java + +import java.util.concurrent.TimeUnit + +import java.util + +import org.apache.linkis.computation.client.LinkisJobBuilder +import org.apache.linkis.computation.client.once.simple.{SimpleOnceJob, SimpleOnceJobBuilder, SubmittableSimpleOnceJob} +import org.apache.linkis.computation.client.operator.impl.{EngineConnLogOperator, EngineConnMetricsOperator, EngineConnProgressOperator} +import org.apache.linkis.computation.client.utils.LabelKeyUtils + +import scala.collection.JavaConverters._ + +object SqoopOnceJobTest extends App { + LinkisJobBuilder.setDefaultServerUrl("http://127.0.0.1:9001") + val logPath = "C:\\Users\\resources\\log4j.properties" + System.setProperty("log4j.configurationFile", logPath) + val startUpMap = new util. HashMap[String, Any] + startUpMap.put("wds.linkis.engineconn.java.driver.memory", "1g") + val builder = SimpleOnceJob. builder(). setCreateService("Linkis-Client") + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY, "sqoop-1.4.6") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY, "Client") + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY, "once") + .setStartupParams(startUpMap) + .setMaxSubmitTime(30000) + .addExecuteUser("freeuser") + val onceJob = importJob(builder) + val time = System. currentTimeMillis() + onceJob.submit() + + println(onceJob. getId) + val logOperator = onceJob.getOperator(EngineConnLogOperator.OPERATOR_NAME).asInstanceOf[EngineConnLogOperator] + println(onceJob.getECMServiceInstance) + logOperator.setFromLine(0) + logOperator.setECMServiceInstance(onceJob.getECMServiceInstance) + logOperator.setEngineConnType("sqoop") + logOperator.setIgnoreKeywords("[main],[SpringContextShutdownHook]") + var progressOperator = onceJob.getOperator(EngineConnProgressOperator.OPERATOR_NAME).asInstanceOf[EngineConnProgressOperator] + var metricOperator = onceJob.getOperator(EngineConnMetricsOperator.OPERATOR_NAME).asInstanceOf[EngineConnMetricsOperator] + var end = false + var rowBefore = 1 + while (!end || rowBefore > 0){ + if(onceJob.isCompleted) { + end = true + metricOperator = null + } + logOperator.setPageSize(100) + Utils. tryQuietly{ + val logs = logOperator.apply() + logs.logs.asScala.foreach( log => { + println(log) + }) + rowBefore = logs. logs. size + } + Thread.sleep(3000) + Option(metricOperator).foreach( operator => { + if (!onceJob.isCompleted){ + println(s"Metric monitoring: ${operator.apply()}") + println(s"Progress: ${progressOperator.apply()}") + } + }) + } + onceJob. isCompleted + onceJob.waitForCompleted() + println(onceJob. getStatus) + println(TimeUnit. SECONDS. convert(System. currentTimeMillis() - time, TimeUnit. MILLISECONDS) + "s") + System. exit(0) + + + def importJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue_10") + .addJobContent("sqoop. mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://127.0.0.1:3306/exchangis") + .addJobContent("sqoop.args.username", "free") + .addJobContent("sqoop.args.password", "testpwd") + .addJobContent("sqoop.args.query", "select id as order_number, sno as time from" + + "exchangis where sno =1 and $CONDITIONS") + .addJobContent("sqoop.args.hcatalog.database", "freedb") + .addJobContent("sqoop.args.hcatalog.table", "zy_test") + .addJobContent("sqoop.args.hcatalog.partition.keys", "month") + .addJobContent("sqoop.args.hcatalog.partition.values", "3") + .addJobContent("sqoop.args.num.mappers", "1") + .build() + } + + def exportJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue1") + .addJobContent("sqoop.mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://127.0.0.1:3306/exchangis") + .addJobContent("sqoop.args.query", "select id as order, sno as great_time from" + + "exchangis_table where sno =1 and $CONDITIONS") + .addJobContent("sqoop.args.hcatalog.database", "hadoop") + .addJobContent("sqoop.args.hcatalog.table", "partition_33") + .addJobContent("sqoop.args.hcatalog.partition.keys", "month") + .addJobContent("sqoop.args.hcatalog.partition.values", "4") + .addJobContent("sqoop.args.num.mappers", "1") + .build() + } +``` + + +## 4 Engine configuration instructions +### 4.1 Default Configuration Description + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| | sqoop.mode | import/export/… | +| -Dmapreduce.job.queuename | sqoop.env.mapreduce.job.queuename | | +| \--connect | sqoop.args.connect | Specify JDBC connect string | +| \--connection-manager | sqoop.args.connection.manager | Specify connection manager class name | +| \--connection-param-file | sqoop.args.connection.param.file | Specify connection parameters file | +| \--driver | sqoop.args.driver | Manually specify JDBC driver class to use | +| \--hadoop-home | sqoop.args.hadoop.home | Override $HADOOP\_MAPRED\_HOME\_ARG | +| \--hadoop-mapred-home | sqoop.args.hadoop.mapred.home | Override $HADOOP\_MAPRED\_HOME\_ARG | +| \--help | sqoop.args.help | Print usage instructions | +| \-P | | Read password from console | +| \--password | sqoop.args.password | Set authentication password | +| \--password-alias | sqoop.args.password.alias | Credential provider password alias | +| \--password-file | sqoop.args.password.file | Set authentication password file path | +| \--relaxed-isolation | sqoop.args.relaxed.isolation | Use read-uncommitted isolation for imports | +| \--skip-dist-cache | sqoop.args.skip.dist.cache | Skip copying jars to distributed cache | +| \--username | sqoop.args.username | Set authentication username | +| \--verbose | sqoop.args.verbose | Print more information while working | +| | | | +### 4.2 Import and export parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--batch | sqoop.args.batch | Indicates underlying statements to be executed in batch mode | +| \--call | sqoop.args.call | Populate the table using this stored procedure (one call per row) | +| \--clear-staging-table | sqoop.args.clear.staging.table | Indicates that any data in staging table can be deleted | +| \--columns | sqoop.args.columns | Columns to export to table | +| \--direct | sqoop.args.direct | Use direct export fast path | +| \--export-dir | sqoop.args.export.dir | HDFS source path for the export | +| \-m,--num-mappers | sqoop.args.num.mappers | Use 'n' map tasks to export in parallel | +| \--mapreduce-job-name | sqoop.args.mapreduce.job.name | Set name for generated mapreduce job | +| \--staging-table | sqoop.args.staging.table | Intermediate staging table | +| \--table | sqoop.args.table | Table to populate | +| \--update-key | sqoop.args.update.key | Update records by specified key column | +| \--update-mode | sqoop.args.update.mode | Specifies how updates are performed when new rows are found with non-matching keys in database | +| \--validate | sqoop.args.validate | Validate the copy using the configured validator | +| \--validation-failurehandler | sqoop.args.validation.failurehandler | Validate the copy using the configured validator | +| \--validation-threshold | sqoop.args.validation.threshold | Fully qualified class name for ValidationThreshold | +| \--validator | sqoop.args.validator | Fully qualified class name for the Validator | +| | | | +### 4.3 Import control parameters +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--append | sqoop.args.append | Imports data in append mode | +| \--as-avrodatafile | sqoop.args.as.avrodatafile | Imports data to Avro data files | +| \--as-parquetfile | sqoop.args.as.parquetfile | Imports data to Parquet files | +| \--as-sequencefile | sqoop.args.as.sequencefile | Imports data to SequenceFiles | +| \--as-textfile | sqoop.args.as.textfile | Imports data as plain text (default) | +| \--autoreset-to-one-mapper | sqoop.args.autoreset.to.one.mapper | Reset the number of mappers to one mapper if no split key available | +| \--boundary-query | sqoop.args.boundary.query | Set boundary query for retrieving max and min value of the primary key | +| \--case-insensitive | sqoop.args.case.insensitive | Data Base is case insensitive, split where condition transfrom to lower case! | +| \--columns | sqoop.args.columns | Columns to import from table | +| \--compression-codec | sqoop.args.compression.codec | Compression codec to use for import | +| \--delete-target-dir | sqoop.args.delete.target.dir | Imports data in delete mode | +| \--direct | sqoop.args.direct | Use direct import fast path | +| \--direct-split-size | sqoop.args.direct.split.size | Split the input stream every 'n' bytes when importing in direct mode | +| \-e,--query | sqoop.args.query | Import results of SQL 'statement' | +| \--fetch-size | sqoop.args.fetch.size | Set number 'n' of rows to fetch from the database when more rows are needed | +| \--inline-lob-limit | sqoop.args.inline.lob.limit | Set the maximum size for an inline LOB | +| \-m,--num-mappers | sqoop.args.num.mappers | Use 'n' map tasks to import in parallel | +| \--mapreduce-job-name | sqoop.args.mapreduce.job.name | Set name for generated mapreduce job | +| \--merge-key | sqoop.args.merge.key | Key column to use to join results | +| \--split-by | sqoop.args.split.by | Column of the table used to split work units | +| \--table | sqoop.args.table | Table to read | +| \--target-dir | sqoop.args.target.dir | HDFS plain table destination | +| \--validate | sqoop.args.validate | Validate the copy using the configured validator | +| \--validation-failurehandler | sqoop.args.validation.failurehandler | Fully qualified class name for ValidationFa ilureHandler | +| \--validation-threshold | sqoop.args.validation.threshold | Fully qualified class name for ValidationThreshold | +| \--validator | sqoop.args.validator | Fully qualified class name for the Validator | +| \--warehouse-dir | sqoop.args.warehouse.dir | HDFS parent for table destination | +| \--where | sqoop.args.where | WHERE clause to use during import | +| \-z,--compress | sqoop.args.compress | Enable compression | +| | | | + +### 4.4 Incremental import parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--check-column | sqoop.args.check.column | Source column to check for incremental change | +| \--incremental | sqoop.args.incremental | Define an incremental import of type 'append' or 'lastmodified' | +| \--last-value | sqoop.args.last.value | Last imported value in the incremental check column | +| | | | + +### 4.5 Output line formatting parameters +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--enclosed-by | sqoop.args.enclosed.by | Sets a required field enclosing character | +| \--escaped-by | sqoop.args.escaped.by | Sets the escape character | +| \--fields-terminated-by | sqoop.args.fields.terminated.by | Sets the field separator character | +| \--lines-terminated-by | sqoop.args.lines.terminated.by | Sets the end-of-line character | +| \--mysql-delimiters | sqoop.args.mysql.delimiters | Uses MySQL's default delimiter set: fields: , lines: \\n escaped-by: \\ optionally-enclosed-by: ' | +| \--optionally-enclosed-by | sqoop.args.optionally.enclosed.by | Sets a field enclosing character | +| | | | + +### 4.6 Input parsing parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--input-enclosed-by | sqoop.args.input.enclosed.by | Sets a required field enclosure | +| \--input-escaped-by | sqoop.args.input.escaped.by | Sets the input escape character | +| \--input-fields-terminated-by | sqoop.args.input.fields.terminated.by | Sets the input field separator | +| \--input-lines-terminated-by | sqoop.args.input.lines.terminated.by | Sets the input end-of-line char | +| \--input-optionally-enclosed-by | sqoop.args.input.optionally.enclosed.by | Sets a field enclosing character | +| | | | + + ### 4.7 `Hive` parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--create-hive-table | sqoop.args.create.hive.table | Fail if the target hive table exists | +| \--hive-database | sqoop.args.hive.database | Sets the database name to use when importing to hive | +| \--hive-delims-replacement | sqoop.args.hive.delims.replacement | Replace Hive record \\0x01 and row delimiters (\\n\\r) from imported string fields with user-defined string | +| \--hive-drop-import-delims | sqoop.args.hive.drop.import.delims | Drop Hive record \\0x01 and row delimiters (\\n\\r) from imported string fields | +| \--hive-home | sqoop.args.hive.home | Override $HIVE\_HOME | +| \--hive-import | sqoop.args.hive.import | Import tables into Hive (Uses Hive's default delimiters if none are set.) | +| \--hive-overwrite | sqoop.args.hive.overwrite | Overwrite existing data in the Hive table | +| \--hive-partition-key | sqoop.args.hive.partition.key | Sets the partition key to use when importing to hive | +| \--hive-partition-value | sqoop.args.hive.partition.value | Sets the partition value to use when importing to hive | +| \--hive-table | sqoop.args.hive.table | Sets the table name to use when importing to hive | +| \--map-column-hive | sqoop.args.map.column.hive | Override mapping for specific column to hive types. | + + +### 4.8 `HBase` parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--column-family | sqoop.args.column.family | Sets the target column family for the import | +| \--hbase-bulkload | sqoop.args.hbase.bulkload | Enables HBase bulk loading | +| \--hbase-create-table | sqoop.args.hbase.create.table | If specified, create missing HBase tables | +| \--hbase-row-key | sqoop.args.hbase.row.key | Specifies which input column to use as the row key | +| \--hbase-table | sqoop.args.hbase.table | Import to in HBase | +| | | | + +### 4.9 `HCatalog` parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--hcatalog-database | sqoop.args.hcatalog.database | HCatalog database name | +| \--hcatalog-home | sqoop.args.hcatalog.home | Override $HCAT\_HOME | +| \--hcatalog-partition-keys | sqoop.args.hcatalog.partition.keys | Sets the partition keys to use when importing to hive | +| \--hcatalog-partition-values ​​ | sqoop.args.hcatalog.partition.values ​​| Sets the partition values ​​to use when importing to hive | +| \--hcatalog-table | sqoop.args.hcatalog.table | HCatalog table name | +| \--hive-home | sqoop.args.hive.home | Override $HIVE\_HOME | +| \--hive-partition-key | sqoop.args.hive.partition.key | Sets the partition key to use when importing to hive | +| \--hive-partition-value | sqoop.args.hive.partition.value | Sets the partition value to use when importing to hive | +| \--map-column-hive | sqoop.args.map.column.hive | Override mapping for specific column to hive types. | +| | | | +| HCatalog import specific options: | | | +| \--create-hcatalog-table | sqoop.args.create.hcatalog.table | Create HCatalog before import | +| \--hcatalog-storage-stanza | sqoop.args.hcatalog.storage.stanza | HCatalog storage stanza for table creation | +| | | +### 4.10 `Accumulo` parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--accumulo-batch-size | sqoop.args.accumulo.batch.size | Batch size in bytes | +| \--accumulo-column-family | sqoop.args.accumulo.column.family | Sets the target column family for the import | +| \--accumulo-create-table | sqoop.args.accumulo.create.table | If specified, create missing Accumulo tables | +| \--accumulo-instance | sqoop.args.accumulo.instance | Accumulo instance name. | +| \--accumulo-max-latency | sqoop.args.accumulo.max.latency | Max write latency in milliseconds | +| \--accumulo-password | sqoop.args.accumulo.password | Accumulo password. | +| \--accumulo-row-key | sqoop.args.accumulo.row.key | Specifies which input column to use as the row key | +| \--accumulo-table | sqoop.args.accumulo.table | Import to in Accumulo | +| \--accumulo-user | sqoop.args.accumulo.user | Accumulo user name. | +| \--accumulo-visibility | sqoop.args.accumulo.visibility | Visibility token to be applied to all rows imported | +| \--accumulo-zookeepers | sqoop.args.accumulo.zookeepers | Comma-separated list of zookeepers (host:port) | +| | | | + +### 4.11 Code Generation Parameters + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \--bindir | sqoop.args.bindir | Output directory for compiled objects | +| \--class-name | sqoop.args.class.name | Sets the generated class name. This overrides --package-name. When combined with --jar-file, sets the input class. | +| \--input-null-non-string | sqoop.args.input.null.non.string | Input null non-string representation | +| \--input-null-string | sqoop.args.input.null.string | Input null string representation | +| \--jar-file | sqoop.args.jar.file | Disable code generation; use specified jar | +| \--map-column-java | sqoop.args.map.column.java | Override mapping for specific columns to java types | +| \--null-non-string | sqoop.args.null.non.string | Null non-string representation | +| \--null-string | sqoop.args.null.string | Null string representation | +| \--outdir | sqoop.args.outdir | Output directory for generated code | +| \--package-name | sqoop.args.package.name | Put auto-generated classes in this package | +| | | | +### 4.12 Generic `Hadoop` command line arguments +>must preceed any tool-specific arguments,Generic options supported are + +| parameter | key | description | +| -------------------------------------------------- -------------------------------------------------- ------------------ | ------------------------------- -------- | ----------------------------------------- -------------------------------------------------- ----------------------- | +| \-conf | sqoop.args.conf | specify an application configuration file | +| \-D | sqoop.args.D | use value for given property | +| \-fs | sqoop.args.fs | specify a namenode | +| \-jt | sqoop.args.jt | specify a ResourceManager | +| \-files | sqoop.args.files | specify comma separated files to be copied to the map reduce cluster | +| \-libjars | sqoop.args.libjars | specify comma separated jar files to include in the classpath. | +| \-archives | sqoop.args.archives | specify comma separated archives to be unarchived on the compute machines. | \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/engine-usage/trino.md b/versioned_docs/version-1.4.0/engine-usage/trino.md new file mode 100644 index 00000000000..fef924e032c --- /dev/null +++ b/versioned_docs/version-1.4.0/engine-usage/trino.md @@ -0,0 +1,243 @@ +--- +title: Trino Engine +sidebar_position: 13 +--- + +This article mainly introduces the installation, use and configuration of the `Trino` engine plugin in `Linkis`. + + +## 1. Pre-work + +### 1.1 Engine installation + +If you want to use `Trino` engine on your `Linkis` service, you need to install `Trino` service and make sure the service is available. + +### 1.2 Service Verification + +```shell +# prepare trino-cli +wget https://repo1.maven.org/maven2/io/trino/trino-cli/374/trino-cli-374-executable.jar +mv trill-cli-374-executable.jar trill-cli +chmod +x trino-cli + +# Execute the task +./trino-cli --server localhost:8080 --execute 'show tables from system.jdbc' + +# Get the following output to indicate that the service is available +"attributes" +"catalogs" +"columns" +"procedure_columns" +"procedures" +"pseudo_columns" +"schemas" +"super_tables" +"super_types" +"table_types" +"tables" +"types" +"udts" +``` + +## 2. Engine plugin deployment + +### 2.1 Engine plugin preparation (choose one) [non-default engine](./overview.md) + +Method 1: Download the engine plug-in package directly + +[Linkis Engine Plugin Download](https://linkis.apache.org/zh-CN/blog/2022/04/15/how-to-download-engineconn-plugin) + +Method 2: Compile the engine plug-in separately (requires `maven` environment) + +``` +# compile +cd ${linkis_code_dir}/linkis-engineconn-plugins/trino/ +mvn clean install +# The compiled engine plug-in package is located in the following directory +${linkis_code_dir}/linkis-engineconn-plugins/trino/target/out/ +``` +[EngineConnPlugin Engine Plugin Installation](../deployment/install-engineconn.md) + +### 2.2 Upload and load engine plugins + +Upload the engine package in 2.1 to the engine directory of the server +```bash +${LINKIS_HOME}/lib/linkis-engineplugins +``` +The directory structure after uploading is as follows +``` +linkis-engineconn-plugins/ +├── triune +│ ├── dist +│ │ └── 371 +│ │ ├── conf +│ │ └── lib +│ └── plugin +│ └── 371 +``` + +### 2.3 Engine refresh + +#### 2.3.1 Restart and refresh +Refresh the engine by restarting the `linkis-cg-linkismanager` service +```bash +cd ${LINKIS_HOME}/sbin +sh linkis-daemon.sh restart cg-linkismanager +``` + +### 2.3.2 Check whether the engine is refreshed successfully +You can check whether the `last_update_time` of the `linkis_engine_conn_plugin_bml_resources` table in the database is the time to trigger the refresh. + +```sql +#login to `linkis` database +select * from linkis_cg_engine_conn_plugin_bml_resources; +``` + +## 3 Engine usage + +### 3.1 Submit tasks through `Linkis-cli` + +```shell + sh ./bin/linkis-cli -submitUser Hadoop \ + -engineType trino-371 -codeType sql \ + -code 'select * from system.jdbc.schemas limit 10' \ + -runtimeMap linkis.trino.url=http://127.0.0.1:8080 +``` + +If the management console, task interface, and configuration file are not configured (see 4.2 for the configuration method), they can be configured through the `-runtimeMap` attribute in the `Linkis-cli` client + +```shell +sh ./bin/linkis-cli -engineType trino-371 \ +-codeType sql -code 'select * from system.jdbc.schemas limit 10;' \ +-runtimeMap linkis.trino.urll=http://127.0.0.1:8080 \ +-runtimeMap linkis.trino.catalog=hive \ +-runtimeMap linkis.trino.schema=default \ +-submitUser hadoop -proxyUser hadoop +``` + +More `Linkis-Cli` command parameter reference: [Linkis-Cli usage](../user-guide/linkiscli-manual.md) + +## 4. Engine configuration instructions + +### 4.1 Default Configuration Description + +| Configuration | Default | Description | Required | +| ----------------------------------------- | ---------- ----------- | -------------------------------------- ----- | -------- | +| linkis.trino.url | http://127.0.0.1:8080 | Trino cluster connection URL | true | +| linkis.trino.default.limit | 5000 | No | Limit the number of result sets | +| linkis.trino.http.connectTimeout | 60 | No | Connection timeout (seconds) | +| linkis.trino.http.readTimeout | 60 | No | Transmission timeout (seconds) | +| linkis.trino.resultSet.cache.max | 512k | no | result set buffer | +| linkis.trino.user | null | no | username | +| linkis.trino.password | null | no | password | +| linkis.trino.passwordCmd | null | no | password callback command | +| linkis.trino.catalog | system | No | Catalog | +| linkis.trino.schema | null | 否 | Schema | +| linkis.trino.ssl.insecured | false | no | verify SSL certificate | +| linkis.engineconn.concurrent.limit | 100 | No | Maximum concurrent number of engines | +| linkis.trino.ssl.key.store | null | no | keystore path | +| linkis.trino.ssl.keystore.password | null | no | keystore password | +| linkis.trino.ssl.keystore.type | null | no | keystore type | +| linkis.trino.ssl.truststore | null | 否 | truststore | +| linkis.trino.ss..truststore.type | null | no | truststore type | +| linkis.trino.ssl.truststore.password | null | no | truststore password | + +### 4.2 Configuration modification + +If the default parameters are not satisfied, there are the following ways to configure some basic parameters + +#### 4.2.1 Management console configuration + +![](./images/trino-config.png) + +Note: After modifying the configuration under the `IDE` tag, you need to specify `-creator IDE` to take effect (other tags are similar), such as: + +```shell +sh ./bin/linkis-cli -creator IDE -submitUser hadoop \ + -engineType trino-371 -codeType sql \ + -code 'select * from system.jdbc.schemas limit 10' \ + -runtimeMap linkis.trino.url=http://127.0.0.1:8080 +``` + +#### 4.2.2 Task interface configuration +Submit the task interface and configure it through the parameter `params.configuration.runtime` + +```shell +Example of http request parameters +{ + "executionContent": {"code": "select * from system.jdbc.schemas limit 10;", "runType": "sql"}, + "params": { + "variable": {}, + "configuration": { + "runtime": { + "linkis.trino.url":"http://127.0.0.1:8080", + "linkis.trino.catalog ":"hive", + "linkis.trino.schema ":"default" + } + } + }, + "labels": { + "engineType": "trino-371", + "userCreator": "hadoop-IDE" + } +} +``` + +### 4.3 Engine related data table + +`Linkis` is managed through engine tags, and the data table information involved is as follows. + +``` +linkis_ps_configuration_config_key: Insert the key and default values ​​​​of the configuration parameters of the engine +linkis_cg_manager_label: insert engine label such as: trino-375 +linkis_ps_configuration_category: Insert the directory association of the engine +linkis_ps_configuration_config_value: Insert the configuration that the engine needs to display +linkis_ps_configuration_key_engine_relation: the relationship between configuration items and engines +``` + +The initial data related to the engine in the table is as follows + + +```sql +-- set variable +SET @TRINO_LABEL="trino-371"; +SET @TRINO_IDE=CONCAT('*-IDE,',@TRINO_LABEL); +SET @TRINO_ALL=CONCAT('*-*,',@TRINO_LABEL); + +-- engine label +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @TRINO_IDE, 'OPTIONAL', 2, now(), now()); +insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @TRINO_ALL, 'OPTIONAL', 2, now(), now()); +select @label_id := id from `linkis_cg_manager_label` where label_value = @TRINO_IDE; +insert into `linkis_ps_configuration_category` (`label_id`, `level`) VALUES (@label_id, 2); + +-- configuration key +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.default.limit', 'The limit on the number of query result sets returned', 'The limit on the number of result sets', '5000', 'None', '', 'trino', 0, 0, 1, 'Data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.http.connectTimeout', 'Timeout for connecting to Trino server', 'Connection timeout (seconds)', '60', 'None', '', 'trino', 0, 0, 1 , 'Data Source Configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.http.readTimeout', 'Timeout waiting for Trino server to return data', 'Transmission timeout (seconds)', '60', 'None', '', 'trino', 0, 0 , 1, 'Data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.resultSet.cache.max', 'Trino result set buffer size', 'Result set buffer', '512k', 'None', '', 'trino', 0, 0, 1 , 'Data Source Configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.url', 'Trino server URL', 'Trino server URL', 'http://127.0.0.1:9401', 'None', '', 'trino', 0, 0, 1 , 'Data Source Configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.user', 'username used to connect to Trino query service', 'username', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.password', 'Password for connecting Trino query service', 'password', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration '); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.passwordCmd', 'Password callback command for connecting to Trino query service', 'Password callback command', 'null', 'None', '', 'trino', 0, 0, 1, 'Datasource Configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.catalog', 'catalog', 'Catalog', 'system', 'None', '', 'trino', 0, 0, 1, 'data source configuration' ); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.schema', 'The default schema for connecting Trino query service', 'Schema', '', 'None', '', 'trino', 0, 0, 1, 'Data source configuration') ; +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.insecured', 'Whether to ignore the server's SSL certificate', 'Verify SSL certificate', 'false', 'None', '', 'trino', 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.engineconn.concurrent.limit', 'Engine maximum concurrency', 'Engine maximum concurrency', '100', 'None', '', 'trino', 0, 0, 1, 'Data source configuration' ); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.keystore', 'Trino server SSL keystore path', 'keystore path', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration '); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.keystore.type', 'Trino server SSL keystore type', 'keystore type', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.keystore.password', 'Trino server SSL keystore password', 'keystore password', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.truststore', 'Trino server SSL truststore path', 'truststore path', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration '); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.truststore.type', 'Trino server SSL truststore type', 'truststore type', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration'); +INSERT INTO `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `engine_conn_type`, `is_hidden`, `is_advanced`, `level`, `treeName`) VALUES ('linkis.trino.ssl.truststore.password', 'Trino server SSL truststore password', 'truststore password', 'null', 'None', '', 'trino', 0, 0, 1, 'data source configuration'); + + +-- key engine relation +insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`) +(select config.id as config_key_id, label.id AS engine_type_label_id FROM `linkis_ps_configuration_config_key` config +INNER JOIN `linkis_cg_manager_label` label ON config.engine_conn_type = 'trino' and label_value = @TRINO_ALL); + +-- engine default configuration +insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`) +(select relation.config_key_id AS config_key_id, '' AS config_value, relation.engine_type_label_id AS config_label_id FROM `linkis_ps_configuration_key_engine_relation` relation +INNER JOIN `linkis_cg_manager_label` label ON relation.engine_type_label_id = label.id AND label.label_value = @TRINO_ALL); +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/feature/_category_.json b/versioned_docs/version-1.4.0/feature/_category_.json new file mode 100644 index 00000000000..eb7c770c8e5 --- /dev/null +++ b/versioned_docs/version-1.4.0/feature/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Version Feature", + "position": 1.5 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/feature/base-engine-compatibilty.md b/versioned_docs/version-1.4.0/feature/base-engine-compatibilty.md new file mode 100644 index 00000000000..81062d30c43 --- /dev/null +++ b/versioned_docs/version-1.4.0/feature/base-engine-compatibilty.md @@ -0,0 +1,74 @@ +--- +title: Base Engine Dependency, Compatibility, Default Version Optimization +sidebar_position: 0.2 +--- + +## 1. Requirement background +1. The lower version of linkis needs to modify the code to adapt to different versions of Hive, Spark, etc. Because of compatibility issues, the compilation may fail, which can reduce the compatibility issues of these basic engines. +2. Hadoop, Hive, and Spark 3.x are very mature, and lower versions of the engine may have potential risks. Many users in the community use the 3.x version by default, so consider changing the default compiled version of Linkis to 3.x. + +## 2. Instructions for use + +## 2.1 Default version adjustment instructions + +Linkis 1.4.0 changes the default versions of Hadoop, Hive, and Spark to 3.x, and the specific versions are Hadoop 3.3.4, Hive 3.1.3, and Spark 3.2.1. + +## 2.2 Different version adaptation + +To compile different hive versions, we only need to specify `-D=xxx`, for example: +``` +mvn clean install package -Dhive.version=2.3.3 +``` +To compile different versions of spark, we only need to specify `-D=xxx`. Common usage scenarios are as follows: +``` +#spark3+hadoop3 +mvn install package + +#spark3+hadoop2 +mvn install package -Phadoop-2.7 + +#spark2+hadoop2 +mvn install package -Pspark-2.4 -Phadoop-2.7 + +#spark2+ hadoop3 +mvn install package -Pspark-2.4 +``` +## 3. Precautions +1. When the default version is compiled, the basic version is: hadoop3.3.4 + hive3.1.3 + spark3.2.1 +``` +mvn install package +``` +Due to the default version upgrade of the default base engine, `spark-3.2`, `hadoop-3.3` and `spark-2.4-hadoop-3.3` profiles were removed, and profiles `hadoop-2.7` and `spark-2.4` were added. + +2. The sub-version of spark can be specified by `-Dspark.version=xxx`. The default scala version used by the system is 2.12.17, which can be adapted to spark 3.x version. To compile spark 2.x, you need to use scala 2.11 version. Can be compiled with -Pspark-2.4 parameter, or -Dspark.version=2.xx -Dscala.version=2.11.12 -Dscala.binary.version=2.11. + +3. The subversion of hadoop can be specified by `-Dhadoop.version=xxx` + +for example : +``` +mvn install package -Pspark-3.2 -Phadoop-3.3 -Dspark.version=3.1.3 +``` + +4. Version 2.x of hive needs to rely on jersey. Hive EC does not add jersey dependency when compiling by default. You can compile it through the following guidelines. + +**Compile hive version 2.3.3** + +When compiling hive EC, the profile that activates adding jersey dependencies when specifying version 2.3.3 is added by default. Users can compile by specifying the -Dhive.version=2.3.3 parameter + +**Compile other hive 2.x versions** + +Modify the linkis-engineconn-plugins/hive/pom.xml file, modify 2.3.3 to the user-compiled version, such as 2.1.0 +```xml + + hive-jersey-dependencies + + + hive.version + + 2.1.0 + + + ... + +``` +Add -Dhive.version=2.1.0 parameter when compiling. diff --git a/versioned_docs/version-1.4.0/feature/datasource-generate-sql.md b/versioned_docs/version-1.4.0/feature/datasource-generate-sql.md new file mode 100644 index 00000000000..e9b0ec5a341 --- /dev/null +++ b/versioned_docs/version-1.4.0/feature/datasource-generate-sql.md @@ -0,0 +1,149 @@ +--- +title: Generate SQL according to the data source +sidebar_position: 0.5 +--- + +## 1. Background +Generate SparkSQL and JdbcSQL based on data source information, including DDL, DML, and DQL. + +## 2. Instructions for use +### generate SparkSQL + +Interface address: /api/rest_j/v1/metadataQuery/getSparkSql + +Request method: GET + +Request data type: application/x-www-form-urlencoded + +Request parameters: + +| Parameter name | Description | Required | Data type | +|-------------------------------|-------|-----|--| +| `dataSourceName` | data source name | is | String | +| `system` | system name | is | String | +| `database` | database name | is | String | +| `table` | table name | is | String | + +Example response: + +```json +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "sparkSql": { + "ddl": "CREATE TEMPORARY TABLE test USING org.apache.spark.sql.jdbc OPTIONS ( url 'jdbc:mysql://localhost:3306/test', dbtable 'test', user 'root', password 'password' )", + "dml": "INSERT INTO test SELECT * FROM ${resultTable}", + "dql": "SELECT id,name FROM test" + } + } +} +``` +Currently supports jdbc, kafka, elasticsearch, mongo data source, you can register spark table according to SparkSQLDDL for query + +### Generate JdbcSQL + +Interface address: /api/rest_j/v1/metadataQuery/getJdbcSql + +Request method: GET + +Request data type: application/x-www-form-urlencoded + +Request parameters: + +| Parameter name | Description | Required | Data type | +|-------------------------------|-------|-----|--| +| `dataSourceName` | data source name | is | String | +| `system` | system name | is | String | +| `database` | database name | is | String | +| `table` | table name | is | String | + +Example response: + +```json +{ + "method": null, + "status": 0, + "message": "OK", + "data": { + "jdbcSql": { + "ddl": "CREATE TABLE `test` (\n\t `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'The column name is id',\n\t `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'The column name is name',\n\t PRIMARY KEY (`id`)\n\t) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", + "dml": "INSERT INTO test SELECT * FROM ${resultTable}", + "dql": "SELECT id,name FROM test" + } + } +} +``` + +Currently supports JDBC data sources, such as: mysql, oracle, postgres, etc. JdbcSQLDDL can be used for front-end display. + +## 3. Precautions +1. You need to register the data source first + +## 4. Implementation principle +### Generate SparkSQL implementation principle +Define DDL_SQL_TEMPLATE to obtain data source information for replacement +```java + public static final String JDBC_DDL_SQL_TEMPLATE = + "CREATE TEMPORARY TABLE %s" + + "USING org.apache.spark.sql.jdbc" + + "OPTIONS (" + + "url '%s'," + + "dbtable '%s'," + + " user '%s'," + + "password '%s'" + + ")"; +``` + +### Generate JdbcSQL implementation principle +Splicing DDL according to table schema information +```java +public String generateJdbcDdlSql(String database, String table) { + StringBuilder ddl = new StringBuilder(); + ddl.append("CREATE TABLE ").append(String.format("%s.%s", database, table)).append(" ("); + + try { + List < MetaColumnInfo > columns = getColumns(database, table); + if (CollectionUtils. isNotEmpty(columns)) { + for (MetaColumnInfo column: columns) { + ddl.append("\n\t").append(column.getName()).append(" ").append(column.getType()); + if (column. getLength() > 0) { + ddl.append("(").append(column.getLength()).append(")"); + } + if (!column. isNullable()) { + ddl.append("NOT NULL"); + } + ddl.append(","); + } + String primaryKeys = + columns. stream() + .filter(MetaColumnInfo::isPrimaryKey) + .map(MetaColumnInfo::getName) + .collect(Collectors.joining(", ")); + if (StringUtils. isNotBlank(primaryKeys)) { + ddl.append(String.format("\n\tPRIMARY KEY (%s),", primaryKeys)); + } + ddl. deleteCharAt(ddl. length() - 1); + } + } catch (Exception e) { + LOG.warn("Fail to get Sql columns(Failed to get the field list)"); + } + + ddl.append("\n)"); + + return ddl. toString(); +} +``` + +Some data sources support direct access to DDL + +**mysql** +```sql +SHOW CREATE TABLE 'table' +``` + +**oracle** +```sql +SELECT DBMS_METADATA.GET_DDL('TABLE', 'table', 'database') AS DDL FROM DUAL +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/feature/hive-engine-support-concurrent.md b/versioned_docs/version-1.4.0/feature/hive-engine-support-concurrent.md new file mode 100644 index 00000000000..fc19a66f916 --- /dev/null +++ b/versioned_docs/version-1.4.0/feature/hive-engine-support-concurrent.md @@ -0,0 +1,24 @@ +--- +title: hive engine supports concurrency and multiplexing +sidebar_position: 0.3 +--- + +## 1. Requirement background +hiveEngineConn supports concurrency, reduces the resource consumption of starting the hive engine, and improves the engine reuse rate. + +## 2. Instructions for use +First, modify the linkis-engineconn.properties file in the linkis-engineconn-plugins/hive/src/main/resources directory, +And set linkis.hive.engineconn.concurrent.support to true. +``` +# Support parallel execution +wds.linkis.engineconn.support.parallelism=true + +# Concurrency limit, the default is 10 +linkis.hive.engineconn.concurrent.limit=10 +``` + +Submit a hive job, and when the first job is complete, submit another job. You can see that the hive engine has been reused. + +Restart the cg-linkismanager service after configuration modification, or make the configuration take effect through [Engine Refresh API](../api/http/linkis-cg-engineplugin-api/engineconn-plugin-refresh.md). +## 3. Precautions +1. Wait for the first hive task to execute successfully before submitting the second hive task. Submitting multiple tasks at the same time for the first time may cause multiple ECs to be started due to no available ECs. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/feature/other.md b/versioned_docs/version-1.4.0/feature/other.md new file mode 100644 index 00000000000..aeb42806873 --- /dev/null +++ b/versioned_docs/version-1.4.0/feature/other.md @@ -0,0 +1,28 @@ +--- +title: Description of other features +sidebar_position: 0.6 +--- + +## 1. Do not kill EC when ECM restarts +When the ECM restarts, there is an option not to kill the engine, but to take over the existing surviving engine. Makes the Engine Connection Manager (ECM) service stateless. + +## 2. Remove json4s dependency +Different versions of spark depend on different json4s versions, which is not conducive to the support of multiple versions of spark. We need to reduce this json4s dependency and remove json4s from linkis. +For example: spark2.4 needs json4s v3.5.3, spark3.2 needs json4s v3.7.0-M11. + +## 3. EngineConn module definition depends on engine version +The version definition of the engine is in `EngineConn` by default. Once the relevant version is changed, it needs to be modified in many places. We can put the relevant version definition in the top-level pom file. When compiling a specified engine module, it needs to be compiled in the project root directory, and use `-pl` to compile the specific engine module, for example: +``` +mvn install package -pl linkis-engineconn-plugins/spark -Dspark.version=3.2.1 +``` +The version of the engine can be specified by the -D parameter of mvn compilation, such as -Dspark.version=xxx, -Dpresto.version=0.235 +At present, all the underlying engine versions have been moved to the top-level pom file. When compiling the specified engine module, it needs to be compiled in the project root directory, and `-pl` is used to compile the specific engine module. + +## 4. Linkis main version number modification instructions + +Linkis will no longer be upgraded by minor version after version 1.3.2. The next version will be 1.4.0, and the version number will be 1.5.0, 1.6.0 and so on. When encountering a major defect in a released version that needs to be fixed, it will pull a minor version to fix the defect, such as 1.4.1. + + +## 5. LInkis code submission main branch instructions + +The modified code of Linkis 1.3.2 and earlier versions is merged into the dev branch by default. In fact, the development community of Apache Linkis is very active, and new development requirements or repair functions will be submitted to the dev branch, but when users visit the Linkis code base, the master branch is displayed by default. Since we only release a new version every quarter, it seems that the community is not very active from the perspective of the master branch. Therefore, we decided to merge the code submitted by developers into the master branch by default starting from version 1.4.0. diff --git a/versioned_docs/version-1.4.0/feature/overview.md b/versioned_docs/version-1.4.0/feature/overview.md new file mode 100644 index 00000000000..34160261e3a --- /dev/null +++ b/versioned_docs/version-1.4.0/feature/overview.md @@ -0,0 +1,33 @@ +--- +title: version overview +sidebar_position: 0.1 +--- + +- [Base engine dependencies, compatibility, default version optimization](./base-engine-compatibilty.md) +- [Hive engine connector supports concurrent tasks](./hive-engine-support-concurrent.md) +- [Support more datasources](../user-guide/datasource-manual#31-jdbc-datasource) +- [Spark ETL enhancements](./spark-etl.md) +- [Generate SQL from data source](./datasource-generate-sql.md) +- [linkis-storage supports S3 file system (experimental version)](../deployment/deploy-quick#343-s3-mode) +- [add postgresql database support (experimental version)](../deployment/deploy-quick#22-configuration database information) +- [Add impala engine support (experimental version)](../engine-usage/impala.md) +- [Other feature description](./other.md) +- [version of Release-Notes](/download/release-notes-1.4.0) + +## Parameter changes + +| module name (service name) | type | parameter name | default value | description | +| ----------- | ----- | ------------------------------- ------------------------- | ---------------- | ------- --------------------------------------------------- | +| mg-eureka | New | eureka.instance.metadata-map.linkis.app.version | ${linkis.app.version} | Eureka metadata reports Linkis application version information| +| mg-eureka | Add | eureka.instance.metadata-map.linkis.conf.version | None | Eureka metadata report Linkis service version information | +| mg-eureka | Modify | eureka.client.registry-fetch-interval-seconds | 8 | Eureka Client pull service registration information interval (seconds) | +| mg-eureka | New | eureka.instance.lease-renewal-interval-in-seconds | 4 | The frequency (seconds) at which the eureka client sends heartbeats to the server | +| mg-eureka | new | eureka.instance.lease-expiration-duration-in-seconds | 12 | eureka waits for the next heartbeat timeout (seconds)| +| EC-shell | Modify | wds.linkis.engineconn.support.parallelism | true | Whether to enable parallel execution of shell tasks | +| EC-shell | Modify | linkis.engineconn.shell.concurrent.limit | 15 | Concurrent number of shell tasks | +| Entrance | Modify | linkis.entrance.auto.clean.dirty.data.enable | true | Whether to clean dirty data at startup | + + + +## Database table changes +For details, see the upgrade schema `db/upgrade/1.4.0_schema` file in the corresponding branch of the code warehouse (https://github.com/apache/linkis) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/feature/spark-etl.md b/versioned_docs/version-1.4.0/feature/spark-etl.md new file mode 100644 index 00000000000..2151cb74cf9 --- /dev/null +++ b/versioned_docs/version-1.4.0/feature/spark-etl.md @@ -0,0 +1,642 @@ +--- +title: Support spark ETL data synchronization +sidebar_position: 0.4 +--- + +## 1. Background +Using the Spark ETL function, users can synchronize Spark data by configuring json. + +## 2. Supported types + +currently supported types +```text +jdbc, file, redis, kafka, elasticsearch, mongo, datalake (hudi, delta) +``` + +## 3. General configuration instructions +```text +name: data source name +type: Contains `source`, `transformation`, `sink`, corresponding to input, transformation, and output respectively +options: configuration parameters +saveMode: save mode, currently supports: `overwrite` and `append` +path: file path, can be: 'file://' or 'hdfs://'(default) +`resultTable` needs to correspond to `sourceTable` +``` + +## 4. Instructions for use + +### 4.1 Add the required jar package +When using the data source, you need to upload the corresponding spark connector jar to the spark/jars directory, the directory location is $SPARK_HOME/jars + +The spark connector jar can be obtained by the following command + +```text +git clone https://github.com/apache/linkis.git + +cd link is + +git checkout master + +cd linkis-engineconn-plugins/spark/scala-2.12 + +mvn clean install -Dmaven.test.skip=true +``` + +The compiled spark connector jar is located in the following directory +```text +linkis/linkis-engineconn-plugins/spark/scala-2.12/target/out/spark/dist/3.2.1/lib +``` + +### 4.2 linkis-cli submit task example + +Just pass in the specific json code in code, pay attention to the conversion of quotation marks. + +```shell +sh /appcom/Install/linkis/bin/linkis-cli -engineType spark-3.2.1 -codeType data_calc -code "" -submitUser hadoop -proxyUser hadoop +``` + +Linkis-cli submits redis data synchronization task example +```shell +sh ./bin/linkis-cli -engineType spark-3.2.1 -codeType data_calc -code "{\"plugins\":[{\"name\":\"file\",\"type\":\" source\",\"config\":{\"resultTable\":\"test\",\"path\":\"hdfs://linkishdfs/tmp/linkis/spark_etl_test/etltest.dolphin\",\ "serializer\":\"csv\",\"options\":{\"header\":\"true\",\"delimiter\":\";\"},\"columnNames\":[ \"name\",\"age\"]}},{\"name\":\"redis\",\"type\":\"sink\",\"config\":{\"sourceTable \":\"test\",\"host\":\"wds07\",\"port\":\"6679\",\"auth\":\"password\",\"targetTable\" :\"spark_etl_test\",\"saveMode\":\"append\"}}]}" -submitUser hadoop -proxyUser hadoop +``` +### 4.3 Synchronization json script description of each data source + +#### 4.3.1 jdbc + +Configuration instructions +```text +url: jdbc connection information +user: user name +password: password +query: sql query statement +``` + +json code + +```json +{ + "sources": [ + { + "name": "jdbc", + "type": "source", + "config": { + "resultTable": "test1", + "url": "jdbc:mysql://127.0.0.1:3306/dip_linkis?characterEncoding=UTF-8", + "driver": "com.mysql.jdbc.Driver", + "user": "root", + "password": "123456", + "query": "select * from dip_linkis.linkis_ps_udf_baseinfo", + "options": { + } + } + } + ], + "transformations": [ + { + "name": "sql", + "type": "transformation", + "config": { + "resultTable": "T1654611700631", + "sql": "select * from test1" + } + } + ], + "sinks": [ + { + "name": "jdbc", + "type": "sink", + "config": { + "sourceTable": "T1654611700631", + "url": "jdbc:mysql://127.0.0.1:3306/dip_linkis?characterEncoding=UTF-8", + "driver": "com.mysql.jdbc.Driver", + "user": "root", + "password": "123456", + "targetTable": "linkis_ps_udf_baseinfo2", + "options": { + } + } + } + ] +} +``` + +A new jar needs to be added, and the corresponding jar should be selected according to the specific data source used +```text +DmJdbcDriver18.jar +kingbase8-8.6.0.jar +postgresql-42.3.8.jar +``` + +#### 4.3.2 file + +Configuration instructions + +```text +serializer: file format, can be `csv`, `parquet`, etc. +columnNames: column names +``` + + +json code + +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "test2", + "path": "hdfs:///tmp/test_new_no_partition", + "serializer": "csv", + "columnNames": ["id", "create_user", "udf_name", "udf_type", "tree_id", "create_time", "update_time", "sys", "cluster_name", "is_expire", "is_shared"] + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "test2", + "path": "hdfs:///tmp/test_new", + "partitionBy": ["create_user"], + "saveMode": "overwrite", + "serializer": "csv" + } + } + ] +} +``` + +Need to add new jar +``` +spark-excel-2.12.17-3.2.2_2.12-3.2.2_0.18.1.jar +``` + +#### 4.3.3 redis + +```text +sourceTable: source table, +host: ip address, +port": port, +auth": password, +targetTable: target table, +saveMode: support append +``` + +json code +```json +{ + "plugins":[ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "test", + "path": "hdfs://linkishdfs/tmp/linkis/spark_etl_test/etltest.dolphin", + "serializer": "csv", + "options": { + "header": "true", + "delimiter": ";" + }, + "columnNames": ["name", "age"] + } + }, + { + "name": "redis", + "type": "sink", + "config": { + "sourceTable": "test", + "host": "wds07", + "port": "6679", + "auth": "password", + "targetTable": "spark_etl_test", + "saveMode": "append" + } + } + ] +} +``` + +Need to add new jar +```text +jedis-3.2.0.jar +commons-pool2-2.8.1.jar +spark-redis_2.12-2.6.0.jar +``` + +#### 4.3.4 kafka + +Configuration instructions +```text +servers: kafka connection information +mode: currently supports `batch` and `stream` +topic: kafka topic name +``` + +Data written to json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header": "true", + "delimiter": ";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "kafka", + "config": { + "sourceTable": "T1654611700631", + "servers": "localhost:9092", + "mode": "batch", + "topic": "test121212" + } + } + ] +} +``` + +Data read json code +```json +{ + "sources": [ + { + "name": "kafka", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "servers": "localhost:9092", + "topic": "test121212" + } + } + ], + "sinks": [ + { + "name": "kafka", + "config": { + "sourceTable": "T1654611700631", + "servers": "localhost:9092", + "mode": "stream", + "topic": "test55555" + } + } + ] +} +``` + +Need to add new jar +``` +kafka-clients-2.8.0.jar +spark-sql-kafka-0-10_2.12-3.2.1.jar +spark-token-provider-kafka-0-10_2.12-3.2.1.jar +``` + +#### 4.3.5 elasticsearch + +Configuration instructions +```text +node: elasticsearch ip +port: elasticsearch port +index: elasticsearch index name +``` + + +Data written to json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header": "true", + "delimiter": ";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "elasticsearch", + "config": { + "sourceTable": "T1654611700631", + "node": "localhost", + "port": "9200", + "index": "estest", + "saveMode": "overwrite" + } + } + ] +} +``` + +Data read json code +```json +{ + "sources": [ + { + "name": "elasticsearch", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "node": "localhost", + "port": "9200", + "index": "estest" + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/csv", + "saveMode": "overwrite", + "serializer": "csv" + } + } + ] +} +``` + +Need to add new jar +``` +elasticsearch-spark-30_2.12-7.17.7.jar +``` + +#### 4.3.6 mongo + +Configuration instructions +```text +uri: mongo connection information +database: mongo database +collection: mongo collection +``` + + +Data written to json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header": "true", + "delimiter": ";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "mongo", + "config": { + "sourceTable": "T1654611700631", + "uri": "mongodb://localhost:27017/test", + "database": "test", + "collection": "test", + "saveMode": "overwrite" + } + } + ] +} +``` + +Data read json code +```json +{ + "sources": [ + { + "name": "mongo", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "uri": "mongodb://localhost:27017/test", + "database": "test", + "collection": "test" + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/json", + "saveMode": "overwrite", + "serializer": "json" + } + } + ] +} +``` + +Need to add new jar +``` +bson-3.12.8.jar +mongo-spark-connector_2.12-3.0.1.jar +mongodb-driver-core-3.12.8.jar +mongodb-driver-sync-3.12.8.jar +``` + +#### 4.3.7 delta + +Configuration instructions +```text +tableFormat: currently supports `hudi` and `delta` +``` + + +Data written to json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header": "true", + "delimiter": ";" + }, + "columnNames": ["name", "age"] + } + } + ], + "sinks": [ + { + "name": "datalake", + "config": { + "sourceTable": "T1654611700631", + "tableFormat": "delta", + "path": "file://{filePath}/delta", + "saveMode": "overwrite" + } + } + ] +} +``` + +Data read json code +```json +{ + "sources": [ + { + "name": "datalake", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "tableFormat": "delta", + "path": "file://{filePath}/delta", + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/csv", + "saveMode": "overwrite", + "options": { + "header": "true" + }, + "serializer": "csv" + } + } + ] +} +``` + +Need to add new jar +``` +delta-core_2.12-2.0.2.jar +delta-storage-2.0.2.jar +``` + +#### 4.3.8 hudi + +Configuration instructions +```text +tableFormat: currently supports `hudi` and `delta` +``` + + +Data written to json code +```json +{ + "sources": [ + { + "name": "file", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "path": "file://{filePath}/etltest.dolphin", + "serializer": "csv", + "options": { + "header": "true", + "delimiter": ";" + }, + "columnNames": ["name", "age"] + } + } + ], + "transformations": [ + { + "name": "sql", + "type": "transformation", + "config": { + "resultTable": "T111", + "sql": "select * from T1654611700631" + } + } + ], + "sinks": [ + { + "name": "datalake", + "config": { + "sourceTable": "T1654611700631", + "tableFormat": "hudi", + "options": { + "hoodie.table.name": "huditest", + "hoodie.datasource.write.recordkey.field": "age", + "hoodie.datasource.write.precombine.field":"age" + }, + "path": "file://{filePath}/hudi", + "saveMode": "append" + } + } + ] +} +``` + +Data read json code +```json +{ + "sources": [ + { + "name": "datalake", + "type": "source", + "config": { + "resultTable": "T1654611700631", + "tableFormat": "hudi", + "path": "file://{filePath}/hudi", + } + } + ], + "transformations": [ + { + "name": "sql", + "type": "transformation", + "config": { + "resultTable": "T111", + "sql": "select * from T1654611700631" + } + } + ], + "sinks": [ + { + "name": "file", + "config": { + "sourceTable": "T1654611700631", + "path": "file://{filePath}/csv", + "saveMode": "overwrite", + "options": { + "header": "true" + }, + "serializer": "csv" + } + } + ] +} +``` + +Need to add new jar +``` +hudi-spark3.2-bundle_2.12-0.13.0.jar +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/quick/_category_.json b/versioned_docs/version-1.4.0/quick/_category_.json new file mode 100644 index 00000000000..6cf11891133 --- /dev/null +++ b/versioned_docs/version-1.4.0/quick/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Quick Experience", + "position": 2.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/quick/deploy-to-kubernetes.md b/versioned_docs/version-1.4.0/quick/deploy-to-kubernetes.md new file mode 100644 index 00000000000..a25a0e8ced6 --- /dev/null +++ b/versioned_docs/version-1.4.0/quick/deploy-to-kubernetes.md @@ -0,0 +1,110 @@ +--- +title: Kubernetes Deployment +sidebar_position: 2 +--- + +This article describes how to deploy a Linkis service in a Kind Kubernetes environment for easier learning and debugging. + +## 1. Dependencies and versions + +kind github:https://github.com/kubernetes-sigs/kind +kind web site:[kind.sigs.k8s.io/](https://kind.sigs.k8s.io/) + +### Versions +- kind 0.14.0 +- docker 20.10.17 +- centos 7.6 +- helm 3.x + +### Notice +- 1. Ensure that the component depends on the version +- 2. kind means that the machine simulating node with docker container is restarted and the container has changed and the scheduler is not working anymore. This is a kind limitation and there is a detailed explanation in the official document. + +## 2.Install the docker +### 2.1 Install the tutorial +``` +sudo yum install -y yum-utils device-mapper-persistent-data lvm2 +sudo yum -y install docker-ce +systemctl start docker +systemctl enable docker +``` + +## 3. Install the kind + +### Step1 Manually download the kind binary +``` +https://github.com/kubernetes-sigs/kind/releases +``` +### Step2 Install kind Binary +``` +chmod +x ./kind +mv kind-linux-amd64 /usr/bin/kind +``` +## 4. Install linkis +### Step1 Download linkis1.3.1 deployment package +``` +apache-linkis-1.3.1-incubating-bin.tar.gz +``` +### Step2 Build directory +``` +mkdir -p /opt/data/common/extendlib +``` +### Step3 Copy driver to /opt/data/common/extendlib +``` +curl https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar -o /opt/data/common/extendlib/[mysql-connector-java-8.0.28.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar) +``` +### Step3 Reset kind (not necessary) +``` +./bin/install-linkis-to-kubernetes.sh reset +``` +### Step5 Pull the image +``` +./bin/install-linkis-to-kubernetes.sh pull -mghcr.dockerproxy.com +``` +### Step6 Install linkis to kind +``` +./bin/install-linkis-to-kubernetes.sh install -l -mghcr.dockerproxy.com +``` +### Step7 Run commands to view services and wait until all services are successfully started +``` +kubectl get pods -A +``` +![](/Images/deployment/kubernetes/pods.jpg) + +### Step8 Copy the ldh environment to linkis +``` +./helm/scripts/prepare-for-spark.sh +``` +### Step9 Enabling Port Mapping +``` +./helm/scripts/remote-proxy.sh start +``` +### Step10 Access to the system +``` +linkis-web: http://10.0.2.102:8088/#/login +username:hadoop +Get the password command: +kubectl describe cm linkis-demo-linkis-config -n linkis |grep wds.linkis.admin.password +password:4f90c1b13 +``` + +``` +eureka: http://10.0.2.101:20303/ +``` + +![](/Images/deployment/kubernetes/eureka.png) + +### Step11 use linkis-cli executes the task +``` +Enter the container +./helm/scripts/login-pod.sh cg-engineconnmanager +Executing shell tests +sh ./bin/linkis-cli -engineType shell-1 -codeType shell -code "echo "hello" " -submitUser hadoop -proxyUser hadoop +Executing hive Tests +sh ./bin/linkis-cli -engineType hive-2.3.3 -codeType hql -code "show tables" -submitUser hadoop -proxyUser hadoop +Executing spark Tests +sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "show tables" -submitUser hadoop -proxyUser hadoop +Executing python Tests +sh ./bin/linkis-cli -engineType python-python2 -codeType python -code "print(\"hello\")" -submitUser hadoop -proxyUser hadoop -confMap python.version=python +``` +![](/Images/deployment/kubernetes/linkis.jpg) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/quick/deploy-without-hdfs.md b/versioned_docs/version-1.4.0/quick/deploy-without-hdfs.md new file mode 100644 index 00000000000..199f120e19c --- /dev/null +++ b/versioned_docs/version-1.4.0/quick/deploy-without-hdfs.md @@ -0,0 +1,101 @@ +--- +title: Deploy without HDFS +sidebar_position: 3 +--- + +This article describes how to deploy Linkis services in an environment where HDFS is not deployed to facilitate more lightweight learning, use and debugging. + +For the overall deployment process, please refer to "Quick Deployment", and you need to modify the following content. + +## 1. Configuration modification +Modify the `linkis-env.sh` file to modify the following: +```bash +#Use path mode [file://path] instead of [hdfs://] +WORKSPACE_USER_ROOT_PATH=file:///tmp/linkis/ +HDFS_USER_ROOT_PATH=file:///tmp/linkis +RESULT_SET_ROOT_PATH=file:///tmp/linkis + +export ENABLE_HDFS=false +export ENABLE_HIVE=false +export ENABLE_SPARK=false +``` + +After changing the above configuration to false, there is no need to configure HDFS/HIVE/SPARK environments separately. + +## 2. Copy mysql jar file +Because the mysql-connector-java driver follows the GPL2.0 protocol and does not meet the license policy of the Apache open source protocol, we need to manually copy it to the following two directories. +```bash +${LINKIS_HOME}/lib/linkis-commons/public-module/ +${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +``` + +It can be downloaded directly from the maven repository, such as https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.49 + +## 3. Deploy and start +Refer to the "Quick Deployment" section to complete the deployment by executing the `${LINKIS_HOME}/bin/install.sh` command. +Refering to the "Quick Deployment" section, start the Linkis services by executing the `${LINKIS_HOME}/sbin/linkis-start-all.sh` command. + + +## 4. Verification +Currently, version 1.1.2 only supports shell jobs to run in non-HDFS environments. The execution commands are as follows. + +```bash +$ cd ./bin +$ chmod +x linkis-cli +$ ./linkis-cli -engineType shell-1 -codeType shell -code "echo \"hello\" " -submitUser -proxyUser +``` + +The following output is expected. +```bash +=====Java Start Command===== +exec /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre/bin/java -server -Xms32m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Linkis/linkis03/logs/linkis-cli -XX:ErrorFile=/Linkis/linkis03/logs/linkis-cli/ps_err_pid%p.log -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -classpath /Linkis/linkis03/conf/linkis-cli:/Linkis/linkis03/lib/linkis-computation-governance/linkis-client/linkis-cli/*:/Linkis/linkis03/lib/linkis-commons/public-module/*: -Dconf.root=/Linkis/linkis03/conf/linkis-cli -Dconf.file=linkis-cli.properties -Dlog.path=/Linkis/linkis03/logs/linkis-cli -Dlog.file=linkis-client.root.log.20220418221952287912946 org.apache.linkis.cli.application.LinkisClientApplication '-engineType shell-1 -codeType shell -code echo "hello" -submitUser test -proxyUser test' +[INFO] LogFile path: /Linkis/linkis03/logs/linkis-cli/linkis-client.root.log.20220418221952287912946 +[INFO] User does not provide usr-configuration file. Will use default config +[INFO] connecting to linkis gateway:http://127.0.0.1:9001 +JobId:6 +TaskId:6 +ExecId:exec_id018028linkis-cg-entranceiZbp19q51jb8p984yk2jxdZ:9104LINKISCLI_test_shell_1 +[INFO] Job is successfully submitted! + +2022-04-18 22:19:53.019 INFO Program is substituting variables for you +2022-04-18 22:19:53.019 INFO Variables substitution ended successfully +2022-04-18 22:19:53.019 WARN The code you submit will not be limited by the limit +Job with jobId : LINKISCLI_test_shell_1 and execID : LINKISCLI_test_shell_1 submitted +2022-04-18 22:19:53.019 INFO You have submitted a new job, script code (after variable substitution) is +************************************SCRIPT CODE************************************ +echo "hello" +************************************SCRIPT CODE************************************ +2022-04-18 22:19:53.019 INFO Your job is accepted, jobID is LINKISCLI_test_shell_1 and jobReqId is 6 in ServiceInstance(linkis-cg-entrance, iZbp19q51jb8p984yk2jxdZ:9104). Please wait it to be scheduled +job is scheduled. +2022-04-18 22:19:53.019 INFO Your job is Scheduled. Please wait it to run. +Your job is being scheduled by orchestrator. +2022-04-18 22:19:53.019 INFO job is running. +2022-04-18 22:19:53.019 INFO Your job is Running now. Please wait it to complete. +2022-04-18 22:19:53.019 INFO Job with jobGroupId : 6 and subJobId : 5 was submitted to Orchestrator. +2022-04-18 22:19:53.019 INFO Background is starting a new engine for you,execId astJob_4_codeExec_4 mark id is mark_4, it may take several seconds, please wait +2022-04-18 22:20:01.020 INFO Task submit to ec: ServiceInstance(linkis-cg-engineconn, iZbp19q51jb8p984yk2jxdZ:43213) get engineConnExecId is: 1 +2022-04-18 22:20:01.020 INFO EngineConn local log path: ServiceInstance(linkis-cg-engineconn, iZbp19q51jb8p984yk2jxdZ:43213) /appcom1/tmp/test/20220418/shell/cc21fbb5-3a33-471b-a565-8407ff8ebd80/logs +iZbp19q51jb8p984yk2jxdZ:43213_0 >> echo "hello" +2022-04-18 22:20:01.438 WARN [Linkis-Default-Scheduler-Thread-1] org.apache.linkis.engineconn.computation.executor.hook.executor.ExecuteOnceHook 50 warn - execute once become effective, register lock listener +hello +2022-04-18 22:20:01.020 INFO Your subjob : 5 execue with state succeed, has 1 resultsets. +2022-04-18 22:20:01.020 INFO Congratuaions! Your job : LINKISCLI_test_shell_1 executed with status succeed and 0 results. +2022-04-18 22:20:01.020 INFO job is completed. +2022-04-18 22:20:01.020 INFO Task creation time(任务创建时间): 2022-04-18 22:19:53, Task scheduling time(任务调度时间): 2022-04-18 22:19:53, Task start time(任务开始时间): 2022-04-18 22: Mission end time(任务结束时间): 2022-04-18 22:20:01 +2022-04-18 22:20:01.020 INFO Your mission(您的任务) 6 The total time spent is(总耗时时间为): 8.3 秒 +2022-04-18 22:20:01.020 INFO Congratulations. Your job completed with status Success. + +[INFO] Job execute successfully! Will try get execute result +============Result:================ +TaskId:6 +ExecId: exec_id018028linkis-cg-entranceiZbp19q51jb8p984yk2jxdZ:9104LINKISCLI_test_shell_1 +User:test +Current job status:SUCCEED +extraMsg: +result: + +[INFO] Retrieving result-set, may take time if result-set is large, please do not exit program. +============ RESULT SET 1 ============ +hello +############Execute Success!!!######## +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/quick/live-demo.md b/versioned_docs/version-1.4.0/quick/live-demo.md new file mode 100644 index 00000000000..b038f59a3a3 --- /dev/null +++ b/versioned_docs/version-1.4.0/quick/live-demo.md @@ -0,0 +1,283 @@ +--- +title: Sandbox +sidebar_position: 1 +--- + + + +## **1. Overview of the sandbox environment** + +### **1.1 Get the invitation code** + +Scan the following QR code, add "WeDataSphere open source community assistant", and provide relevant information to obtain the invitation code according to the prompts of the assistant. + +![图片](/Images/quick/live-demo/640.jpeg) + +### **1.2 Register and login to use** + +After getting the invitation code through 1.1, you can register and use it. + +Step 1: Open the registration page link https://dss-open.wedatasphere.com/#/register, fill in the relevant information, and successfully register + +![图片](/Images/quick/live-demo/640-16676643563412.jpeg) + +Step 2: Open the DSS sandbox page https://dss-open.wedatasphere.com/#/login, login with the registered account and password; + +- Login account: registered mobile phone number; +- Login password: the last six digits of the mobile phone number; + +![图片](/Images/quick/live-demo/640-16676643776464.png) + +### **1.3 Interface Description** + +**Important note: For security reasons, the sandbox environment does not support 'add/modify' operations, only support the function of query/view.** + + + +(1) After successful login, you will be redirected to the home page of DSS. The top of the home page includes the Admin and Scriptis entries by default, but you can also add other component entries to the top navigation bar. On the home page, switch the workspace and select the project in the workspace. Now **AIIDEMO** has been configured for everyone to experience, just click the corresponding project. + +![图片](/Images/quick/live-demo/640-16676644060226.png) + +(2) Management platform: Linkis computing governance management platform, in this page can see the execution of all scripts, the management of global resources, the configuration of parameters and variables, data sources and UDF management, is a very important page; + +![图片](/Images/quick/live-demo/640-16676644199108.png) + +(3) Scriptis: a Web tool for data analysis that supports writing SQL, Pyspark, HiveQL and other scripts online and submits them to Linkis for execution, and supports enterprise-level features such as UDFs, functions, resource management and intelligent diagnosis. At present, the sandbox environment does not provide python and shell demos for security reasons. + +![图片](/Images/quick/live-demo/640-1667665078278140.png) + + + +### **1.4 Navigation bar configuration** + +In order to use Qualitis, Scheduis, Visualis, Exchangis components more quickly, the corresponding entry can be added to the top navigation bar. How to do it: Click the entry in the upper left corner and add the corresponding component to the navigation bar. + +![图片](/Images/quick/live-demo/640-1667665075544138.png) + +## + +## **2. Create the project and workflow** + +For security reasons, the sandbox environment does not support the ability to create projects and workflows. Developers can follow these steps in their own environments: + +DSS supports the use of workflow approach, following me step by step to use. + +(1)Click "Create Project" in the workspace "bdapWorkspace"; + +![图片](/Images/quick/live-demo/640-1667665073311136.png) + +(2)Fill in the parameters for the project, as shown in the following screenshot + +![图片](/Images/quick/live-demo/640-1667665070215134.jpeg) + +Because the sandbox environment prohibits project creation for security reasons, the following error is displayed. Build the DSS environment by yourself, you can create the project according to the above method. + +![图片](/Images/quick/live-demo/640-1667665067662132.png) + + + +(3)After successful creation, you can see the project BI_20220804 on the home page; + +![图片](/Images/quick/live-demo/640-1667665065638130.png) + + + +(4)Click to enter the created project "BI_20220804" and click Add workflow + +![图片](/Images/quick/live-demo/640-1667665062469128.png) + + + +(5)Fill in the workflow information + +![图片](/Images/quick/live-demo/640-1667665059998126.png) + + + + + +(6)Enter the project workflow DEMO, we can see the complete workflow interface; + +![图片](/Images/quick/live-demo/640-1667665057158124.png) + + + +## **3. DEMO workflow component description** + +Currently, seven types of workflow nodes are supported, which can be used to complete tasks such as data synchronization, data analysis, data quality management, data visualization and so on. + +We go straight to AIIDEMO, hit Execute, and run the whole DEMO. + +![图片](/Images/quick/live-demo/640-1667665054421122.png) + + + +### **3.1 Data Exchange** + +Use sqoop nodes to allow data exchange between the dss and the target database. + +(1)Double-click Data Sync on the data exchange node. + +![图片](/Images/quick/live-demo/640-1667665051613120.png) + + + +(2)On the page for editing nodes, you can view the node details. Synchronize data from Hvie to MYSQL; + +![图片](/Images/quick/live-demo/640-1667665048477118.png) + + + +(3)Click Data source Hive, and the data source configuration details are displayed in the popup window. The data source is "bdptest10_db.presure_testx". + +![图片](/Images/quick/live-demo/640-1667665045325116.png) + + + +(4)Click on the database you want to sync to: dss_meta_open.presure_testx + +![图片](/Images/quick/live-demo/640-1667665042221114.png) + +![图片](/Images/quick/live-demo/640-1667665040045112.png) + + + +(5)The following fields are synchronized: objectid, intcolumn, doublecolumn, and floatcolumn. + +![图片](/Images/quick/live-demo/640-1667665037278110.png) + +(6)You can also access the component page through "Exchangis" in the top navigation bar to view all data exchange nodes and manage data exchange. + +![图片](/Images/quick/live-demo/640-1667665033853108.jpeg) + + + +### **3.2 Data development** + +Supports languages such as sql, python, pyspark, and shell for data development. Drag the node out directly, and then double-click to enter the node interface to write code. + +(1)We double click the "source_data" node in the DEMO; + +![图片](/Images/quick/live-demo/640-1667665030566106.png) + + + +(2)Enter the editing interface, write the corresponding script language, execute, you can get the relevant execution results; + +![图片](/Images/quick/live-demo/640-1667665027816104.png) + + + +### **3.3 Data quality** + +Data quality is verified using qualitis. + +(1)Click on the data quality node "qualitis_200" + +![图片](/Images/quick/live-demo/640-1667665025253102.png) + + + +(2)The data verification page is displayed, and the configured verification rule is displayed. + +![图片](/Images/quick/live-demo/640-1667665021038100.png) + + + +(3)Select a different verification template by clicking the Add rule in the figure above; + +![图片](/Images/quick/live-demo/640-166766501764598.png) + + + +(4)Access the data Quality admin desk directly by clicking on the top navigation menu "Qualitis". + +![图片](/Images/quick/live-demo/640-166766501543896.png) + + + +### **3.4 visualization** + +Use the visualis component for visual BI analysis. In the sandbox environment, there are **DEMO** complete examples can be referred to. + +(1)Select the item and click "Execute". Wait until all the execution succeeds. + +![图片](/Images/quick/live-demo/640-166766501239894.png) + + + +(2)Click the corresponding data visualization node to see the generated data chart. + +![图片](/Images/quick/live-demo/640-166766501000692.png) + +![图片](/Images/quick/live-demo/640-166766500771790.png) + + + + + +(3)You can go directly to the Visualization Console by clicking on the top navigation menu "Visualis", where you can see the components related to visualization. + +![图片](/Images/quick/live-demo/640-166766500170288.png) + +(4)For a more detailed look at visualization capabilities, check out the video tutorial Big Data Visualization Using DataSphere Studio(DSS) :https://www.bilibili.com/video/BV1xY4y1t7Ma + +![图片](/Images/quick/live-demo/640-166766499746286.png) + +### + +### **3.5 Signal node** + +Currently, three function nodes are supported: datachecker, eventsender, and eventreceiver. Common scenarios for signal nodes: + +1. You can use datachecker to check whether the data is complete before running a batch task. + +2. After the completion of a certain work, you need to notify other workflows to do the work, and use eventsender to send the notification; + +3. Use the eventreceiver to monitor signals. After receiving signals from the eventsender, the corresponding work task is executed. + +![图片](/Images/quick/live-demo/640-166766499277484.png) + + + +### **3.6 Function Nodes** + +connector and subFlow nodes are supported. + +(1)The connector node serves only as a connection node for a workflow and does not perform any functions. + +(2)A subFlow is a sub-workflow node that can be understood as a separate workflow. In complex workflow scenarios, subFlow nodes can be used to simplify the main workflow process. + +![图片](/Images/quick/live-demo/640-166766498331782.png) + + + +### **3.7 Data Output** + +支持通过邮件发送的方式 + +![图片](/Images/quick/live-demo/640-166766497457380.png) + +### + +### **3.8 Dispatching Center** + +(1) After we finish the workflow development and testing in the edit mode, we can click the "Publish" button to publish it directly to the dispatch center. + +![图片](/Images/quick/live-demo/640-166766496979878.png) + + + +(2) Click "Go to the Dispatch Center" or enter the management desk of the dispatch center through "Schedulis" at the top of the navigation. You can perform scheduling management and view workflow status in the scheduling center. + +![图片](/Images/quick/live-demo/640-166766445336610.png) + +## **4. Common mistakes** + +Currently, only a few features are available for community developers to experience in the sandbox environment. Using the sandbox environment can help developers quickly understand the WDS ecosystem. + +For security purposes, only the query, query, and execution functions are provided in the sandbox environment. For example, error messages such as "Only limited query operations are allowed in the sandbox environment", "No project is created in the sandbox environment", or "The background interface is abnormal. Please contact development. + +If you have any questions, please contact the assistant on wechat for feedback. + +![图片](/Images/quick/live-demo/640.jpeg) diff --git a/versioned_docs/version-1.4.0/tuning-and-troubleshooting/_category_.json b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/_category_.json new file mode 100644 index 00000000000..339dc653c8a --- /dev/null +++ b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Tuning And Troubleshooting", + "position": 11.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/tuning-and-troubleshooting/configuration.md b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/configuration.md new file mode 100644 index 00000000000..6a7cdecdc80 --- /dev/null +++ b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/configuration.md @@ -0,0 +1,341 @@ +--- +title: Configurations +sidebar_position: 1 +--- + +> A public configuration file linkis.properties is provided in the conf directory to avoid common configuration parameters needing to be configured in multiple microservices at the same time. This document will list the parameters by module. + +Please note: This article only gives all the configuration parameters of Linkis that affect the running performance or depend on the environment. Many configuration parameters that do not need to be cared about by the user have been omitted. If the user is interested, you can browse the source code to view it. + +## 1 General Configuration + +The general configuration can be set in the global `linkis.properties`. One setting can take effect for each microservice. + +### 1.1 Global Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.encoding | utf-8 | Linkis default encoding format | +| wds.linkis.date.pattern | yyyy-MM-dd'T'HH:mm:ssZ | default date format | +| wds.linkis.test.mode | false | Whether to enable debugging mode, if set to true, all microservices support password-free login, and all EngineConn open remote debugging ports | +| wds.linkis.test.user | none | When wds.linkis.test.mode=true, the default login user for password-free login | +| wds.linkis.home | /appcom/Install/LinkisInstall | Linkis installation directory, if it does not exist, it will automatically get the value of LINKIS_HOME | +| wds.linkis.httpclient.default.connect.timeOut | 50000 | Default connection timeout of Linkis HttpClient | + +### 1.2 LDAP Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.ldap.proxy.url | None | LDAP URL address | +| wds.linkis.ldap.proxy.baseDN | None | LDAP baseDN address | +| wds.linkis.ldap.proxy.userNameFormat | None | | + +### 1.3 Hadoop Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.hadoop.root.user | hadoop | HDFS super user | +| wds.linkis.filesystem.hdfs.root.path | None | User's HDFS default root path | +| wds.linkis.keytab.enable | false | whether to enable kerberos | +| wds.linkis.keytab.file | /appcom/keytab | kerberos keytab path, only valid when wds.linkis.keytab.enable=true | +| wds.linkis.keytab.host.enabled | false | | +| wds.linkis.keytab.host | 127.0.0.1 | | +| hadoop.config.dir | None | If not configured, it will be read from the environment variable HADOOP_CONF_DIR | +| wds.linkis.hadoop.external.conf.dir.prefix | /appcom/config/external-conf/hadoop | hadoop extra configuration | + +### 1.4 Linkis RPC Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.rpc.broadcast.thread.num | 10 | Number of Linkis RPC broadcast threads (**recommended to use the default value**) | +| wds.linkis.ms.rpc.sync.timeout | 60000 | The default processing timeout of Linkis RPC Receiver | +| wds.linkis.rpc.eureka.client.refresh.interval | 1s | Eureka client's microservice list refresh interval (**recommended to use the default value**) | +| wds.linkis.rpc.eureka.client.refresh.wait.time.max | 1m | Refresh maximum waiting time (**recommended to use the default value**) | +| wds.linkis.rpc.receiver.asyn.consumer.thread.max | 10 | Maximum number of threads for Receiver Consumer (**If there are many online users, it is recommended to increase this parameter**) | +| wds.linkis.rpc.receiver.asyn.consumer.freeTime.max | 2m | Receiver Consumer maximum idle time | +| wds.linkis.rpc.receiver.asyn.queue.size.max | 1000 | The maximum buffer size of the Receiver consumption queue (**If there are many online users, it is recommended to increase this parameter**) | +| wds.linkis.rpc.sender.asyn.consumer.thread.max", 5 | Maximum number of threads for Sender Consumer | +| wds.linkis.rpc.sender.asyn.consumer.freeTime.max | 2m | Sender Consumer maximum idle time | +| wds.linkis.rpc.sender.asyn.queue.size.max | 300 | Maximum buffer size of Sender consumption queue | + +## 2. Calculate Governance Configuration + +### 2.1 Entrance Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.spark.engine.version | 2.4.3 | When the user submits a script without specifying a version, the default Spark version used | +| wds.linkis.hive.engine.version | 1.2.1 | When the user submits a script without specifying a version, the default Hive version used | +| wds.linkis.python.engine.version | python2 | When the user submits a script without specifying a version, the default Python version used | +| wds.linkis.jdbc.engine.version | 4 | When the user submits a script without specifying a version, the default JDBC version used | +| wds.linkis.shell.engine.version | 1 | When the user submits a script without specifying a version, the default Shell version used | +| wds.linkis.appconn.engine.version | v1 | When the user submits a script without specifying a version, the default AppConn version used| +| wds.linkis.entrance.scheduler.maxParallelismUsers | 1000 | The maximum number of concurrent users supported by Entrance | +| wds.linkis.entrance.job.persist.wait.max | 5m | The maximum time that Entrance waits for JobHistory to persist a Job | +| wds.linkis.entrance.config.log.path | None | If not configured, the value of wds.linkis.filesystem.hdfs.root.path is used by default | +| wds.linkis.default.requestApplication.name | IDE | Default submission system when no submission system is specified | +| wds.linkis.default.runType | sql | default script type when no script type is specified | +| wds.linkis.warn.log.exclude | org.apache,hive.ql,hive.metastore,com.netflix,org.apache | Real-time WARN level logs not output to the client by default | +| wds.linkis.log.exclude | org.apache,hive.ql,hive.metastore,com.netflix,org.apache,com.webank | Real-time INFO-level logs that are not output to the client by default | +| wds.linkis.instance | 3 | The default number of concurrent jobs for each engine | +| wds.linkis.max.ask.executor.time | 5m | Maximum time to ask LinkisManager for available EngineConn | +| wds.linkis.hive.special.log.include | org.apache.hadoop.hive.ql.exec.Task | Which logs are not filtered by default when pushing Hive logs to the client | +| wds.linkis.spark.special.log.include | org.apache.linkis.engine.spark.utils.JobProgressUtil | Which logs are not filtered by default when pushing Spark logs to the client | +| wds.linkis.entrance.shell.danger.check.enabled | false | Whether to check and intercept Shell dangerous syntax | +| wds.linkis.shell.danger.usage | rm,sh,find,kill,python,for,source,hdfs,hadoop,spark-sql,spark-submit,pyspark,spark-shell,hive,yarn | Shell default Dangerous Grammar | +| wds.linkis.shell.white.usage | cd,ls | Shell whitelist syntax | +| wds.linkis.sql.default.limit | 5000 | SQL default maximum number of returned result set rows | + + +### 2.2 EngineConn Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.engineconn.resultSet.default.store.path | hdfs:///tmp | Job result set default storage path | +| wds.linkis.engine.resultSet.cache.max | 0k | When the size of the result set is lower than the specified value, the EngineConn will return to the Entrance directly without placing the disk | +| wds.linkis.engine.default.limit | 5000 | | +| wds.linkis.engine.lock.expire.time | 120000 | The maximum idle time of the engine lock, that is, after the Entrance applies for the lock, how long it will be released without submitting the code to EngineConn | +| wds.linkis.engineconn.ignore.words | org.apache.spark.deploy.yarn.Client | When Engine pushes logs to Entrance, the logs ignored by default | +| wds.linkis.engineconn.pass.words | org.apache.hadoop.hive.ql.exec.Task | When Engine pushes logs to Entrance, the default logs must be pushed | +| wds.linkis.engineconn.heartbeat.time | 3m | Default heartbeat interval from EngineConn to LinkisManager | +| wds.linkis.engineconn.max.free.time | 1h | Maximum idle time of EngineConn | + + +### 2.3 EngineConnManager Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.ecm.memory.max | 80g | ECM's maximum bootable EngineConn memory | +| wds.linkis.ecm.cores.max | 50 | ECM's maximum number of CPUs that can start EngineConn | +| wds.linkis.ecm.engineconn.instances.max | 50 | The maximum number of EngineConn that can be started, it is generally recommended to set the same as wds.linkis.ecm.cores.max | +| wds.linkis.ecm.protected.memory | 4g | The protected memory of ECM, that is, the memory used by ECM to start EngineConn cannot exceed wds.linkis.ecm.memory.max - wds.linkis.ecm.protected.memory | +| wds.linkis.ecm.protected.cores.max | 2 | The number of ECM protected CPUs, the meaning is the same as wds.linkis.ecm.protected.memory | +| wds.linkis.ecm.protected.engine.instances | 2 | Number of protected instances of ECM | +| wds.linkis.engineconn.wait.callback.pid | 3s | Waiting time for EngineConn to return pid | + +### 2.4 LinkisManager Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.manager.am.engine.start.max.time" | 10m | The maximum start time for LinkisManager to start a new EngineConn | +| wds.linkis.manager.am.engine.reuse.max.time | 5m | The maximum selection time for LinkisManager to reuse an existing EngineConn | +| wds.linkis.manager.am.engine.reuse.count.limit | 10 | The maximum number of polls for LinkisManager to reuse an existing EngineConn | +| wds.linkis.multi.user.engine.types | jdbc,es,presto | When LinkisManager reuses an existing EngineConn, which engine users are not used as reuse rules | +| wds.linkis.rm.instance | 10 | Default maximum number of instances per engine per user | +| wds.linkis.rm.yarnqueue.cores.max | 150 | The maximum number of cores used by each user in each engine queue | +| wds.linkis.rm.yarnqueue.memory.max | 450g | The maximum memory used by each user in each engine | +| wds.linkis.rm.yarnqueue.instance.max | 30 | The maximum number of applications launched by each user in the queue of each engine | + + +## 3. Engine Configuration + +### 3.1 JDBC Engine Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.jdbc.default.limit | 5000 | The default maximum number of returned result set rows | +| wds.linkis.jdbc.support.dbs | mysql=>com.mysql.jdbc.Driver,postgresql=>org.postgresql.Driver,oracle=>oracle.jdbc.driver.OracleDriver,hive2=>org.apache.hive .jdbc.HiveDriver,presto=>com.facebook.presto.jdbc.PrestoDriver | JDBC engine supported driver | +| wds.linkis.engineconn.jdbc.concurrent.limit | 100 | Maximum number of parallel SQL executions | + + +### 3.2 Python Engine Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| pythonVersion | /appcom/Install/anaconda3/bin/python | Python command path | +| python.path | None | Specifies an additional path for Python, which only accepts shared storage paths | + +### 3.3 Spark Engine Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.engine.spark.language-repl.init.time | 30s | Maximum initialization time for Scala and Python command interpreters | +| PYSPARK_DRIVER_PYTHON | python | Python command path | +| wds.linkis.server.spark-submit | spark-submit | spark-submit command path | + + +## 4. PublicEnhancements Configuration + +### 4.1 BML Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.bml.dws.version | v1 | Version number of Linkis Restful request | +| wds.linkis.bml.auth.token.key | Validation-Code | Password-free token-key for BML requests | +| wds.linkis.bml.auth.token.value | BML-AUTH | Password-free token-value for BML requests | +| wds.linkis.bml.hdfs.prefix | /tmp/linkis | Prefix file path where BML files are stored on hdfs | + +### 4.2 Metadata Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| hadoop.config.dir | /appcom/config/hadoop-config | If it does not exist, the value of the environment variable HADOOP_CONF_DIR will be used by default | +| hive.config.dir | /appcom/config/hive-config | If it does not exist, it will default to the value of the environment variable HIVE_CONF_DIR | +| hive.meta.url | None | The URL of the HiveMetaStore database. If hive.config.dir is not configured, the value must be configured | +| hive.meta.user | none | user of the HiveMetaStore database | +| hive.meta.password | none | password for the HiveMetaStore database | + + +### 4.3 JobHistory Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.jobhistory.admin | None | The default Admin account, which is used to specify which users can view everyone's execution history | + + +### 4.4 FileSystem Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.filesystem.root.path | file:///tmp/linkis/ | user's local Linux root directory | +| wds.linkis.filesystem.hdfs.root.path | hdfs:///tmp/ | user's HDFS root directory | +| wds.linkis.workspace.filesystem.hdfsuserrootpath.suffix | /linkis/ | The first-level prefix after the user's HDFS root directory. The actual root directory of the user is: ${hdfs.root.path}\${user}\${ hdfsuserrootpath.suffix} | +| wds.linkis.workspace.resultset.download.is.limit | true | When the client downloads the result set, whether to limit the number of downloads | +| wds.linkis.workspace.resultset.download.maxsize.csv | 5000 | When the result set is downloaded as a CSV file, the limited number of downloads | +| wds.linkis.workspace.resultset.download.maxsize.excel | 5000 | When the result set is downloaded as an Excel file, the limited number of downloads | +| wds.linkis.workspace.filesystem.get.timeout | 2000L | The maximum timeout for requests to the underlying filesystem. (**If the performance of your HDFS or Linux machine is low, it is recommended to increase the query number**) | + +### 4.5 UDF Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.udf.share.path | /mnt/bdap/udf | Shared UDF storage path, it is recommended to set it to HDFS path | + +## 5. MicroService Configuration + +### 5.1 Gateway Configuration + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.gateway.conf.enable.proxy.user | false | Whether to enable the proxy user mode, if enabled, the login user's request will be proxied to the proxy user for execution | +| wds.linkis.gateway.conf.proxy.user.config | proxy.properties | storage file for proxy rules | +| wds.linkis.gateway.conf.proxy.user.scan.interval | 600000 | Refresh interval for proxy files | +| wds.linkis.gateway.conf.enable.token.auth | false | Whether to enable the Token login mode, if enabled, access to Linkis in the form of token is allowed | +| wds.linkis.gateway.conf.token.auth.config | token.properties | Storage file for Token rules | +| wds.linkis.gateway.conf.token.auth.scan.interval | 600000 | Token file refresh interval | +| wds.linkis.gateway.conf.url.pass.auth | /dws/ | By default, no request for login verification | +| wds.linkis.gateway.conf.enable.sso | false | Whether to enable SSO user login mode | +| wds.linkis.gateway.conf.sso.interceptor | None | If the SSO login mode is enabled, the user needs to implement SSOInterceptor to jump to the SSO login page | +| wds.linkis.admin.user | hadoop | list of admin users | +| wds.linkis.login_encrypt.enable | false | When the user logs in, whether to enable RSA encrypted transmission | +| wds.linkis.enable.gateway.auth | false | Whether to enable the Gateway IP whitelist mechanism | +| wds.linkis.gateway.auth.file | auth.txt | IP whitelist storage file | + +## 6. Data Source and Metadata Service Configuration + +### 6.1 Metadata Service Configuration + +|Introduced Version| Parameter Name | Default Value | Description | +|-------| -------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------- | +|v1.1.0 | wds.linkis.server.mdm.service.lib.dir | /lib/linkis-public-enhancements/linkis-ps-metadatamanager/service | Set the relative path of the data source jar package that needs to be loaded, which will be reflected call | +|v1.1.0 | wds.linkis.server.mdm.service.instance.expire-in-seconds | 60 | Set the expiration time for loading sub-services, the service will not be loaded after this time | +|v1.1.0 | wds.linkis.server.dsm.app.name | linkis-ps-data-source-manager | Set the service for obtaining data source information | +|v1.1.0 | wds.linkis.server.mdm.service.kerberos.principle | hadoop/HOST@EXAMPLE.COM | set kerberos principle for linkis-metadata hive service | +|v1.1.0 | wds.linkis.server.mdm.service.user | hadoop | set the access user of hive service | +|v1.1.0 | wds.linkis.server.mdm.service.kerberos.krb5.path | "" | Set the kerberos krb5 path used by the hive service | +|v1.1.0 | wds.linkis.server.mdm.service.temp.location | classpath:/tmp | Set the temporary path of kafka and hive | +|v1.1.0 | wds.linkis.server.mdm.service.sql.driver | com.mysql.jdbc.Driver | Set the driver of mysql service | +|v1.1.0 | wds.linkis.server.mdm.service.sql.url | jdbc:mysql://%s:%s/%s | Set the url format of mysql service | +|v1.1.0 | wds.linkis.server.mdm.service.sql.connect.timeout | 3000 | Set the connection timeout for mysql service to connect to mysql service | +|v1.1.0 | wds.linkis.server.mdm.service.sql.socket.timeout | 6000 | Set the socket timeout time for the mysql service to open the mysql service | +|v1.1.0 | wds.linkis.server.mdm.service.temp.location | /tmp/keytab | Set the local temporary storage path of the service, mainly to store the authentication files downloaded from the bml material service| + +## 7. Common Scene Parameters + +### 7.1 Open Test Mode +The development process requires a password-free interface, which can be replaced or appended to `linkis.properties` + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.test.mode | false | Whether to enable debugging mode, if set to true, all microservices support password-free login, and all EngineConn open remote debugging ports | +| wds.linkis.test.user | hadoop | When wds.linkis.test.mode=true, the default login user for password-free login | + + +### 7.2 Login User Settings +Apache Linkis uses configuration files to manage admin users by default, and this configuration can be replaced or appended to `linkis-mg-gateway.properties`. For multi-user access LDAP implementation. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.admin.user | hadoop | admin username | +| wds.linkis.admin.password | 123456 | Admin user password | + +### 7.3 LDAP Settings +Apache Linkis can access LDAP through parameters to achieve multi-user management, and this configuration can be replaced or added in `linkis-mg-gateway.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.ldap.proxy.url | None | LDAP URL address | +| wds.linkis.ldap.proxy.baseDN | None | LDAP baseDN address | +| wds.linkis.ldap.proxy.userNameFormat | None | | + +### 7.4 Turn off Resource Checking +Apache Linkis sometimes debugs exceptions when submitting tasks, such as: insufficient resources; you can replace or append this configuration in `linkis-cg-linkismanager.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.manager.rm.request.enable | true | resource check | + +### 7.5 Turn on Engine Debugging +Apache Linkis EC can enable debugging mode, and this configuration can be replaced or added in `linkis-cg-linkismanager.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.engineconn.debug.enable | false | Whether to enable engine debugging | + +### 7.6 Hive Metadata Configuration +The public-service service of Apache Linkis needs to read hive metadata; this configuration can be replaced or appended in `linkis-ps-publicservice.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| hive.meta.url | None | The URL of the HiveMetaStore database. | +| hive.meta.user | none | user of the HiveMetaStore database | +| hive.meta.password | none | password for the HiveMetaStore database | + +### 7.7 Linkis Database Configuration +Apache Linkis access uses Mysql as data storage by default, you can replace or append this configuration in `linkis.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.server.mybatis.datasource.url | None | Database connection string, for example: jdbc:mysql://127.0.0.1:3306/dss?characterEncoding=UTF-8 | +| wds.linkis.server.mybatis.datasource.username | none | database user name, for example: root | +| wds.linkis.server.mybatis.datasource.password | None | Database password, for example: root | + +### 7.8 Linkis Session Cache Configuration +Apache Linkis supports using redis for session sharing; this configuration can be replaced or appended in `linkis.properties`. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| linkis.session.redis.cache.enabled | None | Whether to enable | +| linkis.session.redis.host | 127.0.0.1 | hostname | +| linkis.session.redis.port | 6379 | Port, eg | +| linkis.session.redis.password | None | password | + + + +### 7.9 Linkis Module Development Configuration +When developing Apache Linkis, you can use this parameter to customize the database, Rest interface, and entity objects of the loading module; you can modify it in `linkis-ps-publicservice.properties`, and use commas to separate multiple modules. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.server.restful.scan.packages | none | restful scan packages, for example: org.apache.linkis.basedatamanager.server.restful | +| wds.linkis.server.mybatis.mapperLocations | None | Mybatis mapper file path, for example: classpath*:org/apache/linkis/basedatamanager/server/dao/mapper/*.xml| +| wds.linkis.server.mybatis.typeAliasesPackage | None | Entity alias scanning package, for example: org.apache.linkis.basedatamanager.server.domain | +| wds.linkis.server.mybatis.BasePackage | None | Database dao layer scan, for example: org.apache.linkis.basedatamanager.server.dao | + +### 7.10 Linkis Module Development Configuration +This parameter can be used to customize the route of loading modules during Apache Linkis development; it can be modified in `linkis.properties`, and commas are used to separate multiple modules. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.gateway.conf.publicservice.list | cs,contextservice,data-source-manager,metadataQuery,metadatamanager,query,jobhistory,application,configuration,filesystem,udf,variable,microservice,errorcode,bml,datasource,basedata -manager | publicservice services support routing modules | + +### 7.11 Linkis File System And Material Storage Path +This parameter can be used to customize the route of loading modules during Apache Linkis development; it can be modified in `linkis.properties`, and commas are used to separate multiple modules. + +| parameter name | default value | description | +| ------------------------- | ------- | -----------------------------------------------------------| +| wds.linkis.filesystem.root.path | file:///tmp/linkis/ | Local user directory, a folder named after the user name needs to be created under this directory | +| wds.linkis.filesystem.hdfs.root.path | hdfs:///tmp/ | HDFS user directory | +| wds.linkis.bml.is.hdfs | true | Whether to enable hdfs | +| wds.linkis.bml.hdfs.prefix | /apps-data | hdfs path | +| wds.linkis.bml.local.prefix | /apps-data | local path | \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/_category_.json b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/_category_.json new file mode 100644 index 00000000000..47e82a271dc --- /dev/null +++ b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Error Guide", + "position": 4 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/error-code.md b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/error-code.md new file mode 100644 index 00000000000..87c95f5a611 --- /dev/null +++ b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/error-code.md @@ -0,0 +1,1445 @@ +--- +title: Error Code +sidebar_position: 1 +--- + +#### Error code 01001 + +**error description** + +An error occurs during task execution:error code : 01001,error msg : Your task is not routed to the background ECM,Please contact the administrator +>The em of labels + +**Reason 1** + +Your task is not routed to the background ECM + +**Solution 1** +1. Check whether the tenant label is correct + +2. If yes, contact the administrator +--------------------------------- +#### Error code 01002 + +**error description** + +An error occurs during task execution:error code : 01002,error msg : The Linkis service load is too high. Contact the administrator to expand the capacity +>Unexpected end of file from server + +**Reason 1** + +The linkis service load is too high, resulting in abnormal service connection + +**Solution 1** + +Please contact the administrator + +--------------------------------- + +#### Error code 01003 + +**error description** + +An error occurs during task execution:error code : 01003,error msg : The linkis service load is too high. Please contact the administrator for capacity expansion +>failed to ask linkis Manager Can be retried SocketTimeoutException + +**Reason 1** + +The link service load is too high, resulting in service connection timeout + +**Solution 1** + +Contact administrator + +--------------------------------- + +#### Error code 01004 + +**error description** + +An error occurs during task execution:error code : 01004,error msg : The engine is killed at startup,Please contact the administrator +>[0-9]+ Killed + +**Reason 1** + +The engine was killed at startup because the machine load was too high + +**Solution 1** +1. you can choose to retry +2. or contact the administrator + +--------------------------------- + +#### Error code 01005 + +**error description** + +An error occurs during task execution:error code : 01005,error msg : Request Yan to get the queue information and retry for 2 times still failed, please contact the administrator +>Failed to request external resourceClassCastException + +**Reason 1** + +Failed to request Yan to obtain queue information. This is caused by a configuration problem + +**Solution 1** + +Please contact the administrator + +--------------------------------- + +#### Error code 01101 + +**error description** + +An error occurs during task execution:error code : 01101,error msg : ECM resources are insufficient, please contact the administrator for capacity expansion +>ECM resources are insufficient + +**Reason 1** + +Due to insufficient server resources, possibly during peak hours + +**Solution 1** +1. you can retry the task +2. or contact the administrator +--------------------------------- + +#### Error code 01102 + +**error description** + +An error occurs during task execution:error code : 01102,error msg : ECM memory resources are insufficient. Please contact the administrator for capacity expansion +>ECM memory resources are insufficient + +**Reason 1** + +Insufficient server memory resources + +**Solution 1** +1. you can retry the task +2. or contact the administrator +--------------------------------- + +#### Error code 01103 + +**error description** + +An error occurs during task execution:error code : 01103,error msg : ECM CPU resources are insufficient. Please contact the administrator for capacity expansion +>ECM CPU resources are insufficient + +**Reason 1** + +Insufficient server CPU resources + +**Solution 1** +1. you can retry the task +2. or contact the administrator +--------------------------------- + +#### Error code 01104 + +**error description** + +An error occurs during task execution:error code : 01104,error msg : Instance resources are insufficient. Please contact the administrator for capacity expansion +>ECM Insufficient number of instances + +**Reason 1** + +Insufficient server instance resources + +**Solution 1** +1. you can retry the task +2. or contact the administrator +--------------------------------- + +#### Error code 01105 + +**error description** + +An error occurs during task execution:error code : 01105,error msg : The machine is out of memory. Please contact the administrator for capacity expansion +>Cannot allocate memory + +**Reason 1** + +Server machine out of memory + +**Solution 1** + +1. you can retry the task + +2. or contact the administrator +--------------------------------- + +#### Error code 12001 + +**error description** + +An error occurs during task execution:error code : 12001,error msg : The queue CPU resource is insufficient. You can adjust the number of spark actuators +>Queue CPU resources are insufficient + +**Reason 1** + +The queue CPU resource is insufficient, exceeding the limit you set + +**Solution 1** + +- Open the DSS platform and click management console -- parameter configuration -- ide -- spark -- display advanced settings -- Walker engine resource settings (2) -- adjust the number of concurrent executors [spark.executor.instances] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkSetting.png) + +- Or adjust the upper limit of queue resource usage on the management console -- parameter configuration -- global settings +--------------------------------- + +#### Error code 12002 + +**error description** + +An error occurs during task execution:error code : 12002,error msg : The queue memory resources are insufficient. You can adjust the number of spark actuators +>Insufficient queue memory + +**Reason 1** + +The queue memory resource is insufficient, which exceeds the queue memory resource value you set + +**Solution 1** +- Open the DSS platform and click management console -- parameter configuration -- ide -- spark -- display advanced settings -- Walker engine resource settings (2) -- adjust the number of concurrent executors [spark.executor.instances] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkSetting.png) + +- Or adjust the upper limit of queue resource usage on the management console - parameter configuration - global settings +--------------------------------- + +#### Error code 12003 + +**error description** + +An error occurs during task execution:error code : 12003,error msg : The number of queue instances exceeds the limit +>Insufficient number of queue instances + +**Reason 1** + +The number of queue instances exceeds the limit + +**Solution 1** + +- Open the DSS platform and click management console - parameter configuration - global settings - queue resources - maximum number of yarn queue instances [wds.links.rm.yarnqueue.instance.max] +- ![](/Images/tuning-and-troubleshooting/error-guide/queueInstanceMax.png) + +**Remarks** + + +Users are not recommended to modify the global settings at will. If necessary, please contact the operation and maintenance department before modifying. Non global setting parameters, which can be modified by the user + +--------------------------------- + +#### Error code 12004 + +**error description** + +An error occurs during task execution:error code : 12004,error msg : Global drive memory usage limit, lower drive memory can be set +>Drive memory resources are insufficient + +**Reason 1** + +Global drive memory exceeds maximum + +**Solution 1** +- Open the DSS platform and click management console - parameter configuration - global settings - queue resources - maximum number of yarn queue instances [wds.links.rm.yarnqueue.instance.max] +- ![](/Images/tuning-and-troubleshooting/error-guide/queueInstanceMax.png) + +**Solution 2** + +- If the queue is available and the number of application instances is too low, you can contact the administrator to set + +**Remarks** + + +Users are not recommended to modify the global settings at will. If necessary, please contact the operation and maintenance department before modifying. Non global setting parameters, which can be modified by the user + +--------------------------------- + +#### Error code 12005 + +**error description** + +An error occurs during task execution:error code : 12005,error msg : If the maximum number of global drive CPUs is exceeded, idle engines can be cleaned up +>Drive core resources are insufficient + +**Reason 1** + +The number of global drive CPUs exceeds the maximum + +**Solution 1** + +- Open the DSS platform and click management console - parameter configuration - global settings - queue resources - upper limit of queue CPU [wds.links.rm.yarnqueue.cores.max] +- ![](/Images/tuning-and-troubleshooting/error-guide/queueCodesMax.png) + +**Solution 2** + +- Clean up idle engines + +**Remarks** + + +Users are not recommended to modify the global settings at will. If necessary, please contact the operation and maintenance department before modifying. Non global setting parameters, which can be modified by the user + +--------------------------------- + +#### Error code 12006 + +**error description** + +An error occurs during task execution:error code : 12006,error msg : If the maximum number of concurrent engines is exceeded, idle engines can be cleaned up +>Insufficient number of instances + +**Reason 1** + +Maximum engine concurrency exceeded + +**Solution 1** + +- Modify the configuration and global configuration: open the DSS platform and click management console - parameter configuration - global settings - queue resources - global maximum concurrency of each engine [wds.links.rm.instance] +- ![](/Images/tuning-and-troubleshooting/error-guide/MaxInstance.png) +- spark engine +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMaxInstance.png) +- hive engine +- ![](/Images/tuning-and-troubleshooting/error-guide/hiveMaxInstance.png) +- python engine +- ![](/Images/tuning-and-troubleshooting/error-guide/pythonMaxInstance.png) +- pipeline engine +- ![](/Images/tuning-and-troubleshooting/error-guide/pipelineMaxInstance.png) + +**Remarks** + + +Users are not recommended to modify the global settings at will. If necessary, please contact the operation and maintenance department before modifying. Non global setting parameters, which can be modified by the user + +--------------------------------- + +#### Error code 12008 + +**error description** + +An error occurs during task execution:error code : 12008,error msg : Exception in getting the yarn queue information. It may be that the yarn queue you set does not exist +>获取Yarn队列信息异常 + +**Reason 1** + +Exception in getting Yan queue information + +**Solution 1** + +- If the cluster is normal and the user queue is configured incorrectly: +- Linkis management console / parameter configuration > global settings >yarn queue name [wds.linkis.rm.yarnqueue] +- ![](/Images/tuning-and-troubleshooting/error-guide/yarnQueue.png) + +**Solution 2** + +- If the cluster is a new cluster, first check the cluster configuration of linkismanager + >Hadoop cluster address: http://ip:8088/cluster + > + >yarn cluster address:http://ip:8888/cluster/scheduler +> +**Remarks** + + +Users are not recommended to modify the global settings at will. If necessary, please contact the operation and maintenance department before modifying. Non global setting parameters, which can be modified by the user + +--------------------------------- + +#### Error code 12009 + +**error description** + +An error occurs during task execution:error code : 12009,error msg : Session creation failed. The%s queue does not exist. Please check whether the queue settings are correct +>queue (\S+) is not exists in YARN + +**Reason 1** + +The queue does not exist. Please check whether the queue settings are correct + +**Solution 1** + +- The user contacts the administrator to confirm whether the queue is correct +- ![](/Images/tuning-and-troubleshooting/error-guide/yarnQueue.png) +--------------------------------- + +#### Error code 12010 + +**error description** + +An error occurs during task execution:error code : 12010,error msg : The cluster queue memory resources are insufficient. You can contact people in the group to release resources +>Insufficient cluster queue memory + +**Reason 1** + +Insufficient cluster queue memory resources + +**Solution 1** + +- Check whether the resource memory is full. The user contacts the personnel in the group to release the resource, or applies for queue expansion +- ![](/Images/tuning-and-troubleshooting/error-guide/queueRamResource.png) +--------------------------------- + +#### Error code 12011 + +**error description** + +An error occurs during task execution:error code : 12011,error msg : Cluster queue CPU resources are insufficient. You can contact people in the group to release resources +>Insufficient cluster queue cpu + +**Reason 1** + +Insufficient cluster queue CPU resources + +**Solution 1** + +- Check whether the resource CPU is full. The user contacts the personnel in the group to release the resource, or applies for queue expansion +- ![](/Images/tuning-and-troubleshooting/error-guide/queueCPUResource.png) +--------------------------------- + +#### Error code 12013 + +**error description** + +An error occurs during task execution:error code : 12013,error msg : Insufficient resources cause the engine to timeout. You can retry the task +>wait for DefaultEngineConn + +**Reason 1** + +Starting the engine timed out due to insufficient resources + +**Solution 1** + +The user retries the task. If it occurs repeatedly, please contact the administrator for troubleshooting + +--------------------------------- + +#### Error code 12014 + +**error description** + +An error occurs during task execution:error code : 12014,error msg : The request engine timed out, which may be caused by insufficient queue resources. Please try again +>wait for engineConn initial timeout + +**Reason 1** + +Request engine timed out + +**Solution 1** + +The user retries the task. If it occurs repeatedly, please contact the administrator for troubleshooting + +--------------------------------- + +#### Error code 13001 + +**error description** + +An error occurs during task execution:error code : 13001,error msg : Java process memory overflow, it is recommended to optimize the script content +>OutOfMemoryError + +**Reason 1** + +Java process memory overflow + +**Solution 1** + +- The user tries to increase the memory configuration of the Java management side. If it occurs repeatedly, please contact the administrator for troubleshooting +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idespark -- spark engine resource settings (2) -- spark engine memory [spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) + +--------------------------------- + +#### Error code 13002 + +**error description** + +An error occurs during task execution:error code : 13002,error msg : The use of resources is too large. Please tune SQL or increase resources + +>Container killed by YARN for exceeding memory limits + +**Reason 1** + +Use resources too large + +**Solution 1** + +- Increase the memory of the executor in the management console or in the task submission +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idspark -- worker resource settings (2) -- worker memory size [spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) +--------------------------------- + +#### Error code 13003 + +**error description** + +An error occurs during task execution:error code : 13003,error msg : The use of resources is too large. Please tune SQL or increase resources + +>read record exception + +**Reason 1** + +Use resources too large + +**Solution 1** + +- After confirming with the administrator, the user can increase the memory of the executor in the management console or in the task submission +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idspark -- worker resource settings (2) -- worker memory size [spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) +--------------------------------- + +#### Error code 13004 + +**error description** + +An error occurs during task execution:error code : 13004,error msg : The engine exited unexpectedly, which may be caused by excessive use of resources + +>failed because the engine quitted unexpectedly + +**Reason 1** + +Unexpected engine exit + +**Solution 1** + +Contact the administrator for troubleshooting + +--------------------------------- + +#### Error code 13005 + +**error description** + +An error occurs during task execution:error code : 13005,error msg : Spark app exit may be caused by complex tasks + +>Spark application has already stopped + +**Reason 1** + +Spark app exit may be caused by complex tasks + +**Solution 1** + +- The user tries to increase the memory configuration of the Java management side. If it occurs repeatedly, please contact the administrator for troubleshooting +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idespark -- spark engine resource settings (2) -- spark engine memory [spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) + +**Solution 2** + +- After confirming with the administrator, the user can increase the memory of the executor in the management console or in the task submission +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idspark -- worker resource settings (2) -- worker memory size [spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) + +--------------------------------- + +#### Error code 13006 + +**error description** + +An error occurs during task execution:error code : 13006,error msg : Spark context exits, which may be caused by complex tasks + +>Spark application has already stopped + +**Reason 1** + +Spark context exits, which may be caused by complex tasks + +**Solution 1** + +- The user tries to increase the memory configuration of the Java management side. If it occurs repeatedly, please contact the administrator for troubleshooting +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idespark -- spark engine resource settings (2) -- spark engine memory [spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) + +**Solution 2** + +- After confirming with the administrator, the user can increase the memory of the executor in the management console or in the task submission +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idspark -- worker resource settings (2) -- worker memory size [spark.executor.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkExecutorMemory.png) +--------------------------------- + +#### Error code 13007 + +**error description** + +An error occurs during task execution:error code : 13007,error msg : Pyspark child process exited unexpectedly, which may be caused by complex tasks + +>Pyspark process has stopped + +**Reason 1** + +Pyspark child process exited unexpectedly, which may be caused by complex tasks + +**Solution 1** + +- The user tries to increase the memory configuration of the Java management side. If it occurs repeatedly, please contact the administrator for troubleshooting +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idespark -- spark engine resource settings (2) -- spark engine memory [spark.driver.memory] +- ![](/Images/tuning-and-troubleshooting/error-guide/sparkMemory.png) +--------------------------------- + +#### Error code 21001 + +**error description** + +An error occurs during task execution:error code : 21001,error msg : Session creation failed, user%s cannot submit application to queue:%s, please contact the person who provided the queue to you + +>User (\S+) cannot submit applications to queue (\S+) + +**Reason 1** + +Session creation failed, user%s cannot submit application to queue + +**Solution 1** + +The user queue does not have permission. Please check whether the queue configuration is wrong or apply for queue permission + +--------------------------------- + +#### Error code 21002 + +**error description** + +An error occurs during task execution:error code : 21002,error msg : Failed to create Python interpreter, please contact the administrator + +>initialize python executor failed + +**Reason 1** + +Failed to create Python interpreter, please contact the administrator + +**Solution 1** + +Contact the operation and maintenance personnel for troubleshooting + +--------------------------------- + +#### Error code 21003 + +**error description** + +An error occurs during task execution:error code : 21003,error msg : Failed to create stand-alone Python interpreter, please contact the administrator + +>PythonSession process cannot be initialized + +**Reason 1** + +Failed to create Python interpreter, please contact the administrator + +**Solution 1** + +Contact the operation and maintenance personnel for troubleshooting + +--------------------------------- + +#### Error code 22001 + +**error description** + +An error occurs during task execution:error code : 22001,error msg : %S has no permission to access. Please apply for permission to open the data table. Please contact your data management personnel + +>Permission denied:\s*user=[a-zA-Z0-9_]+,\s*access=[A-Z]+\s*,\s*inode="([a-zA-Z0-9/_\.]+) + +**Reason 1** + +Unauthorized access + +**Solution 1** + +- Database table permission needs to be applied to +--------------------------------- + +#### Error code 22003 + +**error description** + +An error occurs during task execution:error code : 22003,error msg : The checked database table has no permission + +>Authorization failed:No privilege + +**Reason 1** + +Unauthorized access + +**Solution 1** + +- Database table permission needs to be applied to + +--------------------------------- + +#### Error code 22004 + +**error description** + +An error occurs during task execution:error code : 22004,error msg : The user%s does not exist on the machine. Please confirm whether you have applied for relevant permissions + +>user (\S+) does not exist + +**Reason 1** + +Unauthorized access + +**Solution 1** + + +- User bill of lading application authority +--------------------------------- + +#### Error code 22005 + +**error description** + +An error occurs during task execution:error code : 22005,error msg : The user does not exist on the machine. Please confirm whether you have applied for relevant permissions + +>engineConnExec.sh: Permission denied + +**Reason 1** + +Unauthorized access + +**Solution 1** + +- User bill of lading application authority +--------------------------------- + +#### Error code 22006 + +**error description** + +An error occurs during task execution:error code : 22006,error msg : The user does not exist on the machine. Please confirm whether you have applied for relevant permissions + +>at com.sun.security.auth.UnixPrincipal + +**Reason 1** + +Unauthorized access + +**Solution 1** + + +- User bill of lading application authority +--------------------------------- + +#### Error code 22007 + +**error description** + +An error occurs during task execution:error code : 22007,error msg : The user does not exist on the machine. Please confirm whether you have applied for relevant permissions + +>LoginException: java.lang.NullPointerException: invalid null input: name + +**Reason 1** + +Unauthorized access + +**Solution 1** + + +- User bill of lading application authority +--------------------------------- + +#### Error code 22008 + +**error description** + +An error occurs during task execution:error code : 22008,error msg : The user does not exist on the machine. Please confirm whether you have applied for relevant permissions + +>User not known to the underlying authentication module + +**Reason 1** + +Unauthorized access + +**Solution 1** + + +- User bill of lading application authority +--------------------------------- + +#### Error code 30001 + +**error description** + +An error occurs during task execution:error code : 30001,error msg : Library exceeds limit + +>is exceeded + +**Reason 1** + +Library exceeds limit + +**Solution 1** + +Users clean up data by themselves + +**Solution 2** + +Apply for database expansion + +--------------------------------- + +#### Error code 31001 + +**error description** + +An error occurs during task execution:error code : 31001,error msg : User active kill task + +>is killed by user + +**Reason 1** + +User active kill task + +**Solution 1** + +- If it is confirmed that the user has not actively killed, please contact the operation and maintenance personnel for troubleshooting +--------------------------------- + +#### Error code 31002 + +**error description** + +An error occurs during task execution:error code : 31002,error msg : The enginetypelabel you submitted does not have a corresponding engine version + +>EngineConnPluginNotFoundException + +**Reason 1** + +Enginetypelabel has no corresponding engine version + +**Solution 1** + +- The user checks whether the enginetypelabel passed is correct. If it is correct, please contact the operation and maintenance personnel for troubleshooting +- Inspection method of the operation and maintenance personnel: the lib/links-engineconn-plugins/ on the linkis ECP node is the local cache of all available engine plug-ins. This is not possible because the corresponding version of the engine is not available, or there are other abnormal format files in the engine file, such as Bak, you shouldn't have put zip. Zip, etc +--------------------------------- + +#### Error code 41001 + +**error description** + +An error occurs during task execution:error code : 41001,error msg : The database%s does not exist. Please check whether the referenced database is correct + +>Database '([a-zA-Z_0-9]+)' not found + +**Reason 1** + +Database %s does not exist + +**Solution 1** + +- User checks whether the database exists and permissions +- >show databases + +--------------------------------- + +#### Error code 41001 + +**error description** + +An error occurs during task execution:error code : 41001,error msg : The database%s does not exist. Please check whether the referenced database is correct + +>Database does not exist: ([a-zA-Z_0-9]+) + +**Reason 1** + +Database %s does not exist + +**Solution 1** + +- User checks whether the database exists and permissions +- >show databases + +--------------------------------- + +#### Error code 41003 + +**error description** + +An error occurs during task execution:error code : 41003,error msg : The field%s does not exist. Please check whether the referenced field is correct + +>cannot resolve '`(.+)`' given input columns + +**Reason 1** + +Field %s does not exist + +**Solution 1** + +- User checks whether the field exists +>desc tabl_name +--------------------------------- + +#### Error code 41003 + +**error description** + +An error occurs during task execution:error code : 41003,error msg : The field%s does not exist. Please check whether the referenced field is correct + +>Column '(.+)' cannot be resolved + +**Reason 1** + +Field %s does not exist + +**Solution 1** + +- User checks whether the field exists +>desc tabl_name +--------------------------------- + +#### Error code 41003 + +**error description** + +An error occurs during task execution:error code : 41003,error msg : The field%s does not exist. Please check whether the referenced field is correct + +> Invalid table alias or column reference '(.+)': + +**Reason 1** + +Field %s does not exist + +**Solution 1** + +- User checks whether the field exists +>desc tabl_name +--------------------------------- + +#### Error code 41004 + +**error description** + +An error occurs during task execution:error code : 41004,error msg : Partition field%s does not exist. Please check whether the referenced table is a partition table or the partition field is incorrect + +>Partition spec \{(\S+)\} contains non-partition columns + +**Reason 1** + +Partition field %s does not exist + +**Solution 1** + +- The user checks whether the partition field is filled in correctly + +--------------------------------- + +#### Error code 41004 + +**error description** + +An error occurs during task execution:error code : 41004,error msg : Partition field%s does not exist. Please check whether the referenced table is a partition table or the partition field is incorrect + +>table is not partitioned but partition spec exists:\{(.+)\} + +**Reason 1** + +Partition field %s does not exist + +**Solution 1** + +- The user checks whether the partition field is filled in correctly + +--------------------------------- + +#### Error code 41004 + +**error description** + +An error occurs during task execution:error code : 41004,error msg : The path corresponding to the table does not exist. Please contact your data manager + +>Path does not exist: viewfs + +**Reason 1** + +Partition path does not exist + +**Solution 1** + +- Please try refresh table XXX, or the kill engine runs again, but there are still exceptions. Please contact the data management personnel for troubleshooting + +--------------------------------- + +#### Error code 41004 + +**error description** + +An error occurs during task execution:error code : 41004,error msg : Field%s does not exist, please check whether the referenced table%s is a partition table or the partition field is incorrect + +>([a-zA-Z_0-9]+) is not a valid partition column in table ([`\.a-zA-Z_0-9]+) + +**Reason 1** + +Field %s does not exist + +**Solution 1** + +- The user checks whether the partition field is filled in correctly + +--------------------------------- + +#### Error code 41005 + +**error description** + +An error occurs during task execution:error code : 41005,error msg : File %s does not exist + +>Caused by:\s*java.io.FileNotFoundException + +**Reason 1** + +File %s does not exist + +**Solution 1** + +- Please try refresh table XXX, or the kill engine runs again, but there are still exceptions. Please contact the data management personnel for troubleshooting + + +--------------------------------- + +#### Error code 42003 + +**error description** + +An error occurs during task execution:error code : 42003,error msg : Unknown function%s, please check whether the function referenced in the code is correct + +>Undefined function: '(\S+)' + +**Reason 1** + +Error in referenced function + +**Solution 1** + +- If it is a UDF, please check the function. If it is a public function, please contact the operation and maintenance personnel for troubleshooting +- udf address![](/Images/tuning-and-troubleshooting/error-guide/udf.png) + +--------------------------------- + +#### Error code 42003 + +**error description** + +An error occurs during task execution:error code : 42003,error msg : Unknown function%s, please check whether the function referenced in the code is correct + +>Invalid function '(\S+)' + +**Reason 1** + +Error in referenced function + +**Solution 1** + +- If it is a UDF, please check the function. If it is a public function, please contact the operation and maintenance personnel for troubleshooting +- udf address![](/Images/tuning-and-troubleshooting/error-guide/udf.png) + +--------------------------------- + +#### Error code 42004 + +**error description** + +An error occurs during task execution:error code : 42004,error msg : There is a name conflict in the field%s, please check whether there is a field with the same name in the sub query + +>Ambiguous column Reference '(\S+)' in subquery + +**Reason 1** + +Name conflict in field %s + +**Solution 1** + +- User checks whether there is a duplicate name field + +--------------------------------- + +#### Error code 42004 + +**error description** + +An error occurs during task execution:error code : 42004,error msg : There is a name conflict in the field%s, please check whether there is a field with the same name in the sub query + +>Reference '(\S+)' is ambiguous + +**Reason 1** + +Name conflict in field %s + +**Solution 1** + +- User checks whether there is a duplicate name field + +--------------------------------- + +#### Error code 42005 + +**error description** + +An error occurs during task execution:error code : 42005,error msg : The field%s must specify a table or subquery alias. Please check the source of the field + +>Column '(\S+)' Found in more than One Tables/Subqueries + +**Reason 1** + +Field does not specify a table + +**Solution 1** + +- User added field source + +--------------------------------- + +#### Error code 42006 + +**error description** + +An error occurs during task execution:error code : 42006,error msg : The table%s already exists in the database. Please delete the corresponding table and try again + +>Table already exists + +**Reason 1** + +Table %s already exists in the database + +**Solution 1** + +- The user needs to clean up the table and try again + +--------------------------------- + +#### Error code 42006 + +**error description** + +An error occurs during task execution:error code : 42006,error msg : Table %s already exists in the database,Please delete the corresponding table and try again + +>AnalysisException: (S+) already exists + +**Reason 1** + +Table %s already exists in the database + +**Solution 1** + +- The user needs to clean up the table and try again + +--------------------------------- + +#### Error code 42006 + +**error description** + +An error occurs during task execution:error code : 42006,error msg : Table %s already exists in the database,Please delete the corresponding table and try again + +>Table (\S+) already exists + +**Reason 1** + +Table %s already exists in the database + +**Solution 1** + +- The user needs to clean up the table and try again + + +--------------------------------- + +#### Error code 42006 + +**error description** + +An error occurs during task execution:error code : 42006,error msg : Table %s already exists in the database,Please delete the corresponding table and try again + +>Table or view '(\S+)' already exists in database '(\S+)' + +**Reason 1** + +Table %s already exists in the database + +**Solution 1** + +- The user needs to clean up the table and try again + + +--------------------------------- + +#### Error code 42007 + +**error description** + +An error occurs during task execution:error code : 42007,error msg : The number of fields in the inserted target table does not match, please check the code! + +>requires that the data to be inserted have the same number of columns as the target table + +**Reason 1** + +Insert target table field quantity mismatch + +**Solution 1** + +- User check code + + +--------------------------------- + +#### Error code 42008 + +**error description** + +An error occurs during task execution:error code : 42008,error msg : Data type does not match, please check the code! + +>due to data type mismatch: differing types in + +**Reason 1** + +data type mismatch + +**Solution 1** + +- User check code + + +--------------------------------- + +#### Error code 42009 + +**error description** + +An error occurs during task execution:error code : 42009,error msg : The reference of field%s is incorrect. Please check whether the field exists! + +>Invalid column reference (S+) + +**Reason 1** + +Incorrect reference to field %s + +**Solution 1** + +- User checks whether the field exists + + +--------------------------------- + +#### Error code 42010 + +**error description** + +An error occurs during task execution:error code : 42010,error msg : Failed to extract data for field %s + +>Can't extract value from (S+): need + +**Reason 1** + +Failed to extract data for field %s + +**Solution 1** + +- Check whether the selected field is incorrect + + +--------------------------------- + +#### Error code 42012 + +**error description** + +An error occurs during task execution:error code : 42012,error msg : Group by position 2 is not in the select list, please check the code! + +>GROUP BY position (S+) is not in select list + +**Reason 1** + +The field of group by is not in the select list + +**Solution 1** + +- User check code + + +--------------------------------- + +#### Error code 42014 + +**error description** + +An error occurs during task execution:error code : 42014,error msg : Insert data does not specify target table field%s, please check the code! + +>Cannot insert into target table because column number/types are different '(S+)' + +**Reason 1** + +The inserted data does not correspond to the fields of the target table + +**Solution 1** + +- User check code + + +--------------------------------- + +#### Error code 42016 + +**error description** + +An error occurs during task execution:error code : 42016,error msg : UDF function does not specify a parameter, please check the code! + +>UDFArgumentException Argument expected + +**Reason 1** + +UDF function does not specify full parameters + +**Solution 1** + +- User check code + + +--------------------------------- + +#### Error code 42017 + +**error description** + +An error occurs during task execution:error code : 42017,error msg : Aggregate function%s cannot be written in group by, please check the code! + +>aggregate functions are not allowed in GROUP BY + +**Reason 1** + +Aggregate function%s cannot be written in group by, please check the code! + +**Solution 1** + +- User check code + + +--------------------------------- + +#### Error code 43007 + +**error description** + +An error occurs during task execution:error code : 43007,error msg : Pyspark execution failed, possibly due to syntax error or stage failure + +>Py4JJavaError: An error occurred + +**Reason 1** + +Syntax error or stage failure + +**Solution 1** + +- If it is a syntax error, you need to check the code for modification +- If the stage fails, you can choose to retry + + +--------------------------------- + +#### Error code 43011 + +**error description** + +An error occurs during task execution:error code : 43011,error msg : Export excel table exceeds the maximum limit of 1048575 + +>Invalid row number + +**Reason 1** + +Data volume exceeds the limit of a single sheet + +**Solution 1** + +- Reduce the amount of data to export, or export to CSV format + + +--------------------------------- + +#### Error code 43040 + +**error description** + +An error occurs during task execution:error code : 43040,error msg : Presto query must specify data source and Library Information + +>Schema must be specified when session schema is not set + +**Reason 1** + +Data source configuration error + +**Solution 1** + +- Check management console Presto data source configuration +- Modify the configuration, open the DSS platform, and click management console -- parameter configuration -- ide -- idepresto -- data source configuration +- ![](/Images/tuning-and-troubleshooting/error-guide/presto.png) + + +--------------------------------- + +#### Error code 46001 + +**error description** + +An error occurs during task execution:error code : 46001,error msg : Import file address not found:%s + +>java.io.FileNotFoundException: (\S+) \(No such file or directory\) + +**Reason 1** + +file does not exist + +**Solution 1** + +- Please check the workspace, or check whether the files in the HDFS directory exist +- ![](/Images/tuning-and-troubleshooting/error-guide/hdfs.png) + + +--------------------------------- + +#### Error code 46002 + +**error description** + +An error occurs during task execution:error code : 46002,error msg : Exception of temporary file directory permission when exporting to excel + +>java.io.IOException: Permission denied(.+) at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet + +**Reason 1** + +Abnormal file directory or insufficient file read / write permission + +**Solution 1** + +- Please confirm that the file has read-write permission. If there is any abnormality, please contact the operation and maintenance personnel for handling + + +--------------------------------- + +#### Error code 46003 + +**error description** + +An error occurs during task execution:error code : 46003,error msg : Unable to create directory while exporting file:%s + +>java.io.IOException: Mkdirs failed to create (\S+) (.+) + +**Reason 1** + +Unable to create directory + +**Solution 1** + +- Contact the operation and maintenance personnel for troubleshooting + + +--------------------------------- + +#### Error code 46004 + +**error description** + +An error occurs during task execution:error code : 46004,error msg : Error importing module. The system does not have a%s module. Please contact the operation and maintenance personnel to install it + +>ImportError: No module named (S+) + +**Reason 1** + +The system does not have a %s module + +**Solution 1** + +- Contact the operation and maintenance personnel for troubleshooting diff --git a/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/interface.md b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/interface.md new file mode 100644 index 00000000000..576af85dec3 --- /dev/null +++ b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/error-guide/interface.md @@ -0,0 +1,133 @@ +--- +title: Interface Error Troubleshooting +sidebar_position: 3 +--- + +How to quickly locate interfaces and query logs for interface errors + +## How to locate + +### 1.Front end F12 interface error +**Error information troubleshooting** +![](/Images/tuning-and-troubleshooting/error-guide/errorMsg.png) +If an error message is found, press f12--network-- filter the request information fetch/xhr-- check the single request --priview-- locate the error reporting request + +**Find URL** +![](/Images/tuning-and-troubleshooting/error-guide/findUrl.png) +Click the headers of a single request, and you will see general. Here you will see the request address: +>Request URL :XXXXX /api/rest_j/v1/data-source-manager/op/connect/json + +### 2. App name found +When an interface request reports an error, the URL specification locates the application name. +The linkis interface URL follows the design specification: +>/api/rest_j/v1/{applicationName}/. + +ApplicationName is the application name. Find the microservice to which you belong through the application name, and view the log under the corresponding microservice. + +#### Correspondence between application name and microservice + +|ApplicationName|Microservice| +|:----:|:----:| +|linkismanager|cg-linkismanager| +|engineplugin|cg-engineplugin| +|cg-engineconnmanager|cg-engineconnmanager| +|entrance|cg-entrance| +|bml|ps-bml| +|contextservice|ps-cs| +|datasource|ps-datasource| +|configuration|| +|microservice|| +|jobhistory|ps-publicservice| +|variable|| +|udf|| + + +### 3. Find log path +The user service address is different. We need to locate the log address first +> ps -ef | grep ps-datasource + +![](/Images/tuning-and-troubleshooting/error-guide/logs.png) + +- cg-linkismanager: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-linkismanager-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-linkismanager.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-linkismanager.out` + +- cg-engineplugin: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineplugin-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineplugin.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineplugin.out` + +- cg-engineconnmanager: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineconnmanager-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineconnmanager.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-engineconnmanager.out` + +- cg-entrance: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-entrance-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-entrance.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-cg-entrance.out` + +- ps-bml: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-bml-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-bml.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-bml.out` + +- ps-cs: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-cs-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-cs.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-cs.out` + +- ps-datasource: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-datasource-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-datasource.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-datasource.out` + +- ps-publicservice: +>GC log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-publicservice-gc.log` +> +>Service log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-publicservice.log` +> +>System out log:` /${LINKIS_HOME}/logs/linkis/linkis-ps-publicservice.out` + +### 4. view log +Display the error message corresponding to the interface + +Find the request log, in which other services called by the service are displayed, or the logical logs processed in their own services are displayed +>tail -fn200 linkis-ps-data-source-manager.log + +![](/Images/tuning-and-troubleshooting/error-guide/datasourcemanager.png) + +**The above figure shows the logs of service calling other services. You can query the logs of other services based on this information** + +**The following figure shows the service logs that actually report errors** + +>tail -fn200 linkis-ps-metadataquery.log + +![](/Images/tuning-and-troubleshooting/error-guide/errorMsgFromMeta.png) + +Front end error reporting display + +![](/Images/tuning-and-troubleshooting/error-guide/errorMsg.png) + + +### 5.Exception location +`ECMResourceClear failed, ecm current resource:bdpuje +s110003:9102{"instance":0,"memory":"0.0 B","cpu":0} org.apache.linkis.manager.exception.PersistenceErrorException: errCode: 210001 ,desc: label not found, this label may be removed a +lready. , ip: localhost110003 ,port: 9101 ,serviceKind: linkis-cg-linkismanager` + +Where IP and port are the corresponding service addresses, and servicekind is the corresponding service name. If the RPC call log fails, you can use this information to find the corresponding service \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/tuning-and-troubleshooting/overview.md b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/overview.md new file mode 100644 index 00000000000..d14e4026759 --- /dev/null +++ b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/overview.md @@ -0,0 +1,100 @@ +--- +title: Overview +sidebar_position: 0 +--- + +## Tuning and troubleshooting + +In the process of preparing for the release of a version, we will try our best to find deployment and installation problems in advance and then repair them. Because everyone has some differences in the deployment environments, we sometimes have no way to predict all the problems and solutions in advance. However, due to the existence of the community, many of your problems will overlap. Perhaps the installation and deployment problems you have encountered have already been discovered and solved by users. Therefore, for some problems that cannot be accurately located by themselves, the basic idea and priority of the recommended troubleshooting steps can be: **Search keywords in the community issue catalog —\>Check the "Q\&A Problem Summary" document in the community—\>Locate system log—\>Community user group consultation and communication—\>Locate source code and do remote debug** + +### Ⅰ. How to locate the exception log + +If an interface request reports an error, we can locate the problematic microservice based on the return of the interface. Under normal circumstances, we can **locate according to the URL specification. **URLs in the Linkis interface follow certain design specifications. That is, the format of **/api/rest_j/v1/{applicationName}/.+**, the application name can be located through applicationName. Some applications themselves are microservices. At this time, the application name is the same as the microservice name, and part of the application itself is a microservice, at this time, you should find the belonging microservice by the application name, and check the log under the corresponding microservice. The corresponding relationship between the microservice and the application name is given below. + +| **ApplicationName** | **Microservice** | +| -------------------- | -------------------- | +| cg-linkismanager | cg-linkismanager | +| cg-engineplugin | cg-engineplugin | +| cg-engineconnmanager | cg-engineconnmanager | +| cg-entrance | cg-entrance | +| ps-bml | ps-bml | +| ps-cs | ps-cs | +| ps-datasource | ps-datasource | +| configuration | | +| instance-label | | +| jobhistory | ps-publicservice | +| variable | | +| udf | | + +### Ⅱ. community issue column search keywords + +On the homepage of the github community, the issue column retains some of the problems and solutions encountered by community users, which is very suitable for quickly finding solutions after encountering problems, just search for keywords that report errors in the filter filter. + +### Ⅲ. "Q\&A Question Summary" + +[FAQ](/faq/main), this document contains a summary of common problems and solutions during the installation and deployment process. + +### Ⅳ. Locating system log + +Generally, errors can be divided into three stages: an error is reported when installing and executing install.sh, an error is reported when the microservice is started, and an error is reported when the engine is started. + +1. **An error occurred when executing install.sh**, usually in the following situations + + 1. Missing environment variables: For example, the environment of java/python/Hadoop/hive/spark needs to be configured under the standard version, and the corresponding verification operation will be performed when the script is installed. If you encounter this kind of problem, there will be a lot of problems. Clear prompts for missing environment variables, such as exception -bash + spark-submit: command not found, etc. + + 2. The system version does not match: Linkis currently supports most versions of Linux. + The compatibility of the os version is the best, and some system versions may have command incompatibility. For example, the poor compatibility of yum in ubantu may cause yum-related errors in the installation and deployment. In addition, it is also recommended not to use windows as much as possible. Deploying linkis, currently no script is fully compatible with the .bat command. + + 3. Missing configuration item: There are two configuration files that need to be modified in linkis1.0 version, linkis-env.sh and db.sh + + The former contains the environment parameters that linkis needs to load during execution, and the latter is the database information that linkis itself needs to store related tables. Under normal circumstances, if the corresponding configuration is missing, the error message will show an exception related to the Key value. For example, when db.sh does not fill in the relevant database configuration, unknow will appear mysql server host ‘-P’ is abnormal, which is caused by missing host. + +2. **Report error when starting microservice** + + Linkis puts the log files of all microservices into the logs directory. The log directory levels are as follows: + + ```` + ├── linkis-computation-governance + │ ├── linkis-cg-engineconnmanager + │ ├── linkis-cg-engineplugin + │ ├── linkis-cg-entrance + │ └── linkis-cg-linkismanager + ├── linkis-public-enhancements + │ └── linkis-ps-publicservice + └── linkis-spring-cloud-services + │ ├── linkis-mg-eureka + └─├── linkis-mg-gateway + ```` + + It includes three microservice modules: computing governance, public enhancement, and microservice management. Each microservice contains three logs, linkis-gc.log, linkis.log, and linkis.out, corresponding to the service's GC log, service log, and service System.out log. + + Under normal circumstances, when an error occurs when starting a microservice, you can cd to the corresponding service in the log directory to view the related log to troubleshoot the problem. Generally, the most frequently occurring problems can also be divided into three categories: + + 1. **Port Occupation**: Since the default port of Linkis microservices is mostly concentrated at 9000, it is necessary to check whether the port of each microservice is occupied by other microservices before starting. If it is occupied, you need to change conf/ The microservice port corresponding to the linkis-env.sh file + + 2. **Necessary configuration parameters are missing**: For some microservices, certain user-defined parameters must be loaded before they can be started normally. For example, the linkis-cg-engineplugin microservice will load conf/ when it starts. For the configuration related to wds.linkis.engineconn.\* in linkis.properties, if the user changes the Linkis path after installation, if the configuration does not correspond to the modification, an error will be reported when the linkis-cg-engineplugin microservice is started. + + 3. **System environment is not compatible**: It is recommended that users refer to the recommended system and application versions in the official documents as much as possible when deploying and installing, and install necessary system plug-ins, such as expect, yum, etc. If the application version is not compatible, It may cause errors related to the application. For example, the incompatibility of SQL statements in the mysql5.7 version may cause errors in the linkis.ddl and linkis.dml files when initializing the db during the installation process. You need to refer to the "Q\&A Problem Summary" or the deployment documentation to make the corresponding settings. + +3. **Report error during microservice execution period** + + The situation of error reporting during the execution of microservices is more complicated, and the situations encountered are also different depending on the environment, but the troubleshooting methods are basically the same. Starting from the corresponding microservice error catalog, we can roughly divide it into three situations: + + 1. **Manually installed and deployed microservices report errors**: The logs of this type of microservice are unified under the log/ directory. After locating the microservice, enter the corresponding directory to view it. + + 2. **engine start failure**: insufficient resources, request engine failure: When this type of error occurs, it is not necessarily due to insufficient resources, because the front end will only grab the logs after the Spring project is started, for errors before the engine is started cannot be fetched well. There are three kinds of high-frequency problems found in the actual use process of internal test users: + + a. **The engine cannot be created because there is no engine directory permission**: The log will be printed to the linkis.out file under the cg-engineconnmanager microservice. You need to enter the file to view the specific reason. + + b. **There is a dependency conflict in the engine lib package**, **The server cannot start normally because of insufficient memory resources: **Since the engine directory has been created, the log will be printed to the stdout file under the engine, and the engine path can refer to c + + c. **Errors reported during engine execution**: Each started engine is a microservice that is dynamically loaded and started during runtime. When the engine is started, if an error occurs, you need to find the corresponding log of the engine in the corresponding startup user directory. The corresponding root path is **ENGINECONN_ROOT_PATH** filled in **linkis-env** before installation. If you need to modify the path after installation, you need to modify wds.linkis.engineconn.root.dir in linkis.properties. + +### Ⅴ. Community user group consultation and communication + +For problems that cannot be resolved according to the above process positioning during the installation and deployment process, you can send error messages in our community group. In order to facilitate community partners and developers to help solve them and improve efficiency, it is recommended that when you ask questions, You can describe the problem phenomenon, related log information, and the places that have been checked are sent out together. If you think it may be an environmental problem, you need to list the corresponding application version together**. We provide two online groups: WeChat group and QQ group. The communication channels and specific contact information can be found at the bottom of the Linkis github homepage. + +### Ⅵ. locate the source code by remote debug + +Under normal circumstances, remote debugging of source code is the most effective way to locate problems, but compared to document review, users need to have a certain understanding of the source code structure. It is recommended that you check the [Linkis source code level detailed structure](../development/directory-structure.md) in the Linkis WIKI before remote debugging.After having a certain degree of familiarity to the the source code structure of the project, after a certain degree of familiarity, you can refer to [How to Debug Linkis](development/debug.md). \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/tuning-and-troubleshooting/tuning.md b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/tuning.md new file mode 100644 index 00000000000..2c6380802e3 --- /dev/null +++ b/versioned_docs/version-1.4.0/tuning-and-troubleshooting/tuning.md @@ -0,0 +1,66 @@ +--- +title: Tuning +sidebar_position: 2 +--- + +>Linkis0.x version runs stably on the production environment of WeBank, and supports various businesses. Linkis1.0 is an optimized version of 0.x, and the related tuning logic has not changed, so this document will introduce several Linkis deployment and tuning suggestions. Due to limited space, this article cannot cover all optimization scenarios. Related tuning guides will also be supplemented and updated. Of course, we also hope that community users will provide suggestions for Linkis1.0 tuning documents. + +## 1. Overview + +This document will introduce several tuning methods based on production experience, namely the selection of Jvm heap size during deployment in production, the setting of concurrency for task submission, and the introduction of task running resource application parameters. The parameter settings described in the document are not recommended parameter values. Users need to select the parameters according to their actual production environment. + +## 2. Jvm heap size tuning + +When installing Linkis, you can find the following variables in linkis-env.sh: + +```shell +SERVER_HEAP_SIZE="512M" +``` + +After setting this variable, it will be added to the java startup parameters of each microservice during installation to control the Jvm startup heap size. Although the xms and xmx parameters need to be set when java is started, they are usually set to the same value. In production, as the number of users increases, this parameter needs to be adjusted larger to meet the needs. Of course, setting a larger stack memory requires a larger server configuration. Also, single-machine deployment has limitations. In production, a distributed deployment method can be used to deploy different Linkis and DSS microservices on multiple servers. Meanwhile, you can adjust the stack size to meet production requirements. + +## 3. Tuning the concurrency of task submission + +Some Linkis task concurrency parameters will have a default value. In most scenarios, the default value can meet the demand, but sometimes it cannot, so it needs to be adjusted. This article will introduce several parameters for adjusting the concurrency of tasks to facilitate users to optimize concurrent tasks in production. + +Since tasks are submitted by RPC, in the linkis-common/linkis-rpc module, you can configure the following parameters to increase the number of concurrent rpc: + +```shell +wds.linkis.rpc.receiver.asyn.consumer.thread.max=400 +wds.linkis.rpc.receiver.asyn.queue.size.max=5000 +wds.linkis.rpc.sender.asyn.consumer.thread.max=100 +wds.linkis.rpc.sender.asyn.queue.size.max=2000 +``` + +In the Linkis source code, we set a default value for the number of concurrent tasks, which can meet the needs in most scenarios. However, when a large number of concurrent tasks are submitted for execution in some scenarios, such as when Qualitis (another open source project of WeBank) is used for mass data verification, initCapacity and maxCapacity have not been upgraded to a configurable item in the current version. Users need to modify, by increasing the values of these two parameters, the number of concurrency. Of course, this also requires a higher server configuration. + +```java + private val groupNameToGroups = new JMap[String, Group] + private val labelBuilderFactory = LabelBuilderFactoryContext.getLabelBuilderFactory + + override def getOrCreateGroup(groupName: String): Group = { + if (!groupNameToGroups.containsKey(groupName)) synchronized { + val initCapacity = 100 + val maxCapacity = 100 + // other codes... + } + } +``` + +## 4. Resource settings related to task runtime + +When submitting a task to run on Yarn, Yarn provides a configurable interface. As a highly scalable framework, Linkis can also be configured to set resource configuration. + +The related configuration of Spark and Hive are as follows: + +Part of the Spark configuration in linkis-engineconn-plugins/engineconn-plugins, you can adjust the configuration to change the runtime environment of tasks submitted to Yarn. Due to limited space, such as more about Hive, Yarn configuration requires users to refer to the source code and the parameters documentation. + +```shell + "spark.driver.memory" = 2 //Unit is G + "wds.linkis.driver.cores" = 1 + "spark.executor.memory" = 4 //Unit is G + "spark.executor.cores" = 2 + "spark.executor.instances" = 3 + "wds.linkis.rm.yarnqueue" = "default" +``` + diff --git a/versioned_docs/version-1.4.0/upgrade/_category_.json b/versioned_docs/version-1.4.0/upgrade/_category_.json new file mode 100644 index 00000000000..71f5ad1b771 --- /dev/null +++ b/versioned_docs/version-1.4.0/upgrade/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Upgrade Guide", + "position": 12.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/upgrade/upgrade-from-0.X-to-1.0-guide.md b/versioned_docs/version-1.4.0/upgrade/upgrade-from-0.X-to-1.0-guide.md new file mode 100644 index 00000000000..58de0639613 --- /dev/null +++ b/versioned_docs/version-1.4.0/upgrade/upgrade-from-0.X-to-1.0-guide.md @@ -0,0 +1,78 @@ +--- +title: Upgrade From 0.X To 1.0 +sidebar_position: 1 +--- + + > This article briefly introduces the precautions for upgrading Linkis from 0.X to 1.0. Linkis 1.0 has adjusted several Linkis services with major changes. This article will introduce the precautions for upgrading from 0.X to 1.X. + +## 1.Precautions + +        **If you are using Linkis for the first time, you can ignore this chapter.**. + +## 2. Service upgrade installation + +     Because linkis 1.0 basically upgraded all services, including service names, all services need to be reinstalled when upgrading from 0.X to 1.X. + +     If you need to keep 0.X data during the upgrade, you must select 1 to skip the table building statement (see the code below). + +     For the installation of Linkis1.0, please refer to [Quick Deployment Linkis1.0](../deployment/deploy-quick.md) + +``` +Do you want to clear Linkis table information in the database? +1: Do not execute table-building statements +2: Dangerous! Clear all data and rebuild the tables +other: exit + +Please input the choice: ## choice 1 +``` +## 3. Database upgrade + +     After the service is installed, the database structure needs to be modified, including table structure changes and new tables and data: + +### 3.1 Table structure modification part: + +     linkis_task: The submit_user and label_json fields are added to the table. The update statement is: + +```mysql-sql +ALTER TABLE linkis_task ADD submit_user varchar(50) DEFAULT NULL COMMENT 'submitUser name'; +ALTER TABLE linkis_task ADD `label_json` varchar(200) DEFAULT NULL COMMENT 'label json'; +``` + +### 3.2 Need newly executed sql: + +```mysql-sql +cd db/module +## Add the tables that the enginePlugin service depends on: +source linkis_ecp.sql +## Add a table that the public service-instanceLabel service depends on +source linkis_instance_label.sql +## Added tables that the linkis-manager service depends on +source linkis-manager.sql +``` + +### 3.3 Publicservice-Configuration table modification + +     In order to support the full labeling capability of Linkis 1.X, all the data tables related to the configuration module have been upgraded to labeling, which is completely different from the 0.X Configuration table. It is necessary to re-execute the table creation statement and the initialization statement. + +     This means that **Linkis0.X users' existing engine configuration parameters can no longer be migrated to Linkis1.0** (it is recommended that users reconfigure the engine parameters once). + +     The execution of the table building statement is as follows: + +```mysql-sql +source linkis_configuration.sql +``` + +     Because Linkis 1.0 supports multiple versions of the engine, it is necessary to modify the version of the engine when executing the initialization statement, as shown below: + +```mysql-sql +vim linkis_configuration_dml.sql +## Modify the default version of the corresponding engine +SET @SPARK_LABEL="spark-2.4.3"; +SET @HIVE_LABEL="hive-1.2.1"; +## Execute the initialization statement +source linkis_configuration_dml.sql +``` + +## 4. Installation and startup Linkis1.0 + +     Start Linkis 1.0 to verify whether the service has been started normally and provide external services. For details, please refer to: [Quick Deployment Linkis1.0](../deployment/deploy-quick.md) diff --git a/versioned_docs/version-1.4.0/upgrade/upgrade-guide.md b/versioned_docs/version-1.4.0/upgrade/upgrade-guide.md new file mode 100644 index 00000000000..77882ecabba --- /dev/null +++ b/versioned_docs/version-1.4.0/upgrade/upgrade-guide.md @@ -0,0 +1,174 @@ +--- +title: Version Upgrades above 1.0.3 +sidebar_position: 2 +--- + +> This article briefly introduces the general upgrade process for versions above 1.0.3 + + +## 1 Upgrade Instructions + +- If you are installing and using Linkis for the first time, or reinstalling Linkis, you don't need to pay attention to the Linkis upgrade guide. +- If components of other platforms (DataSphereStudio/Qualitis/Visualis, etc.) are involved, please confirm the compatibility between versions before upgrading, and it is best to use the recommended version. +- It is recommended to control the version through the soft chain. You can switch the version by modifying the target address of the soft chain. For example: `linkis -> /appcom/Install/LinkisInstall/linkis-1.1.3.20220615210213` +- The upgrade process mainly requires attention to the adjustment of the database table structure and the adjustment of some configuration parameters +- In addition to the upgrade of the back-end services, the management console resources of linkis also need to be upgraded together +- The main changes of each version can be found in the overview information of the version `https://linkis.apache.org/zh-CN/docs/x.x.x/release` and the version [release-note](https://linkis.apache .org/zh-CN/download/main): https://linkis.apache.org/zh-CN/download/main +- The database changes/configuration parameter changes of each version are based on the previous version + +## 2 Service upgrade installation + +Press [Deployment guide document](../deployment/deploy-quick) (the installation of the management console in the document can be skipped) to install the new version. + +When installing the service, if the historical data is retained, please retain the historical data, if you do not need to retain the data, just reinstall it directly +```shell script +Do you want to clear Linkis table information in the database? + 1: Do not execute table-building statements + 2: Dangerous! Clear all data and rebuild the tables + other: exit + +Please input the choice: ## choice 1 +```` + +## 3. Database table upgrade +>After the service installation is completed, the database structure needs to be modified, including table structure changes and table data changes + + +Find the corresponding version `db/upgrade/x.x.x-schema/` sql change file + +If it is executed across multiple versions, please execute them in the order of versions, +If some versions do not have x.x.x_schema (after the linkis>=1.1.0 version, as long as the adjustment of the database table is involved, there will be a corresponding version of the schema file), it means that there is no change in the data table in this version + +:::caution notice +Execute upgrade_1.1.1 under DDL upgrade script in schema, such as if it is executed to linkis_ cg_ rm_ resource_ action_ Record related error, please check whether the statement creating the table is missing engine=innodb default charset=utf8; If it is missing, please add it before execution +::: + +```shell script +├── linkis_ddl.sql # The current version of the full ddl database definition language table building statement +├── linkis_dml.sql # The current version of the full dml data manipulation language data additions and changes +└── upgrade + ├── 1.1.0_schema # The corresponding version of sql + │ └── mysql + │ ├── linkis_ddl.sql + │ └── linkis_dml.sql + ├── 1.1.1_schema + │ └── mysql + │ ├── linkis_ddl.sql + │ └── linkis_dml.sql + └── 1.1.3_schema + └── mysql + └── linkis_ddl.sql +```` + +```mysql-sql + #If it is executed across multiple versions, please execute in order of versions, execute ddl first and then execute ddl + #For example, currently upgrade from linkis-1.0.3 to linkis-1.1.2 + source upgrade/1.1.0_schema/mysql/linkis_ddl.sql + source upgrade/1.1.0_schema/mysql/linkis_dml.sql + + source upgrade/1.1.1_schema/mysql/linkis_ddl.sql + source upgrade/1.1.1_schema/mysql/linkis_dml.sql + +```` +## 4 Adjustment of data (optional) +>According to the actual situation, decide whether to make the following adjustments + +### 4.1 TOKEN configuration +Authentication for interface calls yes +1.1.1 Version adjustment Migrate the original TOKEN configuration from `${LINKIS_HOME}/conf/token.properties` to the database table `linkis_mg_gateway_auth_token`, +For the TOKEN originally configured in `token.properties`, you need to manually migrate the table +### 4.2 UDF Adjustment +1.1.1 supports the functions of UDF multi-version control and UDF storage to BML, the table structure stored by UDF functions has been adjusted, and the historical data of UDF needs to be migrated separately + +### 4.3 Session field key configuration + +In version 1.1.1, the key of the session field was adjusted from `bdp-user-ticket-id`-> to `linkis_user_session_ticket_id_v1`, +If it is an upgrade to Linkis. At the same time, DSS or other projects are deployed, but in their service lib package, the linkis-module-x.x.x.jar package of Linkis that they depend on is <1.1.1, you need to modify the file located in `${LINKIS_HOME}/conf/linkis.properties` +```shell +echo "wds.linkis.session.ticket.key=bdp-user-ticket-id" >> linkis.properties +```` +### 4.4 Adjustment of default queue +1.1.1 Begin to adjust the default cluster name of yarn queue `wds.linkis.rm.cluster` sit is adjusted to default, if you have been using sit, please modify the table data +Cluster name in `linkis_cg_rm_external_resource_provider` + +### 4.5 Copies of other related packages + +If there is a third-party appconn plugin installed in `${LINKIS_HOME_OLD}/lib/linkis-engineconn-plugins` in the previous version of Linkis, you need to copy it to the new version, +It is best to link to the appconn path through a soft chain +like: +```` +#Check if the old version has a third-party appconn installed +cd ${LINKIS_HOME_OLD}/lib/linkis-engineconn-plugins/ +ll + appconn -> /appcom/Install/LinkisInstall/appconn + + +#The new version is consistent +cd ${LINKIS_HOME}/lib/linkis-engineconn-plugins/ +#soft chain +ln -snf /appcom/Install/LinkisInstall/appconn appconn +```` + + +If dss is installed in the original version, you need to copy the `dss-gateway-support-x.x.x.jar` in the original package to the `./lib/linkis-spring-cloud-services/linkis-mg-gateway/` directory of linkis +like: +```shell script +cp ${LINKIS_HOME_OLD}/lib/linkis-spring-cloud-services/linkis-mg-gateway/dss-gateway-support-1.1.3.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis- mg-gateway/dss-gateway-support-1.1.3.jar + +```` + +## 5 Updates to the console + +> To upgrade the backend, you also need to upgrade the corresponding management console resources. You don't need to install the management console, just replace the static resources directly. + +### 5.1 Download the front-end installation package and unzip it +Upload it to the server where the management console is located, and decompress it +```shell script +tar -xvf apache-linkis-x.x.x-incubating-web-bin.tar.gz +```` + + +### 5.2 Upgrade +>There are many ways to upgrade the management console, because it is only the update of resources, which can be done through the installation script of the management console, or it can directly overwrite the original resources. +>It is recommended to use the soft chain method, just modify the target address of the soft chain. The following takes the new version resource path method as an example + +The nginx configuration file is by default in `/etc/nginx/conf.d/*` +nginx log files are in `/var/log/nginx/access.log` and `/var/log/nginx/error.log` + +Scenario 1: If it is integrated into the DSS project, modify the address of the linkis management console resource in the DSS project to point to +The nginx configuration file for dss is by default in `/etc/nginx/conf.d/dss.conf` +````nginx +#Example + server { + ...... + location dss/linkis { + alias /appcom/Install/linkis-web-newversion/dist; # static file directory + index index.html index.html; + } + ..... + } +```` + +Scenario 2: If linkis is deployed independently +Modify the configuration of Nginx, the static resource address points to the new version of the linkis console +Linkis' nginx configuration file is by default in `/etc/nginx/conf.d/dss.conf` +````nginx +#Example + server { + ...... + location dss/linkis { + alias /appcom/Install/linkis-web-newversion/dist; # static file directory + index index.html index.html; + } + ...... + } +```` + +Reload nginx configuration +```` +sudo nginx -s reload +```` + +### 5.3 Notes + +- After the management console is upgraded, because the browser may have a cache, if you want to verify the effect, it is best to clear the browser cache \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/upgrade/upgrade-to-1.4.0-guide.md b/versioned_docs/version-1.4.0/upgrade/upgrade-to-1.4.0-guide.md new file mode 100644 index 00000000000..0c1761d1aaf --- /dev/null +++ b/versioned_docs/version-1.4.0/upgrade/upgrade-to-1.4.0-guide.md @@ -0,0 +1,193 @@ +--- +title: Upgrade Guide for 1.4.0 +sidebar_position: 3 +--- + +> Linkis1.4.0 has made many adjustments to Linkis services and codes. This article introduces the relevant precautions for upgrading to Linkis 1.4.0. + +## 1. Precautions + +**1) If you are using Linkis for the first time, you can ignore this chapter and refer to the [Single-machine deployment](../deployment/deploy-quick.md) guide to deploy Linkis. ** + +**2) If you have installed a version before Likis 1.4.0 but do not want to keep the original data, you can also refer to the [Stand-alone Deployment](../deployment/deploy-quick.md) guide to redeploy, and select 2 to clean up during installation All the data and rebuild the table (see the code below). ** +``` +Do you want to clear Linkis table information in the database? + 1: Do not execute table-building statements + 2: Dangerous! Clear all data and rebuild the tables + other: exit + +Please input the choice: ## choice 2 +``` +**3) If you have installed a version of Likis earlier than 1.4.0 but need to keep the original version data, you can refer to this document to upgrade. ** + +**** + +## 2. Environment upgrade + +Linkis 1.4.0 upgrades the default dependent environments Hadoop, Hive, and Spark to 3.x. Hadoop was upgraded to 3.3.4, Hive was upgraded to 3.1.3, and Spark was upgraded to 3.2.1. Please upgrade these environments before performing subsequent operations. + +Verify the upgraded version by the following command +``` +echo $HADOOP_HOME +/data/hadoop-3.3.4 +echo $HIVE_HOME +/data/apache-hive-3.1.3-bin +echo $SPARK_HOME +/data/spark-3.2.1-bin-hadoop3.2 +``` + +Before installation, please modify the relevant configurations of Hadoop, Hive, and Spark in the deploy-config/linkis-env.sh file to the upgraded directory. The specific modification items are as follows: + +``` +#HADOOP +HADOOP_HOME=${HADOOP_HOME:-"/appcom/Install/hadoop"} +HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/appcom/config/hadoop-config"} + +## Hadoop env version +HADOOP_VERSION=${HADOOP_VERSION:-"3.3.4"} + +#Hive +HIVE_HOME=/appcom/Install/hive +HIVE_CONF_DIR=/appcom/config/hive-config + +#Spark +SPARK_HOME=/appcom/Install/spark +SPARK_CONF_DIR=/appcom/config/spark-config + +``` + +## 3. Service upgrade installation + +Because the 1.4.0 version has changed a lot, the service needs to be reinstalled when the old version is upgraded to 1.4.0. + +If you need to keep the old version of data during installation, be sure to choose 1 to skip the table creation statement (see the code below). + +Linkis 1.4.0 installation can refer to [How to install quickly](../deployment/deploy-quick.md) + +``` +Do you want to clear Linkis table information in the database? + 1: Do not execute table-building statements + 2: Dangerous! Clear all data and rebuild the tables + other: exit + +Please input the choice: ## choice 1 +``` + +## 4. Database upgrade + After the service installation is complete, the data tables of the database need to be modified, including table structure changes and table data updates. Execute the DDL and DML scripts corresponding to the upgraded version. + ``` + # table structure changes + linkis-dist\package\db\upgrade\${version}_schema\mysql\linkis_ddl.sql + # table data changes + linkis-dist\package\db\upgrade\${version}_schema\mysql\linkis_dml.sql + ``` +Note that when upgrading, please execute the upgrade script in sequence, such as upgrading from the current version 1.3.1 to version 1.4.0. You need to execute the DDL and DML scripts of 1.3.2 upgrade first, and then execute the DDL and DML scripts of 1.4.0 upgrade. This article takes the upgrade from 1.3.2 to 1.4.0 as an example to illustrate + +### 4.1 Table structure modification part: + +Connect to the mysql database and execute the linkis-dist\package\db\upgrade\1.3.2_schema\mysql\linkis_ddl.sql script content, the specific content is as follows: + +```mysql-sql +ALTER TABLE `linkis_cg_manager_service_instance` ADD COLUMN `identifier` varchar(32) COLLATE utf8_bin DEFAULT NULL; +ALTER TABLE `linkis_cg_manager_service_instance` ADD COLUMN `ticketId` varchar(255) COLLATE utf8_bin DEFAULT NULL; +ALTER TABLE `linkis_cg_ec_resource_info_record` MODIFY COLUMN metrics TEXT DEFAULT NULL COMMENT 'ec metrics'; +``` + +### 4.2 Newly executed sql is required: + +Connect to the mysql database and execute the linkis-dist\package\db\upgrade\1.3.2_schema\mysql\linkis_dml.sql script content, the specific content is as follows: +```sql +-- Default version upgrade +UPDATE linkis_ps_configuration_config_key SET default_value = 'python3' WHERE `key` = 'spark.python.version'; +UPDATE linkis_cg_manager_label SET label_value = '*-*,hive-3.1.3' WHERE label_value = '*-*,hive-2.3.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-IDE,hive-3.1.3' WHERE label_value = '*-IDE,hive-2.3.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-nodeexecution,hive-3.1.3' WHERE label_value = '*-nodeexecution,hive-2.3.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-*,spark-3.2.1' WHERE label_value = '*-*,spark-2.4.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-IDE,spark-3.2.1' WHERE label_value = '*-IDE,spark-2.4.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-Visualis,spark-3.2.1' WHERE label_value = '*-Visualis,spark-2.4.3'; +UPDATE linkis_cg_manager_label SET label_value = '*-nodeexecution,spark-3.2.1' WHERE label_value = '*-nodeexecution,spark-2.4.3'; + +-- Support for different data sources +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('tidb', 'tidb Database', 'tidb', 'Relational Database', '', 3, 'TiDB Database', 'TiDB', 'Relational Database'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'tidb'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, ` ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', 'Address', 'Address', NULL, 'TEXT', NULL, 0, 'Address(host1:port1,host2:port2...)', 'Address(host1:port1, host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', 'Host', 'Host', NULL, 'TEXT', NULL, 1, 'Host', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', 'Port', 'Port', NULL, 'TEXT', NULL, 1, 'Port', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', 'Driver class name', 'Driver class name', 'com.mysql.jdbc.Driver', 'TEXT', NULL, 1, 'Driver class name (Driver class name)', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', 'Connection params', 'Connection params', NULL, 'TEXT', NULL, 0, 'Input JSON format): {"param":"value" }', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', 'Username', 'Username', NULL, 'TEXT', NULL, 1, 'Username', 'Username', '^[0-9A-Za -z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', 'Password', 'Password', NULL, 'PASSWORD', NULL, 0, 'Password', 'Password', '', NULL, NULL, NULL, now (), now()), + (@data_source_type_id, 'instance', 'Instance name (instance)', 'Instance', NULL, 'TEXT', NULL, 1, 'Instance name (instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); + +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('starrocks', 'starrocks` Database', 'starrocks', 'olap', '', 4, 'StarRocks Database', 'StarRocks', 'Olap'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'starrocks'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, ` ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', 'Address', 'Address', NULL, 'TEXT', NULL, 0, 'Address(host1:port1,host2:port2...)', 'Address(host1:port1, host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', 'Host', 'Host', NULL, 'TEXT', NULL, 1, 'Host', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', 'Port', 'Port', NULL, 'TEXT', NULL, 1, 'Port', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', 'Driver class name', 'Driver class name', 'com.mysql.jdbc.Driver', 'TEXT', NULL, 1, 'Driver class name (Driver class name)', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', 'Connection params', 'Connection params', NULL, 'TEXT', NULL, 0, 'Input JSON format): {"param":"value" }', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', 'Username', 'Username', NULL, 'TEXT', NULL, 1, 'Username', 'Username', '^[0-9A-Za -z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', 'Password', 'Password', NULL, 'PASSWORD', NULL, 0, 'Password', 'Password', '', NULL, NULL, NULL, now (), now()), + (@data_source_type_id, 'instance', 'Instance name (instance)', 'Instance', NULL, 'TEXT', NULL, 1, 'Instance name (instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); + +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('gaussdb', 'gaussdb Database', 'gaussdb', 'Relational Database', '', 3, 'GaussDB Database', 'GaussDB', 'Relational Database'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'gaussdb'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, ` ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', 'Address', 'Address', NULL, 'TEXT', NULL, 0, 'Address(host1:port1,host2:port2...)', 'Address(host1:port1, host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', 'Host', 'Host', NULL, 'TEXT', NULL, 1, 'Host', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', 'Port', 'Port', NULL, 'TEXT', NULL, 1, 'Port', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', 'Driver class name', 'Driver class name', 'org.postgresql.Driver', 'TEXT', NULL, 1, 'Driver class name) ', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', 'Connection params', 'Connection params', NULL, 'TEXT', NULL, 0, 'Input JSON format): {"param":"value" }', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', 'Username', 'Username', NULL, 'TEXT', NULL, 1, 'Username', 'Username', '^[0-9A-Za -z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', 'Password', 'Password', NULL, 'PASSWORD', NULL, 1, 'Password', 'Password', '', NULL, NULL, NULL, now (), now()), + (@data_source_type_id, 'instance', 'Instance name (instance)', 'Instance', NULL, 'TEXT', NULL, 1, 'Instance name (instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); + +INSERT INTO `linkis_ps_dm_datasource_type` (`name`, `description`, `option`, `classifier`, `icon`, `layers`, `description_en`, `option_en`, `classifier_en`) VALUES ('oceanbase', 'oceanbase` Database', 'oceanbase', 'olap', '', 4, 'oceanbase Database', 'oceanbase', 'Olap'); + +select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'oceanbase'; +INSERT INTO `linkis_ps_dm_datasource_type_key` +(`data_source_type_id`, `key`, `name`, `name_en`, `default_value`, `value_type`, `scope`, `require`, `description`, `description_en`, `value_regex`, `ref_id`, ` ref_value`, `data_source`, `update_time`, `create_time`) +VALUES (@data_source_type_id, 'address', 'Address', 'Address', NULL, 'TEXT', NULL, 0, 'Address(host1:port1,host2:port2...)', 'Address(host1:port1, host2:port2...)', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'host', 'Host', 'Host', NULL, 'TEXT', NULL, 1, 'Host', 'Host', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'port', 'Port', 'Port', NULL, 'TEXT', NULL, 1, 'Port', 'Port', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'driverClassName', 'Driver class name', 'Driver class name', 'com.mysql.jdbc.Driver', 'TEXT', NULL, 1, 'Driver class name (Driver class name)', 'Driver class name', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'params', 'Connection params', 'Connection params', NULL, 'TEXT', NULL, 0, 'Input JSON format): {"param":"value" }', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'username', 'Username', 'Username', NULL, 'TEXT', NULL, 1, 'Username', 'Username', '^[0-9A-Za -z_-]+$', NULL, NULL, NULL, now(), now()), + (@data_source_type_id, 'password', 'Password', 'Password', NULL, 'PASSWORD', NULL, 1, 'Password', 'Password', '', NULL, NULL, NULL, now (), now()), + (@data_source_type_id, 'instance', 'Instance name (instance)', 'Instance', NULL, 'TEXT', NULL, 1, 'Instance name (instance)', 'Instance', NULL, NULL, NULL, NULL, now(), now()); +``` + +## 4. Add mysql driver package +When linkis is upgraded to version 1.4.0, the mysql driver package needs to use version 8.x. Take version 8.0.28 as an example: [Download link](https://repo1.maven.org/maven2/mysql/mysql-connector-java /8.0.28/mysql-connector-java-8.0.28.jar) copy the driver package to the lib package + +``` +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-spring-cloud-services/linkis-mg-gateway/ +cp mysql-connector-java-8.0.28.jar ${LINKIS_HOME}/lib/linkis-commons/public-module/ +``` + +## 5. Start the service + +```shell +sh linkis-start-all.sh +``` + +## 6. Precautions + +1. After Spark is upgraded to 3.x, it is not compatible with python2, so you need to install python3 when executing pyspark tasks, and perform the following operations +```shell +sudo ln -snf /usr/bin/python3 /usr/bin/python2 +``` +And add the following configuration in the spark engine configuration $LINKIS_HOME/lib/linkis-engineconn-plugins/spark/dist/3.2.1/conf/linkis-engineconn.properties, specify the python installation path +``` +pyspark.python3.path=/usr/bin/python3 +``` +2. The Token value in the configuration file cannot be automatically unified with the original database Token value during upgrade. You need to manually modify the Token value in the `linkis.properties` and `linkis-cli/linkis-cli.properties` files to the Token value corresponding to the data table `linkis_mg_gateway_auth_token`. +3. When upgrading from a lower version to a higher version, execute the database upgrade script step by step. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/_category_.json b/versioned_docs/version-1.4.0/user-guide/_category_.json new file mode 100644 index 00000000000..7a33624101d --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "User Guide", + "position": 4.0 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/_category_.json b/versioned_docs/version-1.4.0/user-guide/control-panel/_category_.json new file mode 100644 index 00000000000..bd5dba17a54 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Control Panel", + "position": 8 +} \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/basicdata-management.md b/versioned_docs/version-1.4.0/user-guide/control-panel/basicdata-management.md new file mode 100644 index 00000000000..cd4a92cad59 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/basicdata-management.md @@ -0,0 +1,36 @@ +--- +title: Basic Data Management +sidebar_position: 8 +--- + +The data source management page can manage data such as user tokens, error codes, extended resources, and engine materials. + +## 1. Token Management + +It is used to manage Token information of each application. + +![](../images/basic-token.png) + +## 2. Error code management + +### 2.1 List of error codes + +List error code information, you can query by error code or error description. + +![](../images/basic-code.png) + +### 2.1 Common error code problem solving + +[common error codes and how to deal with them](../../tuning-and-troubleshooting/error-guide/error-code.md) + +## 3. Extended resource management + +Used to manage extended resources, such as yarn link url, etc. + +![](../images/basic-ext.png) + +## 4. Engine material management + +Used to manage Linkis engine materials, including creation, update and deletion of engine plugins. + +![](../images/basic-bml.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/datasource-management.md b/versioned_docs/version-1.4.0/user-guide/control-panel/datasource-management.md new file mode 100644 index 00000000000..fd2bd40d0ee --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/datasource-management.md @@ -0,0 +1,32 @@ +--- +title: Data Source Management +sidebar_position: 7 +--- + +Data source management can process data source link information, data source environment, data source classification and data source permissions. + +## 1. Data source management + +The data source management interface can view the data source managed by Linkis. And manage the data source, including creating, modifying, testing the connection, modifying the state of the data source, etc. + +![](../images/datasource-manage.png) + +## 2. Data source environment + +On the data source environment page, you can view the data source environment and modify the parameters of the managed environment. + +![](../images/env-list.png) + +![](../images/env-edit.png) + +## 3. Data source classification + +The data source classification page is used to manage the types of data sources. This classification is used in both data source management and data source permission pages. + +![](../images/ds-class.png) + +## 4. Data source permissions + +This page manages data source permissions. + +![](../images/ds-auth.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/ecm-management.md b/versioned_docs/version-1.4.0/user-guide/control-panel/ecm-management.md new file mode 100644 index 00000000000..f267cbe669c --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/ecm-management.md @@ -0,0 +1,31 @@ +--- +title: ECM Management +sidebar_position: 5 +--- + +The ECM management interface is only visible to Linkis Computing Management Console administrators. This page is used to manage ECM and all engines. On this interface, you can view the status information of the ECM, modify the ECM label information, modify the ECM status information, and query all engine information under each ECM. + +## 1. Instance view +An ECM instance is an ECM service. Users can start multiple ECM services according to requirements to improve request processing efficiency. On this page, you can view ECM instance information, including name, label, and resource information. In addition, ECM instances can be filtered through keywords such as instance name, status, and creator. + +![](../images/ecm-management.png) + + +## 2. Tag management +The ECM service filters and processes requests based on tags. Each service contains default labels and user-defined labels. Only the request carrying the label information of the ECM service will be processed by the current service. Click the Edit button to edit the label information of the ECM (only user-defined labels are allowed), and modify the status of the ECM. + +![](../images/edit-label.png) + +The most commonly used is the tenant label tenant, through which users can isolate tenant requests. + +## 3. Engine information under ECM + +Click the instance name of an ECM to view all engine information under the ECM. And manage the engine, including stopping the engine, adding or deleting user-defined tags, viewing engine logs, and other operations. + +![](../images/ecm-btn.png) + +![](../images/ecm-engine.png) + +![](../images/ecm-engine-label.png) + +Similarly, after tagging the engine under the ECM instance, you can control the specific engine that processes the request in a finer granularity. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/global-history.md b/versioned_docs/version-1.4.0/user-guide/control-panel/global-history.md new file mode 100644 index 00000000000..50508267689 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/global-history.md @@ -0,0 +1,23 @@ +--- +title: Global History +sidebar_position: 1 +--- + +## 1. Historical tasks + +The global history interface provides the user's own linkis task submission record, and the creation time, execution statement, and status of each task can be displayed here. And you can filter based on keywords such as task ID, time, engine, status, etc. + +> ![](../images/global-history-interface.png) + + +## 2. Task details +Click the button on the left to view the task execution log, task details and task results. If the task execution fails, you can troubleshoot the problem through the task log. +![../images/image2.png](../images/history-query-button.png) + + +![./media/image3.png](../images/task-execution-log.png) + +## 3. Admin view +For linkis computing management platform administrators, administrators can view all users' historical tasks by clicking the switch administrator view on the page. + +![./media/image4.png](../images/administrator-view.png) diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/global-variable.md b/versioned_docs/version-1.4.0/user-guide/control-panel/global-variable.md new file mode 100644 index 00000000000..ae81752f53f --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/global-variable.md @@ -0,0 +1,8 @@ +--- +title: Global Variable +sidebar_position: 4 +--- + +In the global variable interface, users can customize variables for code writing, click the edit button to add parameters, and save after adding. + +![](../images/global-var.png) diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/microservice-management.md b/versioned_docs/version-1.4.0/user-guide/control-panel/microservice-management.md new file mode 100644 index 00000000000..9d889f6b006 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/microservice-management.md @@ -0,0 +1,22 @@ +--- +title: Microservice Management +sidebar_position: 6 +--- + +Linkis is a distributed microservice system built on Spring Cloud. The registry service uses Eureka. The microservice management interface is only visible to administrators. + +## 1. Service view + +The microservice management interface can view all microservice information under Linkis, and filter services by instance name and engine type keywords. And the tags under the service can be managed through the edit button. + +![](../images/microservice-list.png) + +![](../images/ms-edit.png) + +## 2. Registry + +Linkis's own microservices can be viewed by clicking on the Eureka registration center, and the microservices associated with Linkis will be listed directly on this interface. + +![](../images/eureka-btn.png) + +![](../images/eureka.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/overview.md b/versioned_docs/version-1.4.0/user-guide/control-panel/overview.md new file mode 100644 index 00000000000..044e6836745 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/overview.md @@ -0,0 +1,93 @@ +--- +title: Description of The Main Interface of The Management Console +sidebar_position: 0 +--- + +### 1 Global History +#### 1.1 Main functions +- Query of executing tasks: Support querying historical tasks based on time/task ID/engine type/task status. +- Forced stop of running tasks +- Admin users can switch the admin view to view all user tasks +- View detailed task execution logs and execution results + +#### 1.2 Main interface + +- Paging query of historical tasks /api/rest_j/v1/jobhistory/list +- Detailed query of historical tasks /api/rest_j/v1/jobhistory/{taskId}/get +- Log viewing /api/rest_j/v1/filesystem/openLog?path=hdfs:%2F%2F%2Ftmp%2Flinkis%2Flog%2F2022-04-12%2FIDE%2Fhadoop%2F466.log +- Result set file list /api/rest_j/v1/filesystem/getDirFileTrees?path=hdfs:%2F%2F%2Ftmp%2Flinkis%2Fhadoop%2Flinkis%2F20220412_173302%2FIDE%2F466 +- Execute result set data /api/rest_j/v1/filesystem/openFile?path=hdfs:%2F%2F%2Ftmp%2Flinkis%2Fhadoop%2Flinkis%2F20220412_173302%2FIDE%2F466%2F_0.dolphin&page=1&pageSize=5000 +- Mandatory kill interface for tasks /api/rest_j/v1/entrance/killJobs + + +### 2 Resource Management +#### 2.1 Main functions +- View the status of the engine currently started by the logged-in user and the resource usage +- Ability to stop the engine through interface operations +- Administrator users can switch administrator views, view yarn queue resources, and reset resources + +#### 2.2 Main interface +- Resource query interface /api/rest_j/v1/linkisManager/rm/userresources +- Detailed engine instance information api/rest_j/v1/linkisManager/rm/applicationlist used by resources +- Engine kill interface /api/rest_j/v1/linkisManager/rm/enginekill +- Resource reset interface /api/rest_j/v1/linkisManager/rm/resetResource?resourceId=2 +- List of all resources used /api/rest_j/v1/linkisManager/rm/allUserResource?page=1&size=15 + + +### 3 parameter configuration +#### 3.1 Main functions +- Function of user-defined parameter management +- Users can manage engine related configurations on this interface +- Administrators can also add application types and engines here + +#### 3.2 Main interface +- View the configuration tree list /api/rest_j/v1/configuration/getFullTreesByAppName?creator=%E5%85%A8%E5%B1%80%E8%AE%BE%E7%BD%AE +- New secondary engine configuration /api/rest_j/v1/configuration/createSecondCategory +- configuration saving /api/rest_j/v1/configuration/saveFullTree + + +### 4 Global variables +#### 4.1 Main functions +- Support users to customize the addition and modification of variables, which can be automatically replaced according to the configured variable values ​​when the task is submitted. Ability to reuse commonly used variables + +#### 4.2 Main interface +- Saving of global variables /api/rest_j/v1/variable/saveGlobalVariable +- Query of global variables /api/rest_j/v1/variable/listGlobalVariable + +### 5 ECM Management +> **Only visible to linkis computing management platform administrators** +#### 5.1 Main functions +- Admin can manage ECM and all engines, +- You can view ECM status information, modify ECM label information, modify ECM status information, and query all engine information under each ECM +- You can edit the tag information of ECM (only some tags are allowed to be edited), and modify the status of ECM. +- You can view all the engine information under the ECM, and you can stop the operation for a single engine, view the operation log, and edit the tag information of the engine. + +The maximum available resource is configured with a default value via a configuration file parameter +wds.linkis.ecm.memory.max 100g +wds.linkis.ecm.cores.max 100 +wds.linkis.ecm.engineconn.instances.max 50 + + +#### 5.2 Main interface +- Query the ECM list api/rest_j/v1/linkisManager/listAllEMs +- Modify ECM information api/rest_j/v1/linkisManager/modifyEMInfo +- Query engine data under ecm/api/rest_j/v1/linkisManager/listEMEngines +- Modify engine information api/rest_j/v1/linkisManager/modifyEngineInfo +- Engine kill interface /api/rest_j/v1/linkisManager/rm/enginekill +- Engine log query interface /api/rest_j/v1/linkisManager/openEngineLog + + +### 6 Microservice Management + +#### 6.1 Main functions + +You can view all microservice information under Linkis, which is only visible to linkis computing management console administrators. + +#### 6.2 Main interface +- Service query /api/rest_j/v1/microservice/allInstance +- label update api/rest_j/v1/microservice/instanceLabel + + + + + diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/param-conf.md b/versioned_docs/version-1.4.0/user-guide/control-panel/param-conf.md new file mode 100644 index 00000000000..8158d1e2d6b --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/param-conf.md @@ -0,0 +1,68 @@ +--- +title: Parameter Configuration +sidebar_position: 3 +--- + +The parameter configuration interface provides the user-defined parameter management function, and the user can manage the related configuration of the engine on this interface. By default, engine configurations for `IDE`, `Visualis`, and `nodeexecution` applications are provided, and users can add or delete applications and engines according to their needs. + +## 1. Parameter configuration instructions +The parameter configuration page is mainly to manage the parameters of each engine plug-in of `Linkis`. The engine configuration in `Linkis` is managed through tags, and the engine configuration parameters under different applications are isolated from each other. For engine parameters whose configuration is not displayed, the default engine parameter configuration during system initialization will be called when the task is executed. + + +## 2. Add new application (admin only) +The administrator can add an application through the Add Application Type button. + +![](../images/add-app.png) + +## 3. New engine + +The engine is associated with the application, and the corresponding reference must be selected before adding an engine, such as adding an engine under the `Visualis` application. + +![](../images/add-engine-btn.png) + +![](../images/add-engine.png) + +**Note:**Engine version needs to fill in [Linkis supported engine version](./overview.md). Otherwise, an error will be reported when executing the `Linkis` task. + + +## 4. Editing Apps and Engines (admins only) +Administrators can delete existing applications and engine configurations through the Edit Directory button (Note! Deleting an application directly will delete all engine configurations under the application and cannot be restored), or add an engine. + +![](../images/del-app.png) + +## 5. Global settings + +The global setting is mainly to configure the parameters of the queue resources, which will take effect for all application tasks after configuration. + +![](../images/global-conf.png) + +### 5.1 Queue Settings + +**1. View available queues** + +Visit hadoop cluster to view available queues, address: http://ip:port/cluster/scheduler + +![](../images/yarn-deque.png) + +**2. Set up the queue** + +Set the name of the available queue queried in step 1 and save it. +![](../images/yarn-write.png) + +**3. View the available resources of the set queue** + +Click the button in the lower right corner to view the available resources of the queue. +![](../images/click-yarn.png) +![](../images/deque-resource.png) + +**4. Set Resource Limits** + +Set resource limits based on the available resources (CPU and memory) of the queue queried in step 3, including the maximum number of queue instances, the upper limit of queue CPU usage, the upper limit of queue memory usage, and the upper limit of global memory usage of each engine. + + + +## 6. Engine parameter modification + +After the user clicks the engine label under the corresponding application, the engine parameters can be modified, such as modifying the `JDBC` engine under the `IDE` application. After modification, click the Save button. + +![](../images/engine-conf.png) diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/permission-instructions-console.md b/versioned_docs/version-1.4.0/user-guide/control-panel/permission-instructions-console.md new file mode 100644 index 00000000000..4b011d9a47a --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/permission-instructions-console.md @@ -0,0 +1,124 @@ +--- +title: User Permission Description of Management Console +sidebar_position: 10 +--- + +## 1. Role Type + +- Administrator (Admin): able to view all menu entries, the administrator role has the highest authority, including historical administrator authority +- History Admin (historyAdmin): In addition to the tasks submitted by yourself, you can also view other historical tasks +- general user: View the task information submitted by yourself + +## 2. Description of function role permission chart + +The permissions that different roles have in the function + +| Function Name | Administrator (Admin) | History Administrator (historyAdmin) | Ordinary User | +| -------- | -------- | ----- |----- | +| Administrator View (Global History) | √ | √ | | +| Search Bar (Resource Management) | √ | | | +| Parameter configuration | √ | | | +| Global variables | √ | √ | √ | +| ECM Management | √ | | | +| Microservice Management | √ | | | +| Data Source Management | √ | √ | √ | +| Data source environment management | √ | | | +| Data source type | √ | | | +| UDF Management | √ | √ | √ | +| Function Management | √ | √ | √ | +| Tenant Tag Management | √ | | | +| Whitelist Management | √ | | | +| Code Retrieval (Admin View) | √ | | | +| Code search (other functions) | √ | √ | √ | + +## 3. Functional authority distinction + +### 3.1 Global History +The administrator view can only be viewed by historical administrators or administrators + +![](/Images/control-panel/qhgly-img.png) + +### 3.2 Resource Management + +The search bar is only visible to administrators + +![](/Images/control-panel/sslkj-img.png) + +### 3.3 Parameter configuration + +Only admins can edit apps + +![](/Images/control-panel/glybj-img.png) + +### 3.4 Global variables + +all editable + +![](/Images/control-panel/jksy-img.png) + +### 3.5 ECM Management (Admin) + +Only administrators have permission + +![](/Images/control-panel/ecmgl-img.png) + +### 3.6 Microservice Management (Admin) + +Only administrators have permission + +![](/Images/control-panel/wfwgl-img.png) + +### 3.7 Data Source Management + +#### 3.7.1 Data source management + +have authority + +![](/Images/control-panel/sou-img.png) + +#### 3.7.2 Data source environment management (Admin) + +Only administrators have permission + +![](/Images/control-panel/hj-img.png) + + +#### 3.7.3 Data source type (Admin) + +Only administrators have permission + +![](/Images/control-panel/pzx-img.png) + +### 3.8 UDF Management + +#### 3.8.1 UDF management + +have authority + +![](/Images/control-panel/udfgl-img.png) + +#### 3.8.2 Function Management + +have authority + +![](/Images/control-panel/fun-img.png) + +### 3.9 Basic data management (Admin) + +#### 3.9.1 Tenant label management + +Only administrators have permission + +![](/Images/control-panel/zhbj-img.png) + +#### 3.9.2 Whitelist Management + +Only administrators have permission + +![](/Images/control-panel/bmdgl-img.png) + +### 3.10 Code Retrieval + +The administrator view can only be viewed by administrators + +![](/Images/control-panel/dmjs-img.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/resource-limit.md b/versioned_docs/version-1.4.0/user-guide/control-panel/resource-limit.md new file mode 100644 index 00000000000..6e0920d5ef3 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/resource-limit.md @@ -0,0 +1,58 @@ +--- +title: Limit Parameter Adjustment +sidebar_position: 5 +--- + +This article describes how to adjust parameters when resources such as memory and CPU are insufficient. + +## 1. Insufficient queue resources +An error is reported during task execution: error code 12001, the error message queue has insufficient CPU resources, you can adjust the number of Spark executors + +Click on the management console--parameter configuration--IDE--Spark--display advanced settings--woker engine resource settings (2)--adjust the concurrent number of executors +![](../images/spark-resource.png) + +Or set the global setting to adjust the upper limit of queue resource usage. + +![](../images/global-limit.png) + +## 2. The number of queue instances exceeds the limit + +An error is reported during task execution: error code 12003, the number of error message queue instances exceeds the limit + +Click Management Console--Parameter Configuration--Global Settings--Queue Resources--Maximum Number of Yarn Queue Instances [wds.linkis.rm.yarnqueue.instance.max] + +![](../images/yarn-instance.png) + +## 3. Global driver memory usage limit +An error is reported during task execution: error code 12004, error message upper limit of global driver memory usage, lower driver memory can be set + +Click Management Console--Parameter Configuration--Global Settings--Queue Resources--Maximum Number of Yarn Queue Memory 队列内存使用上限[wds.linkis.rm.yarnqueue.memory.max] + +![](../images/engine-memory.png) + +## 4. Exceeded the upper limit of the CPU number of the global driver + +An error is reported during task execution: error code 12005, the error message exceeds the upper limit of the number of CPUs in the global drive, and idle engines can be cleaned up + +Click Management Console - Parameter Configuration - Global Settings - Queue Resources - Upper Limit of The Number of Engine Cores[wds.linkis.rm.client.core.max] + +![](../images/global-core.png) + +Or solve it by cleaning idle engines. + +## 5. Exceeded the upper limit of the engine's maximum concurrent number + +An error is reported during task execution: error code 12006, the error message exceeds the maximum concurrency limit of the engine, and idle engines can be cleaned up + +Click Management Console--Parameter Configuration--Global Settings--Queue Resources--Maximum concurrent number of each engine globally [wds.linkis.rm.instance] + +![](../images/global-con.png) + +**Spark engine** +![](../images/spark-con.png) + +**Hive engine** + +![](../images/hive-con.png) + +Other engine settings are similar to Spark and Hive engines. \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/resource-manager.md b/versioned_docs/version-1.4.0/user-guide/control-panel/resource-manager.md new file mode 100644 index 00000000000..d9c56437193 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/resource-manager.md @@ -0,0 +1,26 @@ +--- +title: Resource Management +sidebar_position: 2 +--- + +On the resource management page, you can view historically started engines and manage the status of existing engine resources. + +## 1. History Engine + +In the historical engine column of resource management, users can see the status of their currently started engines, including the engine type, creator, and resource occupancy. At the same time, you can also filter based on keywords such as instance name, creation user, and engine type. + +![./media/image5.png](../images/history-engine.png) + +## 2. Engine log +Click the view log button on the right side of the historical engine to view the engine startup log. If the engine fails to start, you can also check the cause of the failure through the error log. +![./media/image5.png](../images/engine-view-log.png) +![./media/image5.png](../images/engine-log.png) + +## 3. Resource management +In the history engine bar of resource management, users can see the status of the engine they are currently starting and the resource usage, and they can also stop the engine through the page. +![./media/image5.png](../images/resource-management-interface.png) + +## 4. Admin view +For linkis computing console administrators, you can view all user engine resources by clicking the switch administrator view on the resource management page. +![./media/image5.png](../images/resource-management-button.png) +![./media/image5.png](../images/resource-management-administrator.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/spark-param.md b/versioned_docs/version-1.4.0/user-guide/control-panel/spark-param.md new file mode 100644 index 00000000000..d05d8943f09 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/spark-param.md @@ -0,0 +1,26 @@ +--- +title: Spark Engine Parameter Adjustment +sidebar_position: 4 +--- + +This article describes how to adjust the parameters of the Spark engine. + + +## 1. Adjust engine parameters + +Users can adjust Spark parameters on the management console according to their needs. Linkis management console == "parameter setting ==" select the corresponding application == "click the Spark engine to display the parameters that can be set by Spark. + +![](../images/set-spark-param.png) + +## 2. Increase engine execution speed + +If you want the engine to execute faster, you can adjust the number of executors. The more executor cores, the higher the execution efficiency. + +![](../images/executor-count.png) + +## 3. Driver handles big data + +If you need to pull large data and then process it with the Driver, you need to adjust the driver memory parameters. + +![](../images/executor-memory.png) + diff --git a/versioned_docs/version-1.4.0/user-guide/control-panel/udf-function.md b/versioned_docs/version-1.4.0/user-guide/control-panel/udf-function.md new file mode 100644 index 00000000000..1f82f71e8fc --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/control-panel/udf-function.md @@ -0,0 +1,174 @@ +--- +title: UDF Function +sidebar_position: 9 +--- + +## 1 Introduction to UDF +UDF: User Defined Function, user-defined function. In some scenarios, we need to use hive functions to process some data. Functions like count() and sum() are built-in. If we want to use some functions that are not built-in, we need to customize the function, which can be done by writing UDF. + +### 1.1 UDF function implementation + +The way to implement a UDF is relatively simple: just inherit the UDF class and rewrite the evaluate method. + +``` +public class HelloUDF extends UDF{ + public String evaluate(String str){ + try { + return "Hello " + str; + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + return "ERROR"; + } + } +``` + + +### 1.2 Several types of UDF + +- UDF function (can be used only after registration): + - UDF function of general type: refers to the UDF function that can be used by both hql of Hive and sql of Spark, and is generally compiled into a jar package + - Spark-type UDF functions: Spark-specific UDFs need to create corresponding scala/python scripts first, register through scala or python functions, and can also be used in sql after registration + +- Custom functions PythonUDF and ScalaUDF can only be used in the Spark engine + - python function, based on functions written in python + - Scala functions, functions written based on scala + + +## 2 UDF addition, deletion and modification +Click on the linkis management console: Home>>UDF Management +![](/Images/udf/udf_01.png) + + +There are two columns of "UDF Management" and "Function Management". In the Function Management column, there are general method functions, such as python and scala functions, which can be used like ordinary functions in scripts without registration. UDF needs It can only be used after registration. +![](/Images/udf/udf_02.png) + + +### 2.1 UDF new +Added UDF function of general type: + +You need to compile the corresponding Jar package first, and upload it to the workspace of the corresponding user (if you use the dss family bucket, you can upload it through scriptis, if you use linkis separately, you need to manually upload it to the corresponding directory) + +![](/Images/udf/udf_09.png) + +Click the Add UDF button. There are two types of UDFs that can be added. Select the "General" type and register through the jar package. The registration format needs to write the fully qualified class name of the UDF implementation class. + +![](/Images/udf/udf_03.png) + +For example, the fully qualified class name of UDFServiceImpl in the figure below is: org.apache.linkis.udf.service.impl.UDFServiceImpl + +![](../images/udf-cllass.png) + +Add the UDF function of Spark type: + +If you choose the "spark" type, select the defined scala or python function to register, and you need to write a scala or python type script for the custom function. It can also be used in sql after registration, similar to: select hello("abc"). + +Notice: +1. When registering, you should fill in the method name in the new script. +2. After adding udf, the corresponding jar package or script content will be uploaded to bml storage. If the resource is modified locally, it needs to be updated to take effect. + +![](/Images/udf/udf_04.png) + +### 2.2 UDF modification + +Click the edit button corresponding to udf. + +![](/Images/udf/udf_05.png) + + +If you need to update the content of the udf, you need to edit the udf and upload it again, and generate a new version of the udf. If the content of the script has not changed, but only modified other content such as the format used, only the information will be updated, and no new version will be generated. + +![](/Images/udf/udf_06.png) + +### 2.3 UDF deletion + +Click the delete button corresponding to the udf. Note: all versions of the udf will be deleted. + +![](/Images/udf/udf_07.png) + +## 3 UDF usage +If you want to make the UDF you created take effect and use it in the program, you need to load the UDF. The entry point of "loading"/"unloading" is: enter the UDF function on the left side of scriptis -> personal function, and the created UDFs are all in the personal function list. + +**Note 1: If you do not actively cancel the check on the page when adding a UDF, it will be checked and loaded by default. At this time, you need to kill the corresponding engine to start a new engine, so that the operation will take effect.** + +**Note 2: The operation of loading/unloading udf needs to kill the corresponding engine and start a new engine before the operation will take effect** + +Introduction to non-personal functions in the list: + +BDAP function: functions created by bdap for users, such as desensitization functions, etc. Note: The bdap function needs to be actively loaded before it can be used. + +System function: The default function of the system can be used in the code without loading by the user. + +Shared functions: functions shared to you by others, you need to load them to use them + +Expired function: It is also a shared function, but the sharer marked it as expired, which will not affect the use for the time being + +**Load udf from parameter `ids`** + +| parameter name | introduction | default| +|--------------------------- |------------------------------|---------| +|`linkis.user.udf.all.load` | load user's all selected udf | true | +|`linkis.user.udf.custom.ids`| udf ID list,split by `,` | - | + +example: + +```http request +POST /api/rest_j/v1/entrance/submit +Content-Type: application/json +Token-Code: dss-AUTH +Token-User: linkis + +{ + "executionContent": { + "code": "show databases", + "runType": "sql" + }, + "params": { + "configuration": { + "startup": { + "linkis.user.udf.all.load": false + "linkis.user.udf.custom.ids": "1,2,3" + } + } + }, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "linkis-IDE" + } +} +``` + +## 4 UDF sharing +Premise: The sharing function requires the user to be an administrator to use it, otherwise the front-end page will not provide an operation entry. + +Click the share button of udf: a content box will pop up, enter the list of users you want to share (comma-separated). + +Note: After being shared with others, the UDF needs to be actively loaded by others before it can be used. + + + +After sharing, the shared user can find it in the "Shared Function", and then use it after ticking and loading it. + +## 5 Other Function Introduction +### 5.1 UDF Handover + +If the user resigns, it may be necessary to hand over the personal udf to others. Click the transfer button, select your transfer object, and click OK. + + + +### 5.2 UDF expiration + +For a UDF shared with others, if it has been loaded by the sharing user, the UDF cannot be deleted directly, but the UDF can only be marked as expired. For the time being, it is only used for marking and does not affect the use. + +### 5.3 UDF version list + +Click the "version list" button of a udf to view all versions of the udf. For each version the following features are provided: + +Create a new version: copy the corresponding version to the latest version. + +Download: download the udf file from bml to the local. + +View source code: For python/scala script type, you can directly view the source code, jar type does not support it. + +Publish: Shared udf can be clicked to release a certain version, so that the version will take effect for the shared user. Note: The shared user uses the latest version of udf, and the individual user always uses the latest version. + diff --git a/versioned_docs/version-1.4.0/user-guide/datasource-client.md b/versioned_docs/version-1.4.0/user-guide/datasource-client.md new file mode 100644 index 00000000000..3a0a35865d2 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/datasource-client.md @@ -0,0 +1,145 @@ +--- +title: DataSource Client SDK +sidebar_position: 6 +--- + +> ``` +> Linkis DataSource provides a convenient interface for JAVA and SCALA calls, which can be used only by introducing the module of linkis-datasource-client +> ``` + +## 1. import dependent modules +``` + + org.apache.linkis + linkis-datasource-client + ${linkis.version} + +如: + + org.apache.linkis + linkis-datasource-client + 1.1.0 + +``` + +## 2. Scala Test Code +Create a Scala test class LinkisDataSourceClientTest, the specific interface meaning can be seen in the comments: +```java + +import com.fasterxml.jackson.databind.ObjectMapper +import org.apache.linkis.common.utils.JsonUtils +import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient} +import org.apache.linkis.datasource.client.request.{CreateDataSourceAction, GetAllDataSourceTypesAction, MetadataGetDatabasesAction, UpdateDataSourceParameterAction} +import org.apache.linkis.datasourcemanager.common.domain.{DataSource, DataSourceType} +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.{DWSClientConfig, DWSClientConfigBuilder} + +import java.io.StringWriter +import java.util +import java.util.concurrent.TimeUnit + + +object LinkisDataSourceClientTest { + + def main(args: Array[String]): Unit = { + val clientConfig =DWSClientConfigBuilder.newBuilder + .addServerUrl("http://127.0.0.1:9001") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connection timtout + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new StaticAuthenticationStrategy) //AuthenticationStrategy Linkis authen suppory static and Token + .setAuthTokenKey("hadoop") // set submit user + .setAuthTokenValue("xxx") // set passwd or token + .setDWSVersion("v1") //linkis rest version v1 + .build + //init datasource remote client + val dataSourceClient = new LinkisDataSourceRemoteClient(clientConfig) + //init metadata remote client + val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig) + //get all datasource type + testGetAllDataSourceTypes(dataSourceClient) + //create kafka datasource + testCreateDataSourceForKafka(dataSourceClient) + //create es datasource + testCreateDataSourceForEs(dataSourceClient) + //update datasource parameter for kafka + testUpdateDataSourceParameterForKafka(dataSourceClient) + //update datasource parameter for es + testUpdateDataSourceParameterForEs(dataSourceClient) + //get hive metadata database list + testMetadataGetDatabases(metaDataClient) + } + +def testGetAllDataSourceTypes(client:LinkisDataSourceRemoteClient): Unit ={ + val getAllDataSourceTypesResult = client.getAllDataSourceTypes(GetAllDataSourceTypesAction.builder().setUser("hadoop").build()).getAllDataSourceType + System.out.println(getAllDataSourceTypesResult) + } + +def testCreateDataSourceForKafka(client:LinkisDataSourceRemoteClient): Unit ={ + val dataSource = new DataSource(); + val dataSourceType = new DataSourceType + dataSourceType.setName("kafka") + dataSourceType.setId("2") + dataSourceType.setLayers(2) + dataSourceType.setClassifier("message queue") + dataSourceType.setDescription("kafka") + dataSource.setDataSourceType(dataSourceType) + dataSource.setDataSourceName("kafka-test") + dataSource.setCreateSystem("client") + dataSource.setDataSourceTypeId(2l); + + val dsJsonWriter = new StringWriter + + val mapper = new ObjectMapper + JsonUtils.jackson.writeValue(dsJsonWriter, dataSource) + val map = mapper.readValue(dsJsonWriter.toString,new util.HashMap[String,Any]().getClass) + val id = client.createDataSource(CreateDataSourceAction.builder().setUser("hadoop").addRequestPayloads(map).build()).getInsert_id + System.out.println(id) + + } + +def testCreateDataSourceForEs(client:LinkisDataSourceRemoteClient): Unit ={ + val dataSource = new DataSource(); + dataSource.setDataSourceName("es-test") + dataSource.setCreateSystem("client") + dataSource.setDataSourceTypeId(7l); + val dsJsonWriter = new StringWriter + val mapper = new ObjectMapper + JsonUtils.jackson.writeValue(dsJsonWriter, dataSource) + val map = mapper.readValue(dsJsonWriter.toString,new util.HashMap[String,Any]().getClass) + val id = client.createDataSource(CreateDataSourceAction.builder().setUser("hadoop").addRequestPayloads(map).build()).getInsert_id + System.out.println(id) + + } + +def testUpdateDataSourceParameterForKafka(client:LinkisDataSourceRemoteClient): Unit ={ + val params = new util.HashMap[String,Any]() + val connParams = new util.HashMap[String,Any]() + connParams.put("brokers","127.0.0.1:9092") + params.put("connectParams",connParams) + params.put("comment","kafka data source") + client.updateDataSourceParameter(UpdateDataSourceParameterAction.builder().setUser("hadoop").setDataSourceId("7").addRequestPayloads(params).build()) + } + +def testUpdateDataSourceParameterForEs(client:LinkisDataSourceRemoteClient): Unit ={ + val params = new util.HashMap[String,Any]() + val connParams = new util.HashMap[String,Any]() + val elasticUrls = new util.ArrayList[String]() + elasticUrls.add("http://127.0.0.1:9200") + connParams.put("elasticUrls",elasticUrls) + params.put("connectParams",connParams) + params.put("comment","es data source") + client.updateDataSourceParameter(UpdateDataSourceParameterAction.builder().setUser("hadoop").setDataSourceId("8").addRequestPayloads(params).build()) + } + + + def testMetadataGetDatabases(client:LinkisMetaDataRemoteClient): Unit ={ + client.getDatabases(MetadataGetDatabasesAction.builder().setUser("hadoop").setDataSourceId(9l).setUser("hadoop").setSystem("client").build()).getDbs + } +} +``` + diff --git a/versioned_docs/version-1.4.0/user-guide/datasource-manual.md b/versioned_docs/version-1.4.0/user-guide/datasource-manual.md new file mode 100644 index 00000000000..a8a1a30bab3 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/datasource-manual.md @@ -0,0 +1,533 @@ +--- +title: Data Source Manual +sidebar_position: 4 +--- + +> Introduce how to use the new feature function data source of version 1.1.0 + +## 1. Data source function introduction + +### 1.1 Concept + +- Data source: We call database services that can provide data storage as databases, such as mysql/hive/kafka. The data source defines the configuration information for connecting to the actual database. The configuration information is mainly the address required for connection and user authentication information , connection parameters, etc. Stored in the linkis_ps_dm_datasource_* table related to the linkis database +- Metadata: simply refers to the metadata of the database, which refers to the data that defines the data structure and the data of various object structures of the database. For example, the database name, table name, column name, field length, type and other information data in the database. + +### 1.2 Three main modules + +**linkis-datasource-client** +Client module, DataSourceRemoteClient for basic management of user data sources, and MetaDataRemoteClient for metadata query operations. + +**linkis-datasource-manager-server** +Data source management module, service name ps-data-source-manager. Perform basic management of data sources, and provide http interfaces such as adding, querying, modifying, and connection testing of external data sources. The rpc service is provided internally, which is convenient for the data element management module to call through rpc to query the necessary information needed to establish a connection to the database. + +- [http interface documentation](/api/http/linkis-ps-publicservice-api/data-source-manager-api.md) +- http interface class org.apache.linkis.metadatamanager.server.restful +- rpc interface class org.apache.linkis.metadatamanager.server.receiver + +**linkis-metedata-manager-server** +Data element management module, service name ps-metadatamanager. It provides the basic query function of the data metadata of the database, provides the http interface externally, and provides the rpc service internally, which is convenient for the data source management module to perform the connection test of the data source through the rpc call. +- [http interface documentation](/api/http/linkis-ps-publicservice-api/metadatamanager-api.md) +- http interface class org.apache.linkis.datasourcemanager.core.restful +- rpc interface class org.apache.linkis.datasourcemanager.core.receivers + + +### 1.3 Processing logic +#### 1.3.1 LinkisDataSourceRemoteClient +The functional structure diagram is as follows: +![datasource](/Images/deployment/datasource/datasource.png) + +- The LinkisDataSourceRemoteClient client assembles the http request according to the request parameters, +- HTTP request sent to linkis-ps-data-source-manager +- linkis-ps-data-source-manager will perform basic parameter verification, some interfaces can only be operated by the administrator role +- linkis-ps-data-source-manager performs basic data operations with the database +- The data source test connection interface provided by linkis-ps-data-source-manager internally uses rpc to call the ps-metadatamanager method for connection test +- The data result after the http request is processed will be mapped and converted from the result set to the entity class by annotating the DWSHttpMessageResult function + +LinkisDataSourceRemoteClient interface +- GetAllDataSourceTypesResult getAllDataSourceTypes(GetAllDataSourceTypesAction) Query all data source types +- QueryDataSourceEnvResult queryDataSourceEnv(QueryDataSourceEnvAction) Query the cluster configuration information that can be used by the data source +- GetInfoByDataSourceIdResult getInfoByDataSourceId(GetInfoByDataSourceIdAction): query data source information by data source id +- QueryDataSourceResult queryDataSource(QueryDataSourceAction) query data source information +- GetConnectParamsByDataSourceIdResult getConnectParams(GetConnectParamsByDataSourceIdAction) Get connection configuration parameters +- CreateDataSourceResult createDataSource(CreateDataSourceAction) to create a data source +- DataSourceTestConnectResult getDataSourceTestConnect(DataSourceTestConnectAction) to test whether the data source can be connected normally +- DeleteDataSourceResult deleteDataSource(DeleteDataSourceAction) deletes the data source +- ExpireDataSourceResult expireDataSource(ExpireDataSourceAction) sets the data source to expired state +- GetDataSourceVersionsResult getDataSourceVersions(GetDataSourceVersionsAction) Query the version list of the data source configuration +- PublishDataSourceVersionResult publishDataSourceVersion(PublishDataSourceVersionAction) publishes the data source configuration version +- UpdateDataSourceResult updateDataSource(UpdateDataSourceAction) to update the data source +- UpdateDataSourceParameterResult updateDataSourceParameter(UpdateDataSourceParameterAction) Update data source configuration parameters +- GetKeyTypeDatasourceResult getKeyDefinitionsByType(GetKeyTypeDatasourceAction) Query the configuration properties required by a data source type + + +#### 1.3.2 LinkisMetaDataRemoteClient +The functional structure diagram is as follows: +![metadata](/Images/deployment/datasource/metadata.png) + +- LinkisMetaDataRemoteClient client, according to the request parameters, assemble the http request, +- HTTP request sent to ps-metadatamanager +- ps-metadatamanager will perform basic parameter verification, +- The request will send an RPC request to linkis-ps-data-source-manager based on the parameter datasourceId to obtain the type of the data source, connection parameters such as username and password, etc. +- After getting the information required for the connection, load the lib package in the corresponding directory according to the data source type, and call the corresponding function method through the reflection mechanism to query the metadata information +- The data result after the http request is processed will be mapped and converted from the result set to the entity class by annotating the DWSHttpMessageResult function + +LinkisMetaDataRemoteClient interface +- MetadataGetDatabasesResult getDatabases(MetadataGetDatabasesAction) query database list +- MetadataGetTablesResult getTables(MetadataGetTablesAction) query table data +- MetadataGetTablePropsResult getTableProps(MetadataGetTablePropsAction) +- MetadataGetPartitionsResult getPartitions(MetadataGetPartitionsAction) query partition table +- MetadataGetColumnsResult getColumns(MetadataGetColumnsAction) query data table fields + +### 1.3 Source module directory structure +```shell script +linkis-public-enhancements/linkis-datasource + +├── linkis-datasource-client //client code +├── linkis-datasource-manager //Datasource management module +│ ├── common //Data source management common module +│ └── server //Data source management service module +├── linkis-metadata //Module existing in the old version, reserved +├── linkis-metadata-manager //Data Metadata Management Module +│ ├── common //Data element management common module +│ ├── server //Data element management service module +│ └── service //Supported data sources +│ ├── elasticsearch +│ ├── hive +│ ├── kafka +│ └── mysql + + +``` +### 1.4 Installation package directory structure + +```shell script +/lib/linkis-public-enhancements/ + +├── linkis-ps-data-source-manager +├── linkis-ps-metadatamanager +│ └── service +│ ├── elasticsearch +│ ├── hive +│ ├── kafka +│ └── mysql +``` + +`wds.linkis.server.mdm.service.lib.dir` controls the classpath loaded during reflection calls. The default value of the parameter is `/lib/linkis-public-enhancements/linkis-ps-metadatamanager/service` + +### 1.5 Configuration Parameters + +See [Tuning and Troubleshooting>Parameter List#datasourceConfiguration Parameters](/docs/1.1.0/tuning-and-troubleshooting/configuration#6-datasource-and-metadata-service-configuration-parameters) + +### 1.6 Installation extra data drivers + +1.Some data drivers require to be installed by user's self, because they are possibly not compatible with the Apache license + +2.Extra data driver directory: ./lib/linkis-public-enhancements/linkis-ps-publicservice + +3.Data drivers list + +| Driver Name | Driver Version | Download Link | +| ----------- | ----------- |----------- | +| db2 | db2jcc4 | https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads | +| dameng | DmJdbcDriver18 | https://download.dameng.com/eco/docs/JAVA_Mybatis_lib.zip | +| mysql | 5.1.34 | https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.34/mysql-connector-java-5.1.34.jar | +|kingbase| kingbase8 | http://maven.jeecg.org/nexus/content/repositories/jeecg/kingbase/kingbase8/8/kingbase8-8.jar | +|greenplum | 5.1.4 | https://network.pivotal.io/products/vmware-tanzu-greenplum#/releases/985537/file_groups/5749 | +| postgresql | 42.3.1 | https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.1/postgresql-42.3.1.jar| +| sqlserver | sqlserver2000 | https://www.microsoft.com/en-us/download/details.aspx?id=11774 | +| oracle | 11.2.0.3 | http://www.datanucleus.org/downloads/maven2/oracle/ojdbc6/11.2.0.3/ojdbc6-11.2.0.3.jar | + +## 2. Enable data source function + +In the startup script of linkis, the two services related to the data source (ps-data-source-manager, ps-metadatamanager) will not be started by default. +If you want to use the data source service, you can enable it in the following ways: +Modify `export ENABLE_METADATA_MANAGER=true` in `$LINKIS_CONF_DIR/linkis-env.sh` to true. +When the service is started and stopped through linkis-start-all.sh/linkis-stop-all.sh, the data source service will be started and stopped. + +Check whether the service starts normally through the eureka page + +![datasource eureka](/Images/deployment/datasource/eureka.png) + +:::caution note +- 1. Management of linkis The web version needs to be upgraded to version 1.1.0 to use the data source management page function on the linkis console. +- 2. At present, there are jar packages of mysql/hive/kafak/elasticsearch in the data source, but the kafak/elasticsearch data source has not been strictly tested, and the complete availability of functions is not guaranteed. +::: + +## 3. Use of data sources +The use of data sources is divided into three steps: +- step 1. Create data source/configure connection parameters +- step 2. Publish the data source and select the connection configuration version to use +- step 3. Data source usage, query metadata information +, hive/kafka/elasticsearch configuration is associated with the corresponding cluster environment configuration. + +### 3.1 Mysql data source +#### 3.1.1 Created through the management console +> You can only create configuration data sources, and test whether the data sources can be connected normally, and cannot directly query metadata + +Implement a JDBC generic module, and then choose any item mentioned below on the web UI. + +| Data Source | Link | +| ----------- |----------- | +| mysql | https://www.mysql.com | +| oracle | https://www.oracle.com/database/technologies | +| kingbase | https://www.kingbase.com.cn | +| postgresql | https://www.postgresql.org | +| sqlserver | https://www.microsoft.com/en-us/sql-server | +| db2 | https://www.ibm.com/products/db2/database | +| greenplum | https://greenplum.org | +| dm | https://dmdatabases.com | +| doris | https://doris.apache.org | +| clickhouse | https://clickhouse.com | + + +Take MySQL as an example: + +> Data Source Management > New Data Source > Select MySQL Type + +Enter relevant configuration information + +![create mysql](/Images/deployment/datasource/create_mysql.png) + +After the entry is successful, you can pass the connection test to verify whether the connection can be made normally + + +:::caution note +- The system to which the data source created through the management console belongs is Linkis +- After the creation is successful, it needs to be published (switching and selecting the configuration parameter version when publishing) before it can be used normally +::: + +Publishing of the configuration (using that configuration for the connection to the data source): + +Click on the version and then pop up the page to select the appropriate configuration to publish + +![publish](/Images/deployment/datasource/publish_version.png) + + +#### 3.1.2 Using the client + +scala code example: +```scala +package org.apache.linkis.datasource.client +import java.util +import java.util.concurrent.TimeUnit + +import org.apache.linkis.common.utils.JsonUtils +import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient} +import org.apache.linkis.datasource.client.request._ +import org.apache.linkis.datasource.client.response._ +import org.apache.linkis.datasourcemanager.common.domain.DataSource +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder +import org.junit.jupiter.api.{Disabled, Test} + +object TestMysqlClient { + + val gatewayUrl = "http://127.0.0.1:9001" + val clientConfig = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val dataSourceclient = new LinkisDataSourceRemoteClient(clientConfig.build()) + + val clientConfig2 = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig2.build()) + + @Test + @Disabled + def testCreateDataSourceMysql: Unit = { + val user = "hadoop" + val system = "Linkis" + + //create data source + val dataSource = new DataSource(); + val dataSourceName = "for-mysql-test" + dataSource.setDataSourceName(dataSourceName) + dataSource.setDataSourceDesc("this is for mysql test") + dataSource.setCreateSystem(system) + dataSource.setDataSourceTypeId(1L) + + val map = JsonUtils.jackson.readValue(JsonUtils.jackson.writeValueAsString(dataSource), new util.HashMap[String, Any]().getClass) + val createDataSourceAction: CreateDataSourceAction = CreateDataSourceAction.builder() + .setUser(user) + .addRequestPayloads(map) + .build() + val createDataSourceResult: CreateDataSourceResult = dataSourceclient.createDataSource(createDataSourceAction) + val dataSourceId = createDataSourceResult.getInsertId + + + // set connection parameters + val params = new util.HashMap[String, Any] + + val connectParams = new util.HashMap[String, Any] + connectParams.put("host", "127.0.0.1") + connectParams.put("port", "36000") + connectParams.put("username", "db username") + connectParams.put("password", "db password") + + params.put("connectParams", connectParams) + params.put("comment", "init") + + val updateParameterAction: UpdateDataSourceParameterAction = UpdateDataSourceParameterAction.builder() + .setUser(user) + .setDataSourceId(dataSourceId) + .addRequestPayloads(params) + .build() + val updateParameterResult: UpdateDataSourceParameterResult = dataSourceclient.updateDataSourceParameter(updateParameterAction) + + val version: Long = updateParameterResult.getVersion + + //publish configuration version + dataSourceclient.publishDataSourceVersion( + PublishDataSourceVersionAction.builder() + .setDataSourceId(dataSourceId) + .setUser(user) + .setVersion(version) + .build()) + + // use example + val metadataGetDatabasesAction: MetadataGetDatabasesAction = MetadataGetDatabasesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setSystem(system) + .build() + val metadataGetDatabasesResult: MetadataGetDatabasesResult = metaDataClient.getDatabases(metadataGetDatabasesAction) + + val metadataGetTablesAction: MetadataGetTablesAction = MetadataGetTablesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis") + .setSystem(system) + .build() + val metadataGetTablesResult: MetadataGetTablesResult = metaDataClient.getTables(metadataGetTablesAction) + + val metadataGetColumnsAction = MetadataGetColumnsAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis") + .setSystem(system) + .setTable("linkis_datasource") + .build() + val metadataGetColumnsResult: MetadataGetColumnsResult = metaDataClient.getColumns(metadataGetColumnsAction) + + } +} + +```` + +#### 3.1.3 JDBC EngineConn supported by Linkis +- MySQL +- Oracle +- KingBase +- PostgreSQL +- SQLServer +- DB2 +- Greenplum +- DM +- Doris +- ClickHouse +- TiDB +- Starrocks +- Gaussdb +- OceanBase + +### 3.2 Hive data source + +#### 3.2.1 Created through the management console + +> You can only create configuration data sources, and test whether the data sources can be connected normally, and cannot directly query metadata + +First need to configure the cluster environment information +Table `linkis_ps_dm_datasource_env` +```roomsql +INSERT INTO `linkis_ps_dm_datasource_env` +(`env_name`, `env_desc`, `datasource_type_id`, `parameter`, `create_user`, `modify_user`) +VALUES +('testEnv', 'Test Environment', 4, +'{\r\n "uris": "thrift://clustername:9083",\r\n "keytab": "4dd408ad-a2f9-4501-83b3-139290977ca2",\r\n "principle": "hadoop @WEBANK.COM",\r\n "hadoopConf":{"hive.metastore.execute.setugi":"true"}\r\n}', +'user','user'); +``` +The primary key id is used as the envId. When establishing a connection, you need to use this envId parameter to obtain information about the cluster configuration. +Explanation of configuration fields: +``` +{ + "uris": "thrift://clustername:9083", # Mandatory If kerberos authentication is not enabled, the following [keytab][principle] parameters can be empty + "keytab": "bml resource id", //keytab stores the resourceId in the material library, and currently needs to be manually uploaded through the http interface. + "principle": "hadoop@WEBANK.COM" //Authentication principle + "hadoopConf":{} //Additional connection parameters are optional +} +``` + +The resourceId acquisition method of keytab, the basic data management function is still under planning, and can be obtained through the http interface request +reference example +```shell script +curl --form "file=@file path" \ +--form system=subsystem name \ +-H "Token-Code: authentication token" \ +-H "Token-User: authentication user name" \ +http://linkis-gatewayip:port/api/rest_j/v1/bml/upload + +Example: +curl --form "file=@/appcom/keytab/hadoop.keytab" \ +--form system=ABCD \ +-H "Token-Code:QML-AUTH" \ +-H "Token-User:hadoop" \ +http://127.0.0.1:9001/api/rest_j/v1/bml/upload + +The resourceId in the request result is the corresponding `bml resource id` value +{"method":"/bml/upload","status":0,"message":"The task of submitting and uploading resources was successful","data":{"resourceId": "6e4e54fc-cc97-4d0d-8d5e-a311129ec84e","version":"v000001","taskId":35}} +``` + +Create on the web: + +![create_hive](/Images/deployment/datasource/create_hive.png) + +#### 3.2.2 Using the client +```scala +package org.apache.linkis.datasource.client + +import java.util +import java.util.concurrent.TimeUnit + +import org.apache.linkis.common.utils.JsonUtils +import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient} +import org.apache.linkis.datasource.client.request._ +import org.apache.linkis.datasource.client.response._ +import org.apache.linkis.datasourcemanager.common.domain.DataSource +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder +import org.junit.jupiter.api.{Disabled, Test} + +object TestHiveClient { + val gatewayUrl = "http://127.0.0.1:9001" + val clientConfig = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val dataSourceclient = new LinkisDataSourceRemoteClient(clientConfig.build()) + + val clientConfig2 = DWSClientConfigBuilder.newBuilder + .addServerUrl(gatewayUrl) + .connectionTimeout(30000) + .discoveryEnabled(false) + .discoveryFrequency(1, TimeUnit.MINUTES) + .loadbalancerEnabled(true) + .maxConnectionSize(1) + .retryEnabled(false) + .readTimeout(30000) + .setAuthenticationStrategy(new StaticAuthenticationStrategy) + .setAuthTokenKey("hadoop") + .setAuthTokenValue("xxxxx") + .setDWSVersion("v1") + + val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig2.build()) + + + @Test + @Disabled + def testCreateDataSourceMysql: Unit = { + val user = "hadoop" + val system = "Linkis" + + //create data source + val dataSource = new DataSource(); + val dataSourceName = "for-hive-test" + dataSource.setDataSourceName(dataSourceName) + dataSource.setDataSourceDesc("this is for hive test") + dataSource.setCreateSystem(system) + dataSource.setDataSourceTypeId(4L) + + val map = JsonUtils.jackson.readValue(JsonUtils.jackson.writeValueAsString(dataSource), new util.HashMap[String, Any]().getClass) + val createDataSourceAction: CreateDataSourceAction = CreateDataSourceAction.builder() + .setUser(user) + .addRequestPayloads(map) + .build() + val createDataSourceResult: CreateDataSourceResult = dataSourceclient.createDataSource(createDataSourceAction) + val dataSourceId = createDataSourceResult.getInsertId + + // set connection parameters + val params = new util.HashMap[String, Any] + val connectParams = new util.HashMap[String, Any] + connectParams.put("envId", "3") + params.put("connectParams", connectParams) + params.put("comment", "init") + + val updateParameterAction: UpdateDataSourceParameterAction = UpdateDataSourceParameterAction.builder() + .setUser(user) + .setDataSourceId(dataSourceId) + .addRequestPayloads(params) + .build() + val updateParameterResult: UpdateDataSourceParameterResult = dataSourceclient.updateDataSourceParameter(updateParameterAction) + + val version: Long = updateParameterResult.getVersion + + //publish configuration version + dataSourceclient.publishDataSourceVersion( + PublishDataSourceVersionAction.builder() + .setDataSourceId(dataSourceId) + .setUser(user) + .setVersion(version) + .build()) + + // use example + val metadataGetDatabasesAction: MetadataGetDatabasesAction = MetadataGetDatabasesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setSystem(system) + .build() + val metadataGetDatabasesResult: MetadataGetDatabasesResult = metaDataClient.getDatabases(metadataGetDatabasesAction) + + val metadataGetTablesAction: MetadataGetTablesAction = MetadataGetTablesAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis_test_ind") + .setSystem(system) + .build() + val metadataGetTablesResult: MetadataGetTablesResult = metaDataClient.getTables(metadataGetTablesAction) + + + + val metadataGetColumnsAction = MetadataGetColumnsAction.builder() + .setUser(user) + .setDataSourceName(dataSourceName) + .setDatabase("linkis_test_ind") + .setSystem(system) + .setTable("test") + .build() + val metadataGetColumnsResult: MetadataGetColumnsResult = metaDataClient.getColumns(metadataGetColumnsAction) + + } +} +``` diff --git a/versioned_docs/version-1.4.0/user-guide/dynamic-variables.md b/versioned_docs/version-1.4.0/user-guide/dynamic-variables.md new file mode 100644 index 00000000000..5ad0d6b4d29 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/dynamic-variables.md @@ -0,0 +1,342 @@ +--- +title: built-in time variable +sidebar_position: 7 +--- + +## 1. Overview +### need +1. The user hopes that Linkis can provide some public variables and then replace them during execution. For example, the user runs the same SQL in batches every day, and needs to specify the partition time of the previous day. Writing based on SQL will be more complicated if the system provides a run_date variable It will be very convenient to use. +2. The user hopes that Linkis supports date pattern calculation, supports writing variables such as &{YYYY-MM-DD} in the code to calculate time variables +3. The user wants to define variables by himself, such as setting a float variable, and then use it in the code + +### Target +1. Support variable replacement of task code +2. Support custom variables, support users to define custom variables in scripts and task parameters submitted to Linkis, support simple +, - and other calculations +3. Preset system variables: run_date, run_month, run_today and other system variables +4. Support date pattern variable, support +, - operation of pattern + +The specific technical architecture can refer to: +[Linkis Custom Variables](https://linkis.apache.org/docs/latest/architecture/commons/variable/) + +## 2 Custom variable function introduction +     The variable types supported by Linkis are divided into custom variables and system built-in variables. The internal variables are pre-defined by Linkis and can be used directly. Then different variable types support different calculation formats: String supports +, integers and decimals support +-*/, and dates support +-. + +### 2.1 Built-in variables +Currently supported built-in variables are as follows: +(The variable values in the following table take 20240229 in leap year as a special date as an example) + +| variable name | variable type | variable meaning | variable value example | +| ------ | -------- | -------- | ---------- | +| run\_date | String | Data statistics time (users can set it themselves, the default setting is the day before the current time), if you execute yesterday’s data today, it will be yesterday’s time, the format is yyyyMMdd | 20240229 | +| run\_date\_std | String | Data statistics time (standard date format), if yesterday’s data is executed today, it is yesterday’s time, the format is yyyy-MM-dd | 2024-02-29 | +| run_today | String | The day after run_date (data statistics time), the format is yyyyMMdd | 20240301 | +| run_today_std | String | The day after run_date (data statistics time) (standard format), the format is yyyy-MM-dd | 2024-03-01 | +| run_mon | String | The month of run_date, the format is yyyyMM | 202402 | +| run_mon_std | String | The month of run_date (standard format), the format is yyyy-MM | 2024-02 | +| run\_month\_begin | String | The first day of the month where the data statistics time is located, the format is yyyyMMdd | 20240201 | +| run\_month\_begin\_std | String | The first day of the month where run_date is located (standard date format), the format is yyyy-MM-dd | 2024-02-01 | +| run_month_now_begin | String | the first day of the previous month where run_today is located, the format is yyyyMMdd | 20240201 | +| run_month_now_begin_std | String | The first day of the previous month where run_today is located (standard format), the format is yyyy-MM-dd | 2024-02-01 | +| run\_month\_end | String | The last day of the month where run_date belongs, in the format of yyyyMMdd | 20240229 | +| run\_month\_end\_std | String | The last day of the month of run_date (standard date format), the format is yyyy-MM-dd | 2024-02-29 | +| run_month_now_end | String | the last day of the previous month where run_today is located, the format is yyyyMMdd | 20240229 | +| run_month_now_end_std | String | The last day of the previous month where run_today is located (standard date format), the format is yyyy-MM-dd | 2024-02-29 | +| run_quarter_begin | String | The first day of the quarter where run_date belongs, the format is yyyyMMdd | 20240101 | +| run_quarter_end | String | The last day of the quarter where run_date is located, in the format of yyyyMMdd | 20240331 | +| run_half_year_begin | String | The first day of the half year where run_date is located, the format is yyyyMMdd | 20240101 | +| run_half_year_end | String | The last day of the half year where run_date is located, the format is yyyyMMdd | 20240630 | +| run_year_begin | String | The first day of the year where run_date is located, the format is yyyyMMdd | 20240101 | +| run_year_end | String | The last day of the year where run_date is located, the format is yyyyMMdd | 20241231 | +| run_quarter_begin_std | String | The first day of the quarter where run_date belongs (standard format), the format is yyyy-MM-dd | 2024-01-01 | +| run_quarter_end_std | String | The last day of the quarter where run_date belongs (standard format), the format is yyyy-MM-dd | 2024-03-31 | +| run_half_year_begin_std | String | The first day of the half year where run_date is located (standard format), the format is yyyy-MM-dd | 2024-01-01 | +| run_half_year_end_std | String | The last day of the half year where run_date is located (standard format), the format is yyyy-MM-dd | 2024-06-30 | +| run_year_begin_std | String | The first day of the year where run_date is located (standard format), the format is yyyy-MM-dd | 2024-01-01 | +| run_year_end_std | String | The last day of the year of run_date (standard format), the format is yyyy-MM-dd | 2024-12-31 | +| run_tody_h | String | run_today task running time, yyyyMMddHH | 2024030111 | +| run_tody_h_std | String | The running time of the run_today task yyyy-MM-dd HH | 2024-03-01 11 | + +details: + +1. run_date is a date variable that comes with the core, and supports user-defined dates. If not specified, it defaults to the day before the current system time. +2. Definition of other derived built-in date variables: other date built-in variables are calculated relative to run_date. Once run_date changes, the values of other variables will also change automatically. Other date variables do not support setting initial values and can only be modified by modifying run_date . +3. The built-in variables support richer usage scenarios: ${run_date-1} is the day before run_data; ${run_month_begin-1} is the first day of the previous month of run_month_begin, where -1 means minus one month. + +Take sql as an example: +``` +--@set run_date=20240229 +select +"${run_date}" as run_date, +"${run_date_std}" as run_date_std, +"${run_today}" as run_today, +"${run_today_std}" as run_today_std, +"${run_mon}" as run_mon, +"${run_mon_std}" as run_mon_std, +"${run_month_begin}" as run_month_begin, +"${run_month_begin_std}" as run_month_begin_std, +"${run_month_now_begin}" as run_month_now_begin, +"${run_month_now_begin_std}" as run_month_now_begin_std, +"${run_month_end}" as run_month_end, +"${run_month_end_std}" as run_month_end_std, +"${run_month_now_end}" as run_month_now_end, +"${run_month_now_end_std}" as run_month_now_end_std, +"${run_quarter_begin}" as run_quarter_begin, +"${run_quarter_end}" as run_quarter_end, +"${run_half_year_begin}" as run_half_year_begin, +"${run_half_year_end}" as run_half_year_end, +"${run_year_begin}" as run_year_begin, +"${run_year_end}" as run_year_end, +"${run_quarter_begin_std}" as run_quarter_begin_std, +"${run_quarter_end_std}" as run_quarter_end_std, +"${run_half_year_begin_std}" as run_half_year_begin_std, +"${run_half_year_end_std}" as run_half_year_end_std, +"${run_year_begin_std}" as run_year_begin_std, +"${run_year_end_std}" as run_year_end_std, +"${run_today_h}" as run_tody_h, +"${run_today_h_std}" as run_tody_h_std + +Compile the replaced content: +select +"20240229" as run_date, +"2024-02-29" as run_date_std, +"20240301" as run_today, +"2024-03-01" as run_today_std, +"202402" as run_mon, +"2024-02" as run_mon_std, +"20240201" as run_month_begin, +"2024-02-01" as run_month_begin_std, +"20240201" as run_month_now_begin, +"2024-02-01" as run_month_now_begin_std, +"20240229" as run_month_end, +"2024-02-29" as run_month_end_std, +"20240229" as run_month_now_end, +"2024-02-29" as run_month_now_end_std, +"20240101" as run_quarter_begin, +"20240331" as run_quarter_end, +"20240101" as run_half_year_begin, +"20240630" as run_half_year_end, +"20240101" as run_year_begin, +"20241231" as run_year_end, +"2024-01-01" as run_quarter_begin_std, +"2024-03-31" as run_quarter_end_std, +"2024-01-01" as run_half_year_begin_std, +"2024-06-30" as run_half_year_end_std, +"2024-01-01" as run_year_begin_std, +"2024-12-31" as run_year_end_std, +"2024030111" as run_tody_h, +"2024-03-01 11" as run_tody_h_std + +``` + +### 2.2 Custom variables +     What are custom variables? User variables that are defined first and used later. User-defined variables temporarily support the definition of strings, integers, and floating-point variables. Strings support the + method, and integers and floating-point numbers support the +-*/ method. User-defined variables do not conflict with the set variable syntax supported by SparkSQL and HQL itself, but the same name is not allowed. How to define and use custom variables? as follows: +``` +## Defined in the code, specify before the task code +sql type definition method: +--@set f=20.1 +The python/Shell type is defined as follows: +#@set f=20.1 +Note: Only one line to define a variable is supported +``` +The use is directly used in the code through ```{varName expression}, such as ${f*2}``` + +### 2.3 Variable scope +Custom variables also have a scope in linkis, and the priority is that the variable defined in the script is greater than the Variable defined in the task parameter and greater than the built-in run_date variable. The task parameters are defined as follows: +``` +## restful +{ + "executionContent": {"code": "select \"${f-1}\";", "runType": "sql"}, + "params": { + "variable": {f: "20.1"}, + "configuration": { + "runtime": { + "linkis.openlookeng.url":"http://127.0.0.1:9090" + } + } + }, + "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.sql"}, + "labels": { + "engineType": "spark-2.4.3", + "userCreator": "hadoop-IDE" + } +} +## java SDK +JobSubmitAction. builder + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) //execute user + .setLabels(labels) + .setVariableMap(varMap) //setVar + .build +``` + +## 3. Date Pattern variable introduction + +### 3.1 Features + +* Support Pattern format time and users can specify it at will +* Pattern date variables are calculated relative to run_date +* Support ±y/±M/±d/±H etc. +* Among them, +- is to operate on the linkis built-in parameter run_date first, and then replace the pattern field before %. Non-Pattern characters do not support operation and replacement. + +Pattern format comparison table: + +Letter| Date or Time Component| Presentation| Examples +----- | ----- | ----- | ----- +G |Era designator |Text |AD +y |Year |Year |1996; 96 +Y |Week year |Year |2009; 09 +M |Month in year |Month| July; Jul; 07 +w |Week in year |Number |27 +W |Week in month |Number |2 +D |Day in year |Number| 189 +d |Day in month |Number |10 +F |Day of week in month| Number |2 +E |Day name in week |Text |Tuesday; Tue +u |Day number of week (1 = Monday, …, 7 = Sunday) |Number |1 +a |Am/pm marker |Text |PM +H |Hour in day (0-23) |Number| 0 +k |Hour in day (1-24)| Number |24 +K |Hour in am/pm (0-11)| Number |0 +h |Hour in am/pm (1-12) |Number |12 +m |Minute in hour |Number |30 +s |Second in minute |Number| 55 +S |Millisecond |Number |978 +z |Time zone |General time zone |Pacific Standard Time; PST; GMT-08:00 +Z |Time zone |RFC 822 time zone |-0800 +X |Time zone |ISO 8601 time zone |-08; -0800; -08:00 + + +### 3.2 Date Pattern variable example +You can define the parameters that need dynamic rendering according to your own preferences/business actual situation + +variable | result +--- | --- +&{yyyy-01-01} | 2021-01-01 +&{yyyy-01-01%-2y} | 2019-01-01 +&{yyyy-MM-01%-2M} | 2021-02-01 +&{yyyy-MM-dd%-2d} | 2021-03-31 +&{yyyy MM ----- HH%-1H} | 2021 04 ----- 14 +&{yyyyMMdd%-1d} | 20210401 +&{yyyyMM01%-1M} | 20210301 +&{HH%-1H} | 14 + +### 3.3 Date Pattern variable usage examples + +* Example 1: sql +```sql +SELECT * FROM hive.tmp.fund_nav_histories +WHERE dt <= DATE_FORMAT(DATE_ADD('day', -1, DATE(Date_parse('&{yyyyMMdd%-1d}', '%Y%m%d'))), '%Y%m%d') +``` +after rendering +```sql +SELECT * FROM hive.tmp.fund_nav_histories +WHERE dt <= DATE_FORMAT(DATE_ADD('day', -1, DATE(Date_parse('20220705', '%Y%m%d'))), '%Y%m%d') +``` + +* Example 2: shell +```shell +aws s3 ls s3://***/ads/tmp/dws_member_active_detail_d_20210601_20211231/pt=&{yyyyMMdd%-1d}/ +``` +after rendering +```shell +aws s3 ls s3://***/ads/tmp/dws_member_active_detail_d_20210601_20211231/pt=20220705/ +``` + +* Example 3: datax json +```json +{ + "job": { + "setting": { + "speed": { + "channel": 1 + } + }, + "content": [ + { + "reader": { + "name": "s3reader", + "parameter": { + "bucket": "**************", + "path": [ + "ads/tmp/ccass_tm_announcements/&{yyyyMMdd%-1d}/" + ], + "stored": "parquet", + "compression": "NONE", + "column": [ + { + "index": 0, + "type": "int" + }, + { + "index": 1, + "type": "string", + "constant": "&{yyyyMMdd%-1d}" + } + ] + } + }, + "writer": { + "name": "streamwriter", + "parameter": { + "print": true + } + } + } + ] + } +} +``` +after rendering +```json +{ + "job": { + "setting": { + "speed": { + "channel": 1 + } + }, + "content": [ + { + "reader": { + "name": "s3reader", + "parameter": { + "bucket": "**************", + "path": [ + "ads/tmp/ccass_tm_announcements/20220705/" + ], + "stored": "parquet", + "compression": "NONE", + "column": [ + { + "index": 0, + "type": "int" + }, + { + "index": 1, + "type": "string", + "constant": "20220705" + } + ] + } + }, + "writer": { + "name": "streamwriter", + "parameter": { + "print": true + } + } + } + ] + } +} +``` +* Example 4:python +```python +print(&{yyyyMMdd%-1d}) +``` +after rendering +``` + 20220705 +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/how-to-use.md b/versioned_docs/version-1.4.0/user-guide/how-to-use.md new file mode 100644 index 00000000000..49196f86809 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/how-to-use.md @@ -0,0 +1,34 @@ +--- +title: How to Use +sidebar_position: 1 +--- + +# How to use Linkis? + +        In order to meet the needs of different usage scenarios, Linkis provides a variety of usage and access methods, which can be summarized into three categories, namely Client-side use, Scriptis-side use, and DataSphere It is used on the Studio side, among which Scriptis and DataSphere Studio are the open source data analysis platforms of the WeBank Big Data Platform Room. Since these two projects are essentially compatible with Linkis, it is easiest to use Linkis through Scriptis and DataSphere Studio. + +## 1. Client side usage + +        If you need to connect to other applications on the basis of Linkis, you need to develop the interface provided by Linkis. Linkis provides a variety of client access interfaces. For detailed usage introduction, please refer to the following: +- [**Restful API Usage**](api/linkis-task-operator.md) +- [**JDBC API Usage**](api/jdbc-api.md) +- [**How ​​to use Java SDK**](../user-guide/sdk-manual.md) + +## 2. Scriptis uses Linkis + +        If you need to use Linkis to complete interactive online analysis and processing, and you do not need data analysis application tools such as workflow development, workflow scheduling, data services, etc., you can Install [**Scriptis**](https://github.com/WeBankFinTech/Scriptis) separately. For detailed installation tutorial, please refer to its corresponding installation and deployment documents. + +### 2.1. Use Scriptis to execute scripts + +        Currently Scriptis supports submitting a variety of task types to Linkis, including Spark SQL, Hive SQL, Scala, PythonSpark, etc. In order to meet the needs of data analysis, the left side of Scriptis, Provides viewing user workspace information, user database and table information, user-defined functions, and HDFS directories. It also supports uploading and downloading, result set exporting and other functions. Scriptis is very simple to use Linkis, you can easily write scripts in the edit bar, and submit them to Linkis to run. +![Scriptis uses Linkis](/Images/manual/sparksql_run.png) + +### 2.2. Scriptis Management Console + +        Linkis provides an interface for resource configuration and management. If you want to configure and manage task resources, you can set it on the Scriptis management console interface, including queue settings and resource configuration , The number of engine instances, etc. Through the management console, you can easily configure the resources for submitting tasks to Linkis, making it more convenient and faster. +![Scriptis uses Linkis](/Images/manual/queue_set.png) + +## 3. DataSphere Studio uses Linkis + +        [**DataSphere Studio**](https://github.com/WeBankFinTech/DataSphereStudio), referred to as DSS, is an open source part of WeBank’s big data platform Station-type data analysis and processing platform, the DSS interactive analysis module integrates Scriptis. Using DSS for interactive analysis is the same as Scriptis. In addition to providing the basic functions of Scriptis, DSS provides and integrates richer and more powerful data analysis functions, including Data services for data extraction, workflow for developing reports, visual analysis software Visualis, etc. Due to native support, DSS is currently the most integrated software with Linkis. If you want to use the complete Linkis function, it is recommended to use DSS with Linkis. +![DSS Run Workflow](/Images/manual/workflow.png) \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/images/add-app.png b/versioned_docs/version-1.4.0/user-guide/images/add-app.png new file mode 100644 index 00000000000..1e1d76878f9 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/add-app.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/add-engine-btn.png b/versioned_docs/version-1.4.0/user-guide/images/add-engine-btn.png new file mode 100644 index 00000000000..a30b0402749 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/add-engine-btn.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/add-engine.png b/versioned_docs/version-1.4.0/user-guide/images/add-engine.png new file mode 100644 index 00000000000..1e1d76878f9 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/add-engine.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/add-spark-engine.png b/versioned_docs/version-1.4.0/user-guide/images/add-spark-engine.png new file mode 100644 index 00000000000..a30b0402749 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/add-spark-engine.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/administrator-view.png b/versioned_docs/version-1.4.0/user-guide/images/administrator-view.png new file mode 100644 index 00000000000..358141860d1 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/administrator-view.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/basic-bml.png b/versioned_docs/version-1.4.0/user-guide/images/basic-bml.png new file mode 100644 index 00000000000..2048081c08a Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/basic-bml.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/basic-code.png b/versioned_docs/version-1.4.0/user-guide/images/basic-code.png new file mode 100644 index 00000000000..2048081c08a Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/basic-code.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/basic-ext.png b/versioned_docs/version-1.4.0/user-guide/images/basic-ext.png new file mode 100644 index 00000000000..2048081c08a Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/basic-ext.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/basic-token.png b/versioned_docs/version-1.4.0/user-guide/images/basic-token.png new file mode 100644 index 00000000000..2048081c08a Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/basic-token.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/click-yarn.png b/versioned_docs/version-1.4.0/user-guide/images/click-yarn.png new file mode 100644 index 00000000000..2048081c08a Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/click-yarn.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/datasource-manage.png b/versioned_docs/version-1.4.0/user-guide/images/datasource-manage.png new file mode 100644 index 00000000000..2048081c08a Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/datasource-manage.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/del-app.png b/versioned_docs/version-1.4.0/user-guide/images/del-app.png new file mode 100644 index 00000000000..eff51a267d6 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/del-app.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/deque-resource.png b/versioned_docs/version-1.4.0/user-guide/images/deque-resource.png new file mode 100644 index 00000000000..5a8e4db4522 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/deque-resource.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/ds-auth.png b/versioned_docs/version-1.4.0/user-guide/images/ds-auth.png new file mode 100644 index 00000000000..bad9bf2f8c2 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/ds-auth.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/ds-class.png b/versioned_docs/version-1.4.0/user-guide/images/ds-class.png new file mode 100644 index 00000000000..f939d8374e2 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/ds-class.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/ecm-btn.png b/versioned_docs/version-1.4.0/user-guide/images/ecm-btn.png new file mode 100644 index 00000000000..5b7a12bb8ec Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/ecm-btn.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/ecm-engine-label.png b/versioned_docs/version-1.4.0/user-guide/images/ecm-engine-label.png new file mode 100644 index 00000000000..585bb97d626 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/ecm-engine-label.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/ecm-engine.png b/versioned_docs/version-1.4.0/user-guide/images/ecm-engine.png new file mode 100644 index 00000000000..5b7a12bb8ec Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/ecm-engine.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/ecm-management.png b/versioned_docs/version-1.4.0/user-guide/images/ecm-management.png new file mode 100644 index 00000000000..8b058310a80 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/ecm-management.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/edit-label.png b/versioned_docs/version-1.4.0/user-guide/images/edit-label.png new file mode 100644 index 00000000000..d82d84d8712 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/edit-label.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/engine-conf.png b/versioned_docs/version-1.4.0/user-guide/images/engine-conf.png new file mode 100644 index 00000000000..2392beeb2bd Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/engine-conf.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/engine-log.png b/versioned_docs/version-1.4.0/user-guide/images/engine-log.png new file mode 100644 index 00000000000..ba2ef8c08ba Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/engine-log.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/engine-memory.png b/versioned_docs/version-1.4.0/user-guide/images/engine-memory.png new file mode 100644 index 00000000000..f05f485bcb9 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/engine-memory.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/engine-view-log.png b/versioned_docs/version-1.4.0/user-guide/images/engine-view-log.png new file mode 100644 index 00000000000..7f58733348d Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/engine-view-log.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/env-edit.png b/versioned_docs/version-1.4.0/user-guide/images/env-edit.png new file mode 100644 index 00000000000..227842ab553 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/env-edit.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/env-list.png b/versioned_docs/version-1.4.0/user-guide/images/env-list.png new file mode 100644 index 00000000000..9882cab50dc Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/env-list.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/eureka-btn.png b/versioned_docs/version-1.4.0/user-guide/images/eureka-btn.png new file mode 100644 index 00000000000..32c8d5a2fb3 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/eureka-btn.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/eureka.png b/versioned_docs/version-1.4.0/user-guide/images/eureka.png new file mode 100644 index 00000000000..dc2a5f6b83c Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/eureka.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/executor-count.png b/versioned_docs/version-1.4.0/user-guide/images/executor-count.png new file mode 100644 index 00000000000..3678cc96c07 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/executor-count.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/executor-memory.png b/versioned_docs/version-1.4.0/user-guide/images/executor-memory.png new file mode 100644 index 00000000000..0a74604873c Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/executor-memory.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/global-con.png b/versioned_docs/version-1.4.0/user-guide/images/global-con.png new file mode 100644 index 00000000000..29653ababd8 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/global-con.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/global-conf.png b/versioned_docs/version-1.4.0/user-guide/images/global-conf.png new file mode 100644 index 00000000000..76d2383a7a6 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/global-conf.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/global-core.png b/versioned_docs/version-1.4.0/user-guide/images/global-core.png new file mode 100644 index 00000000000..1c3c756c558 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/global-core.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/global-cpu.png b/versioned_docs/version-1.4.0/user-guide/images/global-cpu.png new file mode 100644 index 00000000000..c748930c115 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/global-cpu.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/global-history-interface.png b/versioned_docs/version-1.4.0/user-guide/images/global-history-interface.png new file mode 100644 index 00000000000..45fca7c12b4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/global-history-interface.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/global-limit.png b/versioned_docs/version-1.4.0/user-guide/images/global-limit.png new file mode 100644 index 00000000000..b90c53b99cc Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/global-limit.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/global-var.png b/versioned_docs/version-1.4.0/user-guide/images/global-var.png new file mode 100644 index 00000000000..ed6d93a0fc7 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/global-var.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/history-engine.png b/versioned_docs/version-1.4.0/user-guide/images/history-engine.png new file mode 100644 index 00000000000..e1b336c4dad Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/history-engine.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/history-query-button.png b/versioned_docs/version-1.4.0/user-guide/images/history-query-button.png new file mode 100644 index 00000000000..ba1c557c255 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/history-query-button.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/hive-con.png b/versioned_docs/version-1.4.0/user-guide/images/hive-con.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/hive-con.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/list-app.png b/versioned_docs/version-1.4.0/user-guide/images/list-app.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/list-app.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/microservice-list.png b/versioned_docs/version-1.4.0/user-guide/images/microservice-list.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/microservice-list.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/ms-edit.png b/versioned_docs/version-1.4.0/user-guide/images/ms-edit.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/ms-edit.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/resource-management-administrator.png b/versioned_docs/version-1.4.0/user-guide/images/resource-management-administrator.png new file mode 100644 index 00000000000..0dd0d955284 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/resource-management-administrator.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/resource-management-button.png b/versioned_docs/version-1.4.0/user-guide/images/resource-management-button.png new file mode 100644 index 00000000000..3f5ef516164 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/resource-management-button.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/resource-management-interface.png b/versioned_docs/version-1.4.0/user-guide/images/resource-management-interface.png new file mode 100644 index 00000000000..0dd0d955284 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/resource-management-interface.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/set-spark-param.png b/versioned_docs/version-1.4.0/user-guide/images/set-spark-param.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/set-spark-param.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/spark-con.png b/versioned_docs/version-1.4.0/user-guide/images/spark-con.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/spark-con.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/spark-resource.png b/versioned_docs/version-1.4.0/user-guide/images/spark-resource.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/spark-resource.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/task-execution-log.png b/versioned_docs/version-1.4.0/user-guide/images/task-execution-log.png new file mode 100644 index 00000000000..68a2452a686 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/task-execution-log.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/udf-cllass.png b/versioned_docs/version-1.4.0/user-guide/images/udf-cllass.png new file mode 100644 index 00000000000..91956c33a07 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/udf-cllass.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/yarn-cpu.png b/versioned_docs/version-1.4.0/user-guide/images/yarn-cpu.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/yarn-cpu.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/yarn-deque.png b/versioned_docs/version-1.4.0/user-guide/images/yarn-deque.png new file mode 100644 index 00000000000..f73920afe28 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/yarn-deque.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/yarn-instance.png b/versioned_docs/version-1.4.0/user-guide/images/yarn-instance.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/yarn-instance.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/images/yarn-write.png b/versioned_docs/version-1.4.0/user-guide/images/yarn-write.png new file mode 100644 index 00000000000..330eee417c4 Binary files /dev/null and b/versioned_docs/version-1.4.0/user-guide/images/yarn-write.png differ diff --git a/versioned_docs/version-1.4.0/user-guide/linkiscli-manual.md b/versioned_docs/version-1.4.0/user-guide/linkiscli-manual.md new file mode 100644 index 00000000000..928e1b0afd4 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/linkiscli-manual.md @@ -0,0 +1,194 @@ +--- +title: Shell Scripts Manual +sidebar_position: 2 +--- + +## 1.Introduction + +Linkis-Cli is a shell command line program used to submit tasks to Linkis. + +## 2.Basic case + +You can simply submit a task to Linkis by referring to the example below + +The first step is to check whether the default configuration file `linkis-cli.properties` exists in the conf/ directory, and it contains the following configuration: + +```properties + wds.linkis.client.common.gatewayUrl=http://127.0.0.1:9001 + wds.linkis.client.common.authStrategy=token + wds.linkis.client.common.tokenKey=Validation-Code + wds.linkis.client.common.tokenValue=BML-AUTH +``` + +The second step is to enter the linkis installation directory and enter the command: + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop +``` + +In the third step, you will see the information on the console that the task has been submitted to linkis and started to execute. + +Linkis-cli currently only supports synchronous submission, that is, after submitting a task to linkis, it will continue to inquire about the task status and pull task logs until the task ends. If the status is successful at the end of the task, linkis-cli will also actively pull the result set and output it. + + +## 3.How to use + +```bash + sh ./bin/linkis-cli [parameter] [cli parameter] +``` + +## 4.Supported parameter list + +* cli parameters + + | Parameter | Description | Data Type | Is Required | + | ----------- | -------------------------- | -------- |- --- | + | --gwUrl | Manually specify the linkis gateway address | String | No | + | --authStg | Specify authentication policy | String | No | + | --authKey | Specify authentication key | String | No | + | --authVal | Specify authentication value | String | No | + | --userConf | Specify the configuration file location | String | No | + +* Parameters + + | Parameter | Description | Data Type | Is Required | + | ----------- | -------------------------- | -------- |- --- | + | -engType | Engine Type | String | Yes | + | -runType | Execution Type | String | Yes | + | -code | Execution code | String | No | + | -codePath | Local execution code file path | String | No | + | -smtUsr | Specify the submitting user | String | No | + | -pxyUsr | Specify the execution user | String | No | + | -creator | Specify creator | String | No | + | -scriptPath | scriptPath | String | No | + | -outPath | Path of output result set to file | String | No | + | -confMap | configuration map | Map | No | + | -varMap | variable map for variable substitution | Map | No | + | -labelMap | linkis labelMap | Map | No | + | -sourceMap | Specify linkis sourceMap | Map | No | + + +## 5.Detailed example + +### 5.1 add cli parameters + +Cli parameters can be passed in manually specified, this way will overwrite the conflicting configuration items in the default configuration file + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop --gwUrl http://127.0.0.1:9001- -authStg token --authKey [tokenKey] --authVal [tokenValue] +``` + +### 5.2 add engine initial parameters + +The initial parameters of the engine can be added through the `-confMap` parameter. Note that the data type of the parameter is Map. The input format of the command line is as follows: + + -confMap key1=val1,key2=val2,... + +For example: the following example sets startup parameters such as the yarn queue for engine startup and the number of spark executors: + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -confMap wds.linkis.yarnqueue=q02,spark.executor.instances=3 -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop +``` + +Of course, these parameters can also be read in a configuration file, we will talk about it later + +### 5.3 add tags + +Labels can be added through the `-labelMap` parameter. Like the `-confMap`, the type of the `-labelMap` parameter is also Map: + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -labelMap labelKey=labelVal -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop +``` + +### 5.4 variable replacement + +Linkis-cli variable substitution is realized by `${}` symbol and `-varMap` + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select count(*) from \${key};" -varMap key=testdb.test -submitUser hadoop -proxyUser hadoop +``` + +During execution, the sql statement will be replaced with: + +```mysql-sql + select count(*) from testdb.test +``` + +Note that the escape character in `'\$'` is to prevent the parameter from being parsed in advance by linux. If `-codePath` specifies the local script mode, the escape character is not required + +### 5.5 use user configuration + +1. linkis-cli supports loading user-defined configuration files, the configuration file path is specified by the `--userConf` parameter, and the configuration file needs to be in the file format of `.properties` + +```bash + sh ./bin/linkis-cli -engineType spark-2.4.3 -codeType sql -code "select count(*) from testdb.test;" -submitUser hadoop -proxyUser hadoop --userConf [configuration file path] +``` + + +2. Which parameters can be configured? + +All parameters can be configured, for example: + +cli parameters: + +```properties + wds.linkis.client.common.gatewayUrl=http://127.0.0.1:9001 + wds.linkis.client.common.authStrategy=static + wds.linkis.client.common.tokenKey=[tokenKey] + wds.linkis.client.common.tokenValue=[tokenValue] +``` + +parameter: + +```properties + wds.linkis.client.label.engineType=spark-2.4.3 + wds.linkis.client.label.codeType=sql +``` + +When the Map class parameters are configured, the format of the key is + + [Map prefix] + [key] + +The Map prefix includes: + + - ExecutionMap prefix: wds.linkis.client.exec + - sourceMap prefix: wds.linkis.client.source + - ConfigurationMap prefix: wds.linkis.client.param.conf + - runtimeMap prefix: wds.linkis.client.param.runtime + - labelMap prefix: wds.linkis.client.label + +Note: + +1. variableMap does not support configuration + +2. When there is a conflict between the configured key and the key entered in the command parameter, the priority is as follows: + + Instruction Parameters> Key in Instruction Map Type Parameters> User Configuration> Default Configuration + +Example: + +Configure engine startup parameters: + +```properties + wds.linkis.client.param.conf.spark.executor.instances=3 + wds.linkis.client.param.conf.wds.linkis.yarnqueue=q02 +``` + +Configure labelMap parameters: + +```properties + wds.linkis.client.label.myLabel=label123 +``` + +### 5.6 output result set to file + +Use the `-outPath` parameter to specify an output directory, linkis-cli will output the result set to a file, and each result set will automatically create a file. The output format is as follows: +``` + task-[taskId]-result-[idx].txt +``` +E.g: +``` + task-906-result-1.txt + task-906-result-2.txt + task-906-result-3.txt +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/sdk-manual.md b/versioned_docs/version-1.4.0/user-guide/sdk-manual.md new file mode 100644 index 00000000000..d7313438418 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/sdk-manual.md @@ -0,0 +1,518 @@ +--- +title: Linkis SDK Manual +sidebar_position: 3 +--- + +> Linkis provides a convenient interface for JAVA and SCALA calls. You only need to import the linkis-computation-client module to use it. After 1.0, it supports the method of submitting with Label. The following will introduce the way to use the SDK. + + +**Engine version and script type supported by Linkis** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Engine pluginDefault supported versionsScript typeType Description
Spark2.4.3pypython script
scalascala script
sqlsql script
Hive2.3.3hqlhql script
Pythonpython2pythonpython script
Shell1shellshell script
JDBC4jdbcsql script name
Flink1.12.2sqlsql script
openLooKeng1.5.0sqlsql script
Pipeline1pipelineFile import and export
Presto0.234psqlsql script
Sqoop1.4.6appconnFile import and export
Elasticsearch7.6.2esjsonjson script
essqlsql script
trino371tsqlsql script
+ + +**Linkis common label** + +|label key|label value|description| +|:-|:-|:-| +|engineType| spark-2.4.3 | the engine type and version | +|userCreator| user + "-AppName" | the running user and your AppName | +|codeType| sql | script type| +|jobRunningTimeout| 10 | If the job does not finish for 10s, it will automatically initiate Kill. The unit is s | +|jobQueuingTimeout| 10|If the job queue exceeds 10s and fails to complete, Kill will be automatically initiated. The unit is s| +|jobRetryTimeout| 10000| The waiting time for a job to fail due to resources or other reasons is ms. If a job fails due to insufficient queue resources, the retry is initiated 10 times by default | +|tenant| hduser02| tenant label | + +## 1. Import dependent modules +``` + + org.apache.linkis + linkis-computation-client + ${linkis.version} + +``` + +## 2. Java test code +Create a Java test class LinkisClientTest, the specific interface meaning can be found in the notes: + +```java +package org.apache.linkis.client.test; + +import org.apache.linkis.common.utils.Utils; +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy; +import org.apache.linkis.httpclient.dws.config.DWSClientConfig; +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder; +import org.apache.linkis.manager.label.constant.LabelKeyConstant; +import org.apache.linkis.protocol.constants.TaskConstant; +import org.apache.linkis.ujes.client.UJESClient; +import org.apache.linkis.ujes.client.UJESClientImpl; +import org.apache.linkis.ujes.client.request.JobSubmitAction; +import org.apache.linkis.ujes.client.request.JobExecuteAction; +import org.apache.linkis.ujes.client.request.ResultSetAction; +import org.apache.linkis.ujes.client.response.*; +import org.apache.commons.io.IOUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class LinkisClientTest { + + // 1. build config: linkis gateway url + private static DWSClientConfig clientConfig = ((DWSClientConfigBuilder) (DWSClientConfigBuilder.newBuilder() + .addServerUrl("http://127.0.0.1:9001/") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connectionTimeOut + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy Linkis authen suppory static and Token + .setAuthTokenKey("hadoop") // set submit user + .setAuthTokenValue("123456"))) // set passwd or token (setAuthTokenValue("test")) + .setDWSVersion("v1") //linkis rest version v1 + .build(); + + // 2. new Client(Linkis Client) by clientConfig + private static UJESClient client = new UJESClientImpl(clientConfig); + + public static void main(String[] args) { + // The user needs to be consistent with the value of AuthTokenKey + String user = "hadoop"; + String executeCode = "df=spark.sql(\"show tables\")\n" + + "show(df)"; // code support:sql/hql/py/scala + try { + + System.out.println("user : " + user + ", code : [" + executeCode + "]"); + // 3. build job and execute + JobExecuteResult jobExecuteResult = toSubmit(user, executeCode); + System.out.println("execId: " + jobExecuteResult.getExecID() + ", taskId: " + jobExecuteResult.taskID()); + // 4. get job info + JobInfoResult jobInfoResult = client.getJobInfo(jobExecuteResult); + int sleepTimeMills = 1000; + int logFromLen = 0; + int logSize = 100; + while (!jobInfoResult.isCompleted()) { + // 5. get progress and log + JobProgressResult progress = client.progress(jobExecuteResult); + System.out.println("progress: " + progress.getProgress()); + JobLogResult logRes = client.log(jobExecuteResult, logFromLen, logSize); + logFromLen = logRes.fromLine(); + // 0: info 1: warn 2: error 3: all + System.out.println(logRes.log().get(3)); + Utils.sleepQuietly(sleepTimeMills); + jobInfoResult = client.getJobInfo(jobExecuteResult); + } + + JobInfoResult jobInfo = client.getJobInfo(jobExecuteResult); + // 6. Get the result set list (if the user submits multiple SQLs at a time, + // multiple result sets will be generated) + String resultSet = jobInfo.getResultSetList(client)[0]; + // 7. get resultContent + ResultSetResult resultSetResult = client.resultSet(ResultSetAction.builder().setPath(resultSet).setUser(jobExecuteResult.getUser()).build()); + System.out.println("metadata: " + resultSetResult.getMetadata()); // column name type + System.out.println("res: " + resultSetResult.getFileContent()); //row data + } catch (Exception e) { + e.printStackTrace();// please use log + IOUtils.closeQuietly(client); + } + IOUtils.closeQuietly(client); + } + + + private static JobExecuteResult toSubmit(String user, String code) { + // 1. build params + // set label map :EngineTypeLabel/UserCreatorLabel/EngineRunTypeLabel/Tenant + Map labels = new HashMap(); + labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-2.4.3"); // required engineType Label + labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, user + "-APPName");// required execute user and creator eg:hadoop-IDE + labels.put(LabelKeyConstant.CODE_TYPE_KEY, "py"); // required codeType + // set start up map :engineConn start params + Map startupMap = new HashMap(16); + // Support setting engine native parameters,For example: parameters of engines such as spark/hive + startupMap.put("spark.executor.instances", 2); + // setting linkis params + startupMap.put("wds.linkis.rm.yarnqueue", "dws"); + + // 2. build jobSubmitAction + JobSubmitAction jobSubmitAction = JobSubmitAction.builder() + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) // execute user + .setLabels(labels) . + .build(); + // 3. to execute + return client.submit(jobSubmitAction); + } +} +``` +Run the above code to complete task submission/execution/log/result set acquisition, etc. + +## 3. Scala test code + +```java +package org.apache.linkis.client.test + +import org.apache.commons.io.IOUtils +import org.apache.commons.lang3.StringUtils +import org.apache.linkis.common.utils.Utils +import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy +import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder +import org.apache.linkis.manager.label.constant.LabelKeyConstant +import org.apache.linkis.ujes.client.request._ +import org.apache.linkis.ujes.client.response._ +import java.util +import java.util.concurrent.TimeUnit + +import org.apache.linkis.ujes.client.UJESClient + +object LinkisClientTest { + // 1. build config: linkis gateway url + val clientConfig = DWSClientConfigBuilder.newBuilder() + .addServerUrl("http://127.0.0.1:9001/") //set linkis-mg-gateway url: http://{ip}:{port} + .connectionTimeout(30000) //connectionTimeOut + .discoveryEnabled(false) //disable discovery + .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency + .loadbalancerEnabled(true) // enable loadbalance + .maxConnectionSize(5) // set max Connection + .retryEnabled(false) // set retry + .readTimeout(30000) //set read timeout + .setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy Linkis authen suppory static and Token + .setAuthTokenKey("hadoop") // set submit user + .setAuthTokenValue("hadoop") // set passwd or token (setAuthTokenValue("BML-AUTH")) + .setDWSVersion("v1") //link rest version v1 + .build(); + + // 2. new Client(Linkis Client) by clientConfig + val client = UJESClient(clientConfig) + + def main(args: Array[String]): Unit = { + val user = "hadoop" // execute user user needs to be consistent with the value of AuthTokenKey + val executeCode = "df=spark.sql(\"show tables\")\n" + + "show(df)"; // code support:sql/hql/py/scala + try { + // 3. build job and execute + println("user : " + user + ", code : [" + executeCode + "]") + // It is recommended to use submit, which supports the transfer of task labels + val jobExecuteResult = toSubmit(user, executeCode) + println("execId: " + jobExecuteResult.getExecID + ", taskId: " + jobExecuteResult.taskID) + // 4. get job info + var jobInfoResult = client.getJobInfo(jobExecuteResult) + var logFromLen = 0 + val logSize = 100 + val sleepTimeMills: Int = 1000 + while (!jobInfoResult.isCompleted) { + // 5. get progress and log + val progress = client.progress(jobExecuteResult) + println("progress: " + progress.getProgress) + val logObj = client.log(jobExecuteResult, logFromLen, logSize) + logFromLen = logObj.fromLine + val logArray = logObj.getLog + // 0: info 1: warn 2: error 3: all + if (logArray != null && logArray.size >= 4 && StringUtils.isNotEmpty(logArray.get(3))) { + println(s"log: ${logArray.get(3)}") + } + Utils.sleepQuietly(sleepTimeMills) + jobInfoResult = client.getJobInfo(jobExecuteResult) + } + if (!jobInfoResult.isSucceed) { + println("Failed to execute job: " + jobInfoResult.getMessage) + throw new Exception(jobInfoResult.getMessage) + } + + // 6. Get the result set list (if the user submits multiple SQLs at a time, + // multiple result sets will be generated) + val jobInfo = client.getJobInfo(jobExecuteResult) + val resultSetList = jobInfoResult.getResultSetList(client) + println("All result set list:") + resultSetList.foreach(println) + val oneResultSet = jobInfo.getResultSetList(client).head + // 7. get resultContent + val resultSetResult: ResultSetResult = client.resultSet(ResultSetAction.builder.setPath(oneResultSet).setUser(jobExecuteResult.getUser).build) + println("metadata: " + resultSetResult.getMetadata) // column name type + println("res: " + resultSetResult.getFileContent) //row data + } catch { + case e: Exception => { + e.printStackTrace() //please use log + } + } + IOUtils.closeQuietly(client) + } + + + def toSubmit(user: String, code: String): JobExecuteResult = { + // 1. build params + // set label map :EngineTypeLabel/UserCreatorLabel/EngineRunTypeLabel/Tenant + val labels: util.Map[String, AnyRef] = new util.HashMap[String, AnyRef] + labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "spark-2.4.3"); // required engineType Label + labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, user + "-APPName"); // The requested user and application name, both parameters must be missing, where APPName cannot contain "-", it is recommended to replace it with "_" + labels.put(LabelKeyConstant.CODE_TYPE_KEY, "py"); // specify the script type + + val startupMap = new java.util.HashMap[String, AnyRef]() + // Support setting engine native parameters,For example: parameters of engines such as spark/hive + val instances: Integer = 2 + startupMap.put("spark.executor.instances", instances) + // setting linkis params + startupMap.put("wds.linkis.rm.yarnqueue", "default"); + // 2. build jobSubmitAction + val jobSubmitAction = JobSubmitAction.builder + .addExecuteCode(code) + .setStartupParams(startupMap) + .setUser(user) //submit user + .addExecuteUser(user) //execute user + .setLabels(labels) + .build + // 3. to execute + client.submit(jobSubmitAction) + } + } +``` + + +## 4. Once SDK Usage +The Linkis-cli client supports submitting tasks of the Once type. After the engine process is started, the task will only be run once, and it will be automatically destroyed after the task ends. + +OnceEngineConn calls LinkisManager's createEngineConn interface through LinkisManagerClient, and sends the code to the engine created by the user, and then the engine starts to execute + +write a test class +Use clien conditions + +```java +1. Configure the correct and available gateway address: +LinkisJobClient.config().setDefaultServerUrl("http://ip:9001"); +2. Write the engine parameters, configuration items, and execution code in the code: + String code = "env { + + " spark.app.name = \"SeaTunnel\"\n" + + "spark.executor.instances = 2\n" + + "spark.executor.cores = 1\n" + + " spark.executor.memory = \"1g\"\n" + + "}\n" + + "\n" + + "source {\n" + + "Fake {\n" + + " result_table_name = \"my_dataset\"\n" + + " }\n" + + "\n" + + "}\n" + + "\n" + + "transform {\n" + + "}\n" + + "\n" + + "sink {\n" + + " Console {}\n" + + "}"; +3. Create an Once mode object: SubmittableSimpleOnceJob: +SubmittableSimpleOnceJob = LinkisJobClient.once() + .simple() + .builder() + .setCreateService("seatunnel-Test") + .setMaxSubmitTime(300000) timeout + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY(), "seatunnel-2.1.2") engine label + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY(), "hadoop-seatunnel") user label + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY(), "once") engine mode label + .addStartupParam(Configuration.IS_TEST_MODE().key(), true) Whether to enable the test mode + .addExecuteUser("hadoop") execute user + .addJobContent("runType", "spark") execution engine + .addJobContent("code", code) execute code + .addJobContent("master", "local[4]") + .addJobContent("deploy-mode", "client") + .addSource("jobName", "OnceJobTest") name + .build(); + +``` + +Test class sample code: + +```java +package org.apache.linkis.ujes.client + +import org.apache.linkis.common.utils.Utils +import java.util.concurrent.TimeUnit +import java.util +import org.apache.linkis.computation.client.LinkisJobBuilder +import org.apache.linkis.computation.client.once.simple.{SimpleOnceJob, SimpleOnceJobBuilder, SubmittableSimpleOnceJob} +import org.apache.linkis.computation.client.operator.impl.{EngineConnLogOperator, EngineConnMetricsOperator, EngineConnProgressOperator} +import org.apache.linkis.computation.client.utils.LabelKeyUtils +import scala.collection.JavaConverters._ + +object SqoopOnceJobTest extends App { + LinkisJobBuilder.setDefaultServerUrl("http://gateway address:9001") + val logPath = "C:\\Users\\resources\\log4j.properties" + System.setProperty("log4j.configurationFile", logPath) + val startUpMap = new util. HashMap[String, AnyRef] + startUpMap.put("wds.linkis.engineconn.java.driver.memory", "1g") + val builder = SimpleOnceJob. builder(). setCreateService("Linkis-Client") + .addLabel(LabelKeyUtils.ENGINE_TYPE_LABEL_KEY, "sqoop-1.4.6") + .addLabel(LabelKeyUtils.USER_CREATOR_LABEL_KEY, "hadoop-Client") + .addLabel(LabelKeyUtils.ENGINE_CONN_MODE_LABEL_KEY, "once") + .setStartupParams(startUpMap) + .setMaxSubmitTime(30000) + .addExecuteUser("hadoop") + val onceJob = importJob(builder) + val time = System. currentTimeMillis() + onceJob. submit() + println(onceJob. getId) + val logOperator = onceJob.getOperator(EngineConnLogOperator.OPERATOR_NAME).asInstanceOf[EngineConnLogOperator] + println(onceJob. getECMServiceInstance) + logOperator. setFromLine(0) + logOperator.setECMServiceInstance(onceJob.getECMServiceInstance) + logOperator.setEngineConnType("sqoop") + logOperator.setIgnoreKeywords("[main],[SpringContextShutdownHook]") + var progressOperator = onceJob.getOperator(EngineConnProgressOperator.OPERATOR_NAME).asInstanceOf[EngineConnProgressOperator] + var metricOperator = onceJob.getOperator(EngineConnMetricsOperator.OPERATOR_NAME).asInstanceOf[EngineConnMetricsOperator] + var end = false + var rowBefore = 1 + while (!end || rowBefore > 0) { + if (onceJob. isCompleted) { + end = true + metricOperator = null + } + logOperator. setPageSize(100) + Utils. tryQuietly { + val logs = logOperator.apply() + logs. logs. asScala. foreach(log => { + println(log) + }) + rowBefore = logs. logs. size + } + Thread. sleep(3000) + Option(metricOperator).foreach(operator => { + if (!onceJob.isCompleted) { + println(s"Metric monitoring: ${operator.apply()}") + println(s"Progress: ${progressOperator.apply()}") + } + }) + } + onceJob. isCompleted + onceJob. waitForCompleted() + println(onceJob. getStatus) + println(TimeUnit. SECONDS. convert(System. currentTimeMillis() - time, TimeUnit. MILLISECONDS) + "s") + System. exit(0) + + def importJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue_1003_01") + .addJobContent("sqoop. mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://database address/library name") + .addJobContent("sqoop.args.username", "database account") + .addJobContent("sqoop.args.password", "database password") + .addJobContent("sqoop.args.query", "select * from linkis_ps_udf_manager where 1=1 and $CONDITIONS") + #The table must exist $CONDITIONS is indispensable + .addJobContent("sqoop.args.hcatalog.database", "janicegong_ind") + .addJobContent("sqoop.args.hcatalog.table", "linkis_ps_udf_manager_sync2") + .addJobContent("sqoop.args.hcatalog.partition.keys", "ds") + .addJobContent("sqoop.args.hcatalog.partition.values", "20220708") + .addJobContent("sqoop.args.num.mappers", "1") + .build() + } + def exportJob(jobBuilder: SimpleOnceJobBuilder): SubmittableSimpleOnceJob = { + jobBuilder + .addJobContent("sqoop.env.mapreduce.job.queuename", "queue_1003_01") + .addJobContent("sqoop. mode", "import") + .addJobContent("sqoop.args.connect", "jdbc:mysql://database address/library name") + .addJobContent("sqoop.args.username", "database account") + .addJobContent("sqoop.args.password", "database password") + .addJobContent("sqoop.args.query", "select * from linkis_ps_udf_manager where 1=1 and $CONDITIONS") + #The table must exist $CONDITIONS is indispensable + .addJobContent("sqoop.args.hcatalog.database", "janicegong_ind") + .addJobContent("sqoop.args.hcatalog.table", "linkis_ps_udf_manager_sync2") + .addJobContent("sqoop.args.hcatalog.partition.keys", "ds") + .addJobContent("sqoop.args.hcatalog.partition.values", "20220708") + .addJobContent("sqoop.args.num.mappers", "1") + .build + } + } +``` \ No newline at end of file diff --git a/versioned_docs/version-1.4.0/user-guide/udf-function.md b/versioned_docs/version-1.4.0/user-guide/udf-function.md new file mode 100644 index 00000000000..9c83958ebf6 --- /dev/null +++ b/versioned_docs/version-1.4.0/user-guide/udf-function.md @@ -0,0 +1,175 @@ +--- +title: UDF Function +sidebar_position: 5 +--- + +## 1 Introduction to UDF +UDF: User Defined Function, user-defined function. In some scenarios, we need to use hive functions to process some data. Functions like count() and sum() are built-in. If we want to use some functions that are not built-in, we need to customize the function, which can be done by writing UDF. + + +## 1.Overview of the overall steps for creating UDF +### 1 Universal type UDF functions +Overall step description +- Write UDF functions in UDF format locally and package them as jar package files +- 【Scriptis >> Workspace】Upload to the corresponding directory in the workspace +- 【Management Console>>UDF Function】 Create udf (default loading) +- Used in task code (only effective for newly started engines) + +**Step1 Writing jar packages locally** + +Hive UDF Example: +1. add hive dependency +```xml + + org.apache.hive + hive-exec + 3.1.3 + +``` +2. create UDF class +```java +import org.apache.hadoop.hive.ql.exec.UDF; + +public class UDFExample extends UDF { + public Integer evaluate(Integer value) { + return value == null ? null : value + 1; + } +} +``` + +3. package +```shell +mvn package +``` + +**Step2【Scriptis >> Workspace】Upload jar package** +Select the corresponding folder and right-click to select Upload + +![](/Images/udf/udf_14.png) + +**Step3【Management Console>>UDF Function】 Create UDF** +- Function name: Conforming to the rules is sufficient, such as test_ Udf_ Using jar in scripts such as SQL +- Function Type: General +- Script path: Select the shared directory path where the jar package is stored, such as../..// Wds_ Functions_ 1_ 0_ 0. jar +- Registration format: package name+class name, such as com.webank.wedatasphere.willink.bdp.udf.ToUpperCase +- Usage format: Input type and return type must be consistent with the definition in the jar package +- Classification: drop-down selection; Alternatively, enter a custom directory (which will create a new target level directory under the personal function) + +![](/Images/udf/udf_15.png) + +Note that the newly created UDF function is loaded by default and can be viewed on the [Scriptis>>UDF Functions] page for easy viewing during Scriptis task editing. Checking the UDF function indicates that it will be loaded and used + +![](/Images/udf/udf_16.png) + +**Step4 Use this udf function** + +Innovative udf function using the above steps in the task +Function name is [Create UDF] Function name +In pyspark: +print (sqlContext.sql("select test_udf_jar(name1) from stacyyan_ind.result_sort_1_20200226").collect()) + +### 2 UDF functions of Spark type +Overall step description +- Create a new Spark script file in the desired directory in the [Scriptis>>workspace] +- Create UDF in [Management Console>>UDF Functions] (default loading) +- Used in task code (only effective for newly started engines) + +**Step1 dss-scriptis-Create a new scala script** + +![](/Images/udf/udf_17.png) + +def helloWorld(str: String): String = "hello, " + str + +**Step2 Create UDF** +- Function name: Conforming to the rules is sufficient, such as test_ Udf_ Scala +- Function type: spark +- Script Path:../..// B +- Registration format: The input type and return type must be consistent with the definition; The function names that need to be defined in the registration format must be strictly consistent, such as helloWorld +- Classification: Drop down and select the first level directory that exists under dss scriptis UDF function - Personal function; Alternatively, enter a custom directory (which will create a new target level directory under the personal function) + +![](/Images/udf/udf_18.png) + +**Step3 Use this udf function** + +Use the above steps in the task to create a new udf function +Function name is [Create UDF] Function name +- In scala + val s=sqlContext.sql("select test_udf_scala(name1) + from stacyyan_ind.result_sort_1_20200226") + show(s) +- in pyspark + print(sqlContext.sql("select test_udf_scala(name1) + from stacyyan_ind.result_sort_1_20200226").collect()); +- in sql + select test_udf_scala(name1) from stacyyan_ind.result_sort_1_20200226; + +### 3 Python functions +Overall step description +- Create a new Python script file in the desired directory in the [Scriptis>>workspace] +- Create UDF in [Management Console>>UDF Functions] (default loading) +- Used in task code (only effective for newly started engines) + +**Step1 dss-scriptis-Create a new pyspark script** + +![](/Images/udf/udf_19.png) + +def addation(a, b): +return a + b +Step2 Create UDF +- Function name: Conforming to the rules is sufficient, such as test_ Udf_ Py +- Function type: spark +- Script Path:../..// A +- Registration format: The function names that need to be defined must be strictly consistent, such as addition +- Usage format: The input type and return type must be consistent with the definition +- Classification: Drop down and select the first level directory that exists under dss scriptis UDF function - Personal function; Alternatively, enter a custom directory (which will create a new target level directory under the personal function) + +![](/Images/udf/udf_20.png) + +**Step3 uses this udf function** +Use the above steps in the task to create a new udf function +Function name is [Create UDF] Function name +- in pyspark + print(sqlContext.sql("select test_udf_py(pv,impression) from neiljianliu_ind.alias where entityid=504059 limit 50").collect()); +- in sql + select test_udf_py(pv,impression) from neiljianliu_ind.alias where entityid=504059 limit 50 + +### 4 scala functions +Overall step description +- Create a new Spark Scala script file in the desired directory in the [Scriptis>>workspace] +- Create UDF in [Management Console>>UDF Functions] (default loading) +- Used in task code (only effective for newly started engines) +- +**Step1 dss-scriptis-Create a new scala script** +def hellozdy(str:String):String = "hellozdy,haha " + str +**Step2 CREATE FUNCTION** +- Function name: Must be strictly consistent with the defined function name, such as hellozdy +- Function Type: Custom Function +- Script Path:../..// D +- Usage format: The input type and return type must be consistent with the definition +- Classification: Drop down and select the first level directory that exists under dss scriptis method function personal function; Alternatively, enter a custom directory (which will create a new target level directory under the personal function) + Step3 Use this function + Use the above steps in the task to create a new udf function + Function name is [Create UDF] Function name + val a = hellozdy("abcd"); + print(a) + +### 5 Common usage issues +#### 5.1 UDF function loading failed +"FAILED: SemanticException [Error 10011]: Invalid function xxxx" + + ![](/Images/udf/udf_10.png) + +- Firstly, check if the UDF function configuration is correct: + + ![](/Images/udf/udf_11.png) + +- The registration format is the function path name: + + ![](/Images/udf/udf_12.png) + +- Check the scriptis udf function to see if the loaded function is checked. When the function is not checked, udf will not be loaded when the engine starts + + ![](/Images/udf/udf_13.png) + +- Check if the engine has loaded UDF. If not, please restart another engine or restart the current engine + Note: UDF will only be loaded when the engine is initialized. If UDF is added midway, the current engine will not be able to perceive and load it \ No newline at end of file diff --git a/versioned_sidebars/version-1.4.0-sidebars.json b/versioned_sidebars/version-1.4.0-sidebars.json new file mode 100644 index 00000000000..caea0c03ba6 --- /dev/null +++ b/versioned_sidebars/version-1.4.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "tutorialSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/versions.json b/versions.json index dbc66e91050..f2cd94e87e9 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,5 @@ [ + "1.4.0", "1.3.2", "1.3.1", "1.3.0", diff --git a/yarn.lock b/yarn.lock index 4168e35c17b..eda179cb5d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,56 +3,61 @@ "@algolia/autocomplete-core@1.7.2": - version "1.7.2" - resolved "https://registry.npmmirror.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz" - integrity sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw== + "integrity" "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==" + "resolved" "https://registry.npmmirror.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz" + "version" "1.7.2" dependencies: "@algolia/autocomplete-shared" "1.7.2" "@algolia/autocomplete-preset-algolia@1.7.2": - version "1.7.2" - resolved "https://registry.npmmirror.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz" - integrity sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw== + "integrity" "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==" + "resolved" "https://registry.npmmirror.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz" + "version" "1.7.2" dependencies: "@algolia/autocomplete-shared" "1.7.2" "@algolia/autocomplete-shared@1.7.2": - version "1.7.2" - resolved "https://registry.npmmirror.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz" - integrity sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug== + "integrity" "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" + "resolved" "https://registry.npmmirror.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz" + "version" "1.7.2" "@algolia/cache-browser-local-storage@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz" - integrity sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw== + "integrity" "sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==" + "resolved" "https://registry.npmmirror.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/cache-common" "4.14.3" "@algolia/cache-common@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/cache-common/-/cache-common-4.14.3.tgz" - integrity sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q== + "integrity" "sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==" + "resolved" "https://registry.npmmirror.com/@algolia/cache-common/-/cache-common-4.14.3.tgz" + "version" "4.14.3" + +"@algolia/cache-common@4.19.1": + "integrity" "sha512-XGghi3l0qA38HiqdoUY+wvGyBsGvKZ6U3vTiMBT4hArhP3fOGLXpIINgMiiGjTe4FVlTa5a/7Zf2bwlIHfRqqg==" + "resolved" "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.19.1.tgz" + "version" "4.19.1" "@algolia/cache-in-memory@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz" - integrity sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg== + "integrity" "sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==" + "resolved" "https://registry.npmmirror.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/cache-common" "4.14.3" "@algolia/client-account@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/client-account/-/client-account-4.14.3.tgz" - integrity sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ== + "integrity" "sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==" + "resolved" "https://registry.npmmirror.com/@algolia/client-account/-/client-account-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/client-common" "4.14.3" "@algolia/client-search" "4.14.3" "@algolia/transporter" "4.14.3" "@algolia/client-analytics@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/client-analytics/-/client-analytics-4.14.3.tgz" - integrity sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw== + "integrity" "sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==" + "resolved" "https://registry.npmmirror.com/@algolia/client-analytics/-/client-analytics-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/client-common" "4.14.3" "@algolia/client-search" "4.14.3" @@ -60,121 +65,135 @@ "@algolia/transporter" "4.14.3" "@algolia/client-common@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.14.3.tgz" - integrity sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw== + "integrity" "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==" + "resolved" "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/requester-common" "4.14.3" "@algolia/transporter" "4.14.3" +"@algolia/client-common@4.19.1": + "integrity" "sha512-3kAIVqTcPrjfS389KQvKzliC559x+BDRxtWamVJt8IVp7LGnjq+aVAXg4Xogkur1MUrScTZ59/AaUd5EdpyXgA==" + "resolved" "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.19.1.tgz" + "version" "4.19.1" + dependencies: + "@algolia/requester-common" "4.19.1" + "@algolia/transporter" "4.19.1" + "@algolia/client-personalization@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/client-personalization/-/client-personalization-4.14.3.tgz" - integrity sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg== + "integrity" "sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==" + "resolved" "https://registry.npmmirror.com/@algolia/client-personalization/-/client-personalization-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/client-common" "4.14.3" "@algolia/requester-common" "4.14.3" "@algolia/transporter" "4.14.3" +"@algolia/client-search@>= 4.9.1 < 6": + "integrity" "sha512-mBecfMFS4N+yK/p0ZbK53vrZbL6OtWMk8YmnOv1i0LXx4pelY8TFhqKoTit3NPVPwoSNN0vdSN9dTu1xr1XOVw==" + "resolved" "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.19.1.tgz" + "version" "4.19.1" + dependencies: + "@algolia/client-common" "4.19.1" + "@algolia/requester-common" "4.19.1" + "@algolia/transporter" "4.19.1" + "@algolia/client-search@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.14.3.tgz" - integrity sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A== + "integrity" "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==" + "resolved" "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/client-common" "4.14.3" "@algolia/requester-common" "4.14.3" "@algolia/transporter" "4.14.3" "@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.npmmirror.com/@algolia/events/-/events-4.0.1.tgz" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + "integrity" "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + "resolved" "https://registry.npmmirror.com/@algolia/events/-/events-4.0.1.tgz" + "version" "4.0.1" "@algolia/logger-common@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/logger-common/-/logger-common-4.14.3.tgz" - integrity sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw== + "integrity" "sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==" + "resolved" "https://registry.npmmirror.com/@algolia/logger-common/-/logger-common-4.14.3.tgz" + "version" "4.14.3" + +"@algolia/logger-common@4.19.1": + "integrity" "sha512-i6pLPZW/+/YXKis8gpmSiNk1lOmYCmRI6+x6d2Qk1OdfvX051nRVdalRbEcVTpSQX6FQAoyeaui0cUfLYW5Elw==" + "resolved" "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.19.1.tgz" + "version" "4.19.1" "@algolia/logger-console@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/logger-console/-/logger-console-4.14.3.tgz" - integrity sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw== + "integrity" "sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==" + "resolved" "https://registry.npmmirror.com/@algolia/logger-console/-/logger-console-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/logger-common" "4.14.3" "@algolia/requester-browser-xhr@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz" - integrity sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q== + "integrity" "sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==" + "resolved" "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/requester-common" "4.14.3" "@algolia/requester-common@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/requester-common/-/requester-common-4.14.3.tgz" - integrity sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw== + "integrity" "sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==" + "resolved" "https://registry.npmmirror.com/@algolia/requester-common/-/requester-common-4.14.3.tgz" + "version" "4.14.3" + +"@algolia/requester-common@4.19.1": + "integrity" "sha512-BisRkcWVxrDzF1YPhAckmi2CFYK+jdMT60q10d7z3PX+w6fPPukxHRnZwooiTUrzFe50UBmLItGizWHP5bDzVQ==" + "resolved" "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.19.1.tgz" + "version" "4.19.1" "@algolia/requester-node-http@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz" - integrity sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA== + "integrity" "sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==" + "resolved" "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/requester-common" "4.14.3" "@algolia/transporter@4.14.3": - version "4.14.3" - resolved "https://registry.npmmirror.com/@algolia/transporter/-/transporter-4.14.3.tgz" - integrity sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w== + "integrity" "sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==" + "resolved" "https://registry.npmmirror.com/@algolia/transporter/-/transporter-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/cache-common" "4.14.3" "@algolia/logger-common" "4.14.3" "@algolia/requester-common" "4.14.3" +"@algolia/transporter@4.19.1": + "integrity" "sha512-nkpvPWbpuzxo1flEYqNIbGz7xhfhGOKGAZS7tzC+TELgEmi7z99qRyTfNSUlW7LZmB3ACdnqAo+9A9KFBENviQ==" + "resolved" "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.19.1.tgz" + "version" "4.19.1" + dependencies: + "@algolia/cache-common" "4.19.1" + "@algolia/logger-common" "4.19.1" + "@algolia/requester-common" "4.19.1" + "@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.1.2.tgz" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + "integrity" "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==" + "resolved" "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.1.2.tgz" + "version" "2.1.2" dependencies: "@jridgewell/trace-mapping" "^0.3.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + "integrity" "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==" + "resolved" "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.5.tgz" - integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== + "integrity" "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==" + "resolved" "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.5.tgz" + "version" "7.20.5" -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.npmmirror.com/@babel/core/-/core-7.12.9.tgz" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/core/-/core-7.20.5.tgz" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.4.0-0": + "integrity" "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==" + "resolved" "https://registry.npmmirror.com/@babel/core/-/core-7.20.5.tgz" + "version" "7.20.5" dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" @@ -186,50 +205,72 @@ "@babel/template" "^7.18.10" "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + "convert-source-map" "^1.7.0" + "debug" "^4.1.0" + "gensync" "^1.0.0-beta.2" + "json5" "^2.2.1" + "semver" "^6.3.0" + +"@babel/core@7.12.9": + "integrity" "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==" + "resolved" "https://registry.npmmirror.com/@babel/core/-/core-7.12.9.tgz" + "version" "7.12.9" + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + "convert-source-map" "^1.7.0" + "debug" "^4.1.0" + "gensync" "^1.0.0-beta.1" + "json5" "^2.1.2" + "lodash" "^4.17.19" + "resolve" "^1.3.2" + "semver" "^5.4.1" + "source-map" "^0.5.0" "@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.20.5": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.5.tgz" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== + "integrity" "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==" + "resolved" "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.5.tgz" + "version" "7.20.5" dependencies: "@babel/types" "^7.20.5" "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" + "jsesc" "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + "integrity" "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==" + "resolved" "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + "integrity" "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== + "integrity" "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz" + "version" "7.20.0" dependencies: "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" + "browserslist" "^4.21.3" + "semver" "^6.3.0" "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz" - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== + "integrity" "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz" + "version" "7.19.0" dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" @@ -240,70 +281,70 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== + "integrity" "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz" + "version" "7.19.0" dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" + "regexpu-core" "^5.1.0" "@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + "integrity" "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==" + "resolved" "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" + "version" "0.3.3" dependencies: "@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" + "debug" "^4.1.1" + "lodash.debounce" "^4.0.8" + "resolve" "^1.14.2" + "semver" "^6.1.2" "@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "integrity" "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + "version" "7.18.9" "@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + "integrity" "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + "integrity" "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==" + "resolved" "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" + "version" "7.19.0" dependencies: "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" "@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + "integrity" "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==" + "resolved" "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + "integrity" "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/types" "^7.18.9" "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + "integrity" "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==" + "resolved" "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== + "integrity" "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==" + "resolved" "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz" + "version" "7.20.2" dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -315,26 +356,26 @@ "@babel/types" "^7.20.2" "@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + "integrity" "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==" + "resolved" "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "integrity" "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + "version" "7.20.2" + +"@babel/helper-plugin-utils@7.10.4": + "integrity" "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" + "version" "7.10.4" "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + "integrity" "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==" + "resolved" "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" @@ -342,9 +383,9 @@ "@babel/types" "^7.18.9" "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== + "integrity" "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz" + "version" "7.19.1" dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-member-expression-to-functions" "^7.18.9" @@ -353,45 +394,45 @@ "@babel/types" "^7.19.0" "@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + "integrity" "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==" + "resolved" "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + "version" "7.20.2" dependencies: "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + "integrity" "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/types" "^7.18.9" "@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + "integrity" "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==" + "resolved" "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "integrity" "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + "version" "7.19.4" "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "integrity" "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + "resolved" "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + "version" "7.19.1" "@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "integrity" "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + "version" "7.18.6" "@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + "integrity" "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz" + "version" "7.19.0" dependencies: "@babel/helper-function-name" "^7.19.0" "@babel/template" "^7.18.10" @@ -399,48 +440,48 @@ "@babel/types" "^7.19.0" "@babel/helpers@^7.12.5", "@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.6.tgz" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== + "integrity" "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==" + "resolved" "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.6.tgz" + "version" "7.20.6" dependencies: "@babel/template" "^7.18.10" "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + "integrity" "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==" + "resolved" "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" + "chalk" "^2.0.0" + "js-tokens" "^4.0.0" "@babel/parser@^7.12.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.8", "@babel/parser@^7.20.5": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.5.tgz" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== + "integrity" "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==" + "resolved" "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.5.tgz" + "version" "7.20.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + "integrity" "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + "integrity" "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-proposal-optional-chaining" "^7.18.9" "@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.1" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== + "integrity" "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz" + "version" "7.20.1" dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-plugin-utils" "^7.19.0" @@ -448,83 +489,74 @@ "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + "integrity" "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + "integrity" "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + "integrity" "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + "integrity" "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + "integrity" "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + "integrity" "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + "integrity" "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + "integrity" "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== + "integrity" "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz" + "version" "7.20.2" dependencies: "@babel/compat-data" "^7.20.1" "@babel/helper-compilation-targets" "^7.20.0" @@ -532,35 +564,44 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.1" +"@babel/plugin-proposal-object-rest-spread@7.12.1": + "integrity" "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" + "version" "7.12.1" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + "integrity" "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== + "integrity" "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + "integrity" "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + "integrity" "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-create-class-features-plugin" "^7.18.6" @@ -568,173 +609,173 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + "integrity" "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + "version" "7.8.4" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + "version" "7.12.13" dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + "integrity" "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + "version" "7.14.5" dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + "integrity" "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + "integrity" "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + "version" "7.20.0" dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + "integrity" "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-syntax-jsx@7.12.1": + "integrity" "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" + "version" "7.12.1" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3", "@babel/plugin-syntax-object-rest-spread@7.8.3": + "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + "integrity" "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + "version" "7.14.5" dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + "version" "7.14.5" dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + "integrity" "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + "integrity" "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + "integrity" "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-module-imports" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-remap-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + "integrity" "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz" - integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== + "integrity" "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz" + "version" "7.20.5" dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.20.2": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz" - integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== + "integrity" "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz" + "version" "7.20.2" dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-compilation-targets" "^7.20.0" @@ -744,96 +785,96 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" + "globals" "^11.1.0" "@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + "integrity" "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== + "integrity" "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz" + "version" "7.20.2" dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + "integrity" "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + "integrity" "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + "integrity" "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + "integrity" "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" + "version" "7.18.8" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + "integrity" "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-compilation-targets" "^7.18.9" "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + "integrity" "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + "integrity" "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.19.6": - version "7.19.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== + "integrity" "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz" + "version" "7.19.6" dependencies: "@babel/helper-module-transforms" "^7.19.6" "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.19.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== + "integrity" "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz" + "version" "7.19.6" dependencies: "@babel/helper-module-transforms" "^7.19.6" "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-simple-access" "^7.19.4" "@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.19.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== + "integrity" "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz" + "version" "7.19.6" dependencies: "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-module-transforms" "^7.19.6" @@ -841,75 +882,75 @@ "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + "integrity" "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== + "integrity" "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz" + "version" "7.19.1" dependencies: "@babel/helper-create-regexp-features-plugin" "^7.19.0" "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + "integrity" "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + "integrity" "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz" - integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== + "integrity" "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz" + "version" "7.20.5" dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + "integrity" "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz" - integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== + "integrity" "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz" + "version" "7.20.2" dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + "integrity" "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + "integrity" "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.19.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + "integrity" "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz" + "version" "7.19.0" dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" @@ -918,104 +959,104 @@ "@babel/types" "^7.19.0" "@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + "integrity" "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + "integrity" "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "regenerator-transform" "^0.15.0" "@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + "integrity" "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.18.6": - version "7.19.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + "integrity" "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz" + "version" "7.19.6" dependencies: "@babel/helper-module-imports" "^7.18.6" "@babel/helper-plugin-utils" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + "babel-plugin-polyfill-corejs2" "^0.3.3" + "babel-plugin-polyfill-corejs3" "^0.6.0" + "babel-plugin-polyfill-regenerator" "^0.4.1" + "semver" "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + "integrity" "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== + "integrity" "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz" + "version" "7.19.0" dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + "integrity" "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + "integrity" "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + "integrity" "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.19.3" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz" - integrity sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w== + "integrity" "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz" + "version" "7.19.3" dependencies: "@babel/helper-create-class-features-plugin" "^7.19.0" "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-typescript" "^7.18.6" "@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + "integrity" "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" + "version" "7.18.10" dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + "integrity" "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": - version "7.20.2" - resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.20.2.tgz" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + "integrity" "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==" + "resolved" "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.20.2.tgz" + "version" "7.20.2" dependencies: "@babel/compat-data" "^7.20.1" "@babel/helper-compilation-targets" "^7.20.0" @@ -1087,27 +1128,27 @@ "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" + "babel-plugin-polyfill-corejs2" "^0.3.3" + "babel-plugin-polyfill-corejs3" "^0.6.0" + "babel-plugin-polyfill-regenerator" "^0.4.1" + "core-js-compat" "^3.25.1" + "semver" "^6.3.0" "@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + "integrity" "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==" + "resolved" "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + "version" "0.1.5" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" - esutils "^2.0.2" + "esutils" "^2.0.2" "@babel/preset-react@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/preset-react/-/preset-react-7.18.6.tgz" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + "integrity" "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==" + "resolved" "https://registry.npmmirror.com/@babel/preset-react/-/preset-react-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-validator-option" "^7.18.6" @@ -1117,47 +1158,47 @@ "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + "integrity" "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==" + "resolved" "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-transform-typescript" "^7.18.6" "@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + "integrity" "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + "resolved" "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + "version" "0.8.0" "@babel/runtime-corejs3@^7.18.6": - version "7.20.6" - resolved "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz" - integrity sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ== + "integrity" "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==" + "resolved" "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz" + "version" "7.20.6" dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" + "core-js-pure" "^3.25.1" + "regenerator-runtime" "^0.13.11" "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.8.4": - version "7.21.0" - resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + "integrity" "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==" + "resolved" "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz" + "version" "7.21.0" dependencies: - regenerator-runtime "^0.13.11" + "regenerator-runtime" "^0.13.11" "@babel/template@^7.12.7", "@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + "integrity" "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==" + "resolved" "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz" + "version" "7.18.10" dependencies: "@babel/code-frame" "^7.18.6" "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" "@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.5.tgz" - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== + "integrity" "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==" + "resolved" "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.5.tgz" + "version" "7.20.5" dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.5" @@ -1167,47 +1208,47 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/parser" "^7.20.5" "@babel/types" "^7.20.5" - debug "^4.1.0" - globals "^11.1.0" + "debug" "^4.1.0" + "globals" "^11.1.0" "@babel/types@^7.12.7", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.4.4": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/types/-/types-7.20.5.tgz" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== + "integrity" "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==" + "resolved" "https://registry.npmmirror.com/@babel/types/-/types-7.20.5.tgz" + "version" "7.20.5" dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + "to-fast-properties" "^2.0.0" "@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "integrity" "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + "resolved" "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz" + "version" "1.5.0" "@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + "integrity" "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" + "resolved" "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + "version" "0.5.7" "@docsearch/css@3.3.0": - version "3.3.0" - resolved "https://registry.npmmirror.com/@docsearch/css/-/css-3.3.0.tgz" - integrity sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg== + "integrity" "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" + "resolved" "https://registry.npmmirror.com/@docsearch/css/-/css-3.3.0.tgz" + "version" "3.3.0" "@docsearch/react@^3.1.1": - version "3.3.0" - resolved "https://registry.npmmirror.com/@docsearch/react/-/react-3.3.0.tgz" - integrity sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A== + "integrity" "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==" + "resolved" "https://registry.npmmirror.com/@docsearch/react/-/react-3.3.0.tgz" + "version" "3.3.0" dependencies: "@algolia/autocomplete-core" "1.7.2" "@algolia/autocomplete-preset-algolia" "1.7.2" "@docsearch/css" "3.3.0" - algoliasearch "^4.0.0" + "algoliasearch" "^4.0.0" -"@docusaurus/core@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/core/-/core-2.2.0.tgz" - integrity sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA== +"@docusaurus/core@^2.0.0-beta", "@docusaurus/core@>=2.0.0-beta.9", "@docusaurus/core@2.2.0": + "integrity" "sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==" + "resolved" "https://registry.npmmirror.com/@docusaurus/core/-/core-2.2.0.tgz" + "version" "2.2.0" dependencies: "@babel/core" "^7.18.6" "@babel/generator" "^7.18.7" @@ -1228,104 +1269,104 @@ "@docusaurus/utils-validation" "2.2.0" "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" - babel-plugin-dynamic-import-node "^2.3.3" - boxen "^6.2.1" - chalk "^4.1.2" - chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" - combine-promises "^1.1.0" - commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" - del "^6.1.1" - detect-port "^1.3.0" - escape-html "^1.0.3" - eta "^1.12.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" - leven "^3.1.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" - prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" - react-router-config "^5.1.1" - react-router-dom "^5.3.3" - rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" - url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" - webpackbar "^5.0.2" + "autoprefixer" "^10.4.7" + "babel-loader" "^8.2.5" + "babel-plugin-dynamic-import-node" "^2.3.3" + "boxen" "^6.2.1" + "chalk" "^4.1.2" + "chokidar" "^3.5.3" + "clean-css" "^5.3.0" + "cli-table3" "^0.6.2" + "combine-promises" "^1.1.0" + "commander" "^5.1.0" + "copy-webpack-plugin" "^11.0.0" + "core-js" "^3.23.3" + "css-loader" "^6.7.1" + "css-minimizer-webpack-plugin" "^4.0.0" + "cssnano" "^5.1.12" + "del" "^6.1.1" + "detect-port" "^1.3.0" + "escape-html" "^1.0.3" + "eta" "^1.12.3" + "file-loader" "^6.2.0" + "fs-extra" "^10.1.0" + "html-minifier-terser" "^6.1.0" + "html-tags" "^3.2.0" + "html-webpack-plugin" "^5.5.0" + "import-fresh" "^3.3.0" + "leven" "^3.1.0" + "lodash" "^4.17.21" + "mini-css-extract-plugin" "^2.6.1" + "postcss" "^8.4.14" + "postcss-loader" "^7.0.0" + "prompts" "^2.4.2" + "react-dev-utils" "^12.0.1" + "react-helmet-async" "^1.3.0" + "react-loadable" "npm:@docusaurus/react-loadable@5.5.2" + "react-loadable-ssr-addon-v5-slorber" "^1.0.1" + "react-router" "^5.3.3" + "react-router-config" "^5.1.1" + "react-router-dom" "^5.3.3" + "rtl-detect" "^1.0.4" + "semver" "^7.3.7" + "serve-handler" "^6.1.3" + "shelljs" "^0.8.5" + "terser-webpack-plugin" "^5.3.3" + "tslib" "^2.4.0" + "update-notifier" "^5.1.0" + "url-loader" "^4.1.1" + "wait-on" "^6.0.1" + "webpack" "^5.73.0" + "webpack-bundle-analyzer" "^4.5.0" + "webpack-dev-server" "^4.9.3" + "webpack-merge" "^5.8.0" + "webpackbar" "^5.0.2" "@docusaurus/cssnano-preset@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.2.0.tgz" - integrity sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg== + "integrity" "sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg==" + "resolved" "https://registry.npmmirror.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.2.0.tgz" + "version" "2.2.0" dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" + "cssnano-preset-advanced" "^5.3.8" + "postcss" "^8.4.14" + "postcss-sort-media-queries" "^4.2.1" + "tslib" "^2.4.0" "@docusaurus/logger@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/logger/-/logger-2.2.0.tgz" - integrity sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A== + "integrity" "sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A==" + "resolved" "https://registry.npmmirror.com/@docusaurus/logger/-/logger-2.2.0.tgz" + "version" "2.2.0" dependencies: - chalk "^4.1.2" - tslib "^2.4.0" + "chalk" "^4.1.2" + "tslib" "^2.4.0" "@docusaurus/mdx-loader@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/mdx-loader/-/mdx-loader-2.2.0.tgz" - integrity sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA== + "integrity" "sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA==" + "resolved" "https://registry.npmmirror.com/@docusaurus/mdx-loader/-/mdx-loader-2.2.0.tgz" + "version" "2.2.0" dependencies: "@babel/parser" "^7.18.8" "@babel/traverse" "^7.18.8" "@docusaurus/logger" "2.2.0" "@docusaurus/utils" "2.2.0" "@mdx-js/mdx" "^1.6.22" - escape-html "^1.0.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" - stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" - url-loader "^4.1.1" - webpack "^5.73.0" + "escape-html" "^1.0.3" + "file-loader" "^6.2.0" + "fs-extra" "^10.1.0" + "image-size" "^1.0.1" + "mdast-util-to-string" "^2.0.0" + "remark-emoji" "^2.2.0" + "stringify-object" "^3.3.0" + "tslib" "^2.4.0" + "unified" "^9.2.2" + "unist-util-visit" "^2.0.3" + "url-loader" "^4.1.1" + "webpack" "^5.73.0" "@docusaurus/module-type-aliases@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.2.0.tgz" - integrity sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ== + "integrity" "sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ==" + "resolved" "https://registry.npmmirror.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/react-loadable" "5.5.2" "@docusaurus/types" "2.2.0" @@ -1333,28 +1374,28 @@ "@types/react" "*" "@types/react-router-config" "*" "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" + "react-helmet-async" "*" + "react-loadable" "npm:@docusaurus/react-loadable@5.5.2" "@docusaurus/plugin-client-redirects@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.2.0.tgz" - integrity sha512-psBoWi+cbc2I+VPkKJlcZ12tRN3xiv22tnZfNKyMo18iSY8gr4B6Q0G2KZXGPgNGJ/6gq7ATfgDK6p9h9XRxMQ== + "integrity" "sha512-psBoWi+cbc2I+VPkKJlcZ12tRN3xiv22tnZfNKyMo18iSY8gr4B6Q0G2KZXGPgNGJ/6gq7ATfgDK6p9h9XRxMQ==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/logger" "2.2.0" "@docusaurus/utils" "2.2.0" "@docusaurus/utils-common" "2.2.0" "@docusaurus/utils-validation" "2.2.0" - eta "^1.12.3" - fs-extra "^10.1.0" - lodash "^4.17.21" - tslib "^2.4.0" + "eta" "^1.12.3" + "fs-extra" "^10.1.0" + "lodash" "^4.17.21" + "tslib" "^2.4.0" "@docusaurus/plugin-content-blog@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.2.0.tgz" - integrity sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w== + "integrity" "sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/logger" "2.2.0" @@ -1363,20 +1404,20 @@ "@docusaurus/utils" "2.2.0" "@docusaurus/utils-common" "2.2.0" "@docusaurus/utils-validation" "2.2.0" - cheerio "^1.0.0-rc.12" - feed "^4.2.2" - fs-extra "^10.1.0" - lodash "^4.17.21" - reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" - utility-types "^3.10.0" - webpack "^5.73.0" + "cheerio" "^1.0.0-rc.12" + "feed" "^4.2.2" + "fs-extra" "^10.1.0" + "lodash" "^4.17.21" + "reading-time" "^1.5.0" + "tslib" "^2.4.0" + "unist-util-visit" "^2.0.3" + "utility-types" "^3.10.0" + "webpack" "^5.73.0" "@docusaurus/plugin-content-docs@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.2.0.tgz" - integrity sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw== + "integrity" "sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/logger" "2.2.0" @@ -1386,65 +1427,65 @@ "@docusaurus/utils" "2.2.0" "@docusaurus/utils-validation" "2.2.0" "@types/react-router-config" "^5.0.6" - combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - webpack "^5.73.0" + "combine-promises" "^1.1.0" + "fs-extra" "^10.1.0" + "import-fresh" "^3.3.0" + "js-yaml" "^4.1.0" + "lodash" "^4.17.21" + "tslib" "^2.4.0" + "utility-types" "^3.10.0" + "webpack" "^5.73.0" "@docusaurus/plugin-content-pages@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.2.0.tgz" - integrity sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g== + "integrity" "sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/mdx-loader" "2.2.0" "@docusaurus/types" "2.2.0" "@docusaurus/utils" "2.2.0" "@docusaurus/utils-validation" "2.2.0" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" + "fs-extra" "^10.1.0" + "tslib" "^2.4.0" + "webpack" "^5.73.0" "@docusaurus/plugin-debug@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-debug/-/plugin-debug-2.2.0.tgz" - integrity sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow== + "integrity" "sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-debug/-/plugin-debug-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/types" "2.2.0" "@docusaurus/utils" "2.2.0" - fs-extra "^10.1.0" - react-json-view "^1.21.3" - tslib "^2.4.0" + "fs-extra" "^10.1.0" + "react-json-view" "^1.21.3" + "tslib" "^2.4.0" "@docusaurus/plugin-google-analytics@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.2.0.tgz" - integrity sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg== + "integrity" "sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/types" "2.2.0" "@docusaurus/utils-validation" "2.2.0" - tslib "^2.4.0" + "tslib" "^2.4.0" "@docusaurus/plugin-google-gtag@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.2.0.tgz" - integrity sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ== + "integrity" "sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/types" "2.2.0" "@docusaurus/utils-validation" "2.2.0" - tslib "^2.4.0" + "tslib" "^2.4.0" "@docusaurus/plugin-sitemap@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.2.0.tgz" - integrity sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg== + "integrity" "sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg==" + "resolved" "https://registry.npmmirror.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/logger" "2.2.0" @@ -1452,14 +1493,14 @@ "@docusaurus/utils" "2.2.0" "@docusaurus/utils-common" "2.2.0" "@docusaurus/utils-validation" "2.2.0" - fs-extra "^10.1.0" - sitemap "^7.1.1" - tslib "^2.4.0" + "fs-extra" "^10.1.0" + "sitemap" "^7.1.1" + "tslib" "^2.4.0" "@docusaurus/preset-classic@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/preset-classic/-/preset-classic-2.2.0.tgz" - integrity sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg== + "integrity" "sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg==" + "resolved" "https://registry.npmmirror.com/@docusaurus/preset-classic/-/preset-classic-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/plugin-content-blog" "2.2.0" @@ -1474,18 +1515,18 @@ "@docusaurus/theme-search-algolia" "2.2.0" "@docusaurus/types" "2.2.0" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== +"@docusaurus/react-loadable@5.5.2": + "integrity" "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==" + "resolved" "https://registry.npmmirror.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + "version" "5.5.2" dependencies: "@types/react" "*" - prop-types "^15.6.2" + "prop-types" "^15.6.2" "@docusaurus/theme-classic@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/theme-classic/-/theme-classic-2.2.0.tgz" - integrity sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg== + "integrity" "sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg==" + "resolved" "https://registry.npmmirror.com/@docusaurus/theme-classic/-/theme-classic-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/core" "2.2.0" "@docusaurus/mdx-loader" "2.2.0" @@ -1500,23 +1541,23 @@ "@docusaurus/utils-common" "2.2.0" "@docusaurus/utils-validation" "2.2.0" "@mdx-js/react" "^1.6.22" - clsx "^1.2.1" - copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.42" - lodash "^4.17.21" - nprogress "^0.2.0" - postcss "^8.4.14" - prism-react-renderer "^1.3.5" - prismjs "^1.28.0" - react-router-dom "^5.3.3" - rtlcss "^3.5.0" - tslib "^2.4.0" - utility-types "^3.10.0" + "clsx" "^1.2.1" + "copy-text-to-clipboard" "^3.0.1" + "infima" "0.2.0-alpha.42" + "lodash" "^4.17.21" + "nprogress" "^0.2.0" + "postcss" "^8.4.14" + "prism-react-renderer" "^1.3.5" + "prismjs" "^1.28.0" + "react-router-dom" "^5.3.3" + "rtlcss" "^3.5.0" + "tslib" "^2.4.0" + "utility-types" "^3.10.0" "@docusaurus/theme-common@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/theme-common/-/theme-common-2.2.0.tgz" - integrity sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw== + "integrity" "sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw==" + "resolved" "https://registry.npmmirror.com/@docusaurus/theme-common/-/theme-common-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/mdx-loader" "2.2.0" "@docusaurus/module-type-aliases" "2.2.0" @@ -1527,16 +1568,16 @@ "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" - clsx "^1.2.1" - parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" - utility-types "^3.10.0" + "clsx" "^1.2.1" + "parse-numeric-range" "^1.3.0" + "prism-react-renderer" "^1.3.5" + "tslib" "^2.4.0" + "utility-types" "^3.10.0" "@docusaurus/theme-search-algolia@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.2.0.tgz" - integrity sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w== + "integrity" "sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w==" + "resolved" "https://registry.npmmirror.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docsearch/react" "^3.1.1" "@docusaurus/core" "2.2.0" @@ -1546,293 +1587,293 @@ "@docusaurus/theme-translations" "2.2.0" "@docusaurus/utils" "2.2.0" "@docusaurus/utils-validation" "2.2.0" - algoliasearch "^4.13.1" - algoliasearch-helper "^3.10.0" - clsx "^1.2.1" - eta "^1.12.3" - fs-extra "^10.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" + "algoliasearch" "^4.13.1" + "algoliasearch-helper" "^3.10.0" + "clsx" "^1.2.1" + "eta" "^1.12.3" + "fs-extra" "^10.1.0" + "lodash" "^4.17.21" + "tslib" "^2.4.0" + "utility-types" "^3.10.0" "@docusaurus/theme-translations@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/theme-translations/-/theme-translations-2.2.0.tgz" - integrity sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w== + "integrity" "sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w==" + "resolved" "https://registry.npmmirror.com/@docusaurus/theme-translations/-/theme-translations-2.2.0.tgz" + "version" "2.2.0" dependencies: - fs-extra "^10.1.0" - tslib "^2.4.0" + "fs-extra" "^10.1.0" + "tslib" "^2.4.0" -"@docusaurus/types@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/types/-/types-2.2.0.tgz" - integrity sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw== +"@docusaurus/types@*", "@docusaurus/types@2.2.0": + "integrity" "sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw==" + "resolved" "https://registry.npmmirror.com/@docusaurus/types/-/types-2.2.0.tgz" + "version" "2.2.0" dependencies: "@types/history" "^4.7.11" "@types/react" "*" - commander "^5.1.0" - joi "^17.6.0" - react-helmet-async "^1.3.0" - utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" + "commander" "^5.1.0" + "joi" "^17.6.0" + "react-helmet-async" "^1.3.0" + "utility-types" "^3.10.0" + "webpack" "^5.73.0" + "webpack-merge" "^5.8.0" "@docusaurus/utils-common@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/utils-common/-/utils-common-2.2.0.tgz" - integrity sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA== + "integrity" "sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA==" + "resolved" "https://registry.npmmirror.com/@docusaurus/utils-common/-/utils-common-2.2.0.tgz" + "version" "2.2.0" dependencies: - tslib "^2.4.0" + "tslib" "^2.4.0" "@docusaurus/utils-validation@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/utils-validation/-/utils-validation-2.2.0.tgz" - integrity sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg== + "integrity" "sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg==" + "resolved" "https://registry.npmmirror.com/@docusaurus/utils-validation/-/utils-validation-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/logger" "2.2.0" "@docusaurus/utils" "2.2.0" - joi "^17.6.0" - js-yaml "^4.1.0" - tslib "^2.4.0" + "joi" "^17.6.0" + "js-yaml" "^4.1.0" + "tslib" "^2.4.0" "@docusaurus/utils@2.2.0": - version "2.2.0" - resolved "https://registry.npmmirror.com/@docusaurus/utils/-/utils-2.2.0.tgz" - integrity sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA== + "integrity" "sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA==" + "resolved" "https://registry.npmmirror.com/@docusaurus/utils/-/utils-2.2.0.tgz" + "version" "2.2.0" dependencies: "@docusaurus/logger" "2.2.0" "@svgr/webpack" "^6.2.1" - file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" - globby "^11.1.0" - gray-matter "^4.0.3" - js-yaml "^4.1.0" - lodash "^4.17.21" - micromatch "^4.0.5" - resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.4.0" - url-loader "^4.1.1" - webpack "^5.73.0" + "file-loader" "^6.2.0" + "fs-extra" "^10.1.0" + "github-slugger" "^1.4.0" + "globby" "^11.1.0" + "gray-matter" "^4.0.3" + "js-yaml" "^4.1.0" + "lodash" "^4.17.21" + "micromatch" "^4.0.5" + "resolve-pathname" "^3.0.0" + "shelljs" "^0.8.5" + "tslib" "^2.4.0" + "url-loader" "^4.1.1" + "webpack" "^5.73.0" "@hapi/hoek@^9.0.0": - version "9.2.1" - resolved "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz" - integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== + "integrity" "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + "resolved" "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz" + "version" "9.2.1" "@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + "integrity" "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==" + "resolved" "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz" + "version" "5.1.0" dependencies: "@hapi/hoek" "^9.0.0" "@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.4.3.tgz" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + "integrity" "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==" + "resolved" "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.4.3.tgz" + "version" "29.4.3" dependencies: "@sinclair/typebox" "^0.25.16" "@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.npmmirror.com/@jest/types/-/types-29.5.0.tgz" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + "integrity" "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==" + "resolved" "https://registry.npmmirror.com/@jest/types/-/types-29.5.0.tgz" + "version" "29.5.0" dependencies: "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" - chalk "^4.0.0" + "chalk" "^4.0.0" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + "integrity" "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==" + "resolved" "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + "version" "0.3.2" dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + "resolved" "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + "version" "3.1.0" "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "resolved" "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz" + "version" "1.1.2" "@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + "integrity" "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==" + "resolved" "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz" + "version" "0.3.2" dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": + "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "resolved" "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + "version" "1.4.14" "@jridgewell/trace-mapping@^0.3.0", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + "integrity" "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==" + "resolved" "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + "version" "0.3.17" dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + "integrity" "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "resolved" "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + "version" "2.0.4" "@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.npmmirror.com/@mdx-js/mdx/-/mdx-1.6.22.tgz" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + "integrity" "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==" + "resolved" "https://registry.npmmirror.com/@mdx-js/mdx/-/mdx-1.6.22.tgz" + "version" "1.6.22" dependencies: "@babel/core" "7.12.9" "@babel/plugin-syntax-jsx" "7.12.1" "@babel/plugin-syntax-object-rest-spread" "7.8.3" "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" + "babel-plugin-apply-mdx-type-prop" "1.6.22" + "babel-plugin-extract-import-names" "1.6.22" + "camelcase-css" "2.0.1" + "detab" "2.0.4" + "hast-util-raw" "6.0.1" + "lodash.uniq" "4.5.0" + "mdast-util-to-hast" "10.0.1" + "remark-footnotes" "2.0.0" + "remark-mdx" "1.6.22" + "remark-parse" "8.0.3" + "remark-squeeze-paragraphs" "4.0.0" + "style-to-object" "0.3.0" + "unified" "9.2.0" + "unist-builder" "2.0.3" + "unist-util-visit" "2.0.3" "@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.npmmirror.com/@mdx-js/react/-/react-1.6.22.tgz" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + "integrity" "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==" + "resolved" "https://registry.npmmirror.com/@mdx-js/react/-/react-1.6.22.tgz" + "version" "1.6.22" "@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.npmmirror.com/@mdx-js/util/-/util-1.6.22.tgz" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + "integrity" "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + "resolved" "https://registry.npmmirror.com/@mdx-js/util/-/util-1.6.22.tgz" + "version" "1.6.22" "@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + "resolved" "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + "version" "2.1.5" dependencies: "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" + "run-parallel" "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "resolved" "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + "version" "2.0.5" "@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + "resolved" "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + "version" "1.2.8" dependencies: "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + "fastq" "^1.6.0" "@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.21.tgz" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + "integrity" "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + "resolved" "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.21.tgz" + "version" "1.0.0-next.21" "@sideway/address@^4.1.3": - version "4.1.3" - resolved "https://registry.npmmirror.com/@sideway/address/-/address-4.1.3.tgz" - integrity sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ== + "integrity" "sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ==" + "resolved" "https://registry.npmmirror.com/@sideway/address/-/address-4.1.3.tgz" + "version" "4.1.3" dependencies: "@hapi/hoek" "^9.0.0" "@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + "integrity" "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + "resolved" "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz" + "version" "3.0.1" "@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "integrity" "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + "resolved" "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + "version" "2.0.0" "@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.25.24.tgz" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "integrity" "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + "resolved" "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.25.24.tgz" + "version" "0.25.24" "@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "integrity" "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + "resolved" "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz" + "version" "0.14.0" "@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.npmmirror.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== + "integrity" "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==" + "resolved" "https://registry.npmmirror.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" + "version" "4.0.7" dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" + "eval" "^0.1.8" + "p-map" "^4.0.0" + "webpack-sources" "^3.2.2" "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + "integrity" "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" + "version" "6.5.1" "@svgr/babel-plugin-remove-jsx-attribute@*": - version "6.5.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz" - integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== + "integrity" "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz" + "version" "6.5.0" "@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "6.5.0" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz" - integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== + "integrity" "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz" + "version" "6.5.0" "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + "integrity" "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" + "version" "6.5.1" "@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + "integrity" "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" + "version" "6.5.1" "@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + "integrity" "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" + "version" "6.5.1" "@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + "integrity" "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" + "version" "6.5.1" "@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + "integrity" "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" + "version" "6.5.1" "@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + "integrity" "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==" + "resolved" "https://registry.npmmirror.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" + "version" "6.5.1" dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" "@svgr/babel-plugin-remove-jsx-attribute" "*" @@ -1843,48 +1884,48 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/core/-/core-6.5.1.tgz" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== +"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": + "integrity" "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==" + "resolved" "https://registry.npmmirror.com/@svgr/core/-/core-6.5.1.tgz" + "version" "6.5.1" dependencies: "@babel/core" "^7.19.6" "@svgr/babel-preset" "^6.5.1" "@svgr/plugin-jsx" "^6.5.1" - camelcase "^6.2.0" - cosmiconfig "^7.0.1" + "camelcase" "^6.2.0" + "cosmiconfig" "^7.0.1" "@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + "integrity" "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==" + "resolved" "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" + "version" "6.5.1" dependencies: "@babel/types" "^7.20.0" - entities "^4.4.0" + "entities" "^4.4.0" "@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + "integrity" "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==" + "resolved" "https://registry.npmmirror.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" + "version" "6.5.1" dependencies: "@babel/core" "^7.19.6" "@svgr/babel-preset" "^6.5.1" "@svgr/hast-util-to-babel-ast" "^6.5.1" - svg-parser "^2.0.4" + "svg-parser" "^2.0.4" "@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== + "integrity" "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==" + "resolved" "https://registry.npmmirror.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" + "version" "6.5.1" dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" + "cosmiconfig" "^7.0.1" + "deepmerge" "^4.2.2" + "svgo" "^2.8.0" "@svgr/webpack@^6.2.1": - version "6.5.1" - resolved "https://registry.npmmirror.com/@svgr/webpack/-/webpack-6.5.1.tgz" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== + "integrity" "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==" + "resolved" "https://registry.npmmirror.com/@svgr/webpack/-/webpack-6.5.1.tgz" + "version" "6.5.1" dependencies: "@babel/core" "^7.19.6" "@babel/plugin-transform-react-constant-elements" "^7.18.12" @@ -1896,81 +1937,81 @@ "@svgr/plugin-svgo" "^6.5.1" "@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + "integrity" "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==" + "resolved" "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" + "version" "1.1.2" dependencies: - defer-to-connect "^1.0.1" + "defer-to-connect" "^1.0.1" "@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + "integrity" "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + "resolved" "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz" + "version" "0.2.0" "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + "integrity" "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==" + "resolved" "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz" + "version" "1.19.2" dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.10.tgz" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + "integrity" "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==" + "resolved" "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.10.tgz" + "version" "3.5.10" dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + "integrity" "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==" + "resolved" "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" + "version" "1.3.5" dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.npmmirror.com/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + "integrity" "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==" + "resolved" "https://registry.npmmirror.com/@types/connect/-/connect-3.4.35.tgz" + "version" "3.4.35" dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + "integrity" "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==" + "resolved" "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" + "version" "3.7.3" dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.4.1" - resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.4.1.tgz" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== + "integrity" "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==" + "resolved" "https://registry.npmmirror.com/@types/eslint/-/eslint-8.4.1.tgz" + "version" "8.4.1" dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.51.tgz" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@*", "@types/estree@^1.0.0": + "integrity" "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "resolved" "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" + "version" "1.0.1" "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.31": - version "4.17.31" - resolved "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== + "integrity" "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==" + "resolved" "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz" + "version" "4.17.31" dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.15" - resolved "https://registry.npmmirror.com/@types/express/-/express-4.17.15.tgz" - integrity sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ== + "integrity" "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==" + "resolved" "https://registry.npmmirror.com/@types/express/-/express-4.17.15.tgz" + "version" "4.17.15" dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.31" @@ -1978,410 +2019,420 @@ "@types/serve-static" "*" "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.npmmirror.com/@types/hast/-/hast-2.3.4.tgz" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + "integrity" "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==" + "resolved" "https://registry.npmmirror.com/@types/hast/-/hast-2.3.4.tgz" + "version" "2.3.4" dependencies: "@types/unist" "*" "@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.npmmirror.com/@types/history/-/history-4.7.11.tgz" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + "integrity" "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + "resolved" "https://registry.npmmirror.com/@types/history/-/history-4.7.11.tgz" + "version" "4.7.11" "@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + "integrity" "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + "resolved" "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + "version" "6.1.0" "@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.9.tgz" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + "integrity" "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==" + "resolved" "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.9.tgz" + "version" "1.17.9" dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + "integrity" "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "resolved" "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + "version" "2.0.4" "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==" + "resolved" "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + "version" "3.0.0" dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + "integrity" "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==" + "resolved" "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + "version" "3.0.1" dependencies: "@types/istanbul-lib-report" "*" "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.9.tgz" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + "integrity" "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "resolved" "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.9.tgz" + "version" "7.0.9" "@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.npmmirror.com/@types/mdast/-/mdast-3.0.10.tgz" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + "integrity" "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==" + "resolved" "https://registry.npmmirror.com/@types/mdast/-/mdast-3.0.10.tgz" + "version" "3.0.10" dependencies: "@types/unist" "*" "@types/mime@*": - version "3.0.1" - resolved "https://registry.npmmirror.com/@types/mime/-/mime-3.0.1.tgz" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + "integrity" "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + "resolved" "https://registry.npmmirror.com/@types/mime/-/mime-3.0.1.tgz" + "version" "3.0.1" "@types/node@*", "@types/node@^17.0.5": - version "17.0.19" - resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.19.tgz" - integrity sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA== + "integrity" "sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA==" + "resolved" "https://registry.npmmirror.com/@types/node/-/node-17.0.19.tgz" + "version" "17.0.19" "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "resolved" "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz" + "version" "4.0.0" "@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.npmmirror.com/@types/parse5/-/parse5-5.0.3.tgz" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + "integrity" "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + "resolved" "https://registry.npmmirror.com/@types/parse5/-/parse5-5.0.3.tgz" + "version" "5.0.3" "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.5.tgz" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + "integrity" "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "resolved" "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.5.tgz" + "version" "15.7.5" "@types/qs@*": - version "6.9.7" - resolved "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + "integrity" "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "resolved" "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz" + "version" "6.9.7" "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + "integrity" "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "resolved" "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz" + "version" "1.2.4" "@types/react-router-config@*", "@types/react-router-config@^5.0.6": - version "5.0.6" - resolved "https://registry.npmmirror.com/@types/react-router-config/-/react-router-config-5.0.6.tgz" - integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== + "integrity" "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==" + "resolved" "https://registry.npmmirror.com/@types/react-router-config/-/react-router-config-5.0.6.tgz" + "version" "5.0.6" dependencies: "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router" "*" "@types/react-router-dom@*": - version "5.3.3" - resolved "https://registry.npmmirror.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + "integrity" "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==" + "resolved" "https://registry.npmmirror.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" + "version" "5.3.3" dependencies: "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router" "*" "@types/react-router@*": - version "5.1.19" - resolved "https://registry.npmmirror.com/@types/react-router/-/react-router-5.1.19.tgz" - integrity sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA== + "integrity" "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==" + "resolved" "https://registry.npmmirror.com/@types/react-router/-/react-router-5.1.19.tgz" + "version" "5.1.19" dependencies: "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": - version "18.0.26" - resolved "https://registry.npmmirror.com/@types/react/-/react-18.0.26.tgz" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== +"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0": + "integrity" "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==" + "resolved" "https://registry.npmmirror.com/@types/react/-/react-18.0.26.tgz" + "version" "18.0.26" dependencies: "@types/prop-types" "*" "@types/scheduler" "*" - csstype "^3.0.2" + "csstype" "^3.0.2" "@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "integrity" "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "resolved" "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz" + "version" "0.12.0" "@types/sax@^1.2.1": - version "1.2.4" - resolved "https://registry.npmmirror.com/@types/sax/-/sax-1.2.4.tgz" - integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + "integrity" "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==" + "resolved" "https://registry.npmmirror.com/@types/sax/-/sax-1.2.4.tgz" + "version" "1.2.4" dependencies: "@types/node" "*" "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.2.tgz" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "resolved" "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.2.tgz" + "version" "0.16.2" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + "integrity" "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==" + "resolved" "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.1.tgz" + "version" "1.9.1" dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.0" - resolved "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + "integrity" "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==" + "resolved" "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.0.tgz" + "version" "1.15.0" dependencies: "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.33.tgz" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + "integrity" "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==" + "resolved" "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.33.tgz" + "version" "0.3.33" dependencies: "@types/node" "*" "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.npmmirror.com/@types/unist/-/unist-2.0.6.tgz" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + "integrity" "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + "resolved" "https://registry.npmmirror.com/@types/unist/-/unist-2.0.6.tgz" + "version" "2.0.6" "@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.npmmirror.com/@types/ws/-/ws-8.5.3.tgz" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + "integrity" "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==" + "resolved" "https://registry.npmmirror.com/@types/ws/-/ws-8.5.3.tgz" + "version" "8.5.3" dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + "integrity" "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + "resolved" "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + "version" "21.0.0" "@types/yargs@^17.0.8": - version "17.0.17" - resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.17.tgz" - integrity sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g== + "integrity" "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==" + "resolved" "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.17.tgz" + "version" "17.0.17" dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": + "integrity" "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" + "version" "1.11.6" dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + "integrity" "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + "version" "1.11.6" -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + "integrity" "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + "version" "1.11.6" -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.6": + "integrity" "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + "version" "1.11.6" -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + "integrity" "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + "version" "1.11.6" dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + "integrity" "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + "version" "1.11.6" -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.6": + "integrity" "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + "version" "1.11.6" dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + "integrity" "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + "version" "1.11.6" dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + "integrity" "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + "version" "1.11.6" dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + "integrity" "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + "version" "1.11.6" + +"@webassemblyjs/wasm-edit@^1.11.5": + "integrity" "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + "integrity" "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + "integrity" "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": + "integrity" "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + "integrity" "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==" + "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + "integrity" "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "resolved" "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + "version" "1.2.0" "@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1: - version "8.8.0" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== - -address@^1.0.1, address@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/address/-/address-1.1.2.tgz" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.10.0" - resolved "https://registry.npmmirror.com/ajv/-/ajv-8.10.0.tgz" - integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -algoliasearch-helper@^3.10.0: - version "3.11.1" - resolved "https://registry.npmmirror.com/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz" - integrity sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw== + "integrity" "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "resolved" "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz" + "version" "4.2.2" + +"accepts@~1.3.4", "accepts@~1.3.5", "accepts@~1.3.8": + "integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==" + "resolved" "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz" + "version" "1.3.8" + dependencies: + "mime-types" "~2.1.34" + "negotiator" "0.6.3" + +"acorn-import-assertions@^1.9.0": + "integrity" "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==" + "resolved" "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + "version" "1.9.0" + +"acorn-walk@^8.0.0": + "integrity" "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + "resolved" "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz" + "version" "8.2.0" + +"acorn@^8", "acorn@^8.0.4", "acorn@^8.5.0", "acorn@^8.7.1": + "integrity" "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + "resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz" + "version" "8.8.0" + +"address@^1.0.1", "address@^1.1.2": + "integrity" "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + "resolved" "https://registry.npmmirror.com/address/-/address-1.1.2.tgz" + "version" "1.1.2" + +"aggregate-error@^3.0.0": + "integrity" "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==" + "resolved" "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "clean-stack" "^2.0.0" + "indent-string" "^4.0.0" + +"ajv-formats@^2.1.1": + "integrity" "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==" + "resolved" "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "ajv" "^8.0.0" + +"ajv-keywords@^3.4.1", "ajv-keywords@^3.5.2": + "integrity" "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "resolved" "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + "version" "3.5.2" + +"ajv-keywords@^5.0.0": + "integrity" "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==" + "resolved" "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "fast-deep-equal" "^3.1.3" + +"ajv@^6.12.2", "ajv@^6.12.4", "ajv@^6.12.5", "ajv@^6.9.1": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" + dependencies: + "fast-deep-equal" "^3.1.1" + "fast-json-stable-stringify" "^2.0.0" + "json-schema-traverse" "^0.4.1" + "uri-js" "^4.2.2" + +"ajv@^8.0.0": + "integrity" "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==" + "resolved" "https://registry.npmmirror.com/ajv/-/ajv-8.10.0.tgz" + "version" "8.10.0" + dependencies: + "fast-deep-equal" "^3.1.1" + "json-schema-traverse" "^1.0.0" + "require-from-string" "^2.0.2" + "uri-js" "^4.2.2" + +"ajv@^8.8.0", "ajv@^8.8.2": + "integrity" "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==" + "resolved" "https://registry.npmmirror.com/ajv/-/ajv-8.10.0.tgz" + "version" "8.10.0" + dependencies: + "fast-deep-equal" "^3.1.1" + "json-schema-traverse" "^1.0.0" + "require-from-string" "^2.0.2" + "uri-js" "^4.2.2" + +"algoliasearch-helper@^3.10.0": + "integrity" "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==" + "resolved" "https://registry.npmmirror.com/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz" + "version" "3.11.1" dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.0.0, algoliasearch@^4.13.1: - version "4.14.3" - resolved "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-4.14.3.tgz" - integrity sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg== +"algoliasearch@^4.0.0", "algoliasearch@^4.13.1", "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": + "integrity" "sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==" + "resolved" "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-4.14.3.tgz" + "version" "4.14.3" dependencies: "@algolia/cache-browser-local-storage" "4.14.3" "@algolia/cache-common" "4.14.3" @@ -2398,2355 +2449,2400 @@ algoliasearch@^4.0.0, algoliasearch@^4.13.1: "@algolia/requester-node-http" "4.14.3" "@algolia/transporter" "4.14.3" -ansi-align@^3.0.0, ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.0: - version "5.0.1" - resolved "https://registry.npmmirror.com/arg/-/arg-5.0.1.tgz" - integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.7: - version "10.4.14" - resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== - dependencies: - follow-redirects "^1.14.7" - -babel-loader@^8.2.5: - version "8.3.0" - resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.npmmirror.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== +"ansi-align@^3.0.0", "ansi-align@^3.0.1": + "integrity" "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==" + "resolved" "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "string-width" "^4.1.0" + +"ansi-html-community@^0.0.8": + "integrity" "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + "resolved" "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + "version" "0.0.8" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-regex@^6.0.1": + "integrity" "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "resolved" "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz" + "version" "6.0.1" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"ansi-styles@^6.1.0": + "integrity" "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + "resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz" + "version" "6.2.1" + +"anymatch@~3.1.2": + "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" + "resolved" "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"arg@^5.0.0": + "integrity" "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "resolved" "https://registry.npmmirror.com/arg/-/arg-5.0.1.tgz" + "version" "5.0.1" + +"argparse@^1.0.7": + "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + "resolved" "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "sprintf-js" "~1.0.2" + +"argparse@^2.0.1": + "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "resolved" "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz" + "version" "2.0.1" + +"array-flatten@^2.1.2": + "integrity" "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "resolved" "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz" + "version" "2.1.2" + +"array-flatten@1.1.1": + "integrity" "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "resolved" "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz" + "version" "1.1.1" + +"array-union@^2.1.0": + "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "resolved" "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz" + "version" "2.1.0" + +"asap@~2.0.3": + "integrity" "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "resolved" "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz" + "version" "2.0.6" + +"at-least-node@^1.0.0": + "integrity" "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "resolved" "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz" + "version" "1.0.0" + +"autoprefixer@^10.4.12", "autoprefixer@^10.4.7": + "integrity" "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==" + "resolved" "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.14.tgz" + "version" "10.4.14" + dependencies: + "browserslist" "^4.21.5" + "caniuse-lite" "^1.0.30001464" + "fraction.js" "^4.2.0" + "normalize-range" "^0.1.2" + "picocolors" "^1.0.0" + "postcss-value-parser" "^4.2.0" + +"axios@^0.25.0": + "integrity" "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==" + "resolved" "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz" + "version" "0.25.0" + dependencies: + "follow-redirects" "^1.14.7" + +"babel-loader@^8.2.5": + "integrity" "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==" + "resolved" "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz" + "version" "8.3.0" + dependencies: + "find-cache-dir" "^3.3.1" + "loader-utils" "^2.0.0" + "make-dir" "^3.1.0" + "schema-utils" "^2.6.5" + +"babel-plugin-apply-mdx-type-prop@1.6.22": + "integrity" "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==" + "resolved" "https://registry.npmmirror.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" + "version" "1.6.22" dependencies: "@babel/helper-plugin-utils" "7.10.4" "@mdx-js/util" "1.6.22" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== +"babel-plugin-dynamic-import-node@^2.3.3": + "integrity" "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==" + "resolved" "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + "version" "2.3.3" dependencies: - object.assign "^4.1.0" + "object.assign" "^4.1.0" -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.npmmirror.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== +"babel-plugin-extract-import-names@1.6.22": + "integrity" "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==" + "resolved" "https://registry.npmmirror.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" + "version" "1.6.22" dependencies: "@babel/helper-plugin-utils" "7.10.4" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +"babel-plugin-polyfill-corejs2@^0.3.3": + "integrity" "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==" + "resolved" "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" + "version" "0.3.3" dependencies: "@babel/compat-data" "^7.17.7" "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "semver" "^6.1.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +"babel-plugin-polyfill-corejs3@^0.6.0": + "integrity" "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==" + "resolved" "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + "version" "0.6.0" dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "core-js-compat" "^3.25.1" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +"babel-plugin-polyfill-regenerator@^0.4.1": + "integrity" "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==" + "resolved" "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + "version" "0.4.1" dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/bail/-/bail-1.0.5.tgz" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/base16/-/base16-1.0.0.tgz" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.1.1.tgz" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.npmmirror.com/boxen/-/boxen-5.1.2.tgz" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -boxen@^6.2.1: - version "6.2.1" - resolved "https://registry.npmmirror.com/boxen/-/boxen-6.2.1.tgz" - integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== - dependencies: - ansi-align "^3.0.1" - camelcase "^6.2.0" - chalk "^4.1.2" - cli-boxes "^3.0.0" - string-width "^5.0.1" - type-fest "^2.5.0" - widest-line "^4.0.1" - wrap-ansi "^8.0.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.5.tgz" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-6.1.0.tgz" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: - version "1.0.30001473" - resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz" - integrity sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/ccount/-/ccount-1.1.0.tgz" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmmirror.com/character-entities/-/character-entities-1.2.4.tgz" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.12: - version "1.0.0-rc.12" - resolved "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.12.tgz" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" +"bail@^1.0.0": + "integrity" "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + "resolved" "https://registry.npmmirror.com/bail/-/bail-1.0.5.tgz" + "version" "1.0.5" + +"balanced-match@^1.0.0": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" + +"base16@^1.0.0": + "integrity" "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + "resolved" "https://registry.npmmirror.com/base16/-/base16-1.0.0.tgz" + "version" "1.0.0" + +"batch@0.6.1": + "integrity" "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "resolved" "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz" + "version" "0.6.1" + +"big.js@^5.2.2": + "integrity" "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "resolved" "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz" + "version" "5.2.2" + +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" + +"body-parser@1.20.1": + "integrity" "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==" + "resolved" "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz" + "version" "1.20.1" + dependencies: + "bytes" "3.1.2" + "content-type" "~1.0.4" + "debug" "2.6.9" + "depd" "2.0.0" + "destroy" "1.2.0" + "http-errors" "2.0.0" + "iconv-lite" "0.4.24" + "on-finished" "2.4.1" + "qs" "6.11.0" + "raw-body" "2.5.1" + "type-is" "~1.6.18" + "unpipe" "1.0.0" + +"bonjour-service@^1.0.11": + "integrity" "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==" + "resolved" "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "array-flatten" "^2.1.2" + "dns-equal" "^1.0.0" + "fast-deep-equal" "^3.1.3" + "multicast-dns" "^7.2.5" + +"boolbase@^1.0.0": + "integrity" "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "resolved" "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz" + "version" "1.0.0" + +"boxen@^5.0.0": + "integrity" "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==" + "resolved" "https://registry.npmmirror.com/boxen/-/boxen-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "ansi-align" "^3.0.0" + "camelcase" "^6.2.0" + "chalk" "^4.1.0" + "cli-boxes" "^2.2.1" + "string-width" "^4.2.2" + "type-fest" "^0.20.2" + "widest-line" "^3.1.0" + "wrap-ansi" "^7.0.0" + +"boxen@^6.2.1": + "integrity" "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==" + "resolved" "https://registry.npmmirror.com/boxen/-/boxen-6.2.1.tgz" + "version" "6.2.1" + dependencies: + "ansi-align" "^3.0.1" + "camelcase" "^6.2.0" + "chalk" "^4.1.2" + "cli-boxes" "^3.0.0" + "string-width" "^5.0.1" + "type-fest" "^2.5.0" + "widest-line" "^4.0.1" + "wrap-ansi" "^8.0.1" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"braces@^3.0.2", "braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"browserslist@^4.0.0", "browserslist@^4.14.5", "browserslist@^4.18.1", "browserslist@^4.21.3", "browserslist@^4.21.4", "browserslist@^4.21.5", "browserslist@>= 4.21.0": + "integrity" "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==" + "resolved" "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.5.tgz" + "version" "4.21.5" + dependencies: + "caniuse-lite" "^1.0.30001449" + "electron-to-chromium" "^1.4.284" + "node-releases" "^2.0.8" + "update-browserslist-db" "^1.0.10" + +"buffer-from@^1.0.0": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" + +"bytes@3.0.0": + "integrity" "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + "resolved" "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz" + "version" "3.0.0" + +"bytes@3.1.2": + "integrity" "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "resolved" "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz" + "version" "3.1.2" + +"cacheable-request@^6.0.0": + "integrity" "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==" + "resolved" "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "clone-response" "^1.0.2" + "get-stream" "^5.1.0" + "http-cache-semantics" "^4.0.0" + "keyv" "^3.0.0" + "lowercase-keys" "^2.0.0" + "normalize-url" "^4.1.0" + "responselike" "^1.0.2" + +"call-bind@^1.0.0", "call-bind@^1.0.2": + "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" + "resolved" "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "function-bind" "^1.1.1" + "get-intrinsic" "^1.0.2" + +"callsites@^3.0.0": + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" + +"camel-case@^4.1.2": + "integrity" "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==" + "resolved" "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "pascal-case" "^3.1.2" + "tslib" "^2.0.3" + +"camelcase-css@2.0.1": + "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + "resolved" "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz" + "version" "2.0.1" + +"camelcase@^6.2.0": + "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + "resolved" "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz" + "version" "6.3.0" + +"caniuse-api@^3.0.0": + "integrity" "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==" + "resolved" "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "browserslist" "^4.0.0" + "caniuse-lite" "^1.0.0" + "lodash.memoize" "^4.1.2" + "lodash.uniq" "^4.5.0" + +"caniuse-lite@^1.0.0", "caniuse-lite@^1.0.30001449", "caniuse-lite@^1.0.30001464": + "integrity" "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==" + "resolved" "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz" + "version" "1.0.30001473" + +"ccount@^1.0.0": + "integrity" "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + "resolved" "https://registry.npmmirror.com/ccount/-/ccount-1.1.0.tgz" + "version" "1.1.0" + +"chalk@^2.0.0": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" + +"chalk@^4.0.0", "chalk@^4.1.0", "chalk@^4.1.2": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"character-entities-legacy@^1.0.0": + "integrity" "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + "resolved" "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" + "version" "1.1.4" + +"character-entities@^1.0.0": + "integrity" "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + "resolved" "https://registry.npmmirror.com/character-entities/-/character-entities-1.2.4.tgz" + "version" "1.2.4" + +"character-reference-invalid@^1.0.0": + "integrity" "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + "resolved" "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" + "version" "1.1.4" + +"cheerio-select@^2.1.0": + "integrity" "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==" + "resolved" "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "boolbase" "^1.0.0" + "css-select" "^5.1.0" + "css-what" "^6.1.0" + "domelementtype" "^2.3.0" + "domhandler" "^5.0.3" + "domutils" "^3.0.1" + +"cheerio@^1.0.0-rc.12": + "integrity" "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==" + "resolved" "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.12.tgz" + "version" "1.0.0-rc.12" + dependencies: + "cheerio-select" "^2.1.0" + "dom-serializer" "^2.0.0" + "domhandler" "^5.0.3" + "domutils" "^3.0.1" + "htmlparser2" "^8.0.1" + "parse5" "^7.0.0" + "parse5-htmlparser2-tree-adapter" "^7.0.0" + +"chokidar@^3.4.2", "chokidar@^3.5.3", "chokidar@>=3.0.0 <4.0.0": + "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" + "resolved" "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz" + "version" "3.5.3" + dependencies: + "anymatch" "~3.1.2" + "braces" "~3.0.2" + "glob-parent" "~5.1.2" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.6.0" optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.8.0.tgz" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -clean-css@^5.2.2, clean-css@^5.3.0: - version "5.3.2" - resolved "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-2.2.1.tgz" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-3.0.0.tgz" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-table3@^0.6.2: - version "0.6.3" - resolved "https://registry.npmmirror.com/cli-table3/-/cli-table3-0.6.3.tgz" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" + "fsevents" "~2.3.2" + +"chrome-trace-event@^1.0.2": + "integrity" "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + "resolved" "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + "version" "1.0.3" + +"ci-info@^2.0.0": + "integrity" "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "resolved" "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz" + "version" "2.0.0" + +"ci-info@^3.2.0": + "integrity" "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" + "resolved" "https://registry.npmmirror.com/ci-info/-/ci-info-3.8.0.tgz" + "version" "3.8.0" + +"clean-css@^5.2.2", "clean-css@^5.3.0": + "integrity" "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==" + "resolved" "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz" + "version" "5.3.2" + dependencies: + "source-map" "~0.6.0" + +"clean-stack@^2.0.0": + "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "resolved" "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz" + "version" "2.2.0" + +"cli-boxes@^2.2.1": + "integrity" "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + "resolved" "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-2.2.1.tgz" + "version" "2.2.1" + +"cli-boxes@^3.0.0": + "integrity" "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + "resolved" "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-3.0.0.tgz" + "version" "3.0.0" + +"cli-table3@^0.6.2": + "integrity" "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==" + "resolved" "https://registry.npmmirror.com/cli-table3/-/cli-table3-0.6.3.tgz" + "version" "0.6.3" + dependencies: + "string-width" "^4.2.0" optionalDependencies: "@colors/colors" "1.5.0" -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/clsx/-/clsx-1.2.1.tgz" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.npmmirror.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.10: - version "2.0.19" - resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -combine-promises@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/combine-promises/-/combine-promises-1.1.0.tgz" - integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/configstore/-/configstore-5.0.1.tgz" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.2.tgz" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-text-to-clipboard@^3.0.1: - version "3.1.0" - resolved "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz" - integrity sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng== - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - -core-js-compat@^3.25.1: - version "3.29.1" - resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.29.1.tgz" - integrity sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA== - dependencies: - browserslist "^4.21.5" - -core-js-pure@^3.25.1: - version "3.29.1" - resolved "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.29.1.tgz" - integrity sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg== - -core-js@^3.23.3: - version "3.29.1" - resolved "https://registry.npmmirror.com/core-js/-/core-js-3.29.1.tgz" - integrity sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +"clone-deep@^4.0.1": + "integrity" "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==" + "resolved" "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "is-plain-object" "^2.0.4" + "kind-of" "^6.0.2" + "shallow-clone" "^3.0.0" + +"clone-response@^1.0.2": + "integrity" "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==" + "resolved" "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "mimic-response" "^1.0.0" + +"clsx@^1.2.1": + "integrity" "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + "resolved" "https://registry.npmmirror.com/clsx/-/clsx-1.2.1.tgz" + "version" "1.2.1" + +"collapse-white-space@^1.0.2": + "integrity" "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + "resolved" "https://registry.npmmirror.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz" + "version" "1.0.6" + +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"colord@^2.9.1": + "integrity" "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + "resolved" "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz" + "version" "2.9.3" + +"colorette@^2.0.10": + "integrity" "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + "resolved" "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz" + "version" "2.0.19" + +"combine-promises@^1.1.0": + "integrity" "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" + "resolved" "https://registry.npmmirror.com/combine-promises/-/combine-promises-1.1.0.tgz" + "version" "1.1.0" + +"comma-separated-tokens@^1.0.0": + "integrity" "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + "resolved" "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" + "version" "1.0.8" + +"commander@^2.20.0": + "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "resolved" "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz" + "version" "2.20.3" + +"commander@^5.1.0": + "integrity" "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + "resolved" "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz" + "version" "5.1.0" + +"commander@^7.2.0": + "integrity" "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + "resolved" "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz" + "version" "7.2.0" + +"commander@^8.3.0": + "integrity" "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + "resolved" "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz" + "version" "8.3.0" + +"commondir@^1.0.1": + "integrity" "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "resolved" "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz" + "version" "1.0.1" + +"compressible@~2.0.16": + "integrity" "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==" + "resolved" "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz" + "version" "2.0.18" + dependencies: + "mime-db" ">= 1.43.0 < 2" + +"compression@^1.7.4": + "integrity" "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==" + "resolved" "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz" + "version" "1.7.4" + dependencies: + "accepts" "~1.3.5" + "bytes" "3.0.0" + "compressible" "~2.0.16" + "debug" "2.6.9" + "on-headers" "~1.0.2" + "safe-buffer" "5.1.2" + "vary" "~1.1.2" + +"concat-map@0.0.1": + "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "resolved" "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"configstore@^5.0.1": + "integrity" "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==" + "resolved" "https://registry.npmmirror.com/configstore/-/configstore-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "dot-prop" "^5.2.0" + "graceful-fs" "^4.1.2" + "make-dir" "^3.0.0" + "unique-string" "^2.0.0" + "write-file-atomic" "^3.0.0" + "xdg-basedir" "^4.0.0" + +"connect-history-api-fallback@^2.0.0": + "integrity" "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + "resolved" "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + "version" "2.0.0" + +"consola@^2.15.3": + "integrity" "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "resolved" "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz" + "version" "2.15.3" + +"content-disposition@0.5.2": + "integrity" "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + "resolved" "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.2.tgz" + "version" "0.5.2" + +"content-disposition@0.5.4": + "integrity" "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==" + "resolved" "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz" + "version" "0.5.4" + dependencies: + "safe-buffer" "5.2.1" + +"content-type@~1.0.4": + "integrity" "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + "resolved" "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz" + "version" "1.0.5" + +"convert-source-map@^1.7.0": + "integrity" "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "resolved" "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz" + "version" "1.9.0" + +"cookie-signature@1.0.6": + "integrity" "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "resolved" "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz" + "version" "1.0.6" + +"cookie@0.5.0": + "integrity" "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "resolved" "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz" + "version" "0.5.0" + +"copy-anything@^2.0.1": + "integrity" "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==" + "resolved" "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" + "version" "2.0.6" + dependencies: + "is-what" "^3.14.1" + +"copy-text-to-clipboard@^3.0.1": + "integrity" "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==" + "resolved" "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz" + "version" "3.1.0" + +"copy-webpack-plugin@^11.0.0": + "integrity" "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==" + "resolved" "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + "version" "11.0.0" + dependencies: + "fast-glob" "^3.2.11" + "glob-parent" "^6.0.1" + "globby" "^13.1.1" + "normalize-path" "^3.0.0" + "schema-utils" "^4.0.0" + "serialize-javascript" "^6.0.0" + +"core-js-compat@^3.25.1": + "integrity" "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==" + "resolved" "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.29.1.tgz" + "version" "3.29.1" + dependencies: + "browserslist" "^4.21.5" + +"core-js-pure@^3.25.1": + "integrity" "sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg==" + "resolved" "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.29.1.tgz" + "version" "3.29.1" + +"core-js@^3.23.3": + "integrity" "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==" + "resolved" "https://registry.npmmirror.com/core-js/-/core-js-3.29.1.tgz" + "version" "3.29.1" + +"core-util-is@~1.0.0": + "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "resolved" "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz" + "version" "1.0.3" + +"cosmiconfig@^6.0.0": + "integrity" "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==" + "resolved" "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + "version" "6.0.0" dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" + "import-fresh" "^3.1.0" + "parse-json" "^5.0.0" + "path-type" "^4.0.0" + "yaml" "^1.7.2" -cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== +"cosmiconfig@^7.0.1": + "integrity" "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==" + "resolved" "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + "version" "7.1.0" dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.0.0: - version "8.1.3" - resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.5.tgz" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== - -css-loader@^6.7.1: - version "6.7.3" - resolved "https://registry.npmmirror.com/css-loader/-/css-loader-6.7.3.tgz" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.19" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^4.0.0: - version "4.2.2" - resolved "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== - dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1, css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-advanced@^5.3.8: - version "5.3.10" - resolved "https://registry.npmmirror.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz" - integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== - dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.14" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.1.12, cssnano@^5.1.8: - version "5.1.15" - resolved "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.15.tgz" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -debug@2.6.9, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.4: - version "1.2.0" - resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^6.1.1: - version "6.1.1" - resolved "https://registry.npmmirror.com/del/-/del-6.1.1.tgz" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detab@2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/detab/-/detab-2.0.4.tgz" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.npmmirror.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.npmmirror.com/detect-port/-/detect-port-1.5.1.tgz" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.5.0" - resolved "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.5.0.tgz" - integrity sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA== + "import-fresh" "^3.2.1" + "parse-json" "^5.0.0" + "path-type" "^4.0.0" + "yaml" "^1.10.0" + +"cosmiconfig@^8.0.0": + "integrity" "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==" + "resolved" "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz" + "version" "8.1.3" + dependencies: + "import-fresh" "^3.2.1" + "js-yaml" "^4.1.0" + "parse-json" "^5.0.0" + "path-type" "^4.0.0" + +"cross-fetch@^3.1.5": + "integrity" "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==" + "resolved" "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.5.tgz" + "version" "3.1.5" + dependencies: + "node-fetch" "2.6.7" + +"cross-spawn@^7.0.3": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + +"crypto-random-string@^2.0.0": + "integrity" "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + "resolved" "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + "version" "2.0.0" + +"css-declaration-sorter@^6.3.1": + "integrity" "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==" + "resolved" "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz" + "version" "6.4.0" + +"css-loader@^6.7.1": + "integrity" "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==" + "resolved" "https://registry.npmmirror.com/css-loader/-/css-loader-6.7.3.tgz" + "version" "6.7.3" + dependencies: + "icss-utils" "^5.1.0" + "postcss" "^8.4.19" + "postcss-modules-extract-imports" "^3.0.0" + "postcss-modules-local-by-default" "^4.0.0" + "postcss-modules-scope" "^3.0.0" + "postcss-modules-values" "^4.0.0" + "postcss-value-parser" "^4.2.0" + "semver" "^7.3.8" + +"css-minimizer-webpack-plugin@^4.0.0": + "integrity" "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==" + "resolved" "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" + "version" "4.2.2" + dependencies: + "cssnano" "^5.1.8" + "jest-worker" "^29.1.2" + "postcss" "^8.4.17" + "schema-utils" "^4.0.0" + "serialize-javascript" "^6.0.0" + "source-map" "^0.6.1" + +"css-select@^4.1.3": + "integrity" "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==" + "resolved" "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "boolbase" "^1.0.0" + "css-what" "^6.0.1" + "domhandler" "^4.3.1" + "domutils" "^2.8.0" + "nth-check" "^2.0.1" + +"css-select@^5.1.0": + "integrity" "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==" + "resolved" "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "boolbase" "^1.0.0" + "css-what" "^6.1.0" + "domhandler" "^5.0.2" + "domutils" "^3.0.1" + "nth-check" "^2.0.1" + +"css-tree@^1.1.2", "css-tree@^1.1.3": + "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==" + "resolved" "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "mdn-data" "2.0.14" + "source-map" "^0.6.1" + +"css-what@^6.0.1", "css-what@^6.1.0": + "integrity" "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + "resolved" "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz" + "version" "6.1.0" + +"cssesc@^3.0.0": + "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "resolved" "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz" + "version" "3.0.0" + +"cssnano-preset-advanced@^5.3.8": + "integrity" "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==" + "resolved" "https://registry.npmmirror.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz" + "version" "5.3.10" + dependencies: + "autoprefixer" "^10.4.12" + "cssnano-preset-default" "^5.2.14" + "postcss-discard-unused" "^5.1.0" + "postcss-merge-idents" "^5.1.1" + "postcss-reduce-idents" "^5.2.0" + "postcss-zindex" "^5.1.0" + +"cssnano-preset-default@^5.2.14": + "integrity" "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==" + "resolved" "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" + "version" "5.2.14" + dependencies: + "css-declaration-sorter" "^6.3.1" + "cssnano-utils" "^3.1.0" + "postcss-calc" "^8.2.3" + "postcss-colormin" "^5.3.1" + "postcss-convert-values" "^5.1.3" + "postcss-discard-comments" "^5.1.2" + "postcss-discard-duplicates" "^5.1.0" + "postcss-discard-empty" "^5.1.1" + "postcss-discard-overridden" "^5.1.0" + "postcss-merge-longhand" "^5.1.7" + "postcss-merge-rules" "^5.1.4" + "postcss-minify-font-values" "^5.1.0" + "postcss-minify-gradients" "^5.1.1" + "postcss-minify-params" "^5.1.4" + "postcss-minify-selectors" "^5.2.1" + "postcss-normalize-charset" "^5.1.0" + "postcss-normalize-display-values" "^5.1.0" + "postcss-normalize-positions" "^5.1.1" + "postcss-normalize-repeat-style" "^5.1.1" + "postcss-normalize-string" "^5.1.0" + "postcss-normalize-timing-functions" "^5.1.0" + "postcss-normalize-unicode" "^5.1.1" + "postcss-normalize-url" "^5.1.0" + "postcss-normalize-whitespace" "^5.1.1" + "postcss-ordered-values" "^5.1.3" + "postcss-reduce-initial" "^5.1.2" + "postcss-reduce-transforms" "^5.1.0" + "postcss-svgo" "^5.1.0" + "postcss-unique-selectors" "^5.1.1" + +"cssnano-utils@^3.1.0": + "integrity" "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" + "resolved" "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz" + "version" "3.1.0" + +"cssnano@^5.1.12", "cssnano@^5.1.8": + "integrity" "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==" + "resolved" "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.15.tgz" + "version" "5.1.15" + dependencies: + "cssnano-preset-default" "^5.2.14" + "lilconfig" "^2.0.3" + "yaml" "^1.10.2" + +"csso@^4.2.0": + "integrity" "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==" + "resolved" "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "css-tree" "^1.1.2" + +"csstype@^3.0.2": + "integrity" "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "resolved" "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz" + "version" "3.1.2" + +"debug@^2.6.0": + "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "resolved" "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "ms" "2.0.0" + +"debug@^3.2.6": + "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + "version" "3.2.7" + dependencies: + "ms" "^2.1.1" + +"debug@^4.1.0", "debug@^4.1.1", "debug@4": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"debug@2.6.9": + "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "resolved" "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "ms" "2.0.0" + +"decompress-response@^3.3.0": + "integrity" "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==" + "resolved" "https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "mimic-response" "^1.0.0" + +"deep-extend@^0.6.0": + "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "resolved" "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz" + "version" "0.6.0" + +"deepmerge@^4.2.2": + "integrity" "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + "resolved" "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz" + "version" "4.3.1" + +"default-gateway@^6.0.3": + "integrity" "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==" + "resolved" "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz" + "version" "6.0.3" + dependencies: + "execa" "^5.0.0" + +"defer-to-connect@^1.0.1": + "integrity" "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + "resolved" "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz" + "version" "1.1.3" + +"define-lazy-prop@^2.0.0": + "integrity" "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + "resolved" "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + "version" "2.0.0" + +"define-properties@^1.1.4": + "integrity" "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==" + "resolved" "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "has-property-descriptors" "^1.0.0" + "object-keys" "^1.1.1" + +"del@^6.1.1": + "integrity" "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==" + "resolved" "https://registry.npmmirror.com/del/-/del-6.1.1.tgz" + "version" "6.1.1" + dependencies: + "globby" "^11.0.1" + "graceful-fs" "^4.2.4" + "is-glob" "^4.0.1" + "is-path-cwd" "^2.2.0" + "is-path-inside" "^3.0.2" + "p-map" "^4.0.0" + "rimraf" "^3.0.2" + "slash" "^3.0.0" + +"depd@~1.1.2": + "integrity" "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + "resolved" "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz" + "version" "1.1.2" + +"depd@2.0.0": + "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "resolved" "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz" + "version" "2.0.0" + +"destroy@1.2.0": + "integrity" "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + "resolved" "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz" + "version" "1.2.0" + +"detab@2.0.4": + "integrity" "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==" + "resolved" "https://registry.npmmirror.com/detab/-/detab-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "repeat-string" "^1.5.4" + +"detect-node@^2.0.4": + "integrity" "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "resolved" "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz" + "version" "2.1.0" + +"detect-port-alt@^1.1.6": + "integrity" "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==" + "resolved" "https://registry.npmmirror.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz" + "version" "1.1.6" + dependencies: + "address" "^1.0.1" + "debug" "^2.6.0" + +"detect-port@^1.3.0": + "integrity" "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==" + "resolved" "https://registry.npmmirror.com/detect-port/-/detect-port-1.5.1.tgz" + "version" "1.5.1" + dependencies: + "address" "^1.0.1" + "debug" "4" + +"dir-glob@^3.0.1": + "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + "resolved" "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "path-type" "^4.0.0" + +"dns-equal@^1.0.0": + "integrity" "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + "resolved" "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz" + "version" "1.0.0" + +"dns-packet@^5.2.2": + "integrity" "sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==" + "resolved" "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.5.0.tgz" + "version" "5.5.0" dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -docusaurus-plugin-less@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/docusaurus-plugin-less/-/docusaurus-plugin-less-2.0.2.tgz" - integrity sha512-ez6WSSvGS8HoJslYHeG5SflyShWvHFXeTTHXPBd3H1T3zgq9wp6wD7scXm+rXyyfhFhP5VNiIqhYB78z4OLjwg== +"docusaurus-plugin-less@^2.0.2": + "integrity" "sha512-ez6WSSvGS8HoJslYHeG5SflyShWvHFXeTTHXPBd3H1T3zgq9wp6wD7scXm+rXyyfhFhP5VNiIqhYB78z4OLjwg==" + "resolved" "https://registry.npmmirror.com/docusaurus-plugin-less/-/docusaurus-plugin-less-2.0.2.tgz" + "version" "2.0.2" -docusaurus-plugin-sass@^0.2.2: - version "0.2.3" - resolved "https://registry.npmmirror.com/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.3.tgz" - integrity sha512-FbaE06K8NF8SPUYTwiG+83/jkXrwHJ/Afjqz3SUIGon6QvFwSSoKOcoxGQmUBnjTOk+deUONDx8jNWsegFJcBQ== +"docusaurus-plugin-sass@^0.2.2": + "integrity" "sha512-FbaE06K8NF8SPUYTwiG+83/jkXrwHJ/Afjqz3SUIGon6QvFwSSoKOcoxGQmUBnjTOk+deUONDx8jNWsegFJcBQ==" + "resolved" "https://registry.npmmirror.com/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.3.tgz" + "version" "0.2.3" dependencies: - sass-loader "^10.1.1" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/domutils/-/domutils-3.0.1.tgz" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.284: - version "1.4.348" - resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.348.tgz" - integrity sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/emoticon/-/emoticon-3.2.0.tgz" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.2.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.npmmirror.com/entities/-/entities-4.4.0.tgz" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.npmmirror.com/escape-goat/-/escape-goat-2.1.1.tgz" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eta@^1.12.3: - version "1.14.2" - resolved "https://registry.npmmirror.com/eta/-/eta-1.14.2.tgz" - integrity sha512-wZmJAV7EFUG5W8XNXSazIdichnWEhGB1OWg4tnXWPj0CPNUcFdgorGNO6N9p6WBUgoUe4P0OziJYn1+6zxP2aQ== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eval@^0.1.8: - version "0.1.8" - resolved "https://registry.npmmirror.com/eval/-/eval-0.1.8.tgz" - integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + "sass-loader" "^10.1.1" + +"dom-converter@^0.2.0": + "integrity" "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==" + "resolved" "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "utila" "~0.4" + +"dom-serializer@^1.0.1": + "integrity" "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==" + "resolved" "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz" + "version" "1.4.1" + dependencies: + "domelementtype" "^2.0.1" + "domhandler" "^4.2.0" + "entities" "^2.0.0" + +"dom-serializer@^2.0.0": + "integrity" "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==" + "resolved" "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "domelementtype" "^2.3.0" + "domhandler" "^5.0.2" + "entities" "^4.2.0" + +"domelementtype@^2.0.1", "domelementtype@^2.2.0", "domelementtype@^2.3.0": + "integrity" "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + "resolved" "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz" + "version" "2.3.0" + +"domhandler@^4.0.0", "domhandler@^4.2.0", "domhandler@^4.3.1": + "integrity" "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==" + "resolved" "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz" + "version" "4.3.1" + dependencies: + "domelementtype" "^2.2.0" + +"domhandler@^5.0.1", "domhandler@^5.0.2", "domhandler@^5.0.3": + "integrity" "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==" + "resolved" "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz" + "version" "5.0.3" + dependencies: + "domelementtype" "^2.3.0" + +"domutils@^2.5.2", "domutils@^2.8.0": + "integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==" + "resolved" "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz" + "version" "2.8.0" + dependencies: + "dom-serializer" "^1.0.1" + "domelementtype" "^2.2.0" + "domhandler" "^4.2.0" + +"domutils@^3.0.1": + "integrity" "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==" + "resolved" "https://registry.npmmirror.com/domutils/-/domutils-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "dom-serializer" "^2.0.0" + "domelementtype" "^2.3.0" + "domhandler" "^5.0.1" + +"dot-case@^3.0.4": + "integrity" "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==" + "resolved" "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "no-case" "^3.0.4" + "tslib" "^2.0.3" + +"dot-prop@^5.2.0": + "integrity" "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" + "resolved" "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz" + "version" "5.3.0" + dependencies: + "is-obj" "^2.0.0" + +"duplexer@^0.1.2": + "integrity" "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "resolved" "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz" + "version" "0.1.2" + +"duplexer3@^0.1.4": + "integrity" "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + "resolved" "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz" + "version" "0.1.5" + +"eastasianwidth@^0.2.0": + "integrity" "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "resolved" "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + "version" "0.2.0" + +"ee-first@1.1.1": + "integrity" "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "resolved" "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz" + "version" "1.1.1" + +"electron-to-chromium@^1.4.284": + "integrity" "sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==" + "resolved" "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.348.tgz" + "version" "1.4.348" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"emoji-regex@^9.2.2": + "integrity" "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "resolved" "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz" + "version" "9.2.2" + +"emojis-list@^3.0.0": + "integrity" "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "resolved" "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz" + "version" "3.0.0" + +"emoticon@^3.2.0": + "integrity" "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" + "resolved" "https://registry.npmmirror.com/emoticon/-/emoticon-3.2.0.tgz" + "version" "3.2.0" + +"encodeurl@~1.0.2": + "integrity" "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "resolved" "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz" + "version" "1.0.2" + +"end-of-stream@^1.1.0": + "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" + "resolved" "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz" + "version" "1.4.4" + dependencies: + "once" "^1.4.0" + +"enhanced-resolve@^5.15.0": + "integrity" "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==" + "resolved" "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" + "version" "5.15.0" + dependencies: + "graceful-fs" "^4.2.4" + "tapable" "^2.2.0" + +"entities@^2.0.0": + "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "resolved" "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz" + "version" "2.2.0" + +"entities@^4.2.0", "entities@^4.4.0": + "integrity" "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + "resolved" "https://registry.npmmirror.com/entities/-/entities-4.4.0.tgz" + "version" "4.4.0" + +"errno@^0.1.1": + "integrity" "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==" + "resolved" "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" + "version" "0.1.8" + dependencies: + "prr" "~1.0.1" + +"error-ex@^1.3.1": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "is-arrayish" "^0.2.1" + +"es-module-lexer@^1.2.1": + "integrity" "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + "resolved" "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz" + "version" "1.3.0" + +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" + +"escape-goat@^2.0.0": + "integrity" "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + "resolved" "https://registry.npmmirror.com/escape-goat/-/escape-goat-2.1.1.tgz" + "version" "2.1.1" + +"escape-html@^1.0.3", "escape-html@~1.0.3": + "integrity" "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "resolved" "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz" + "version" "1.0.3" + +"escape-string-regexp@^1.0.5": + "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"escape-string-regexp@^4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" + +"eslint-scope@5.1.1": + "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + "resolved" "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^4.1.1" + +"esprima@^4.0.0": + "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "resolved" "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz" + "version" "4.0.1" + +"esrecurse@^4.3.0": + "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + "resolved" "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "estraverse" "^5.2.0" + +"estraverse@^4.1.1": + "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "resolved" "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz" + "version" "4.3.0" + +"estraverse@^5.2.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" + +"esutils@^2.0.2": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + +"eta@^1.12.3": + "integrity" "sha512-wZmJAV7EFUG5W8XNXSazIdichnWEhGB1OWg4tnXWPj0CPNUcFdgorGNO6N9p6WBUgoUe4P0OziJYn1+6zxP2aQ==" + "resolved" "https://registry.npmmirror.com/eta/-/eta-1.14.2.tgz" + "version" "1.14.2" + +"etag@~1.8.1": + "integrity" "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "resolved" "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz" + "version" "1.8.1" + +"eval@^0.1.8": + "integrity" "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==" + "resolved" "https://registry.npmmirror.com/eval/-/eval-0.1.8.tgz" + "version" "0.1.8" dependencies: "@types/node" "*" - require-like ">= 0.1.1" - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.3: - version "4.18.2" - resolved "https://registry.npmmirror.com/express/-/express-4.18.2.tgz" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + "require-like" ">= 0.1.1" + +"eventemitter3@^4.0.0": + "integrity" "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "resolved" "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz" + "version" "4.0.7" + +"events@^3.2.0": + "integrity" "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "resolved" "https://registry.npmmirror.com/events/-/events-3.3.0.tgz" + "version" "3.3.0" + +"execa@^5.0.0": + "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==" + "resolved" "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "cross-spawn" "^7.0.3" + "get-stream" "^6.0.0" + "human-signals" "^2.1.0" + "is-stream" "^2.0.0" + "merge-stream" "^2.0.0" + "npm-run-path" "^4.0.1" + "onetime" "^5.1.2" + "signal-exit" "^3.0.3" + "strip-final-newline" "^2.0.0" + +"express@^4.17.3": + "integrity" "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==" + "resolved" "https://registry.npmmirror.com/express/-/express-4.18.2.tgz" + "version" "4.18.2" + dependencies: + "accepts" "~1.3.8" + "array-flatten" "1.1.1" + "body-parser" "1.20.1" + "content-disposition" "0.5.4" + "content-type" "~1.0.4" + "cookie" "0.5.0" + "cookie-signature" "1.0.6" + "debug" "2.6.9" + "depd" "2.0.0" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "etag" "~1.8.1" + "finalhandler" "1.2.0" + "fresh" "0.5.2" + "http-errors" "2.0.0" + "merge-descriptors" "1.0.1" + "methods" "~1.1.2" + "on-finished" "2.4.1" + "parseurl" "~1.3.3" + "path-to-regexp" "0.1.7" + "proxy-addr" "~2.0.7" + "qs" "6.11.0" + "range-parser" "~1.2.1" + "safe-buffer" "5.2.1" + "send" "0.18.0" + "serve-static" "1.15.0" + "setprototypeof" "1.2.0" + "statuses" "2.0.1" + "type-is" "~1.6.18" + "utils-merge" "1.0.1" + "vary" "~1.1.2" + +"extend-shallow@^2.0.1": + "integrity" "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==" + "resolved" "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "is-extendable" "^0.1.0" + +"extend@^3.0.0": + "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "resolved" "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz" + "version" "3.0.2" + +"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-glob@^3.2.11", "fast-glob@^3.2.9": + "integrity" "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==" + "resolved" "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz" + "version" "3.2.12" dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.npmmirror.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/fbemitter/-/fbemitter-3.0.0.tgz" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npmmirror.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.npmmirror.com/fbjs/-/fbjs-3.0.4.tgz" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -feed@^4.2.2: - version "4.2.2" - resolved "https://registry.npmmirror.com/feed/-/feed-4.2.2.tgz" - integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== - dependencies: - xml-js "^1.6.11" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmmirror.com/file-loader/-/file-loader-6.2.0.tgz" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.npmmirror.com/filesize/-/filesize-8.0.7.tgz" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flux@^4.0.1: - version "4.0.4" - resolved "https://registry.npmmirror.com/flux/-/flux-4.0.4.tgz" - integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@^1.0.0, follow-redirects@^1.14.7: - version "1.15.2" - resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.npmmirror.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + "glob-parent" "^5.1.2" + "merge2" "^1.3.0" + "micromatch" "^4.0.4" + +"fast-json-stable-stringify@^2.0.0": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-url-parser@1.1.3": + "integrity" "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==" + "resolved" "https://registry.npmmirror.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "punycode" "^1.3.2" + +"fastq@^1.6.0": + "integrity" "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==" + "resolved" "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz" + "version" "1.15.0" + dependencies: + "reusify" "^1.0.4" + +"faye-websocket@^0.11.3": + "integrity" "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==" + "resolved" "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz" + "version" "0.11.4" + dependencies: + "websocket-driver" ">=0.5.1" + +"fbemitter@^3.0.0": + "integrity" "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==" + "resolved" "https://registry.npmmirror.com/fbemitter/-/fbemitter-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "fbjs" "^3.0.0" + +"fbjs-css-vars@^1.0.0": + "integrity" "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + "resolved" "https://registry.npmmirror.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" + "version" "1.0.2" + +"fbjs@^3.0.0", "fbjs@^3.0.1": + "integrity" "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==" + "resolved" "https://registry.npmmirror.com/fbjs/-/fbjs-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "cross-fetch" "^3.1.5" + "fbjs-css-vars" "^1.0.0" + "loose-envify" "^1.0.0" + "object-assign" "^4.1.0" + "promise" "^7.1.1" + "setimmediate" "^1.0.5" + "ua-parser-js" "^0.7.30" + +"feed@^4.2.2": + "integrity" "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==" + "resolved" "https://registry.npmmirror.com/feed/-/feed-4.2.2.tgz" + "version" "4.2.2" + dependencies: + "xml-js" "^1.6.11" + +"file-loader@*", "file-loader@^6.2.0": + "integrity" "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==" + "resolved" "https://registry.npmmirror.com/file-loader/-/file-loader-6.2.0.tgz" + "version" "6.2.0" + dependencies: + "loader-utils" "^2.0.0" + "schema-utils" "^3.0.0" + +"filesize@^8.0.6": + "integrity" "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" + "resolved" "https://registry.npmmirror.com/filesize/-/filesize-8.0.7.tgz" + "version" "8.0.7" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"finalhandler@1.2.0": + "integrity" "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==" + "resolved" "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "debug" "2.6.9" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "on-finished" "2.4.1" + "parseurl" "~1.3.3" + "statuses" "2.0.1" + "unpipe" "~1.0.0" + +"find-cache-dir@^3.3.1": + "integrity" "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==" + "resolved" "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + "version" "3.3.2" + dependencies: + "commondir" "^1.0.1" + "make-dir" "^3.0.2" + "pkg-dir" "^4.1.0" + +"find-up@^3.0.0": + "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" + "resolved" "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "locate-path" "^3.0.0" + +"find-up@^4.0.0": + "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + "resolved" "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "locate-path" "^5.0.0" + "path-exists" "^4.0.0" + +"find-up@^5.0.0": + "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + "resolved" "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "locate-path" "^6.0.0" + "path-exists" "^4.0.0" + +"flux@^4.0.1": + "integrity" "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==" + "resolved" "https://registry.npmmirror.com/flux/-/flux-4.0.4.tgz" + "version" "4.0.4" + dependencies: + "fbemitter" "^3.0.0" + "fbjs" "^3.0.1" + +"follow-redirects@^1.0.0", "follow-redirects@^1.14.7": + "integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "resolved" "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz" + "version" "1.15.2" + +"fork-ts-checker-webpack-plugin@^6.5.0": + "integrity" "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==" + "resolved" "https://registry.npmmirror.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" + "version" "6.5.3" dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.3.tgz" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.2.0" - resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -github-slugger@^1.4.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/github-slugger/-/github-slugger-1.5.0.tgz" - integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.1.tgz" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/global-modules/-/global-modules-2.0.0.tgz" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/global-prefix/-/global-prefix-3.0.0.tgz" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.1: - version "13.1.3" - resolved "https://registry.npmmirror.com/globby/-/globby-13.1.3.tgz" - integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.npmmirror.com/got/-/got-9.6.0.tgz" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + "chalk" "^4.1.0" + "chokidar" "^3.4.2" + "cosmiconfig" "^6.0.0" + "deepmerge" "^4.2.2" + "fs-extra" "^9.0.0" + "glob" "^7.1.6" + "memfs" "^3.1.2" + "minimatch" "^3.0.4" + "schema-utils" "2.7.0" + "semver" "^7.3.2" + "tapable" "^1.0.0" + +"forwarded@0.2.0": + "integrity" "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "resolved" "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz" + "version" "0.2.0" + +"fraction.js@^4.2.0": + "integrity" "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + "resolved" "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz" + "version" "4.2.0" + +"fresh@0.5.2": + "integrity" "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "resolved" "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz" + "version" "0.5.2" + +"fs-extra@^10.1.0": + "integrity" "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==" + "resolved" "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz" + "version" "10.1.0" + dependencies: + "graceful-fs" "^4.2.0" + "jsonfile" "^6.0.1" + "universalify" "^2.0.0" + +"fs-extra@^9.0.0": + "integrity" "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==" + "resolved" "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz" + "version" "9.1.0" + dependencies: + "at-least-node" "^1.0.0" + "graceful-fs" "^4.2.0" + "jsonfile" "^6.0.1" + "universalify" "^2.0.0" + +"fs-monkey@^1.0.3": + "integrity" "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + "resolved" "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.3.tgz" + "version" "1.0.3" + +"fs.realpath@^1.0.0": + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"fsevents@~2.3.2": + "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" + "resolved" "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz" + "version" "2.3.2" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"gensync@^1.0.0-beta.1", "gensync@^1.0.0-beta.2": + "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + "resolved" "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz" + "version" "1.0.0-beta.2" + +"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1": + "integrity" "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==" + "resolved" "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.3" + +"get-own-enumerable-property-symbols@^3.0.0": + "integrity" "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "resolved" "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + "version" "3.0.2" + +"get-stream@^4.1.0": + "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==" + "resolved" "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "pump" "^3.0.0" + +"get-stream@^5.1.0": + "integrity" "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==" + "resolved" "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "pump" "^3.0.0" + +"get-stream@^6.0.0": + "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "resolved" "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz" + "version" "6.0.1" + +"github-slugger@^1.4.0": + "integrity" "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + "resolved" "https://registry.npmmirror.com/github-slugger/-/github-slugger-1.5.0.tgz" + "version" "1.5.0" + +"glob-parent@^5.1.2", "glob-parent@~5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-parent@^6.0.1": + "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + "resolved" "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "is-glob" "^4.0.3" + +"glob-to-regexp@^0.4.1": + "integrity" "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "resolved" "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + "version" "0.4.1" + +"glob@^7.0.0", "glob@^7.1.3", "glob@^7.1.6": + "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" + "resolved" "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" + "version" "7.2.3" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.1.1" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"global-dirs@^3.0.0": + "integrity" "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==" + "resolved" "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "ini" "2.0.0" + +"global-modules@^2.0.0": + "integrity" "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==" + "resolved" "https://registry.npmmirror.com/global-modules/-/global-modules-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "global-prefix" "^3.0.0" + +"global-prefix@^3.0.0": + "integrity" "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==" + "resolved" "https://registry.npmmirror.com/global-prefix/-/global-prefix-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "ini" "^1.3.5" + "kind-of" "^6.0.2" + "which" "^1.3.1" + +"globals@^11.1.0": + "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "resolved" "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz" + "version" "11.12.0" + +"globby@^11.0.1", "globby@^11.0.4", "globby@^11.1.0": + "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" + "resolved" "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz" + "version" "11.1.0" + dependencies: + "array-union" "^2.1.0" + "dir-glob" "^3.0.1" + "fast-glob" "^3.2.9" + "ignore" "^5.2.0" + "merge2" "^1.4.1" + "slash" "^3.0.0" + +"globby@^13.1.1": + "integrity" "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==" + "resolved" "https://registry.npmmirror.com/globby/-/globby-13.1.3.tgz" + "version" "13.1.3" + dependencies: + "dir-glob" "^3.0.1" + "fast-glob" "^3.2.11" + "ignore" "^5.2.0" + "merge2" "^1.4.1" + "slash" "^4.0.0" + +"got@^9.6.0": + "integrity" "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==" + "resolved" "https://registry.npmmirror.com/got/-/got-9.6.0.tgz" + "version" "9.6.0" dependencies: "@sindresorhus/is" "^0.14.0" "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/has-yarn/-/has-yarn-2.1.0.tgz" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.npmmirror.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + "cacheable-request" "^6.0.0" + "decompress-response" "^3.3.0" + "duplexer3" "^0.1.4" + "get-stream" "^4.1.0" + "lowercase-keys" "^1.0.1" + "mimic-response" "^1.0.1" + "p-cancelable" "^1.0.0" + "to-readable-stream" "^1.0.0" + "url-parse-lax" "^3.0.0" + +"graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.0", "graceful-fs@^4.2.4", "graceful-fs@^4.2.6", "graceful-fs@^4.2.9": + "integrity" "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "resolved" "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz" + "version" "4.2.11" + +"gray-matter@^4.0.3": + "integrity" "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==" + "resolved" "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "js-yaml" "^3.13.1" + "kind-of" "^6.0.2" + "section-matter" "^1.0.0" + "strip-bom-string" "^1.0.0" + +"gzip-size@^6.0.0": + "integrity" "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==" + "resolved" "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "duplexer" "^0.1.2" + +"handle-thing@^2.0.0": + "integrity" "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "resolved" "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz" + "version" "2.0.1" + +"has-flag@^3.0.0": + "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "resolved" "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"has-property-descriptors@^1.0.0": + "integrity" "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==" + "resolved" "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "get-intrinsic" "^1.1.1" + +"has-symbols@^1.0.3": + "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "resolved" "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz" + "version" "1.0.3" + +"has-yarn@^2.1.0": + "integrity" "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + "resolved" "https://registry.npmmirror.com/has-yarn/-/has-yarn-2.1.0.tgz" + "version" "2.1.0" + +"has@^1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmmirror.com/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "^1.1.1" + +"hast-to-hyperscript@^9.0.0": + "integrity" "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==" + "resolved" "https://registry.npmmirror.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" + "version" "9.0.1" dependencies: "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + "comma-separated-tokens" "^1.0.0" + "property-information" "^5.3.0" + "space-separated-tokens" "^1.0.0" + "style-to-object" "^0.3.0" + "unist-util-is" "^4.0.0" + "web-namespaces" "^1.0.0" + +"hast-util-from-parse5@^6.0.0": + "integrity" "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==" + "resolved" "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" + "version" "6.0.1" dependencies: "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + "hastscript" "^6.0.0" + "property-information" "^5.0.0" + "vfile" "^4.0.0" + "vfile-location" "^3.2.0" + "web-namespaces" "^1.0.0" + +"hast-util-parse-selector@^2.0.0": + "integrity" "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + "resolved" "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" + "version" "2.2.5" + +"hast-util-raw@6.0.1": + "integrity" "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==" + "resolved" "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz" + "version" "6.0.1" dependencies: "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/hastscript/-/hastscript-6.0.0.tgz" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + "hast-util-from-parse5" "^6.0.0" + "hast-util-to-parse5" "^6.0.0" + "html-void-elements" "^1.0.0" + "parse5" "^6.0.0" + "unist-util-position" "^3.0.0" + "vfile" "^4.0.0" + "web-namespaces" "^1.0.0" + "xtend" "^4.0.0" + "zwitch" "^1.0.0" + +"hast-util-to-parse5@^6.0.0": + "integrity" "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==" + "resolved" "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "hast-to-hyperscript" "^9.0.0" + "property-information" "^5.0.0" + "web-namespaces" "^1.0.0" + "xtend" "^4.0.0" + "zwitch" "^1.0.0" + +"hastscript@^6.0.0": + "integrity" "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==" + "resolved" "https://registry.npmmirror.com/hastscript/-/hastscript-6.0.0.tgz" + "version" "6.0.0" dependencies: "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" + "comma-separated-tokens" "^1.0.0" + "hast-util-parse-selector" "^2.0.0" + "property-information" "^5.0.0" + "space-separated-tokens" "^1.0.0" -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +"he@^1.2.0": + "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "resolved" "https://registry.npmmirror.com/he/-/he-1.2.0.tgz" + "version" "1.2.0" -history@^4.9.0: - version "4.10.1" - resolved "https://registry.npmmirror.com/history/-/history-4.10.1.tgz" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== +"history@^4.9.0": + "integrity" "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==" + "resolved" "https://registry.npmmirror.com/history/-/history-4.10.1.tgz" + "version" "4.10.1" dependencies: "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hoist-non-react-statics@^3.1.0: - version "3.3.2" - resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.npmmirror.com/html-entities/-/html-entities-2.3.3.tgz" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.2.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.0.tgz" - integrity sha512-mH3dWNbvfCKcAEysbpD7wvtIJ6ImPog8aFhfzqog9gCN8CJFhKjLDtjpohG3IxYRLqHMJ1PWpBvnSMkFJBQ6Jg== - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-1.0.5.tgz" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + "loose-envify" "^1.2.0" + "resolve-pathname" "^3.0.0" + "tiny-invariant" "^1.0.2" + "tiny-warning" "^1.0.0" + "value-equal" "^1.0.1" + +"hoist-non-react-statics@^3.1.0": + "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==" + "resolved" "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + "version" "3.3.2" + dependencies: + "react-is" "^16.7.0" + +"hpack.js@^2.1.6": + "integrity" "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==" + "resolved" "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz" + "version" "2.1.6" + dependencies: + "inherits" "^2.0.1" + "obuf" "^1.0.0" + "readable-stream" "^2.0.1" + "wbuf" "^1.1.0" + +"html-entities@^2.3.2": + "integrity" "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + "resolved" "https://registry.npmmirror.com/html-entities/-/html-entities-2.3.3.tgz" + "version" "2.3.3" + +"html-minifier-terser@^6.0.2", "html-minifier-terser@^6.1.0": + "integrity" "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==" + "resolved" "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "camel-case" "^4.1.2" + "clean-css" "^5.2.2" + "commander" "^8.3.0" + "he" "^1.2.0" + "param-case" "^3.0.4" + "relateurl" "^0.2.7" + "terser" "^5.10.0" + +"html-tags@^3.2.0": + "integrity" "sha512-mH3dWNbvfCKcAEysbpD7wvtIJ6ImPog8aFhfzqog9gCN8CJFhKjLDtjpohG3IxYRLqHMJ1PWpBvnSMkFJBQ6Jg==" + "resolved" "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.0.tgz" + "version" "3.3.0" + +"html-void-elements@^1.0.0": + "integrity" "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + "resolved" "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-1.0.5.tgz" + "version" "1.0.5" + +"html-webpack-plugin@^5.5.0": + "integrity" "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==" + "resolved" "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" + "version" "5.5.0" dependencies: "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.1: - version "8.0.2" - resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.2.tgz" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + "html-minifier-terser" "^6.0.2" + "lodash" "^4.17.21" + "pretty-error" "^4.0.0" + "tapable" "^2.0.0" + +"htmlparser2@^6.1.0": + "integrity" "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==" + "resolved" "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "domelementtype" "^2.0.1" + "domhandler" "^4.0.0" + "domutils" "^2.5.2" + "entities" "^2.0.0" + +"htmlparser2@^8.0.1": + "integrity" "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==" + "resolved" "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.2.tgz" + "version" "8.0.2" + dependencies: + "domelementtype" "^2.3.0" + "domhandler" "^5.0.3" + "domutils" "^3.0.1" + "entities" "^4.4.0" + +"http-cache-semantics@^4.0.0": + "integrity" "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "resolved" "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + "version" "4.1.1" + +"http-deceiver@^1.2.7": + "integrity" "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + "resolved" "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz" + "version" "1.2.7" + +"http-errors@~1.6.2": + "integrity" "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==" + "resolved" "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz" + "version" "1.6.3" + dependencies: + "depd" "~1.1.2" + "inherits" "2.0.3" + "setprototypeof" "1.1.0" + "statuses" ">= 1.4.0 < 2" + +"http-errors@2.0.0": + "integrity" "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" + "resolved" "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "depd" "2.0.0" + "inherits" "2.0.4" + "setprototypeof" "1.2.0" + "statuses" "2.0.1" + "toidentifier" "1.0.1" + +"http-parser-js@>=0.5.1": + "integrity" "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "resolved" "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz" + "version" "0.5.8" + +"http-proxy-middleware@^2.0.3": + "integrity" "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==" + "resolved" "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + "version" "2.0.6" dependencies: "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -image-size@^1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/image-size/-/image-size-1.0.2.tgz" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== - -immutable@^4.0.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/immutable/-/immutable-4.3.0.tgz" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== - -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/import-lazy/-/import-lazy-2.1.0.tgz" - integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infima@0.2.0-alpha.42: - version "0.2.0-alpha.42" - resolved "https://registry.npmmirror.com/infima/-/infima-0.2.0-alpha.42.tgz" - integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/is-ci/-/is-ci-2.0.0.tgz" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-decimal/-/is-decimal-1.0.4.tgz" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/is-npm/-/is-npm-5.0.0.tgz" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/is-root/-/is-root-2.1.0.tgz" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/is-word-character/-/is-word-character-1.0.4.tgz" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.npmmirror.com/jest-util/-/jest-util-29.5.0.tgz" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + "http-proxy" "^1.18.1" + "is-glob" "^4.0.1" + "is-plain-obj" "^3.0.0" + "micromatch" "^4.0.2" + +"http-proxy@^1.18.1": + "integrity" "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==" + "resolved" "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz" + "version" "1.18.1" + dependencies: + "eventemitter3" "^4.0.0" + "follow-redirects" "^1.0.0" + "requires-port" "^1.0.0" + +"human-signals@^2.1.0": + "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "resolved" "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz" + "version" "2.1.0" + +"iconv-lite@^0.6.3": + "integrity" "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" + "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + "version" "0.6.3" + dependencies: + "safer-buffer" ">= 2.1.2 < 3.0.0" + +"iconv-lite@0.4.24": + "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" + "resolved" "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz" + "version" "0.4.24" + dependencies: + "safer-buffer" ">= 2.1.2 < 3" + +"icss-utils@^5.0.0", "icss-utils@^5.1.0": + "integrity" "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + "resolved" "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz" + "version" "5.1.0" + +"ignore@^5.2.0": + "integrity" "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + "resolved" "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz" + "version" "5.2.4" + +"image-size@^1.0.1": + "integrity" "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==" + "resolved" "https://registry.npmmirror.com/image-size/-/image-size-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "queue" "6.0.2" + +"image-size@~0.5.0": + "integrity" "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==" + "resolved" "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" + "version" "0.5.5" + +"immer@^9.0.7": + "integrity" "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + "resolved" "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz" + "version" "9.0.21" + +"immutable@^4.0.0": + "integrity" "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "resolved" "https://registry.npmmirror.com/immutable/-/immutable-4.3.0.tgz" + "version" "4.3.0" + +"import-fresh@^3.1.0", "import-fresh@^3.2.1", "import-fresh@^3.3.0": + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + "resolved" "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" + +"import-lazy@^2.1.0": + "integrity" "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" + "resolved" "https://registry.npmmirror.com/import-lazy/-/import-lazy-2.1.0.tgz" + "version" "2.1.0" + +"imurmurhash@^0.1.4": + "integrity" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "resolved" "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" + +"indent-string@^4.0.0": + "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "resolved" "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz" + "version" "4.0.0" + +"infima@0.2.0-alpha.42": + "integrity" "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" + "resolved" "https://registry.npmmirror.com/infima/-/infima-0.2.0-alpha.42.tgz" + "version" "0.2.0-alpha.42" + +"inflight@^1.0.4": + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@^2.0.0", "inherits@^2.0.1", "inherits@^2.0.3", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"inherits@2.0.3": + "integrity" "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "resolved" "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz" + "version" "2.0.3" + +"ini@^1.3.5", "ini@~1.3.0": + "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "resolved" "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz" + "version" "1.3.8" + +"ini@2.0.0": + "integrity" "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + "resolved" "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz" + "version" "2.0.0" + +"inline-style-parser@0.1.1": + "integrity" "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "resolved" "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz" + "version" "0.1.1" + +"interpret@^1.0.0": + "integrity" "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + "resolved" "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz" + "version" "1.4.0" + +"invariant@^2.2.4": + "integrity" "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==" + "resolved" "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz" + "version" "2.2.4" + dependencies: + "loose-envify" "^1.0.0" + +"ipaddr.js@^2.0.1": + "integrity" "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + "resolved" "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + "version" "2.0.1" + +"ipaddr.js@1.9.1": + "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "resolved" "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + "version" "1.9.1" + +"is-alphabetical@^1.0.0", "is-alphabetical@1.0.4": + "integrity" "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + "resolved" "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz" + "version" "1.0.4" + +"is-alphanumerical@^1.0.0": + "integrity" "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==" + "resolved" "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "is-alphabetical" "^1.0.0" + "is-decimal" "^1.0.0" + +"is-arrayish@^0.2.1": + "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "resolved" "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" + +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-buffer@^2.0.0": + "integrity" "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "resolved" "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz" + "version" "2.0.5" + +"is-ci@^2.0.0": + "integrity" "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==" + "resolved" "https://registry.npmmirror.com/is-ci/-/is-ci-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "ci-info" "^2.0.0" + +"is-core-module@^2.9.0": + "integrity" "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==" + "resolved" "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz" + "version" "2.11.0" + dependencies: + "has" "^1.0.3" + +"is-decimal@^1.0.0": + "integrity" "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + "resolved" "https://registry.npmmirror.com/is-decimal/-/is-decimal-1.0.4.tgz" + "version" "1.0.4" + +"is-docker@^2.0.0", "is-docker@^2.1.1": + "integrity" "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + "resolved" "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz" + "version" "2.2.1" + +"is-extendable@^0.1.0": + "integrity" "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + "resolved" "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz" + "version" "0.1.1" + +"is-extglob@^2.1.1": + "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "resolved" "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" + +"is-hexadecimal@^1.0.0": + "integrity" "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + "resolved" "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" + "version" "1.0.4" + +"is-installed-globally@^0.4.0": + "integrity" "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==" + "resolved" "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "global-dirs" "^3.0.0" + "is-path-inside" "^3.0.2" + +"is-npm@^5.0.0": + "integrity" "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + "resolved" "https://registry.npmmirror.com/is-npm/-/is-npm-5.0.0.tgz" + "version" "5.0.0" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"is-obj@^1.0.1": + "integrity" "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + "resolved" "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz" + "version" "1.0.1" + +"is-obj@^2.0.0": + "integrity" "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "resolved" "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz" + "version" "2.0.0" + +"is-path-cwd@^2.2.0": + "integrity" "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + "resolved" "https://registry.npmmirror.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + "version" "2.2.0" + +"is-path-inside@^3.0.2": + "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "resolved" "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz" + "version" "3.0.3" + +"is-plain-obj@^2.0.0": + "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "resolved" "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + "version" "2.1.0" + +"is-plain-obj@^3.0.0": + "integrity" "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + "resolved" "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + "version" "3.0.0" + +"is-plain-object@^2.0.4": + "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==" + "resolved" "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "isobject" "^3.0.1" + +"is-regexp@^1.0.0": + "integrity" "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + "resolved" "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz" + "version" "1.0.0" + +"is-root@^2.1.0": + "integrity" "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + "resolved" "https://registry.npmmirror.com/is-root/-/is-root-2.1.0.tgz" + "version" "2.1.0" + +"is-stream@^2.0.0": + "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "resolved" "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz" + "version" "2.0.1" + +"is-typedarray@^1.0.0": + "integrity" "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "resolved" "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz" + "version" "1.0.0" + +"is-what@^3.14.1": + "integrity" "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + "resolved" "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" + "version" "3.14.1" + +"is-whitespace-character@^1.0.0": + "integrity" "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + "resolved" "https://registry.npmmirror.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" + "version" "1.0.4" + +"is-word-character@^1.0.0": + "integrity" "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + "resolved" "https://registry.npmmirror.com/is-word-character/-/is-word-character-1.0.4.tgz" + "version" "1.0.4" + +"is-wsl@^2.2.0": + "integrity" "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" + "resolved" "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "is-docker" "^2.0.0" + +"is-yarn-global@^0.3.0": + "integrity" "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + "resolved" "https://registry.npmmirror.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz" + "version" "0.3.0" + +"isarray@~1.0.0": + "integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "resolved" "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + +"isarray@0.0.1": + "integrity" "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "resolved" "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz" + "version" "0.0.1" + +"isexe@^2.0.0": + "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "resolved" "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"isobject@^3.0.1": + "integrity" "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + "resolved" "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz" + "version" "3.0.1" + +"jest-util@^29.5.0": + "integrity" "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==" + "resolved" "https://registry.npmmirror.com/jest-util/-/jest-util-29.5.0.tgz" + "version" "29.5.0" dependencies: "@jest/types" "^29.5.0" "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + "chalk" "^4.0.0" + "ci-info" "^3.2.0" + "graceful-fs" "^4.2.9" + "picomatch" "^2.2.3" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== +"jest-worker@^27.4.5": + "integrity" "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==" + "resolved" "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz" + "version" "27.5.1" dependencies: "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" + "merge-stream" "^2.0.0" + "supports-color" "^8.0.0" -jest-worker@^29.1.2: - version "29.5.0" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.5.0.tgz" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== +"jest-worker@^29.1.2": + "integrity" "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==" + "resolved" "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.5.0.tgz" + "version" "29.5.0" dependencies: "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" + "jest-util" "^29.5.0" + "merge-stream" "^2.0.0" + "supports-color" "^8.0.0" -joi@^17.6.0: - version "17.9.1" - resolved "https://registry.npmmirror.com/joi/-/joi-17.9.1.tgz" - integrity sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw== +"joi@^17.6.0": + "integrity" "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==" + "resolved" "https://registry.npmmirror.com/joi/-/joi-17.9.1.tgz" + "version" "17.9.1" dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -4754,2637 +4850,2792 @@ joi@^17.6.0: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.2, json5@^2.2.1: - version "2.2.3" - resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" +"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0": + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved" "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz" + "version" "4.0.0" + +"js-yaml@^3.13.1": + "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + "resolved" "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz" + "version" "3.14.1" + dependencies: + "argparse" "^1.0.7" + "esprima" "^4.0.0" + +"js-yaml@^4.1.0": + "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" + "resolved" "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "argparse" "^2.0.1" + +"jsesc@^2.5.1": + "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "resolved" "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz" + "version" "2.5.2" + +"jsesc@~0.5.0": + "integrity" "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + "resolved" "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz" + "version" "0.5.0" + +"json-buffer@3.0.0": + "integrity" "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + "resolved" "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz" + "version" "3.0.0" + +"json-parse-even-better-errors@^2.3.0", "json-parse-even-better-errors@^2.3.1": + "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "resolved" "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + "version" "2.3.1" + +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-schema-traverse@^1.0.0": + "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "resolved" "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + "version" "1.0.0" + +"json5@^2.1.2", "json5@^2.2.1": + "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + "resolved" "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz" + "version" "2.2.3" + +"jsonfile@^6.0.1": + "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==" + "resolved" "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "universalify" "^2.0.0" optionalDependencies: - graceful-fs "^4.1.6" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/keyv/-/keyv-3.1.0.tgz" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.4, klona@^2.0.6: - version "2.0.6" - resolved "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/latest-version/-/latest-version-5.1.0.tgz" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.0.tgz" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.7.3" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/lodash.curry/-/lodash.curry-4.1.1.tgz" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.npmmirror.com/lodash.flow/-/lodash.flow-3.5.0.tgz" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + "graceful-fs" "^4.1.6" + +"keyv@^3.0.0": + "integrity" "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==" + "resolved" "https://registry.npmmirror.com/keyv/-/keyv-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "json-buffer" "3.0.0" + +"kind-of@^6.0.0", "kind-of@^6.0.2": + "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "resolved" "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz" + "version" "6.0.3" + +"kleur@^3.0.3": + "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + "resolved" "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz" + "version" "3.0.3" + +"klona@^2.0.4", "klona@^2.0.6": + "integrity" "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + "resolved" "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz" + "version" "2.0.6" + +"latest-version@^5.1.0": + "integrity" "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==" + "resolved" "https://registry.npmmirror.com/latest-version/-/latest-version-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "package-json" "^6.3.0" + +"launch-editor@^2.6.0": + "integrity" "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==" + "resolved" "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.0.tgz" + "version" "2.6.0" + dependencies: + "picocolors" "^1.0.0" + "shell-quote" "^1.7.3" + +"less-loader@>=10.0.0": + "integrity" "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==" + "resolved" "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz" + "version" "11.1.3" + +"less@^3.5.0 || ^4.0.0", "less@>=4.0.0": + "integrity" "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==" + "resolved" "https://registry.npmjs.org/less/-/less-4.1.3.tgz" + "version" "4.1.3" + dependencies: + "copy-anything" "^2.0.1" + "parse-node-version" "^1.0.1" + "tslib" "^2.3.0" + optionalDependencies: + "errno" "^0.1.1" + "graceful-fs" "^4.1.2" + "image-size" "~0.5.0" + "make-dir" "^2.1.0" + "mime" "^1.4.1" + "needle" "^3.1.0" + "source-map" "~0.6.0" + +"leven@^3.1.0": + "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + "resolved" "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz" + "version" "3.1.0" + +"lilconfig@^2.0.3": + "integrity" "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + "resolved" "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz" + "version" "2.1.0" + +"lines-and-columns@^1.1.6": + "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "resolved" "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + "version" "1.2.4" + +"loader-runner@^4.2.0": + "integrity" "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + "resolved" "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz" + "version" "4.3.0" + +"loader-utils@^2.0.0": + "integrity" "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==" + "resolved" "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "big.js" "^5.2.2" + "emojis-list" "^3.0.0" + "json5" "^2.1.2" + +"loader-utils@^3.2.0": + "integrity" "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" + "resolved" "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.2.1.tgz" + "version" "3.2.1" + +"locate-path@^3.0.0": + "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" + "resolved" "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "p-locate" "^3.0.0" + "path-exists" "^3.0.0" + +"locate-path@^5.0.0": + "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + "resolved" "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "p-locate" "^4.1.0" + +"locate-path@^6.0.0": + "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + "resolved" "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "p-locate" "^5.0.0" + +"lodash-es@^4.17.21": + "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "resolved" "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz" + "version" "4.17.21" + +"lodash.curry@^4.0.1": + "integrity" "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + "resolved" "https://registry.npmmirror.com/lodash.curry/-/lodash.curry-4.1.1.tgz" + "version" "4.1.1" + +"lodash.debounce@^4.0.8": + "integrity" "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "resolved" "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + "version" "4.0.8" + +"lodash.flow@^3.3.0": + "integrity" "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + "resolved" "https://registry.npmmirror.com/lodash.flow/-/lodash.flow-3.5.0.tgz" + "version" "3.5.0" + +"lodash.memoize@^4.1.2": + "integrity" "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + "resolved" "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + "version" "4.1.2" + +"lodash.uniq@^4.5.0", "lodash.uniq@4.5.0": + "integrity" "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "resolved" "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + "version" "4.5.0" + +"lodash@^4.17.19", "lodash@^4.17.20", "lodash@^4.17.21": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" + +"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.2.0", "loose-envify@^1.3.1", "loose-envify@^1.4.0": + "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" + "resolved" "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "js-tokens" "^3.0.0 || ^4.0.0" + +"lower-case@^2.0.2": + "integrity" "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==" + "resolved" "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "tslib" "^2.0.3" + +"lowercase-keys@^1.0.0", "lowercase-keys@^1.0.1": + "integrity" "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "resolved" "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz" + "version" "1.0.1" + +"lowercase-keys@^2.0.0": + "integrity" "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + "resolved" "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + "version" "2.0.0" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"make-dir@^2.1.0": + "integrity" "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==" + "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + "version" "2.1.0" dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + "pify" "^4.0.1" + "semver" "^5.6.0" + +"make-dir@^3.0.0", "make-dir@^3.0.2", "make-dir@^3.1.0": + "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" + "resolved" "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz" + "version" "3.1.0" dependencies: - semver "^6.0.0" + "semver" "^6.0.0" -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.npmmirror.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== +"markdown-escapes@^1.0.0": + "integrity" "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + "resolved" "https://registry.npmmirror.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz" + "version" "1.0.4" -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== +"mdast-squeeze-paragraphs@^4.0.0": + "integrity" "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==" + "resolved" "https://registry.npmmirror.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" + "version" "4.0.0" dependencies: - unist-util-remove "^2.0.0" + "unist-util-remove" "^2.0.0" -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== +"mdast-util-definitions@^4.0.0": + "integrity" "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==" + "resolved" "https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" + "version" "4.0.0" dependencies: - unist-util-visit "^2.0.0" + "unist-util-visit" "^2.0.0" -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== +"mdast-util-to-hast@10.0.1": + "integrity" "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==" + "resolved" "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" + "version" "10.0.1" dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.4.13" - resolved "https://registry.npmmirror.com/memfs/-/memfs-3.4.13.tgz" - integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== - dependencies: - fs-monkey "^1.0.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.33.0.tgz" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18, mime-types@~2.1.17: - version "2.1.18" - resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.18.tgz" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mini-css-extract-plugin@^2.6.1: - version "2.7.5" - resolved "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== - dependencies: - schema-utils "^4.0.0" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@^3.3.4: - version "3.3.6" - resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.npmmirror.com/node-emoji/-/node-emoji-1.11.0.tgz" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-4.5.1.tgz" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0: - version "4.1.4" - resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" + "mdast-util-definitions" "^4.0.0" + "mdurl" "^1.0.0" + "unist-builder" "^2.0.0" + "unist-util-generated" "^1.0.0" + "unist-util-position" "^3.0.0" + "unist-util-visit" "^2.0.0" + +"mdast-util-to-string@^2.0.0": + "integrity" "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + "resolved" "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" + "version" "2.0.0" + +"mdn-data@2.0.14": + "integrity" "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "resolved" "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz" + "version" "2.0.14" + +"mdurl@^1.0.0": + "integrity" "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + "resolved" "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz" + "version" "1.0.1" + +"media-typer@0.3.0": + "integrity" "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "resolved" "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz" + "version" "0.3.0" + +"memfs@^3.1.2", "memfs@^3.4.3": + "integrity" "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==" + "resolved" "https://registry.npmmirror.com/memfs/-/memfs-3.4.13.tgz" + "version" "3.4.13" + dependencies: + "fs-monkey" "^1.0.3" + +"merge-descriptors@1.0.1": + "integrity" "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "resolved" "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + "version" "1.0.1" + +"merge-stream@^2.0.0": + "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "resolved" "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz" + "version" "2.0.0" + +"merge2@^1.3.0", "merge2@^1.4.1": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" + +"methods@~1.1.2": + "integrity" "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "resolved" "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz" + "version" "1.1.2" + +"micromatch@^4.0.2", "micromatch@^4.0.4", "micromatch@^4.0.5": + "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" + "resolved" "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz" + "version" "4.0.5" + dependencies: + "braces" "^3.0.2" + "picomatch" "^2.3.1" + +"mime-db@>= 1.43.0 < 2": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-db@~1.33.0": + "integrity" "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "resolved" "https://registry.npmmirror.com/mime-db/-/mime-db-1.33.0.tgz" + "version" "1.33.0" + +"mime-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-types@^2.1.27": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mime-types@^2.1.31": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mime-types@~2.1.17", "mime-types@2.1.18": + "integrity" "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==" + "resolved" "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.18.tgz" + "version" "2.1.18" + dependencies: + "mime-db" "~1.33.0" + +"mime-types@~2.1.24": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mime-types@~2.1.34": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mime@^1.4.1", "mime@1.6.0": + "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + "version" "1.6.0" + +"mimic-fn@^2.1.0": + "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "resolved" "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz" + "version" "2.1.0" + +"mimic-response@^1.0.0", "mimic-response@^1.0.1": + "integrity" "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "resolved" "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz" + "version" "1.0.1" + +"mini-css-extract-plugin@^2.6.1": + "integrity" "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==" + "resolved" "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz" + "version" "2.7.5" + dependencies: + "schema-utils" "^4.0.0" + +"minimalistic-assert@^1.0.0": + "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "resolved" "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + "version" "1.0.1" + +"minimatch@^3.0.4", "minimatch@^3.0.5", "minimatch@^3.1.1", "minimatch@3.1.2": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"minimist@^1.2.0", "minimist@^1.2.5": + "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "resolved" "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz" + "version" "1.2.8" + +"mrmime@^1.0.0": + "integrity" "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" + "resolved" "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz" + "version" "1.0.1" + +"ms@^2.1.1", "ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"ms@2.0.0": + "integrity" "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "resolved" "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz" + "version" "2.0.0" + +"ms@2.1.3": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"multicast-dns@^7.2.5": + "integrity" "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==" + "resolved" "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz" + "version" "7.2.5" + dependencies: + "dns-packet" "^5.2.2" + "thunky" "^1.0.2" + +"nanoid@^3.3.4": + "integrity" "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + "resolved" "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz" + "version" "3.3.6" + +"needle@^3.1.0": + "integrity" "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==" + "resolved" "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "debug" "^3.2.6" + "iconv-lite" "^0.6.3" + "sax" "^1.2.4" + +"negotiator@0.6.3": + "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "resolved" "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz" + "version" "0.6.3" + +"neo-async@^2.6.2": + "integrity" "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "resolved" "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz" + "version" "2.6.2" + +"no-case@^3.0.4": + "integrity" "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==" + "resolved" "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "lower-case" "^2.0.2" + "tslib" "^2.0.3" + +"node-emoji@^1.10.0": + "integrity" "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==" + "resolved" "https://registry.npmmirror.com/node-emoji/-/node-emoji-1.11.0.tgz" + "version" "1.11.0" + dependencies: + "lodash" "^4.17.21" + +"node-fetch@2.6.7": + "integrity" "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==" + "resolved" "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz" + "version" "2.6.7" + dependencies: + "whatwg-url" "^5.0.0" + +"node-forge@^1": + "integrity" "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + "resolved" "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz" + "version" "1.3.1" + +"node-releases@^2.0.8": + "integrity" "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "resolved" "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz" + "version" "2.0.10" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" + +"normalize-range@^0.1.2": + "integrity" "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + "resolved" "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz" + "version" "0.1.2" + +"normalize-url@^4.1.0": + "integrity" "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + "resolved" "https://registry.npmmirror.com/normalize-url/-/normalize-url-4.5.1.tgz" + "version" "4.5.1" + +"normalize-url@^6.0.1": + "integrity" "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + "resolved" "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz" + "version" "6.1.0" + +"npm-run-path@^4.0.1": + "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + "resolved" "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "path-key" "^3.0.0" + +"nprogress@^0.2.0": + "integrity" "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + "resolved" "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz" + "version" "0.2.0" + +"nth-check@^2.0.1": + "integrity" "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" + "resolved" "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "boolbase" "^1.0.0" + +"object-assign@^4.1.0", "object-assign@^4.1.1": + "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "resolved" "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz" + "version" "4.1.1" + +"object-inspect@^1.9.0": + "integrity" "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "resolved" "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz" + "version" "1.12.3" + +"object-keys@^1.1.1": + "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "resolved" "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz" + "version" "1.1.1" + +"object.assign@^4.1.0": + "integrity" "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==" + "resolved" "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz" + "version" "4.1.4" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.4" + "has-symbols" "^1.0.3" + "object-keys" "^1.1.1" + +"obuf@^1.0.0", "obuf@^1.1.2": + "integrity" "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "resolved" "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz" + "version" "1.1.2" + +"on-finished@2.4.1": + "integrity" "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" + "resolved" "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz" + "version" "2.4.1" + dependencies: + "ee-first" "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +"on-headers@~1.0.2": + "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "resolved" "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz" + "version" "1.0.2" -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" +"once@^1.3.0", "once@^1.3.1", "once@^1.4.0": + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmmirror.com/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" +"onetime@^5.1.2": + "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + "resolved" "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "mimic-fn" "^2.1.0" -open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== +"open@^8.0.9", "open@^8.4.0": + "integrity" "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==" + "resolved" "https://registry.npmmirror.com/open/-/open-8.4.2.tgz" + "version" "8.4.2" dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" + "define-lazy-prop" "^2.0.0" + "is-docker" "^2.1.1" + "is-wsl" "^2.2.0" -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +"opener@^1.5.2": + "integrity" "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + "resolved" "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz" + "version" "1.5.2" -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-1.1.0.tgz" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +"p-cancelable@^1.0.0": + "integrity" "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + "resolved" "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-1.1.0.tgz" + "version" "1.1.0" -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== +"p-limit@^2.0.0", "p-limit@^2.2.0": + "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + "resolved" "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz" + "version" "2.3.0" dependencies: - p-try "^2.0.0" + "p-try" "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== +"p-limit@^3.0.2": + "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + "resolved" "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz" + "version" "3.1.0" dependencies: - yocto-queue "^0.1.0" + "yocto-queue" "^0.1.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== +"p-locate@^3.0.0": + "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" + "resolved" "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz" + "version" "3.0.0" dependencies: - p-limit "^2.0.0" + "p-limit" "^2.0.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +"p-locate@^4.1.0": + "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + "resolved" "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz" + "version" "4.1.0" dependencies: - p-limit "^2.2.0" + "p-limit" "^2.2.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== +"p-locate@^5.0.0": + "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + "resolved" "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz" + "version" "5.0.0" dependencies: - p-limit "^3.0.2" + "p-limit" "^3.0.2" -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== +"p-map@^4.0.0": + "integrity" "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==" + "resolved" "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz" + "version" "4.0.0" dependencies: - aggregate-error "^3.0.0" + "aggregate-error" "^3.0.0" -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== +"p-retry@^4.5.0": + "integrity" "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==" + "resolved" "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz" + "version" "4.6.2" dependencies: "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.npmmirror.com/package-json/-/package-json-6.5.0.tgz" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/parse-entities/-/parse-entities-2.0.0.tgz" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + "retry" "^0.13.1" + +"p-try@^2.0.0": + "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "resolved" "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz" + "version" "2.2.0" + +"package-json@^6.3.0": + "integrity" "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==" + "resolved" "https://registry.npmmirror.com/package-json/-/package-json-6.5.0.tgz" + "version" "6.5.0" + dependencies: + "got" "^9.6.0" + "registry-auth-token" "^4.0.0" + "registry-url" "^5.0.0" + "semver" "^6.2.0" + +"param-case@^3.0.4": + "integrity" "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==" + "resolved" "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "dot-case" "^3.0.4" + "tslib" "^2.0.3" + +"parent-module@^1.0.0": + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "callsites" "^3.0.0" + +"parse-entities@^2.0.0": + "integrity" "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==" + "resolved" "https://registry.npmmirror.com/parse-entities/-/parse-entities-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "character-entities" "^1.0.0" + "character-entities-legacy" "^1.0.0" + "character-reference-invalid" "^1.0.0" + "is-alphanumerical" "^1.0.0" + "is-decimal" "^1.0.0" + "is-hexadecimal" "^1.0.0" + +"parse-json@^5.0.0": + "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" + "resolved" "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz" + "version" "5.2.0" dependencies: "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-numeric-range@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" - integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/path-is-inside/-/path-is-inside-1.0.2.tgz" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/pkg-up/-/pkg-up-3.1.0.tgz" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-loader@^7.0.0: - version "7.1.0" - resolved "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-7.1.0.tgz" - integrity sha512-vTD2DJ8vJD0Vr1WzMQkRZWRjcynGh3t7NeoLg+Sb1TeuK7etiZfL/ZwHbaVa3M+Qni7Lj/29voV9IggnIUjlIw== - dependencies: - cosmiconfig "^8.0.0" - klona "^2.0.6" - semver "^7.3.8" - -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" + "error-ex" "^1.3.1" + "json-parse-even-better-errors" "^2.3.0" + "lines-and-columns" "^1.1.6" + +"parse-node-version@^1.0.1": + "integrity" "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + "resolved" "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" + "version" "1.0.1" + +"parse-numeric-range@^1.3.0": + "integrity" "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + "resolved" "https://registry.npmmirror.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" + "version" "1.3.0" + +"parse5-htmlparser2-tree-adapter@^7.0.0": + "integrity" "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==" + "resolved" "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "domhandler" "^5.0.2" + "parse5" "^7.0.0" + +"parse5@^6.0.0": + "integrity" "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "resolved" "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz" + "version" "6.0.1" + +"parse5@^7.0.0": + "integrity" "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==" + "resolved" "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz" + "version" "7.1.2" + dependencies: + "entities" "^4.4.0" + +"parseurl@~1.3.2", "parseurl@~1.3.3": + "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "resolved" "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz" + "version" "1.3.3" + +"pascal-case@^3.1.2": + "integrity" "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==" + "resolved" "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "no-case" "^3.0.4" + "tslib" "^2.0.3" + +"path-exists@^3.0.0": + "integrity" "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + "resolved" "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz" + "version" "3.0.0" + +"path-exists@^4.0.0": + "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "resolved" "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz" + "version" "4.0.0" + +"path-is-absolute@^1.0.0": + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-is-inside@1.0.2": + "integrity" "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + "resolved" "https://registry.npmmirror.com/path-is-inside/-/path-is-inside-1.0.2.tgz" + "version" "1.0.2" + +"path-key@^3.0.0", "path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"path-parse@^1.0.7": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-to-regexp@^1.7.0": + "integrity" "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==" + "resolved" "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + "version" "1.8.0" + dependencies: + "isarray" "0.0.1" + +"path-to-regexp@0.1.7": + "integrity" "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "resolved" "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + "version" "0.1.7" + +"path-to-regexp@2.2.1": + "integrity" "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "resolved" "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz" + "version" "2.2.1" + +"path-type@^4.0.0": + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "resolved" "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz" + "version" "4.0.0" + +"picocolors@^1.0.0": + "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "resolved" "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz" + "version" "1.0.0" + +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.3", "picomatch@^2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"pify@^4.0.1": + "integrity" "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "resolved" "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + "version" "4.0.1" + +"pkg-dir@^4.1.0": + "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==" + "resolved" "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "find-up" "^4.0.0" + +"pkg-up@^3.1.0": + "integrity" "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==" + "resolved" "https://registry.npmmirror.com/pkg-up/-/pkg-up-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "find-up" "^3.0.0" + +"postcss-calc@^8.2.3": + "integrity" "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==" + "resolved" "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz" + "version" "8.2.4" + dependencies: + "postcss-selector-parser" "^6.0.9" + "postcss-value-parser" "^4.2.0" + +"postcss-colormin@^5.3.1": + "integrity" "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==" + "resolved" "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz" + "version" "5.3.1" + dependencies: + "browserslist" "^4.21.4" + "caniuse-api" "^3.0.0" + "colord" "^2.9.1" + "postcss-value-parser" "^4.2.0" + +"postcss-convert-values@^5.1.3": + "integrity" "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==" + "resolved" "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" + "version" "5.1.3" + dependencies: + "browserslist" "^4.21.4" + "postcss-value-parser" "^4.2.0" + +"postcss-discard-comments@^5.1.2": + "integrity" "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==" + "resolved" "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" + "version" "5.1.2" + +"postcss-discard-duplicates@^5.1.0": + "integrity" "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + "resolved" "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" + "version" "5.1.0" + +"postcss-discard-empty@^5.1.1": + "integrity" "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + "resolved" "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" + "version" "5.1.1" + +"postcss-discard-overridden@^5.1.0": + "integrity" "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + "resolved" "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" + "version" "5.1.0" + +"postcss-discard-unused@^5.1.0": + "integrity" "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==" + "resolved" "https://registry.npmmirror.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "postcss-selector-parser" "^6.0.5" + +"postcss-loader@^7.0.0": + "integrity" "sha512-vTD2DJ8vJD0Vr1WzMQkRZWRjcynGh3t7NeoLg+Sb1TeuK7etiZfL/ZwHbaVa3M+Qni7Lj/29voV9IggnIUjlIw==" + "resolved" "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-7.1.0.tgz" + "version" "7.1.0" + dependencies: + "cosmiconfig" "^8.0.0" + "klona" "^2.0.6" + "semver" "^7.3.8" + +"postcss-merge-idents@^5.1.1": + "integrity" "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==" + "resolved" "https://registry.npmmirror.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "cssnano-utils" "^3.1.0" + "postcss-value-parser" "^4.2.0" + +"postcss-merge-longhand@^5.1.7": + "integrity" "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==" + "resolved" "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" + "version" "5.1.7" + dependencies: + "postcss-value-parser" "^4.2.0" + "stylehacks" "^5.1.1" + +"postcss-merge-rules@^5.1.4": + "integrity" "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==" + "resolved" "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" + "version" "5.1.4" + dependencies: + "browserslist" "^4.21.4" + "caniuse-api" "^3.0.0" + "cssnano-utils" "^3.1.0" + "postcss-selector-parser" "^6.0.5" -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== +"postcss-minify-font-values@^5.1.0": + "integrity" "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==" + "resolved" "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" + "version" "5.1.0" dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" + +"postcss-minify-gradients@^5.1.1": + "integrity" "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==" + "resolved" "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "colord" "^2.9.1" + "cssnano-utils" "^3.1.0" + "postcss-value-parser" "^4.2.0" -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" +"postcss-minify-params@^5.1.4": + "integrity" "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==" + "resolved" "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" + "version" "5.1.4" + dependencies: + "browserslist" "^4.21.4" + "cssnano-utils" "^3.1.0" + "postcss-value-parser" "^4.2.0" -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== +"postcss-minify-selectors@^5.2.1": + "integrity" "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==" + "resolved" "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" + "version" "5.2.1" dependencies: - postcss-selector-parser "^6.0.5" + "postcss-selector-parser" "^6.0.5" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +"postcss-modules-extract-imports@^3.0.0": + "integrity" "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + "resolved" "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + "version" "3.0.0" -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +"postcss-modules-local-by-default@^4.0.0": + "integrity" "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==" + "resolved" "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + "version" "4.0.0" dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" + "icss-utils" "^5.0.0" + "postcss-selector-parser" "^6.0.2" + "postcss-value-parser" "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +"postcss-modules-scope@^3.0.0": + "integrity" "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==" + "resolved" "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + "version" "3.0.0" dependencies: - postcss-selector-parser "^6.0.4" + "postcss-selector-parser" "^6.0.4" -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== +"postcss-modules-values@^4.0.0": + "integrity" "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==" + "resolved" "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + "version" "4.0.0" dependencies: - icss-utils "^5.0.0" + "icss-utils" "^5.0.0" -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== +"postcss-normalize-charset@^5.1.0": + "integrity" "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" + "version" "5.1.0" -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== +"postcss-normalize-display-values@^5.1.0": + "integrity" "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" + "version" "5.1.0" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== +"postcss-normalize-positions@^5.1.1": + "integrity" "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" + "version" "5.1.1" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== +"postcss-normalize-repeat-style@^5.1.1": + "integrity" "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" + "version" "5.1.1" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== +"postcss-normalize-string@^5.1.0": + "integrity" "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" + "version" "5.1.0" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== +"postcss-normalize-timing-functions@^5.1.0": + "integrity" "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" + "version" "5.1.0" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== +"postcss-normalize-unicode@^5.1.1": + "integrity" "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" + "version" "5.1.1" dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" + "browserslist" "^4.21.4" + "postcss-value-parser" "^4.2.0" -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== +"postcss-normalize-url@^5.1.0": + "integrity" "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" + "version" "5.1.0" dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" + "normalize-url" "^6.0.1" + "postcss-value-parser" "^4.2.0" -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== +"postcss-normalize-whitespace@^5.1.1": + "integrity" "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" + "version" "5.1.1" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== +"postcss-ordered-values@^5.1.3": + "integrity" "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==" + "resolved" "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" + "version" "5.1.3" dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" + "cssnano-utils" "^3.1.0" + "postcss-value-parser" "^4.2.0" -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== +"postcss-reduce-idents@^5.2.0": + "integrity" "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==" + "resolved" "https://registry.npmmirror.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" + "version" "5.2.0" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== +"postcss-reduce-initial@^5.1.2": + "integrity" "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==" + "resolved" "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" + "version" "5.1.2" dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" + "browserslist" "^4.21.4" + "caniuse-api" "^3.0.0" -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== +"postcss-reduce-transforms@^5.1.0": + "integrity" "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==" + "resolved" "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" + "version" "5.1.0" dependencies: - postcss-value-parser "^4.2.0" + "postcss-value-parser" "^4.2.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +"postcss-selector-parser@^6.0.2", "postcss-selector-parser@^6.0.4", "postcss-selector-parser@^6.0.5", "postcss-selector-parser@^6.0.9": + "integrity" "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==" + "resolved" "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" + "version" "6.0.11" dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" + "cssesc" "^3.0.0" + "util-deprecate" "^1.0.2" -postcss-sort-media-queries@^4.2.1: - version "4.3.0" - resolved "https://registry.npmmirror.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz" - integrity sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg== +"postcss-sort-media-queries@^4.2.1": + "integrity" "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==" + "resolved" "https://registry.npmmirror.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz" + "version" "4.3.0" dependencies: - sort-css-media-queries "2.1.0" + "sort-css-media-queries" "2.1.0" -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== +"postcss-svgo@^5.1.0": + "integrity" "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==" + "resolved" "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz" + "version" "5.1.0" dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" + "postcss-value-parser" "^4.2.0" + "svgo" "^2.7.0" -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== +"postcss-unique-selectors@^5.1.1": + "integrity" "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==" + "resolved" "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" + "version" "5.1.1" dependencies: - postcss-selector-parser "^6.0.5" + "postcss-selector-parser" "^6.0.5" -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +"postcss-value-parser@^4.1.0", "postcss-value-parser@^4.2.0": + "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "resolved" "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + "version" "4.2.0" -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== +"postcss-zindex@^5.1.0": + "integrity" "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==" + "resolved" "https://registry.npmmirror.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz" + "version" "5.1.0" -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== +"postcss@^7.0.0 || ^8.0.1", "postcss@^8.0.9", "postcss@^8.1.0", "postcss@^8.2.15", "postcss@^8.2.2", "postcss@^8.3.11", "postcss@^8.4.14", "postcss@^8.4.16", "postcss@^8.4.17", "postcss@^8.4.19": + "integrity" "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==" + "resolved" "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz" + "version" "8.4.21" dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-time@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/pretty-time/-/pretty-time-1.1.0.tgz" - integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== - -prism-react-renderer@^1.2.1, prism-react-renderer@^1.3.5: - version "1.3.5" - resolved "https://registry.npmmirror.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== - -prismjs@^1.28.0: - version "1.29.0" - resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + "nanoid" "^3.3.4" + "picocolors" "^1.0.0" + "source-map-js" "^1.0.2" + +"prepend-http@^2.0.0": + "integrity" "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" + "resolved" "https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz" + "version" "2.0.0" + +"pretty-error@^4.0.0": + "integrity" "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==" + "resolved" "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "lodash" "^4.17.20" + "renderkid" "^3.0.0" + +"pretty-time@^1.1.0": + "integrity" "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + "resolved" "https://registry.npmmirror.com/pretty-time/-/pretty-time-1.1.0.tgz" + "version" "1.1.0" + +"prism-react-renderer@^1.2.1", "prism-react-renderer@^1.3.5": + "integrity" "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==" + "resolved" "https://registry.npmmirror.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz" + "version" "1.3.5" + +"prismjs@^1.28.0": + "integrity" "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + "resolved" "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz" + "version" "1.29.0" + +"process-nextick-args@~2.0.0": + "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved" "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + "version" "2.0.1" -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npmmirror.com/promise/-/promise-7.3.1.tgz" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.2, prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.npmmirror.com/property-information/-/property-information-5.6.0.tgz" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/pupa/-/pupa-2.1.1.tgz" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/pure-color/-/pure-color-1.3.0.tgz" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.0.tgz" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@1.2.8, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.npmmirror.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.npmmirror.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== +"promise@^7.1.1": + "integrity" "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==" + "resolved" "https://registry.npmmirror.com/promise/-/promise-7.3.1.tgz" + "version" "7.3.1" + dependencies: + "asap" "~2.0.3" + +"prompts@^2.4.2": + "integrity" "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==" + "resolved" "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "kleur" "^3.0.3" + "sisteransi" "^1.0.5" + +"prop-types@^15.6.2", "prop-types@^15.7.2": + "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==" + "resolved" "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz" + "version" "15.8.1" + dependencies: + "loose-envify" "^1.4.0" + "object-assign" "^4.1.1" + "react-is" "^16.13.1" + +"property-information@^5.0.0", "property-information@^5.3.0": + "integrity" "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==" + "resolved" "https://registry.npmmirror.com/property-information/-/property-information-5.6.0.tgz" + "version" "5.6.0" + dependencies: + "xtend" "^4.0.0" + +"proxy-addr@~2.0.7": + "integrity" "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==" + "resolved" "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz" + "version" "2.0.7" + dependencies: + "forwarded" "0.2.0" + "ipaddr.js" "1.9.1" + +"prr@~1.0.1": + "integrity" "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + "resolved" "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + "version" "1.0.1" + +"pump@^3.0.0": + "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" + "resolved" "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "end-of-stream" "^1.1.0" + "once" "^1.3.1" + +"punycode@^1.3.2": + "integrity" "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "resolved" "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz" + "version" "1.4.1" + +"punycode@^2.1.0": + "integrity" "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "resolved" "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz" + "version" "2.3.0" + +"pupa@^2.1.1": + "integrity" "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==" + "resolved" "https://registry.npmmirror.com/pupa/-/pupa-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "escape-goat" "^2.0.0" + +"pure-color@^1.2.0": + "integrity" "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + "resolved" "https://registry.npmmirror.com/pure-color/-/pure-color-1.3.0.tgz" + "version" "1.3.0" + +"qs@6.11.0": + "integrity" "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==" + "resolved" "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz" + "version" "6.11.0" + dependencies: + "side-channel" "^1.0.4" + +"queue-microtask@^1.2.2": + "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved" "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz" + "version" "1.2.3" + +"queue@6.0.2": + "integrity" "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==" + "resolved" "https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "inherits" "~2.0.3" + +"randombytes@^2.1.0": + "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" + "resolved" "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "safe-buffer" "^5.1.0" + +"range-parser@^1.2.1": + "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "resolved" "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz" + "version" "1.2.1" + +"range-parser@~1.2.1": + "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "resolved" "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz" + "version" "1.2.1" + +"range-parser@1.2.0": + "integrity" "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" + "resolved" "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.0.tgz" + "version" "1.2.0" + +"raw-body@2.5.1": + "integrity" "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==" + "resolved" "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz" + "version" "2.5.1" + dependencies: + "bytes" "3.1.2" + "http-errors" "2.0.0" + "iconv-lite" "0.4.24" + "unpipe" "1.0.0" + +"rc@^1.2.8", "rc@1.2.8": + "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==" + "resolved" "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz" + "version" "1.2.8" + dependencies: + "deep-extend" "^0.6.0" + "ini" "~1.3.0" + "minimist" "^1.2.0" + "strip-json-comments" "~2.0.1" + +"react-base16-styling@^0.6.0": + "integrity" "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==" + "resolved" "https://registry.npmmirror.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz" + "version" "0.6.0" + dependencies: + "base16" "^1.0.0" + "lodash.curry" "^4.0.1" + "lodash.flow" "^3.3.0" + "pure-color" "^1.2.0" + +"react-dev-utils@^12.0.1": + "integrity" "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==" + "resolved" "https://registry.npmmirror.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz" + "version" "12.0.1" dependencies: "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^17.0.1: - version "17.0.2" - resolved "https://registry.npmmirror.com/react-dom/-/react-dom-17.0.2.tgz" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-fast-compare@^3.2.0: - version "3.2.1" - resolved "https://registry.npmmirror.com/react-fast-compare/-/react-fast-compare-3.2.1.tgz" - integrity sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg== - -react-helmet-async@*, react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + "address" "^1.1.2" + "browserslist" "^4.18.1" + "chalk" "^4.1.2" + "cross-spawn" "^7.0.3" + "detect-port-alt" "^1.1.6" + "escape-string-regexp" "^4.0.0" + "filesize" "^8.0.6" + "find-up" "^5.0.0" + "fork-ts-checker-webpack-plugin" "^6.5.0" + "global-modules" "^2.0.0" + "globby" "^11.0.4" + "gzip-size" "^6.0.0" + "immer" "^9.0.7" + "is-root" "^2.1.0" + "loader-utils" "^3.2.0" + "open" "^8.4.0" + "pkg-up" "^3.1.0" + "prompts" "^2.4.2" + "react-error-overlay" "^6.0.11" + "recursive-readdir" "^2.2.2" + "shell-quote" "^1.7.3" + "strip-ansi" "^6.0.1" + "text-table" "^0.2.0" + +"react-dom@*", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", "react-dom@^17.0.1", "react-dom@>= 16.8.0 < 19.0.0": + "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" + "resolved" "https://registry.npmmirror.com/react-dom/-/react-dom-17.0.2.tgz" + "version" "17.0.2" + dependencies: + "loose-envify" "^1.1.0" + "object-assign" "^4.1.1" + "scheduler" "^0.20.2" + +"react-error-overlay@^6.0.11": + "integrity" "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + "resolved" "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz" + "version" "6.0.11" + +"react-fast-compare@^3.2.0": + "integrity" "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" + "resolved" "https://registry.npmmirror.com/react-fast-compare/-/react-fast-compare-3.2.1.tgz" + "version" "3.2.1" + +"react-helmet-async@*", "react-helmet-async@^1.3.0": + "integrity" "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==" + "resolved" "https://registry.npmmirror.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz" + "version" "1.3.0" dependencies: "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.npmmirror.com/react-json-view/-/react-json-view-1.21.3.tgz" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.npmmirror.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + "invariant" "^2.2.4" + "prop-types" "^15.7.2" + "react-fast-compare" "^3.2.0" + "shallowequal" "^1.1.0" + +"react-is@^16.13.1", "react-is@^16.6.0", "react-is@^16.7.0": + "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "resolved" "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz" + "version" "16.13.1" + +"react-json-view@^1.21.3": + "integrity" "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==" + "resolved" "https://registry.npmmirror.com/react-json-view/-/react-json-view-1.21.3.tgz" + "version" "1.21.3" + dependencies: + "flux" "^4.0.1" + "react-base16-styling" "^0.6.0" + "react-lifecycles-compat" "^3.0.4" + "react-textarea-autosize" "^8.3.2" + +"react-lifecycles-compat@^3.0.4": + "integrity" "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "resolved" "https://registry.npmmirror.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" + "version" "3.0.4" + +"react-loadable-ssr-addon-v5-slorber@^1.0.1": + "integrity" "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==" + "resolved" "https://registry.npmmirror.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" + "version" "1.0.1" dependencies: "@babel/runtime" "^7.10.3" -react-router-config@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/react-router-config/-/react-router-config-5.1.1.tgz" - integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== +"react-loadable@*", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + "integrity" "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==" + "resolved" "https://registry.npmmirror.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + "version" "5.5.2" + dependencies: + "@types/react" "*" + "prop-types" "^15.6.2" + +"react-router-config@^5.1.1": + "integrity" "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==" + "resolved" "https://registry.npmmirror.com/react-router-config/-/react-router-config-5.1.1.tgz" + "version" "5.1.1" dependencies: "@babel/runtime" "^7.1.2" -react-router-dom@^5.3.3: - version "5.3.4" - resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-5.3.4.tgz" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== +"react-router-dom@^5.3.3": + "integrity" "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==" + "resolved" "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-5.3.4.tgz" + "version" "5.3.4" dependencies: "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.3.3: - version "5.3.4" - resolved "https://registry.npmmirror.com/react-router/-/react-router-5.3.4.tgz" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + "history" "^4.9.0" + "loose-envify" "^1.3.1" + "prop-types" "^15.6.2" + "react-router" "5.3.4" + "tiny-invariant" "^1.0.2" + "tiny-warning" "^1.0.0" + +"react-router@^5.3.3", "react-router@>=5", "react-router@5.3.4": + "integrity" "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==" + "resolved" "https://registry.npmmirror.com/react-router/-/react-router-5.3.4.tgz" + "version" "5.3.4" dependencies: "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-textarea-autosize@^8.3.2: - version "8.4.1" - resolved "https://registry.npmmirror.com/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz" - integrity sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q== + "history" "^4.9.0" + "hoist-non-react-statics" "^3.1.0" + "loose-envify" "^1.3.1" + "path-to-regexp" "^1.7.0" + "prop-types" "^15.6.2" + "react-is" "^16.6.0" + "tiny-invariant" "^1.0.2" + "tiny-warning" "^1.0.0" + +"react-textarea-autosize@^8.3.2": + "integrity" "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==" + "resolved" "https://registry.npmmirror.com/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz" + "version" "8.4.1" dependencies: "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^17.0.1: - version "17.0.2" - resolved "https://registry.npmmirror.com/react/-/react-17.0.2.tgz" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/reading-time/-/reading-time-1.5.0.tgz" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.0: - version "0.15.1" - resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + "use-composed-ref" "^1.3.0" + "use-latest" "^1.2.1" + +"react@*", "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^16.13.1 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0", "react@^17.0.0 || ^16.3.0 || ^15.5.4", "react@^17.0.1", "react@>= 16.8.0 < 19.0.0", "react@>=0.14.9", "react@>=15", "react@17.0.2": + "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==" + "resolved" "https://registry.npmmirror.com/react/-/react-17.0.2.tgz" + "version" "17.0.2" + dependencies: + "loose-envify" "^1.1.0" + "object-assign" "^4.1.1" + +"readable-stream@^2.0.1": + "integrity" "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" + "resolved" "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz" + "version" "2.3.8" + dependencies: + "core-util-is" "~1.0.0" + "inherits" "~2.0.3" + "isarray" "~1.0.0" + "process-nextick-args" "~2.0.0" + "safe-buffer" "~5.1.1" + "string_decoder" "~1.1.1" + "util-deprecate" "~1.0.1" + +"readable-stream@^3.0.6": + "integrity" "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" + "resolved" "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz" + "version" "3.6.2" + dependencies: + "inherits" "^2.0.3" + "string_decoder" "^1.1.1" + "util-deprecate" "^1.0.1" + +"readdirp@~3.6.0": + "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + "resolved" "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "picomatch" "^2.2.1" + +"reading-time@^1.5.0": + "integrity" "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + "resolved" "https://registry.npmmirror.com/reading-time/-/reading-time-1.5.0.tgz" + "version" "1.5.0" + +"rechoir@^0.6.2": + "integrity" "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==" + "resolved" "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz" + "version" "0.6.2" + dependencies: + "resolve" "^1.1.6" + +"recursive-readdir@^2.2.2": + "integrity" "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==" + "resolved" "https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz" + "version" "2.2.3" + dependencies: + "minimatch" "^3.0.5" + +"regenerate-unicode-properties@^10.1.0": + "integrity" "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==" + "resolved" "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + "version" "10.1.0" + dependencies: + "regenerate" "^1.4.2" + +"regenerate@^1.4.2": + "integrity" "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "resolved" "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz" + "version" "1.4.2" + +"regenerator-runtime@^0.13.11": + "integrity" "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "resolved" "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + "version" "0.13.11" + +"regenerator-transform@^0.15.0": + "integrity" "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==" + "resolved" "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + "version" "0.15.1" dependencies: "@babel/runtime" "^7.8.4" -regexpu-core@^5.1.0: - version "5.3.2" - resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== +"regexpu-core@^5.1.0": + "integrity" "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==" + "resolved" "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz" + "version" "5.3.2" dependencies: "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" + "regenerate" "^1.4.2" + "regenerate-unicode-properties" "^10.1.0" + "regjsparser" "^0.9.1" + "unicode-match-property-ecmascript" "^2.0.0" + "unicode-match-property-value-ecmascript" "^2.1.0" -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.npmmirror.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== +"registry-auth-token@^4.0.0": + "integrity" "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==" + "resolved" "https://registry.npmmirror.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz" + "version" "4.2.2" dependencies: - rc "1.2.8" + "rc" "1.2.8" -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/registry-url/-/registry-url-5.1.0.tgz" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== +"registry-url@^5.0.0": + "integrity" "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==" + "resolved" "https://registry.npmmirror.com/registry-url/-/registry-url-5.1.0.tgz" + "version" "5.1.0" dependencies: - rc "^1.2.8" + "rc" "^1.2.8" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== +"regjsparser@^0.9.1": + "integrity" "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==" + "resolved" "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz" + "version" "0.9.1" dependencies: - jsesc "~0.5.0" + "jsesc" "~0.5.0" -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== +"relateurl@^0.2.7": + "integrity" "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + "resolved" "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz" + "version" "0.2.7" -remark-emoji@^2.2.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/remark-emoji/-/remark-emoji-2.2.0.tgz" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== +"remark-emoji@^2.2.0": + "integrity" "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==" + "resolved" "https://registry.npmmirror.com/remark-emoji/-/remark-emoji-2.2.0.tgz" + "version" "2.2.0" dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" + "emoticon" "^3.2.0" + "node-emoji" "^1.10.0" + "unist-util-visit" "^2.0.3" -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== +"remark-footnotes@2.0.0": + "integrity" "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + "resolved" "https://registry.npmmirror.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz" + "version" "2.0.0" -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.npmmirror.com/remark-mdx/-/remark-mdx-1.6.22.tgz" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== +"remark-mdx@1.6.22": + "integrity" "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==" + "resolved" "https://registry.npmmirror.com/remark-mdx/-/remark-mdx-1.6.22.tgz" + "version" "1.6.22" dependencies: "@babel/core" "7.12.9" "@babel/helper-plugin-utils" "7.10.4" "@babel/plugin-proposal-object-rest-spread" "7.12.1" "@babel/plugin-syntax-jsx" "7.12.1" "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.npmmirror.com/remark-parse/-/remark-parse-8.0.3.tgz" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== - dependencies: - mdast-squeeze-paragraphs "^4.0.0" - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + "is-alphabetical" "1.0.4" + "remark-parse" "8.0.3" + "unified" "9.2.0" + +"remark-parse@8.0.3": + "integrity" "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==" + "resolved" "https://registry.npmmirror.com/remark-parse/-/remark-parse-8.0.3.tgz" + "version" "8.0.3" + dependencies: + "ccount" "^1.0.0" + "collapse-white-space" "^1.0.2" + "is-alphabetical" "^1.0.0" + "is-decimal" "^1.0.0" + "is-whitespace-character" "^1.0.0" + "is-word-character" "^1.0.0" + "markdown-escapes" "^1.0.0" + "parse-entities" "^2.0.0" + "repeat-string" "^1.5.4" + "state-toggle" "^1.0.0" + "trim" "0.0.1" + "trim-trailing-lines" "^1.0.0" + "unherit" "^1.0.4" + "unist-util-remove-position" "^2.0.0" + "vfile-location" "^3.0.0" + "xtend" "^4.0.1" + +"remark-squeeze-paragraphs@4.0.0": + "integrity" "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==" + "resolved" "https://registry.npmmirror.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "mdast-squeeze-paragraphs" "^4.0.0" + +"renderkid@^3.0.0": + "integrity" "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==" + "resolved" "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "css-select" "^4.1.3" + "dom-converter" "^0.2.0" + "htmlparser2" "^6.1.0" + "lodash" "^4.17.21" + "strip-ansi" "^6.0.1" + +"repeat-string@^1.5.4": + "integrity" "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + "resolved" "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz" + "version" "1.6.1" + +"require-from-string@^2.0.2": + "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "resolved" "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz" + "version" "2.0.2" "require-like@>= 0.1.1": - version "0.1.2" - resolved "https://registry.npmmirror.com/require-like/-/require-like-0.1.2.tgz" - integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rtl-detect@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/rtl-detect/-/rtl-detect-1.0.4.tgz" - integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== - -rtlcss@^3.5.0: - version "3.5.0" - resolved "https://registry.npmmirror.com/rtlcss/-/rtlcss-3.5.0.tgz" - integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== - dependencies: - find-up "^5.0.0" - picocolors "^1.0.0" - postcss "^8.3.11" - strip-json-comments "^3.1.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.4: - version "7.8.0" - resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-loader@^10.1.1: - version "10.4.1" - resolved "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.4.1.tgz" - integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ== - dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" - -sass@^1.49.8: - version "1.60.0" - resolved "https://registry.npmmirror.com/sass/-/sass-1.60.0.tgz" - integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.20.2.tgz" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + "integrity" "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" + "resolved" "https://registry.npmmirror.com/require-like/-/require-like-0.1.2.tgz" + "version" "0.1.2" + +"requires-port@^1.0.0": + "integrity" "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "resolved" "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz" + "version" "1.0.0" + +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" + +"resolve-pathname@^3.0.0": + "integrity" "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + "resolved" "https://registry.npmmirror.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz" + "version" "3.0.0" + +"resolve@^1.1.6", "resolve@^1.14.2", "resolve@^1.3.2": + "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" + "resolved" "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz" + "version" "1.22.1" + dependencies: + "is-core-module" "^2.9.0" + "path-parse" "^1.0.7" + "supports-preserve-symlinks-flag" "^1.0.0" + +"responselike@^1.0.2": + "integrity" "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==" + "resolved" "https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "lowercase-keys" "^1.0.0" + +"retry@^0.13.1": + "integrity" "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + "resolved" "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz" + "version" "0.13.1" + +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" + +"rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"rtl-detect@^1.0.4": + "integrity" "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + "resolved" "https://registry.npmmirror.com/rtl-detect/-/rtl-detect-1.0.4.tgz" + "version" "1.0.4" + +"rtlcss@^3.5.0": + "integrity" "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==" + "resolved" "https://registry.npmmirror.com/rtlcss/-/rtlcss-3.5.0.tgz" + "version" "3.5.0" + dependencies: + "find-up" "^5.0.0" + "picocolors" "^1.0.0" + "postcss" "^8.3.11" + "strip-json-comments" "^3.1.1" + +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "queue-microtask" "^1.2.2" + +"rxjs@^7.5.4": + "integrity" "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==" + "resolved" "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz" + "version" "7.8.0" + dependencies: + "tslib" "^2.1.0" + +"safe-buffer@^5.1.0", "safe-buffer@>=5.1.0", "safe-buffer@~5.2.0", "safe-buffer@5.2.1": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safe-buffer@~5.1.0", "safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safe-buffer@5.1.2": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + "version" "2.1.2" + +"sass-loader@^10.1.1": + "integrity" "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==" + "resolved" "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.4.1.tgz" + "version" "10.4.1" + dependencies: + "klona" "^2.0.4" + "loader-utils" "^2.0.0" + "neo-async" "^2.6.2" + "schema-utils" "^3.0.0" + "semver" "^7.3.2" + +"sass@^1.3.0", "sass@^1.30.0", "sass@^1.49.8": + "integrity" "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==" + "resolved" "https://registry.npmmirror.com/sass/-/sass-1.60.0.tgz" + "version" "1.60.0" + dependencies: + "chokidar" ">=3.0.0 <4.0.0" + "immutable" "^4.0.0" + "source-map-js" ">=0.6.2 <2.0.0" + +"sax@^1.2.4": + "integrity" "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "resolved" "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz" + "version" "1.2.4" + +"scheduler@^0.20.2": + "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==" + "resolved" "https://registry.npmmirror.com/scheduler/-/scheduler-0.20.2.tgz" + "version" "0.20.2" + dependencies: + "loose-envify" "^1.1.0" + "object-assign" "^4.1.1" + +"schema-utils@^2.6.5": + "integrity" "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz" + "version" "2.7.1" dependencies: "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" + "ajv" "^6.12.4" + "ajv-keywords" "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +"schema-utils@^3.0.0": + "integrity" "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz" + "version" "3.1.1" dependencies: "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" + "ajv" "^6.12.5" + "ajv-keywords" "^3.5.2" -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.0.0.tgz" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.1.1.tgz" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/semver-diff/-/semver-diff-3.1.1.tgz" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-handler@^6.1.3: - version "6.1.5" - resolved "https://registry.npmmirror.com/serve-handler/-/serve-handler-6.1.5.tgz" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.1.2" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.0" - resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.0.tgz" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.npmmirror.com/sirv/-/sirv-1.0.19.tgz" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== +"schema-utils@^3.1.1": + "integrity" "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz" + "version" "3.1.1" dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -sitemap@^7.1.1: - version "7.1.1" - resolved "https://registry.npmmirror.com/sitemap/-/sitemap-7.1.1.tgz" - integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== - dependencies: - "@types/node" "^17.0.5" - "@types/sax" "^1.2.1" - arg "^5.0.0" - sax "^1.2.4" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -sort-css-media-queries@2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz" - integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== - -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.npmmirror.com/state-toggle/-/state-toggle-1.0.3.tgz" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -std-env@^3.0.1: - version "3.3.2" - resolved "https://registry.npmmirror.com/std-env/-/std-env-3.3.2.tgz" - integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.3" - resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + "@types/json-schema" "^7.0.8" + "ajv" "^6.12.5" + "ajv-keywords" "^3.5.2" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +"schema-utils@^3.2.0": + "integrity" "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==" + "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + "version" "3.3.0" dependencies: - safe-buffer "~5.1.0" + "@types/json-schema" "^7.0.8" + "ajv" "^6.12.5" + "ajv-keywords" "^3.5.2" -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== +"schema-utils@^4.0.0": + "integrity" "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.0.0.tgz" + "version" "4.0.0" dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" + "@types/json-schema" "^7.0.9" + "ajv" "^8.8.0" + "ajv-formats" "^2.1.1" + "ajv-keywords" "^5.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +"schema-utils@2.7.0": + "integrity" "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.0.tgz" + "version" "2.7.0" dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + "@types/json-schema" "^7.0.4" + "ajv" "^6.12.2" + "ajv-keywords" "^3.4.1" + +"section-matter@^1.0.0": + "integrity" "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==" + "resolved" "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "extend-shallow" "^2.0.1" + "kind-of" "^6.0.0" + +"select-hose@^2.0.0": + "integrity" "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "resolved" "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz" + "version" "2.0.0" + +"selfsigned@^2.1.1": + "integrity" "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==" + "resolved" "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "node-forge" "^1" + +"semver-diff@^3.1.1": + "integrity" "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==" + "resolved" "https://registry.npmmirror.com/semver-diff/-/semver-diff-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "semver" "^6.3.0" + +"semver@^5.4.1": + "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + "version" "5.7.2" + +"semver@^5.6.0": + "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + "version" "5.7.2" + +"semver@^6.0.0": + "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + "version" "6.3.1" + +"semver@^6.1.1": + "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + "version" "6.3.1" + +"semver@^6.1.2": + "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + "version" "6.3.1" + +"semver@^6.2.0": + "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + "version" "6.3.1" + +"semver@^6.3.0": + "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + "version" "6.3.1" + +"semver@^7.3.2", "semver@^7.3.4", "semver@^7.3.7", "semver@^7.3.8": + "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + "version" "7.5.4" + dependencies: + "lru-cache" "^6.0.0" + +"send@0.18.0": + "integrity" "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==" + "resolved" "https://registry.npmmirror.com/send/-/send-0.18.0.tgz" + "version" "0.18.0" + dependencies: + "debug" "2.6.9" + "depd" "2.0.0" + "destroy" "1.2.0" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "etag" "~1.8.1" + "fresh" "0.5.2" + "http-errors" "2.0.0" + "mime" "1.6.0" + "ms" "2.1.3" + "on-finished" "2.4.1" + "range-parser" "~1.2.1" + "statuses" "2.0.1" + +"serialize-javascript@^6.0.0", "serialize-javascript@^6.0.1": + "integrity" "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==" + "resolved" "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "randombytes" "^2.1.0" + +"serve-handler@^6.1.3": + "integrity" "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==" + "resolved" "https://registry.npmmirror.com/serve-handler/-/serve-handler-6.1.5.tgz" + "version" "6.1.5" + dependencies: + "bytes" "3.0.0" + "content-disposition" "0.5.2" + "fast-url-parser" "1.1.3" + "mime-types" "2.1.18" + "minimatch" "3.1.2" + "path-is-inside" "1.0.2" + "path-to-regexp" "2.2.1" + "range-parser" "1.2.0" + +"serve-index@^1.9.1": + "integrity" "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==" + "resolved" "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "accepts" "~1.3.4" + "batch" "0.6.1" + "debug" "2.6.9" + "escape-html" "~1.0.3" + "http-errors" "~1.6.2" + "mime-types" "~2.1.17" + "parseurl" "~1.3.2" + +"serve-static@1.15.0": + "integrity" "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==" + "resolved" "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz" + "version" "1.15.0" + dependencies: + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "parseurl" "~1.3.3" + "send" "0.18.0" + +"setimmediate@^1.0.5": + "integrity" "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "resolved" "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz" + "version" "1.0.5" + +"setprototypeof@1.1.0": + "integrity" "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "resolved" "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz" + "version" "1.1.0" + +"setprototypeof@1.2.0": + "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "resolved" "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz" + "version" "1.2.0" + +"shallow-clone@^3.0.0": + "integrity" "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==" + "resolved" "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "kind-of" "^6.0.2" + +"shallowequal@^1.1.0": + "integrity" "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "resolved" "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz" + "version" "1.1.0" + +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"shell-quote@^1.7.3": + "integrity" "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==" + "resolved" "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.0.tgz" + "version" "1.8.0" + +"shelljs@^0.8.5": + "integrity" "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==" + "resolved" "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz" + "version" "0.8.5" + dependencies: + "glob" "^7.0.0" + "interpret" "^1.0.0" + "rechoir" "^0.6.2" + +"side-channel@^1.0.4": + "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" + "resolved" "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "^1.0.0" + "get-intrinsic" "^1.0.2" + "object-inspect" "^1.9.0" + +"signal-exit@^3.0.2", "signal-exit@^3.0.3": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" + +"sirv@^1.0.7": + "integrity" "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==" + "resolved" "https://registry.npmmirror.com/sirv/-/sirv-1.0.19.tgz" + "version" "1.0.19" dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + "@polka/url" "^1.0.0-next.20" + "mrmime" "^1.0.0" + "totalist" "^1.0.0" -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +"sisteransi@^1.0.5": + "integrity" "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "resolved" "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz" + "version" "1.0.5" -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.npmmirror.com/style-to-object/-/style-to-object-0.3.0.tgz" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== +"sitemap@^7.1.1": + "integrity" "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==" + "resolved" "https://registry.npmmirror.com/sitemap/-/sitemap-7.1.1.tgz" + "version" "7.1.1" dependencies: - inline-style-parser "0.1.1" + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + "arg" "^5.0.0" + "sax" "^1.2.4" + +"slash@^3.0.0": + "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "resolved" "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz" + "version" "3.0.0" + +"slash@^4.0.0": + "integrity" "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + "resolved" "https://registry.npmmirror.com/slash/-/slash-4.0.0.tgz" + "version" "4.0.0" + +"sockjs@^0.3.24": + "integrity" "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==" + "resolved" "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz" + "version" "0.3.24" + dependencies: + "faye-websocket" "^0.11.3" + "uuid" "^8.3.2" + "websocket-driver" "^0.7.4" + +"sort-css-media-queries@2.1.0": + "integrity" "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==" + "resolved" "https://registry.npmmirror.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz" + "version" "2.1.0" + +"source-map-js@^1.0.2", "source-map-js@>=0.6.2 <2.0.0": + "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "resolved" "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz" + "version" "1.0.2" + +"source-map-support@~0.5.20": + "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + "resolved" "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" + "version" "0.5.21" + dependencies: + "buffer-from" "^1.0.0" + "source-map" "^0.6.0" + +"source-map@^0.5.0": + "integrity" "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + "resolved" "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz" + "version" "0.5.7" + +"source-map@^0.6.0", "source-map@^0.6.1", "source-map@~0.6.0": + "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved" "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" + "version" "0.6.1" + +"space-separated-tokens@^1.0.0": + "integrity" "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + "resolved" "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" + "version" "1.1.5" + +"spdy-transport@^3.0.0": + "integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==" + "resolved" "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "debug" "^4.1.0" + "detect-node" "^2.0.4" + "hpack.js" "^2.1.6" + "obuf" "^1.1.2" + "readable-stream" "^3.0.6" + "wbuf" "^1.7.3" + +"spdy@^4.0.2": + "integrity" "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==" + "resolved" "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz" + "version" "4.0.2" + dependencies: + "debug" "^4.1.0" + "handle-thing" "^2.0.0" + "http-deceiver" "^1.2.7" + "select-hose" "^2.0.0" + "spdy-transport" "^3.0.0" + +"sprintf-js@~1.0.2": + "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "resolved" "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz" + "version" "1.0.3" + +"stable@^0.1.8": + "integrity" "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "resolved" "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz" + "version" "0.1.8" + +"state-toggle@^1.0.0": + "integrity" "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + "resolved" "https://registry.npmmirror.com/state-toggle/-/state-toggle-1.0.3.tgz" + "version" "1.0.3" -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.1.tgz" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== +"statuses@>= 1.4.0 < 2": + "integrity" "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + "resolved" "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz" + "version" "1.5.0" + +"statuses@2.0.1": + "integrity" "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "resolved" "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz" + "version" "2.0.1" + +"std-env@^3.0.1": + "integrity" "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==" + "resolved" "https://registry.npmmirror.com/std-env/-/std-env-3.3.2.tgz" + "version" "3.3.2" + +"string_decoder@^1.1.1": + "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + "resolved" "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "safe-buffer" "~5.2.0" + +"string_decoder@~1.1.1": + "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + "resolved" "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "safe-buffer" "~5.1.0" + +"string-width@^4.0.0", "string-width@^4.1.0", "string-width@^4.2.2": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"string-width@^4.2.0": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"string-width@^5.0.1": + "integrity" "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==" + "resolved" "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "eastasianwidth" "^0.2.0" + "emoji-regex" "^9.2.2" + "strip-ansi" "^7.0.1" + +"stringify-object@^3.3.0": + "integrity" "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==" + "resolved" "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "get-own-enumerable-property-symbols" "^3.0.0" + "is-obj" "^1.0.1" + "is-regexp" "^1.0.0" + +"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "ansi-regex" "^5.0.1" + +"strip-ansi@^7.0.1": + "integrity" "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==" + "resolved" "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "ansi-regex" "^6.0.1" + +"strip-bom-string@^1.0.0": + "integrity" "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" + "resolved" "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz" + "version" "1.0.0" + +"strip-final-newline@^2.0.0": + "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "resolved" "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + "version" "2.0.0" + +"strip-json-comments@^3.1.1": + "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "resolved" "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + "version" "3.1.1" + +"strip-json-comments@~2.0.1": + "integrity" "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + "resolved" "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + "version" "2.0.1" + +"style-to-object@^0.3.0", "style-to-object@0.3.0": + "integrity" "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==" + "resolved" "https://registry.npmmirror.com/style-to-object/-/style-to-object-0.3.0.tgz" + "version" "0.3.0" dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" + "inline-style-parser" "0.1.1" + +"stylehacks@^5.1.1": + "integrity" "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==" + "resolved" "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "browserslist" "^4.21.4" + "postcss-selector-parser" "^6.0.4" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" dependencies: - has-flag "^3.0.0" + "has-flag" "^3.0.0" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== +"supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" dependencies: - has-flag "^4.0.0" + "has-flag" "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== +"supports-color@^8.0.0": + "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + "resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" + "version" "8.1.1" dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + "has-flag" "^4.0.0" + +"supports-preserve-symlinks-flag@^1.0.0": + "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "resolved" "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + "version" "1.0.0" -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.npmmirror.com/svg-parser/-/svg-parser-2.0.4.tgz" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== +"svg-parser@^2.0.4": + "integrity" "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "resolved" "https://registry.npmmirror.com/svg-parser/-/svg-parser-2.0.4.tgz" + "version" "2.0.4" -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== +"svgo@^2.7.0", "svgo@^2.8.0": + "integrity" "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==" + "resolved" "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz" + "version" "2.8.0" dependencies: "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: - version "5.3.7" - resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + "commander" "^7.2.0" + "css-select" "^4.1.3" + "css-tree" "^1.1.3" + "csso" "^4.2.0" + "picocolors" "^1.0.0" + "stable" "^0.1.8" + +"tapable@^1.0.0": + "integrity" "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + "resolved" "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz" + "version" "1.1.3" + +"tapable@^2.0.0", "tapable@^2.1.1", "tapable@^2.2.0": + "integrity" "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "resolved" "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz" + "version" "2.2.1" + +"terser-webpack-plugin@^5.3.3", "terser-webpack-plugin@^5.3.7": + "integrity" "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==" + "resolved" "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" + "version" "5.3.7" dependencies: "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.5" + "jest-worker" "^27.4.5" + "schema-utils" "^3.1.1" + "serialize-javascript" "^6.0.1" + "terser" "^5.16.5" -terser@^5.10.0, terser@^5.16.5: - version "5.16.8" - resolved "https://registry.npmmirror.com/terser/-/terser-5.16.8.tgz" - integrity sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA== +"terser@^5.10.0", "terser@^5.16.5": + "integrity" "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==" + "resolved" "https://registry.npmmirror.com/terser/-/terser-5.16.8.tgz" + "version" "5.16.8" dependencies: "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0: - version "1.0.3" - resolved "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/totalist/-/totalist-1.1.0.tgz" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.npmmirror.com/trim/-/trim-0.0.1.tgz" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/trough/-/trough-1.0.5.tgz" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^2.5.0: - version "2.19.0" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -ua-parser-js@^0.7.30: - version "0.7.35" - resolved "https://registry.npmmirror.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz" - integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.npmmirror.com/unherit/-/unherit-1.1.3.tgz" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmmirror.com/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmmirror.com/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.npmmirror.com/unist-builder/-/unist-builder-2.0.3.tgz" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.npmmirror.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-4.1.0.tgz" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-3.1.0.tgz" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.npmmirror.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.npmmirror.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== - dependencies: - unist-util-is "^4.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + "acorn" "^8.5.0" + "commander" "^2.20.0" + "source-map-support" "~0.5.20" + +"text-table@^0.2.0": + "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "resolved" "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" + +"thunky@^1.0.2": + "integrity" "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "resolved" "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz" + "version" "1.1.0" + +"tiny-invariant@^1.0.2": + "integrity" "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + "resolved" "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz" + "version" "1.3.1" + +"tiny-warning@^1.0.0": + "integrity" "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + "resolved" "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz" + "version" "1.0.3" + +"to-fast-properties@^2.0.0": + "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + "resolved" "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + "version" "2.0.0" + +"to-readable-stream@^1.0.0": + "integrity" "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + "resolved" "https://registry.npmmirror.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz" + "version" "1.0.0" + +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"toidentifier@1.0.1": + "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "resolved" "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz" + "version" "1.0.1" + +"totalist@^1.0.0": + "integrity" "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + "resolved" "https://registry.npmmirror.com/totalist/-/totalist-1.1.0.tgz" + "version" "1.1.0" + +"tr46@~0.0.3": + "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "resolved" "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz" + "version" "0.0.3" + +"trim-trailing-lines@^1.0.0": + "integrity" "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + "resolved" "https://registry.npmmirror.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" + "version" "1.1.4" + +"trim@0.0.1": + "integrity" "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "resolved" "https://registry.npmmirror.com/trim/-/trim-0.0.1.tgz" + "version" "0.0.1" + +"trough@^1.0.0": + "integrity" "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + "resolved" "https://registry.npmmirror.com/trough/-/trough-1.0.5.tgz" + "version" "1.0.5" + +"tslib@^2.0.3", "tslib@^2.1.0", "tslib@^2.3.0", "tslib@^2.4.0": + "integrity" "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "resolved" "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz" + "version" "2.5.0" + +"type-fest@^0.20.2": + "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "resolved" "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz" + "version" "0.20.2" + +"type-fest@^2.5.0": + "integrity" "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + "resolved" "https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz" + "version" "2.19.0" + +"type-is@~1.6.18": + "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" + "resolved" "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz" + "version" "1.6.18" + dependencies: + "media-typer" "0.3.0" + "mime-types" "~2.1.24" + +"typedarray-to-buffer@^3.1.5": + "integrity" "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==" + "resolved" "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + "version" "3.1.5" + dependencies: + "is-typedarray" "^1.0.0" + +"typescript@>= 2.7": + "integrity" "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz" + "version" "5.1.6" + +"ua-parser-js@^0.7.30": + "integrity" "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" + "resolved" "https://registry.npmmirror.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz" + "version" "0.7.35" + +"unherit@^1.0.4": + "integrity" "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==" + "resolved" "https://registry.npmmirror.com/unherit/-/unherit-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "inherits" "^2.0.0" + "xtend" "^4.0.0" + +"unicode-canonical-property-names-ecmascript@^2.0.0": + "integrity" "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + "resolved" "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + "version" "2.0.0" + +"unicode-match-property-ecmascript@^2.0.0": + "integrity" "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==" + "resolved" "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "unicode-canonical-property-names-ecmascript" "^2.0.0" + "unicode-property-aliases-ecmascript" "^2.0.0" + +"unicode-match-property-value-ecmascript@^2.1.0": + "integrity" "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + "resolved" "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + "version" "2.1.0" + +"unicode-property-aliases-ecmascript@^2.0.0": + "integrity" "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + "resolved" "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + "version" "2.1.0" + +"unified@^9.2.2": + "integrity" "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==" + "resolved" "https://registry.npmmirror.com/unified/-/unified-9.2.2.tgz" + "version" "9.2.2" + dependencies: + "bail" "^1.0.0" + "extend" "^3.0.0" + "is-buffer" "^2.0.0" + "is-plain-obj" "^2.0.0" + "trough" "^1.0.0" + "vfile" "^4.0.0" + +"unified@9.2.0": + "integrity" "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==" + "resolved" "https://registry.npmmirror.com/unified/-/unified-9.2.0.tgz" + "version" "9.2.0" + dependencies: + "bail" "^1.0.0" + "extend" "^3.0.0" + "is-buffer" "^2.0.0" + "is-plain-obj" "^2.0.0" + "trough" "^1.0.0" + "vfile" "^4.0.0" + +"unique-string@^2.0.0": + "integrity" "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==" + "resolved" "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "crypto-random-string" "^2.0.0" + +"unist-builder@^2.0.0", "unist-builder@2.0.3": + "integrity" "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + "resolved" "https://registry.npmmirror.com/unist-builder/-/unist-builder-2.0.3.tgz" + "version" "2.0.3" + +"unist-util-generated@^1.0.0": + "integrity" "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + "resolved" "https://registry.npmmirror.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz" + "version" "1.1.6" + +"unist-util-is@^4.0.0": + "integrity" "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "resolved" "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-4.1.0.tgz" + "version" "4.1.0" + +"unist-util-position@^3.0.0": + "integrity" "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + "resolved" "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-3.1.0.tgz" + "version" "3.1.0" + +"unist-util-remove-position@^2.0.0": + "integrity" "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==" + "resolved" "https://registry.npmmirror.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "unist-util-visit" "^2.0.0" + +"unist-util-remove@^2.0.0": + "integrity" "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==" + "resolved" "https://registry.npmmirror.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "unist-util-is" "^4.0.0" + +"unist-util-stringify-position@^2.0.0": + "integrity" "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==" + "resolved" "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" + "version" "2.0.3" dependencies: "@types/unist" "^2.0.2" -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== +"unist-util-visit-parents@^3.0.0": + "integrity" "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==" + "resolved" "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" + "version" "3.1.1" dependencies: "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" + "unist-util-is" "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== +"unist-util-visit@^2.0.0", "unist-util-visit@^2.0.3", "unist-util-visit@2.0.3": + "integrity" "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==" + "resolved" "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz" + "version" "2.0.3" dependencies: "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/update-notifier/-/update-notifier-5.1.0.tgz" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.npmmirror.com/url-loader/-/url-loader-4.1.1.tgz" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.npmmirror.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.npmmirror.com/use-latest/-/use-latest-1.2.1.tgz" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.npmmirror.com/utility-types/-/utility-types-3.10.0.tgz" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.npmmirror.com/value-equal/-/value-equal-1.0.1.tgz" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/vfile-location/-/vfile-location-3.2.0.tgz" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.npmmirror.com/vfile-message/-/vfile-message-2.0.4.tgz" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + "unist-util-is" "^4.0.0" + "unist-util-visit-parents" "^3.0.0" + +"universalify@^2.0.0": + "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "resolved" "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz" + "version" "2.0.0" + +"unpipe@~1.0.0", "unpipe@1.0.0": + "integrity" "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "resolved" "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz" + "version" "1.0.0" + +"update-browserslist-db@^1.0.10": + "integrity" "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==" + "resolved" "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "escalade" "^3.1.1" + "picocolors" "^1.0.0" + +"update-notifier@^5.1.0": + "integrity" "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==" + "resolved" "https://registry.npmmirror.com/update-notifier/-/update-notifier-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "boxen" "^5.0.0" + "chalk" "^4.1.0" + "configstore" "^5.0.1" + "has-yarn" "^2.1.0" + "import-lazy" "^2.1.0" + "is-ci" "^2.0.0" + "is-installed-globally" "^0.4.0" + "is-npm" "^5.0.0" + "is-yarn-global" "^0.3.0" + "latest-version" "^5.1.0" + "pupa" "^2.1.1" + "semver" "^7.3.4" + "semver-diff" "^3.1.1" + "xdg-basedir" "^4.0.0" + +"uri-js@^4.2.2": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" + dependencies: + "punycode" "^2.1.0" + +"url-loader@^4.1.1": + "integrity" "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==" + "resolved" "https://registry.npmmirror.com/url-loader/-/url-loader-4.1.1.tgz" + "version" "4.1.1" + dependencies: + "loader-utils" "^2.0.0" + "mime-types" "^2.1.27" + "schema-utils" "^3.0.0" + +"url-parse-lax@^3.0.0": + "integrity" "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==" + "resolved" "https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "prepend-http" "^2.0.0" + +"use-composed-ref@^1.3.0": + "integrity" "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==" + "resolved" "https://registry.npmmirror.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + "version" "1.3.0" + +"use-isomorphic-layout-effect@^1.1.1": + "integrity" "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" + "resolved" "https://registry.npmmirror.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + "version" "1.1.2" + +"use-latest@^1.2.1": + "integrity" "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==" + "resolved" "https://registry.npmmirror.com/use-latest/-/use-latest-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "use-isomorphic-layout-effect" "^1.1.1" + +"util-deprecate@^1.0.1", "util-deprecate@^1.0.2", "util-deprecate@~1.0.1": + "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"utila@~0.4": + "integrity" "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + "resolved" "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz" + "version" "0.4.0" + +"utility-types@^3.10.0": + "integrity" "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + "resolved" "https://registry.npmmirror.com/utility-types/-/utility-types-3.10.0.tgz" + "version" "3.10.0" + +"utils-merge@1.0.1": + "integrity" "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "resolved" "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz" + "version" "1.0.1" + +"uuid@^8.3.2": + "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "resolved" "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz" + "version" "8.3.2" + +"value-equal@^1.0.1": + "integrity" "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "resolved" "https://registry.npmmirror.com/value-equal/-/value-equal-1.0.1.tgz" + "version" "1.0.1" + +"vary@~1.1.2": + "integrity" "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "resolved" "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz" + "version" "1.1.2" + +"vfile-location@^3.0.0", "vfile-location@^3.2.0": + "integrity" "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + "resolved" "https://registry.npmmirror.com/vfile-location/-/vfile-location-3.2.0.tgz" + "version" "3.2.0" + +"vfile-message@^2.0.0": + "integrity" "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==" + "resolved" "https://registry.npmmirror.com/vfile-message/-/vfile-message-2.0.4.tgz" + "version" "2.0.4" dependencies: "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" + "unist-util-stringify-position" "^2.0.0" -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.npmmirror.com/vfile/-/vfile-4.2.1.tgz" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== +"vfile@^4.0.0": + "integrity" "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==" + "resolved" "https://registry.npmmirror.com/vfile/-/vfile-4.2.1.tgz" + "version" "4.2.1" dependencies: "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.npmmirror.com/wait-on/-/wait-on-6.0.1.tgz" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== - dependencies: - axios "^0.25.0" - joi "^17.6.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-1.1.4.tgz" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-bundle-analyzer@^4.5.0: - version "4.8.0" - resolved "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz" - integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== + "is-buffer" "^2.0.0" + "unist-util-stringify-position" "^2.0.0" + "vfile-message" "^2.0.0" + +"wait-on@^6.0.1": + "integrity" "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==" + "resolved" "https://registry.npmmirror.com/wait-on/-/wait-on-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "axios" "^0.25.0" + "joi" "^17.6.0" + "lodash" "^4.17.21" + "minimist" "^1.2.5" + "rxjs" "^7.5.4" + +"watchpack@^2.4.0": + "integrity" "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==" + "resolved" "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz" + "version" "2.4.0" + dependencies: + "glob-to-regexp" "^0.4.1" + "graceful-fs" "^4.1.2" + +"wbuf@^1.1.0", "wbuf@^1.7.3": + "integrity" "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==" + "resolved" "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz" + "version" "1.7.3" + dependencies: + "minimalistic-assert" "^1.0.0" + +"web-namespaces@^1.0.0": + "integrity" "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + "resolved" "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-1.1.4.tgz" + "version" "1.1.4" + +"webidl-conversions@^3.0.0": + "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "resolved" "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + "version" "3.0.1" + +"webpack-bundle-analyzer@^4.5.0": + "integrity" "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==" + "resolved" "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz" + "version" "4.8.0" dependencies: "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.9.3: - version "4.13.2" - resolved "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" - integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== + "acorn" "^8.0.4" + "acorn-walk" "^8.0.0" + "chalk" "^4.1.0" + "commander" "^7.2.0" + "gzip-size" "^6.0.0" + "lodash" "^4.17.20" + "opener" "^1.5.2" + "sirv" "^1.0.7" + "ws" "^7.3.1" + +"webpack-dev-middleware@^5.3.1": + "integrity" "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==" + "resolved" "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + "version" "5.3.3" + dependencies: + "colorette" "^2.0.10" + "memfs" "^3.4.3" + "mime-types" "^2.1.31" + "range-parser" "^1.2.1" + "schema-utils" "^4.0.0" + +"webpack-dev-server@^4.9.3": + "integrity" "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==" + "resolved" "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz" + "version" "4.13.2" dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -7393,214 +7644,214 @@ webpack-dev-server@^4.9.3: "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@^5.8.0: - version "5.8.0" - resolved "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.8.0.tgz" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.2, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.73.0: - version "5.77.0" - resolved "https://registry.npmmirror.com/webpack/-/webpack-5.77.0.tgz" - integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== + "ansi-html-community" "^0.0.8" + "bonjour-service" "^1.0.11" + "chokidar" "^3.5.3" + "colorette" "^2.0.10" + "compression" "^1.7.4" + "connect-history-api-fallback" "^2.0.0" + "default-gateway" "^6.0.3" + "express" "^4.17.3" + "graceful-fs" "^4.2.6" + "html-entities" "^2.3.2" + "http-proxy-middleware" "^2.0.3" + "ipaddr.js" "^2.0.1" + "launch-editor" "^2.6.0" + "open" "^8.0.9" + "p-retry" "^4.5.0" + "rimraf" "^3.0.2" + "schema-utils" "^4.0.0" + "selfsigned" "^2.1.1" + "serve-index" "^1.9.1" + "sockjs" "^0.3.24" + "spdy" "^4.0.2" + "webpack-dev-middleware" "^5.3.1" + "ws" "^8.13.0" + +"webpack-merge@^5.8.0": + "integrity" "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==" + "resolved" "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.8.0.tgz" + "version" "5.8.0" + dependencies: + "clone-deep" "^4.0.1" + "wildcard" "^2.0.0" + +"webpack-sources@^3.2.2", "webpack-sources@^3.2.3": + "integrity" "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + "resolved" "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz" + "version" "3.2.3" + +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.36.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^5.0.0", "webpack@^5.1.0", "webpack@^5.20.0", "webpack@^5.73.0", "webpack@>= 4", "webpack@>=2", "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5": + "integrity" "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==" + "resolved" "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz" + "version" "5.88.2" dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.npmmirror.com/webpackbar/-/webpackbar-5.0.2.tgz" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== - dependencies: - chalk "^4.1.0" - consola "^2.15.3" - pretty-time "^1.1.0" - std-env "^3.0.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/widest-line/-/widest-line-3.1.0.tgz" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.npmmirror.com/widest-line/-/widest-line-4.0.1.tgz" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.0.tgz" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.13.0: - version "8.13.0" - resolved "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.npmmirror.com/xml-js/-/xml-js-1.6.11.tgz" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.npmmirror.com/zwitch/-/zwitch-1.0.5.tgz" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + "acorn" "^8.7.1" + "acorn-import-assertions" "^1.9.0" + "browserslist" "^4.14.5" + "chrome-trace-event" "^1.0.2" + "enhanced-resolve" "^5.15.0" + "es-module-lexer" "^1.2.1" + "eslint-scope" "5.1.1" + "events" "^3.2.0" + "glob-to-regexp" "^0.4.1" + "graceful-fs" "^4.2.9" + "json-parse-even-better-errors" "^2.3.1" + "loader-runner" "^4.2.0" + "mime-types" "^2.1.27" + "neo-async" "^2.6.2" + "schema-utils" "^3.2.0" + "tapable" "^2.1.1" + "terser-webpack-plugin" "^5.3.7" + "watchpack" "^2.4.0" + "webpack-sources" "^3.2.3" + +"webpackbar@^5.0.2": + "integrity" "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==" + "resolved" "https://registry.npmmirror.com/webpackbar/-/webpackbar-5.0.2.tgz" + "version" "5.0.2" + dependencies: + "chalk" "^4.1.0" + "consola" "^2.15.3" + "pretty-time" "^1.1.0" + "std-env" "^3.0.1" + +"websocket-driver@^0.7.4", "websocket-driver@>=0.5.1": + "integrity" "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==" + "resolved" "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz" + "version" "0.7.4" + dependencies: + "http-parser-js" ">=0.5.1" + "safe-buffer" ">=5.1.0" + "websocket-extensions" ">=0.1.1" + +"websocket-extensions@>=0.1.1": + "integrity" "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + "resolved" "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + "version" "0.1.4" + +"whatwg-url@^5.0.0": + "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" + "resolved" "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "tr46" "~0.0.3" + "webidl-conversions" "^3.0.0" + +"which@^1.3.1": + "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" + "resolved" "https://registry.npmmirror.com/which/-/which-1.3.1.tgz" + "version" "1.3.1" + dependencies: + "isexe" "^2.0.0" + +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmmirror.com/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"widest-line@^3.1.0": + "integrity" "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==" + "resolved" "https://registry.npmmirror.com/widest-line/-/widest-line-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "string-width" "^4.0.0" + +"widest-line@^4.0.1": + "integrity" "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==" + "resolved" "https://registry.npmmirror.com/widest-line/-/widest-line-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "string-width" "^5.0.1" + +"wildcard@^2.0.0": + "integrity" "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + "resolved" "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.0.tgz" + "version" "2.0.0" + +"wrap-ansi@^7.0.0": + "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + "resolved" "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.0" + +"wrap-ansi@^8.0.1": + "integrity" "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==" + "resolved" "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + "version" "8.1.0" + dependencies: + "ansi-styles" "^6.1.0" + "string-width" "^5.0.1" + "strip-ansi" "^7.0.1" + +"wrappy@1": + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"write-file-atomic@^3.0.0": + "integrity" "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==" + "resolved" "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + "version" "3.0.3" + dependencies: + "imurmurhash" "^0.1.4" + "is-typedarray" "^1.0.0" + "signal-exit" "^3.0.2" + "typedarray-to-buffer" "^3.1.5" + +"ws@^7.3.1": + "integrity" "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" + "resolved" "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz" + "version" "7.5.9" + +"ws@^8.13.0": + "integrity" "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==" + "resolved" "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz" + "version" "8.13.0" + +"xdg-basedir@^4.0.0": + "integrity" "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + "resolved" "https://registry.npmmirror.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz" + "version" "4.0.0" + +"xml-js@^1.6.11": + "integrity" "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==" + "resolved" "https://registry.npmmirror.com/xml-js/-/xml-js-1.6.11.tgz" + "version" "1.6.11" + dependencies: + "sax" "^1.2.4" + +"xtend@^4.0.0", "xtend@^4.0.1": + "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "resolved" "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz" + "version" "4.0.2" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"yaml@^1.10.0", "yaml@^1.10.2", "yaml@^1.7.2": + "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "resolved" "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz" + "version" "1.10.2" + +"yocto-queue@^0.1.0": + "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "resolved" "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz" + "version" "0.1.0" + +"zwitch@^1.0.0": + "integrity" "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + "resolved" "https://registry.npmmirror.com/zwitch/-/zwitch-1.0.5.tgz" + "version" "1.0.5"