blob: d0dfca0496af46cc81a96b47a0251879f96c46de [file] [log] [blame]
<!doctype html>
<html class="docs-version-1.1.2" lang="en" dir="ltr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Docusaurus v2.0.0-beta.14">
<link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Apache Linkis Blog RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Linkis Blog Atom Feed">
<link rel="search" type="application/opensearchdescription+xml" title="Apache Linkis" href="/opensearch.xml"><title data-react-helmet="true">DataSource | Apache Linkis</title><meta data-react-helmet="true" name="twitter:card" content="summary_large_image"><meta data-react-helmet="true" property="og:url" content="https://linkis.incubator.apache.org/docs/latest/deployment/start_metadatasource"><meta data-react-helmet="true" name="docsearch:language" content="en"><meta data-react-helmet="true" name="docsearch:version" content="1.1.2"><meta data-react-helmet="true" name="docsearch:docusaurus_tag" content="docs-default-1.1.2"><meta data-react-helmet="true" property="og:title" content="DataSource | Apache Linkis"><meta data-react-helmet="true" name="description" content="Introduce how to use the new feature function data source of version 1.1.0"><meta data-react-helmet="true" property="og:description" content="Introduce how to use the new feature function data source of version 1.1.0"><link data-react-helmet="true" rel="shortcut icon" href="/img/favicon.ico"><link data-react-helmet="true" rel="canonical" href="https://linkis.incubator.apache.org/docs/latest/deployment/start_metadatasource"><link data-react-helmet="true" rel="alternate" href="https://linkis.incubator.apache.org/docs/latest/deployment/start_metadatasource" hreflang="en"><link data-react-helmet="true" rel="alternate" href="https://linkis.incubator.apache.org/zh-CN/docs/latest/deployment/start_metadatasource" hreflang="zh-CN"><link data-react-helmet="true" rel="alternate" href="https://linkis.incubator.apache.org/docs/latest/deployment/start_metadatasource" hreflang="x-default"><link data-react-helmet="true" rel="preconnect" href="https://AE29KQB3IA-dsn.algolia.net" crossorigin="anonymous"><link rel="stylesheet" href="/assets/css/styles.92d87943.css">
<link rel="preload" href="/assets/js/runtime~main.a4c60f50.js" as="script">
<link rel="preload" href="/assets/js/main.42471b13.js" as="script">
</head>
<body>
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div><a href="#" class="skipToContent_OuoZ">Skip to main content</a></div><nav class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Navigation bar toggle" class="navbar__toggle clean-btn" type="button" tabindex="0"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><img src="/img/logo.png" alt="Apache Linkis Logo" class="themedImage_TMUO themedImage--light_4Vu1 navbar__logo"><img src="/img/logo.png" alt="Apache Linkis Logo" class="themedImage_TMUO themedImage--dark_uzRr navbar__logo"><b class="navbar__title">Apache Linkis(Incubating)</b></a><a class="navbar__item navbar__link" href="/">Home</a><a class="navbar__item navbar__link" href="/faq/main">FAQ</a><a class="navbar__item navbar__link" href="/download/main">Download</a><a class="navbar__item navbar__link" href="/community/how-to-subscribe">Community</a><a class="navbar__item navbar__link" href="/blog">Blog</a><a class="navbar__item navbar__link" href="/team">Team</a><a class="navbar__item navbar__link" href="/user">Users</a><div class="navbar__item dropdown dropdown--hoverable"><a class="navbar__link">ASF</a><ul class="dropdown__menu"><li><a href="https://www.apache.org/" target="_blank" rel="noopener noreferrer" class="dropdown__link">Foundation</a></li><li><a href="https://www.apache.org/licenses/" target="_blank" rel="noopener noreferrer" class="dropdown__link">License</a></li><li><a href="https://www.apache.org/events/current-event" target="_blank" rel="noopener noreferrer" class="dropdown__link">Events</a></li><li><a href="https://www.apache.org/security/" target="_blank" rel="noopener noreferrer" class="dropdown__link">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Sponsorship</a></li><li><a href="https://www.apache.org/foundation/policies/privacy.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Privacy</a></li><li><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Thanks</a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class="navbar__link">Doc</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/1.1.3/introduction">Next(1.1.3)</a></li><li><a class="dropdown__link" href="/docs/latest/introduction">1.1.2</a></li><li><a class="dropdown__link" href="/docs/1.1.1/introduction">1.1.1</a></li><li><a class="dropdown__link" href="/docs/1.1.0/introduction">1.1.0</a></li><li><a class="dropdown__link" href="/docs/1.0.3/introduction">1.0.3</a></li><li><a class="dropdown__link" href="/docs/1.0.2/introduction">1.0.2</a></li><li><a class="dropdown__link" href="/docs/0.11.0/introduction">0.11.0</a></li><li><a class="dropdown__link" href="/versions">All Version</a></li></ul></div><a href="https://github.com/apache/incubator-linkis" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub"></a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" class="navbar__link"><span><svg t="1631348384596" class="iconLanguage_EbrZ" viewBox="0 0 1024 1024" version="1.1" p-id="557" width="20" height="20"><path d="M547.797333 638.208l-104.405333-103.168 1.237333-1.28a720.170667 720.170667 0 0 0 152.490667-268.373333h120.448V183.082667h-287.744V100.906667H347.605333v82.218666H59.818667V265.386667h459.178666a648.234667 648.234667 0 0 1-130.304 219.946666 643.242667 643.242667 0 0 1-94.976-137.728H211.541333a722.048 722.048 0 0 0 122.453334 187.434667l-209.194667 206.378667 58.368 58.368 205.525333-205.525334 127.872 127.829334 31.232-83.84m231.424-208.426667h-82.218666l-184.96 493.312h82.218666l46.037334-123.306667h195.242666l46.464 123.306667h82.218667l-185.002667-493.312m-107.690666 287.744l66.56-178.005333 66.602666 178.005333z" fill="currentColor" p-id="558"></path></svg><span>English</span></span></a><ul class="dropdown__menu"><li><a href="/docs/latest/deployment/start_metadatasource" target="_self" rel="noopener noreferrer" class="dropdown__link dropdown__link--active" style="text-transform:capitalize">English</a></li><li><a href="/zh-CN/docs/latest/deployment/start_metadatasource" target="_self" rel="noopener noreferrer" class="dropdown__link" style="text-transform:capitalize">简体中文</a></li></ul></div><div class="searchBox_Bc3W"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div class="main-wrapper docs-wrapper docs-doc-page"><div class="docPage_lDyR"><button class="clean-btn backToTopButton_i9tI" type="button"><svg viewBox="0 0 24 24" width="28"><path d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z" fill="currentColor"></path></svg></button><aside class="docSidebarContainer_0YBq"><div class="sidebar_a3j0"><nav class="menu thin-scrollbar menu_cyFh menuWithAnnouncementBar_+O1J"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" href="/docs/latest/introduction">Introduction</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" href="/docs/latest/release">Version Overview</a></li><li class="theme-doc-sidebar-item-category menu__list-item"><a class="menu__link menu__link--sublist menu__link--active" href="#">Deployment</a><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/quick_deploy">Quick Deployment</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/cluster_deployment">Cluster Deployment</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/engine_conn_plugin_installation">EngineConnPlugin Installation</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/installation_hierarchical_structure">Installation Directory Structure</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/unpack_hierarchical_structure">installation package directory structure</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/sourcecode_hierarchical_structure">Source Code Directory Structure</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/web_install">Linkis Console Deployment</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/involve_skywalking_into_linkis">Involve SkyWaling into Linkis</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/latest/deployment/start_metadatasource">DataSource</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/deploy_linkis_without_hdfs">Deploy Linkis without HDFS</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" tabindex="0" href="/docs/latest/deployment/linkis_scriptis_install">Installation and deployment of tool scriptis</a></li></ul></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">User Guide</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Engine Usage</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">API Docs</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Table Structure</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Architecture</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Development Doc</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Upgrade Guide</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Tuning And Troubleshooting</a></li></ul></nav></div></aside><main class="docMainContainer_r8cw"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_zHA2"><div class="docItemContainer_oiyr"><article><span class="theme-doc-version-badge badge badge--secondary">Version: <!-- -->1.1.2</span><div class="tocCollapsible_aw-L theme-doc-toc-mobile tocMobile_Tx6Y"><button type="button" class="clean-btn tocCollapsibleButton_zr6a">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>DataSource</h1></header><blockquote><p>Introduce how to use the new feature function data source of version 1.1.0</p></blockquote><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithStickyNavbar_y2LR" id="1-data-source-function-introduction"></a>1. Data source function introduction<a class="hash-link" href="#1-data-source-function-introduction" title="Direct link to heading">#</a></h2><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="11-concept"></a>1.1 Concept<a class="hash-link" href="#11-concept" title="Direct link to heading">#</a></h3><ul><li>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<em>ps_dm_datasource</em>* table related to the linkis database</li><li>Metadata: single 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.</li></ul><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="12-three-main-modules"></a>1.2 Three main modules<a class="hash-link" href="#12-three-main-modules" title="Direct link to heading">#</a></h3><p><strong>linkis-datasource-client</strong>
Client module, DataSourceRemoteClient for basic management of user data sources, and MetaDataRemoteClient for metadata query operations.</p><p><strong>linkis-datasource-manager-server</strong>
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.</p><ul><li><a href="/docs/latest/api/http/linkis-ps-publicservice-api/data-source-manager-api">http interface documentation</a></li><li>http interface class org.apache.linkis.metadatamanager.server.restful</li><li>rpc interface class org.apache.linkis.metadatamanager.server.receiver</li></ul><p><strong>linkis-metedata-manager-server</strong>
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.</p><ul><li><a href="/docs/latest/api/http/linkis-ps-publicservice-api/metadatamanager-api">http interface documentation</a></li><li>http interface class org.apache.linkis.datasourcemanager.core.restful</li><li>rpc interface class org.apache.linkis.datasourcemanager.core.receivers</li></ul><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="13-processing-logic"></a>1.3 Processing logic<a class="hash-link" href="#13-processing-logic" title="Direct link to heading">#</a></h3><h4><a aria-hidden="true" tabindex="-1" class="anchor anchor__h4 anchorWithStickyNavbar_y2LR" id="131-linkisdatasourceremoteclient"></a>1.3.1 LinkisDataSourceRemoteClient<a class="hash-link" href="#131-linkisdatasourceremoteclient" title="Direct link to heading">#</a></h4><p>The functional structure diagram is as follows:
<img alt="datasource" src="/assets/images/datasource-33466f8154b90ce8c308f80af54fed9d.png"></p><ul><li>The LinkisDataSourceRemoteClient client assembles the http request according to the request parameters,</li><li>HTTP request sent to linkis-ps-data-source-manager</li><li>linkis-ps-data-source-manager will perform basic parameter verification, some interfaces can only be operated by the administrator role</li><li>linkis-ps-data-source-manager performs basic data operations with the database</li><li>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</li><li>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</li></ul><p>LinkisDataSourceRemoteClient interface</p><ul><li>GetAllDataSourceTypesResult getAllDataSourceTypes(GetAllDataSourceTypesAction) Query all data source types</li><li>QueryDataSourceEnvResult queryDataSourceEnv(QueryDataSourceEnvAction) Query the cluster configuration information that can be used by the data source</li><li>GetInfoByDataSourceIdResult getInfoByDataSourceId(GetInfoByDataSourceIdAction): query data source information by data source id</li><li>QueryDataSourceResult queryDataSource(QueryDataSourceAction) query data source information</li><li>GetConnectParamsByDataSourceIdResult getConnectParams(GetConnectParamsByDataSourceIdAction) Get connection configuration parameters</li><li>CreateDataSourceResult createDataSource(CreateDataSourceAction) to create a data source</li><li>DataSourceTestConnectResult getDataSourceTestConnect(DataSourceTestConnectAction) to test whether the data source can be connected normally</li><li>DeleteDataSourceResult deleteDataSource(DeleteDataSourceAction) deletes the data source</li><li>ExpireDataSourceResult expireDataSource(ExpireDataSourceAction) sets the data source to expired state</li><li>GetDataSourceVersionsResult getDataSourceVersions(GetDataSourceVersionsAction) Query the version list of the data source configuration</li><li>PublishDataSourceVersionResult publishDataSourceVersion(PublishDataSourceVersionAction) publishes the data source configuration version</li><li>UpdateDataSourceResult updateDataSource(UpdateDataSourceAction) to update the data source</li><li>UpdateDataSourceParameterResult updateDataSourceParameter(UpdateDataSourceParameterAction) Update data source configuration parameters</li><li>GetKeyTypeDatasourceResult getKeyDefinitionsByType(GetKeyTypeDatasourceAction) Query the configuration properties required by a data source type</li></ul><h4><a aria-hidden="true" tabindex="-1" class="anchor anchor__h4 anchorWithStickyNavbar_y2LR" id="132-linkismetadataremoteclient"></a>1.3.2 LinkisMetaDataRemoteClient<a class="hash-link" href="#132-linkismetadataremoteclient" title="Direct link to heading">#</a></h4><p>The functional structure diagram is as follows:
<img alt="metadata" src="/assets/images/metadata-00c6c1e49a4eafa8a2496b9a08917758.png"></p><ul><li>LinkisMetaDataRemoteClient client, according to the request parameters, assemble the http request,</li><li>HTTP request sent to ps-metadatamanager</li><li>ps-metadatamanager will perform basic parameter verification,</li><li>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.</li><li>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</li><li>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</li></ul><p>LinkisMetaDataRemoteClient interface</p><ul><li>MetadataGetDatabasesResult getDatabases(MetadataGetDatabasesAction) query database list</li><li>MetadataGetTablesResult getTables(MetadataGetTablesAction) query table data</li><li>MetadataGetTablePropsResult getTableProps(MetadataGetTablePropsAction)</li><li>MetadataGetPartitionsResult getPartitions(MetadataGetPartitionsAction) query partition table</li><li>MetadataGetColumnsResult getColumns(MetadataGetColumnsAction) query data table fields</li></ul><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="13-source-module-directory-structure"></a>1.3 Source module directory structure<a class="hash-link" href="#13-source-module-directory-structure" title="Direct link to heading">#</a></h3><div class="codeBlockContainer_J+bg"><div class="codeBlockContent_csEI shell"><pre tabindex="0" class="prism-code language-shell codeBlock_rtdJ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_1zSZ"><span class="token-line" style="color:#F8F8F2"><span class="token plain">linkis-public-enhancements/linkis-datasource</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── linkis-datasource-client //client code</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── linkis-datasource-manager //Datasource management module</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── common //Data </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">source</span><span class="token plain"> management common module</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── server //Data </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">source</span><span class="token plain"> management </span><span class="token function" style="color:rgb(80, 250, 123)">service</span><span class="token plain"> module</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── linkis-metadata //Module existing </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> the old version, reserved</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── linkis-metadata-manager //Data Metadata Management Module</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── common //Data element management common module</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── server //Data element management </span><span class="token function" style="color:rgb(80, 250, 123)">service</span><span class="token plain"> module</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── </span><span class="token function" style="color:rgb(80, 250, 123)">service</span><span class="token plain"> //Supported data sources</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── elasticsearch</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── hive</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── kafka</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── mysql</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_M3SB clean-btn">Copy</button></div></div><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="14-installation-package-directory-structure"></a>1.4 Installation package directory structure<a class="hash-link" href="#14-installation-package-directory-structure" title="Direct link to heading">#</a></h3><div class="codeBlockContainer_J+bg"><div class="codeBlockContent_csEI shell"><pre tabindex="0" class="prism-code language-shell codeBlock_rtdJ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_1zSZ"><span class="token-line" style="color:#F8F8F2"><span class="token plain">/lib/linkis-public-enhancements/</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── linkis-ps-data-source-manager</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── linkis-ps-metadatamanager</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── </span><span class="token function" style="color:rgb(80, 250, 123)">service</span><span class="token plain"></span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── elasticsearch</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── hive</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ├── kafka</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └── mysql</span></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_M3SB clean-btn">Copy</button></div></div><p><code>wds.linkis.server.mdm.service.lib.dir</code> controls the classpath loaded during reflection calls. The default value of the parameter is <code>/lib/linkis-public-enhancements/linkis-ps-metadatamanager/service</code></p><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="15-configuration-parameters"></a>1.5 Configuration Parameters<a class="hash-link" href="#15-configuration-parameters" title="Direct link to heading">#</a></h3><p>See <a href="/docs/1.1.0/tuning_and_troubleshooting/configuration#6-datasource-and-metadata-service-configuration-parameters">Tuning and Troubleshooting&gt;Parameter List#datasourceConfiguration Parameters</a></p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithStickyNavbar_y2LR" id="2-enable-data-source-function"></a>2. Enable data source function<a class="hash-link" href="#2-enable-data-source-function" title="Direct link to heading">#</a></h2><p>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 <code>export ENABLE_METADATA_MANAGER=true</code> in <code>$LINKIS_CONF_DIR/linkis-env.sh</code> 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.</p><p>Check whether the service starts normally through the eureka page</p><p><img alt="datasource eureka" src="/assets/images/eureka-6c655a155cf632afe0003ad92f7cddd7.png"></p><div class="admonition admonition-caution alert alert--warning"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>note</h5></div><div class="admonition-content"><ul><li><ol><li>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.</li></ol></li><li><ol start="2"><li>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.</li></ol></li></ul></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithStickyNavbar_y2LR" id="3-use-of-data-sources"></a>3. Use of data sources<a class="hash-link" href="#3-use-of-data-sources" title="Direct link to heading">#</a></h2><p>The use of data sources is divided into three steps:</p><ul><li>step 1. Create data source/configure connection parameters</li><li>step 2. Publish the data source and select the connection configuration version to use</li><li>step 3. Data source usage, query metadata information
, hive/kafka/elasticsearch configuration is associated with the corresponding cluster environment configuration.</li></ul><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="31-mysql-data-source"></a>3.1 Mysql data source<a class="hash-link" href="#31-mysql-data-source" title="Direct link to heading">#</a></h3><h4><a aria-hidden="true" tabindex="-1" class="anchor anchor__h4 anchorWithStickyNavbar_y2LR" id="311-created-through-the-management-console"></a>3.1.1 Created through the management console<a class="hash-link" href="#311-created-through-the-management-console" title="Direct link to heading">#</a></h4><blockquote><p>You can only create configuration data sources, and test whether the data sources can be connected normally, and cannot directly query metadata</p></blockquote><p>Data Source Management &gt; New Data Source &gt; Select MySQL Type</p><p>Enter relevant configuration information</p><p><img alt="create mysql" src="/assets/images/create_mysql-748ae7a51622be09651e31630bf6403e.png"></p><p>After the entry is successful, you can pass the connection test to verify whether the connection can be made normally</p><div class="admonition admonition-caution alert alert--warning"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>note</h5></div><div class="admonition-content"><ul><li>The system to which the data source created through the management console belongs is Linkis</li><li>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</li></ul></div></div><p>Publishing of the configuration (using that configuration for the connection to the data source):</p><p>Click on the version and then pop up the page to select the appropriate configuration to publish</p><p><img alt="publish" src="/assets/images/publish_version-74eb63ec4aedd2b4a28ff93fbb5e567d.png"></p><h4><a aria-hidden="true" tabindex="-1" class="anchor anchor__h4 anchorWithStickyNavbar_y2LR" id="312-using-the-client"></a>3.1.2 Using the client<a class="hash-link" href="#312-using-the-client" title="Direct link to heading">#</a></h4><p>scala code example:</p><div class="codeBlockContainer_J+bg"><div class="codeBlockContent_csEI scala"><pre tabindex="0" class="prism-code language-scala codeBlock_rtdJ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_1zSZ"><span class="token-line" style="color:#F8F8F2"><span class="token plain">package org.apache.linkis.datasource.client</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import java.util</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import java.util.concurrent.TimeUnit</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.common.utils.JsonUtils</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient}</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasource.client.request._</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasource.client.response._</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasourcemanager.common.domain.DataSource</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.junit.jupiter.api.{Disabled, Test}</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">object TestMysqlClient {</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val gatewayUrl = &quot;http://127.0.0.1:9001&quot;</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val clientConfig = DWSClientConfigBuilder.newBuilder</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addServerUrl(gatewayUrl)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .connectionTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryFrequency(1, TimeUnit.MINUTES)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .loadbalancerEnabled(true)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .maxConnectionSize(1)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .retryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .readTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthenticationStrategy(new StaticAuthenticationStrategy)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenKey(&quot;hadoop&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenValue(&quot;xxxxx&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDWSVersion(&quot;v1&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val dataSourceclient = new LinkisDataSourceRemoteClient(clientConfig.build())</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val clientConfig2 = DWSClientConfigBuilder.newBuilder</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addServerUrl(gatewayUrl)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .connectionTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryFrequency(1, TimeUnit.MINUTES)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .loadbalancerEnabled(true)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .maxConnectionSize(1)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .retryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .readTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthenticationStrategy(new StaticAuthenticationStrategy)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenKey(&quot;hadoop&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenValue(&quot;xxxxx&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDWSVersion(&quot;v1&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig2.build())</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> @Test</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> @Disabled</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> def testCreateDataSourceMysql: Unit = {</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val user = &quot;hadoop&quot;</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val system = &quot;Linkis&quot;</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> //create data source</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val dataSource = new DataSource();</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setDataSourceName(&quot;for-mysql-test&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setDataSourceDesc(&quot;this is for mysql test&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setCreateSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setDataSourceTypeId(1L)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val map = JsonUtils.jackson.readValue(JsonUtils.jackson.writeValueAsString(dataSource), new util.HashMap[String, Any]().getClass)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val createDataSourceAction: CreateDataSourceAction = CreateDataSourceAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addRequestPayloads(map)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val createDataSourceResult: CreateDataSourceResult = dataSourceclient.createDataSource(createDataSourceAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val dataSourceId = createDataSourceResult.getInsertId</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> // set connection parameters</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val params = new util.HashMap[String, Any]</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val connectParams = new util.HashMap[String, Any]</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> connectParams.put(&quot;host&quot;, &quot;127.0.0.1&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> connectParams.put(&quot;port&quot;, &quot;36000&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> connectParams.put(&quot;username&quot;, &quot;db username&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> connectParams.put(&quot;password&quot;, &quot;db password&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> params.put(&quot;connectParams&quot;, connectParams)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> params.put(&quot;comment&quot;, &quot;init&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val updateParameterAction: UpdateDataSourceParameterAction = UpdateDataSourceParameterAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addRequestPayloads(params)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val updateParameterResult: UpdateDataSourceParameterResult = dataSourceclient.updateDataSourceParameter(updateParameterAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val version: Long = updateParameterResult.getVersion</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> //publish configuration version</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSourceclient.publishDataSourceVersion(</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> PublishDataSourceVersionAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setVersion(version)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build())</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> // use example</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetDatabasesAction: MetadataGetDatabasesAction = MetadataGetDatabasesAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetDatabasesResult: MetadataGetDatabasesResult = metaDataClient.getDatabases(metadataGetDatabasesAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetTablesAction: MetadataGetTablesAction = MetadataGetTablesAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDatabase(&quot;linkis&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetTablesResult: MetadataGetTablesResult = metaDataClient.getTables(metadataGetTablesAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetColumnsAction = MetadataGetColumnsAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDatabase(&quot;linkis&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setTable(&quot;linkis_datasource&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetColumnsResult: MetadataGetColumnsResult = metaDataClient.getColumns(metadataGetColumnsAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> }</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_M3SB clean-btn">Copy</button></div></div><h3><a aria-hidden="true" tabindex="-1" class="anchor anchor__h3 anchorWithStickyNavbar_y2LR" id="32-hive-data-source"></a>3.2 Hive data source<a class="hash-link" href="#32-hive-data-source" title="Direct link to heading">#</a></h3><h4><a aria-hidden="true" tabindex="-1" class="anchor anchor__h4 anchorWithStickyNavbar_y2LR" id="321-created-through-the-management-console"></a>3.2.1 Created through the management console<a class="hash-link" href="#321-created-through-the-management-console" title="Direct link to heading">#</a></h4><blockquote><p>You can only create configuration data sources, and test whether the data sources can be connected normally, and cannot directly query metadata</p></blockquote><p>First need to configure the cluster environment information
Table <code>linkis_ps_dm_datasource_env</code></p><div class="codeBlockContainer_J+bg"><div class="codeBlockContent_csEI roomsql"><pre tabindex="0" class="prism-code language-roomsql codeBlock_rtdJ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_1zSZ"><span class="token-line" style="color:#F8F8F2"><span class="token plain">INSERT INTO `linkis_ps_dm_datasource_env`</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">(`env_name`, `env_desc`, `datasource_type_id`, `parameter`, `create_user`, `modify_user`)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">VALUES</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">(&#x27;testEnv&#x27;, &#x27;TestEnv&#x27;, 4, &#x27;{\r\n &quot;keytab&quot;: &quot;4dd408ad-a2f9-4501-83b3-139290977ca2&quot;,\r\n &quot;uris&quot;: &quot;thrift://clustername:9083 &quot;,\r\n &quot;principle&quot;:&quot;hadoop@WEBANK.COM&quot;\r\n}&#x27;, &#x27;user&#x27;,&#x27;user&#x27;);</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_M3SB clean-btn">Copy</button></div></div><p>The primary key id, used as the envId, needs to pass the envId parameter to obtain information about the cluster configuration when establishing a connection.
Explanation of configuration fields:</p><div class="codeBlockContainer_J+bg"><div class="codeBlockContent_csEI"><pre tabindex="0" class="prism-code language-undefined codeBlock_rtdJ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_1zSZ"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> &quot;keytab&quot;: &quot;bml resource id&quot;, //keytab stores the resourceId in the material library, which currently needs to be manually uploaded through the http interface.</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> &quot;uris&quot;: &quot;thrift://clustername:9083&quot;,</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> &quot;principle&quot;:&quot;hadoop@WEBANK.COM&quot; //Authenticated principle</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_M3SB clean-btn">Copy</button></div></div><p>Create on the web side:</p><p><img alt="create_hive" src="/assets/images/create_hive-6b7da346506ec10f1ebd68ed37ff4e12.png"></p><h4><a aria-hidden="true" tabindex="-1" class="anchor anchor__h4 anchorWithStickyNavbar_y2LR" id="322-using-the-client"></a>3.2.2 Using the client<a class="hash-link" href="#322-using-the-client" title="Direct link to heading">#</a></h4><div class="codeBlockContainer_J+bg"><div class="codeBlockContent_csEI scala"><pre tabindex="0" class="prism-code language-scala codeBlock_rtdJ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_1zSZ"><span class="token-line" style="color:#F8F8F2"><span class="token plain">package org.apache.linkis.datasource.client</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import java.util</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import java.util.concurrent.TimeUnit</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.common.utils.JsonUtils</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasource.client.impl.{LinkisDataSourceRemoteClient, LinkisMetaDataRemoteClient}</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasource.client.request._</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasource.client.response._</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.datasourcemanager.common.domain.DataSource</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.httpclient.dws.authentication.StaticAuthenticationStrategy</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.apache.linkis.httpclient.dws.config.DWSClientConfigBuilder</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.junit.jupiter.api.{Disabled, Test}</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">object TestHiveClient {</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val gatewayUrl = &quot;http://127.0.0.1:9001&quot;</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val clientConfig = DWSClientConfigBuilder.newBuilder</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addServerUrl(gatewayUrl)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .connectionTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryFrequency(1, TimeUnit.MINUTES)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .loadbalancerEnabled(true)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .maxConnectionSize(1)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .retryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .readTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthenticationStrategy(new StaticAuthenticationStrategy)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenKey(&quot;hadoop&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenValue(&quot;xxxxx&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDWSVersion(&quot;v1&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val dataSourceclient = new LinkisDataSourceRemoteClient(clientConfig.build())</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val clientConfig2 = DWSClientConfigBuilder.newBuilder</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addServerUrl(gatewayUrl)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .connectionTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .discoveryFrequency(1, TimeUnit.MINUTES)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .loadbalancerEnabled(true)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .maxConnectionSize(1)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .retryEnabled(false)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .readTimeout(30000)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthenticationStrategy(new StaticAuthenticationStrategy)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenKey(&quot;hadoop&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setAuthTokenValue(&quot;xxxxx&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDWSVersion(&quot;v1&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metaDataClient = new LinkisMetaDataRemoteClient(clientConfig2.build())</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> @Test</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> @Disabled</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> def testCreateDataSourceMysql: Unit = {</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val user = &quot;hadoop&quot;</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val system = &quot;Linkis&quot;</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> //create data source</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val dataSource = new DataSource();</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setDataSourceName(&quot;for-hive-test&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setDataSourceDesc(&quot;this is for hive test&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setCreateSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSource.setDataSourceTypeId(4L)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val map = JsonUtils.jackson.readValue(JsonUtils.jackson.writeValueAsString(dataSource), new util.HashMap[String, Any]().getClass)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val createDataSourceAction: CreateDataSourceAction = CreateDataSourceAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addRequestPayloads(map)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val createDataSourceResult: CreateDataSourceResult = dataSourceclient.createDataSource(createDataSourceAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val dataSourceId = createDataSourceResult.getInsertId</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> // set connection parameters</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val params = new util.HashMap[String, Any]</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val connectParams = new util.HashMap[String, Any]</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> connectParams.put(&quot;envId&quot;, &quot;3&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> params.put(&quot;connectParams&quot;, connectParams)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> params.put(&quot;comment&quot;, &quot;init&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val updateParameterAction: UpdateDataSourceParameterAction = UpdateDataSourceParameterAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .addRequestPayloads(params)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val updateParameterResult: UpdateDataSourceParameterResult = dataSourceclient.updateDataSourceParameter(updateParameterAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val version: Long = updateParameterResult.getVersion</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> //publish configuration version</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> dataSourceclient.publishDataSourceVersion(</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> PublishDataSourceVersionAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setVersion(version)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build())</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> // use example</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetDatabasesAction: MetadataGetDatabasesAction = MetadataGetDatabasesAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetDatabasesResult: MetadataGetDatabasesResult = metaDataClient.getDatabases(metadataGetDatabasesAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetTablesAction: MetadataGetTablesAction = MetadataGetTablesAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDatabase(&quot;linkis_test_ind&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetTablesResult: MetadataGetTablesResult = metaDataClient.getTables(metadataGetTablesAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetColumnsAction = MetadataGetColumnsAction.builder()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setUser(user)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDataSourceId(dataSourceId)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setDatabase(&quot;linkis_test_ind&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setSystem(system)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .setTable(&quot;test&quot;)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> .build()</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> val metadataGetColumnsResult: MetadataGetColumnsResult = metaDataClient.getColumns(metadataGetColumnsAction)</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block">
</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> }</span></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_M3SB clean-btn">Copy</button></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/apache/incubator-linkis-website/edit/dev/versioned_docs/version-1.1.2/deployment/start_metadatasource.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_mS5F" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_mt2f"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><div class="pagination-nav__item"><a class="pagination-nav__link" href="/docs/latest/deployment/involve_skywalking_into_linkis"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">« <!-- -->Involve SkyWaling into Linkis</div></a></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/docs/latest/deployment/deploy_linkis_without_hdfs"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Deploy Linkis without HDFS<!-- --> »</div></a></div></nav></div></div><div class="col col--3"><div class="tableOfContents_vrFS thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#1-data-source-function-introduction" class="table-of-contents__link">1. Data source function introduction</a><ul><li><a href="#11-concept" class="table-of-contents__link">1.1 Concept</a></li><li><a href="#12-three-main-modules" class="table-of-contents__link">1.2 Three main modules</a></li><li><a href="#13-processing-logic" class="table-of-contents__link">1.3 Processing logic</a></li><li><a href="#13-source-module-directory-structure" class="table-of-contents__link">1.3 Source module directory structure</a></li><li><a href="#14-installation-package-directory-structure" class="table-of-contents__link">1.4 Installation package directory structure</a></li><li><a href="#15-configuration-parameters" class="table-of-contents__link">1.5 Configuration Parameters</a></li></ul></li><li><a href="#2-enable-data-source-function" class="table-of-contents__link">2. Enable data source function</a></li><li><a href="#3-use-of-data-sources" class="table-of-contents__link">3. Use of data sources</a><ul><li><a href="#31-mysql-data-source" class="table-of-contents__link">3.1 Mysql data source</a></li><li><a href="#32-hive-data-source" class="table-of-contents__link">3.2 Hive data source</a></li></ul></li></ul></div></div></div></div></main></div></div><footer class="footer"><div class="container"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Linkis</div><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/docs/latest/introduction">Document</a></li><li class="footer__item"><a class="footer__link-item" href="/faq/main">FAQ</a></li><li class="footer__item"><a href="https://github.com/apache/incubator-linkis/releases" target="_blank" rel="noopener noreferrer" class="footer__link-item"><span>Releases<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items"><li class="footer__item"><a href="https://github.com/apache/incubator-linkis" target="_blank" rel="noopener noreferrer" class="footer__link-item"><span>GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li class="footer__item"><a href="https://github.com/apache/incubator-linkis/issues" target="_blank" rel="noopener noreferrer" class="footer__link-item"><span>Issue Tracker<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li class="footer__item"><a href="https://github.com/apache/incubator-linkis/pulls" target="_blank" rel="noopener noreferrer" class="footer__link-item"><span>Pull Requests<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li></ul></div><div class="col footer__col"><div class="footer__title">Subscribe Mailing List</div><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/community/how-to-subscribe">How to Subscribe</a></li><li class="footer__item"><a href="mailto:dev-subscribe@linkis.apache.org" target="_blank" rel="noopener noreferrer" class="footer__link-item"><span>Subscribe Mail<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li class="footer__item"><a href="https://lists.apache.org/list.html?dev@linkis.apache.org" target="_blank" rel="noopener noreferrer" class="footer__link-item"><span>Mail Archive<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright"><div><img style="height:50px" alt="Apache Software Foundation" src="/img/incubator-logo.svg"><p style="color: #999999; padding: 0 20px 30px;font-weight:400;text-align:left">Apache Linkis is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p><p></p>
<p style="padding: 0 20px 30px;color: #999999;font-weight: 400;"> Copyright © 2022 The Apache Software Foundation. Licensed under the Apache License, Version 2.0. Apache Linkis, Apache Incubator, Apache, the Apache feather logo, the Apache Linkis logo and the Apache Incubator project logo are trademarks of The Apache Software Foundation.</p>
<div></div></div></div></div></div></footer></div>
<script src="/assets/js/runtime~main.a4c60f50.js"></script>
<script src="/assets/js/main.42471b13.js"></script>
</body>
</html>