You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2022/04/21 08:37:13 UTC
svn commit: r1900099 [2/4] - in /kylin/site: ./ cn/blog/ cn_blog/2022/04/ cn_blog/2022/04/20/ cn_blog/2022/04/20/kylin4-on-cloud-part1/ cn_blog/2022/04/20/kylin4-on-cloud-part2/ images/blog/kylin4_on_cloud/
Added: kylin/site/cn_blog/2022/04/20/kylin4-on-cloud-part2/index.html
URL: http://svn.apache.org/viewvc/kylin/site/cn_blog/2022/04/20/kylin4-on-cloud-part2/index.html?rev=1900099&view=auto
==============================================================================
--- kylin/site/cn_blog/2022/04/20/kylin4-on-cloud-part2/index.html (added)
+++ kylin/site/cn_blog/2022/04/20/kylin4-on-cloud-part2/index.html Thu Apr 21 08:37:12 2022
@@ -0,0 +1,548 @@
+<!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+-->
+<!doctype html>
+<html>
+ <!--
+* 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.
+-->
+
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <title>Apache Kylin | Kylin on Cloud ââ 两å°æ¶å¿«éæ建äºä¸æ°æ®åæå¹³å°(ä¸)</title>
+ <meta name="description" content="以ä¸é¨å为 Kylin on Cloud ââ 两å°æ¶å¿«éæ建äºä¸æ°æ®åæå¹³å° çä¸ç¯ï¼ä¸ç¯è¯·æ¥çï¼Kylin on Cloud ââ 两å°æ¶å¿«éæ建äºä¸æ°æ®åæå¹³å°(ä¸)">
+ <meta name="author" content="Apache Kylin">
+ <link rel="shortcut icon" href="fav.png" type="image/png">
+
+
+
+<link rel="stylesheet" href="/assets/css/animate.css">
+<!-- Bootstrap -->
+<link rel="stylesheet" href="/assets/css/bootstrap.min.css">
+
+<!-- Fonts -->
+<!-- <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Alice|Open+Sans:400,300,700"> -->
+
+<!-- Icons -->
+<link rel="stylesheet" href="/assets/css/font-awesome.min.css">
+
+ <!-- Custom styles -->
+ <link rel="stylesheet" href="/assets/css/styles.css">
+ <link rel="stylesheet" href="/assets/css/docs.css">
+ <link rel="stylesheet" href="/assets/css/pygments.css">
+
+ <link rel="canonical" href="http://kylin.apache.org/cn_blog/2022/04/20/kylin4-on-cloud-part2/">
+ <link rel="alternate" type="application/rss+xml" title="Apache Kylin" href="http://kylin.apache.org/feed.xml" />
+
+<!--[if lt IE 9]> <script src="assets/js/html5shiv.js"></script> <![endif]-->
+<!-- Global site tag (gtag.js) - Google Analytics -->
+<script async src="https://www.googletagmanager.com/gtag/js?id=UA-120788561-1"></script>
+<script>
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
+
+ gtag('config', 'UA-120788561-1');
+</script>
+<script type="text/javascript" src="/assets/js/jquery-1.9.1.min.js"></script>
+<script type="text/javascript" src="/assets/js/nside.js"></script> </script>
+<script type="text/javascript" src="/assets/js/nnav.js"></script> </script>
+<script>
+var _hmt = _hmt || [];
+(function() {
+ var hm = document.createElement("script");
+ hm.src = "https://hm.baidu.com/hm.js?bdc5e03add430c0b72cc0eb91eabfa99";
+ var s = document.getElementsByTagName("script")[0];
+ s.parentNode.insertBefore(hm, s);
+})();
+</script>
+
+</head>
+
+ <body>
+ <!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+-->
+
+<header id="header" >
+
+ <!-- Main Menu -->
+ <nav class="navbar navbar-default" role="navigation" id="nav-wrapper">
+ <div class="container-fluid" id="nav">
+ <!--
+ <img class="img-circle" width="40px" height="40px" id="circlelogo" src="/assets/images/kylin_logo.jpg">
+ -->
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <img class="navbar-logo" width="46" src="/assets/images/kylin_logo.png" ></img>
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <ul class="nav icon-navbar">
+ <li><a href="https://twitter.com/apachekylin" target="_blank" class="fa fa-twitter fa-lg" title="Twitter: @ApacheKylin" ></a></li>
+ <li><a href="https://github.com/apache/kylin" target="_blank" class="fa fa-github-alt fa-lg" title="Github: apache/kylin" ></a></li>
+ <li><a href="https://www.facebook.com/kylinio" target="_blank" class="fa fa-facebook fa-lg" title="Facebook: kylin.io" ></a></li>
+ </ul>
+ </div>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="navbar-collapse collapse" id="bs-example-navbar-collapse-1">
+
+ <ul class="nav navbar-nav">
+
+ <li><a href="/">Home</a></li>
+ <li>
+ <a href="/docs" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Docs<span class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li><a href="/docs/">Latest Release(Kylin 4.0.1)</a></li>
+ <li><a href="/docs31/">Kylin 3.1.3</a></li>
+ <li><a href="/docs24/">Kylin 2.4.0</a></li>
+ <li><a href="/archive/">Archive</a></li>
+ </ul>
+ </li>
+ <li><a href="/download">Download</a></li>
+ <li><a href="/community" >Community</a></li>
+ <li>
+ <a href="/development" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Development<span class="caret"></span></a>
+ <ul class="dropdown-menu">
+ <li><a href="/development40/">Kylin 4.x</a></li>
+ <li><a href="/development/">Kylin 3.x And Older Versions</a></li>
+ </ul>
+ </li>
+ <li><a href="/blog">Blog</a></li>
+ <li><a href="/cn" >ä¸æç</a></li>
+ </ul>
+ </div><!-- /.navbar-collapse -->
+ </div><!-- /.container-fluid -->
+ </nav>
+
+ <div id="head" class="parallax normal-header" >
+ <div class="text-center header-apache">
+ <a href="http://apache.org/foundation/contributing.html" title="Support Apache" style="margin-left: 150px;">
+ <div>
+ <img src="https://www.apache.org/images/SupportApache-small.png" >
+ </div>
+ </a>
+ </div>
+ </div>
+
+ </header>
+
+ <div class="page-content main">
+ <header style=" padding:2em 0 0 ">
+ <div class="container" >
+ <div style=" padding:0 4em">
+ <div class="blog-icon">
+ <img width="30" src="/assets/images/icon_blog_w.png">
+ </div>
+ <h4 class="index-title" style=" float:left;"><span>Apache Kylin⢠Technical Blog</span></h4>
+ </div>
+ </div>
+ </div>
+
+ <div class="container blog">
+ <div>
+ <article class="post-content" >
+ <!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+-->
+
+<div class="post" style=" padding:2em 4em 4em 4em">
+
+ <header class="post-header">
+ <h1 class="post-title">Kylin on Cloud ââ 两å°æ¶å¿«éæ建äºä¸æ°æ®åæå¹³å°(ä¸)</h1>
+ <p class="post-meta" >Apr 20, 2022 ⢠Yaqian Zhang</p>
+ </header>
+
+ <article class="post-content" >
+ <p>以ä¸é¨å为 <code class="highlighter-rouge">Kylin on Cloud ââ 两å°æ¶å¿«éæ建äºä¸æ°æ®åæå¹³å°</code> çä¸ç¯ï¼ä¸ç¯è¯·æ¥çï¼<a href="../kylin4-on-cloud-part1/">Kylin on Cloud ââ 两å°æ¶å¿«éæ建äºä¸æ°æ®åæå¹³å°(ä¸)</a></p>
+
+<h3 id="kylin-">Kylin æ¥è¯¢é群</h3>
+
+<h4 id="kylin--1">å¯å¨ Kylin æ¥è¯¢é群</h4>
+
+<p>1.å¨å¯å¨æ建é群æ¶ä½¿ç¨ç kylin_configs.yaml çåºç¡ä¸ï¼æå¼ mdx å¼å
³ï¼</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>ENABLE_MDX: &ENABLE_MDX 'true'
+</code></pre>
+</div>
+
+<p>2.ç¶åæ§è¡é¨ç½²å½ä»¤å¯å¨é群ï¼</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>python deploy.py --type deploy --mode query
+</code></pre>
+</div>
+
+<h4 id="kylin--2">ä½éª kylin çæ¥è¯¢é度</h4>
+
+<p>1.æ¥è¯¢é群å¯å¨æååï¼å
æ§è¡ <code class="highlighter-rouge">python deploy.py --type list</code> å½ä»¤æ¥ååºææèç¹ä¿¡æ¯ï¼ç¶åå¨æµè§å¨è¾å
¥ http://${kylin_node_public_ip}:7070/kylin æ£æ¥ kylin UIï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/14_kylin_web_ui.png" alt="" /></p>
+
+<p>2.å¨ Insight 页é¢æ§è¡ä¸ä¹åå¨ spark-sql ä¸ç¸åç sqlï¼</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>select TAXI_TRIP_RECORDS_VIEW.PICKUP_DATE, NEWYORK_ZONE.BOROUGH, count(*), sum(TAXI_TRIP_RECORDS_VIEW.TRIP_TIME_HOUR), sum(TAXI_TRIP_RECORDS_VIEW.TOTAL_AMOUNT)
+from TAXI_TRIP_RECORDS_VIEW
+left join NEWYORK_ZONE
+on TAXI_TRIP_RECORDS_VIEW.PULOCATIONID = NEWYORK_ZONE.LOCATIONID
+group by TAXI_TRIP_RECORDS_VIEW.PICKUP_DATE, NEWYORK_ZONE.BOROUGH;
+</code></pre>
+</div>
+
+<p><img src="/images/blog/kylin4_on_cloud/15_query_in_kylin.png" alt="" /></p>
+
+<p>å¯ä»¥çå°ï¼å¨æ¥è¯¢å»ä¸ cube çæ
åµä¸ï¼ä¹å°±æ¯æ¥è¯¢ç»æç´æ¥æ¥èªäºé¢è®¡ç®åçæ°æ®ï¼åªä½¿ç¨äºå¤§æ¦ 4 ç§çæ¶é´å°±è¿åäºæ¥è¯¢ç»æï¼å¤§å¤§èçäºæ¥è¯¢æ¶é´ã</p>
+
+<h3 id="section">é¢è®¡ç®éä½æ¥è¯¢ææ¬</h3>
+
+<p>å¨å¯¹æ¯åç SparkSql å Kylin æ¥è¯¢é度çæµè¯ä¸ï¼æ们使ç¨çæ°æ®éæ¯çº½çº¦å¸åºç§è½¦è®¢åæ°æ®ï¼äºå®è¡¨å
±æ 2 亿+ æ°æ®ãä»å¯¹æ¯ç»æå¯ä»¥çå°ï¼å¨ä¸äº¿ç大æ°æ®åæåºæ¯ä¸ï¼Kylin è½å¤æ¾èæåæ¥è¯¢æçï¼éè¿ä¸æ¬¡æ建å éä¸åä¸ä¸æ¬¡ä¸å¡æ¥è¯¢ï¼æ大çéä½æ¥è¯¢ææ¬ã</p>
+
+<h3 id="section-1">é
ç½®è¯ä¹å±</h3>
+
+<h4 id="mdx-for-kylin--dataset">å MDX for Kylin 导å
¥ Dataset</h4>
+
+<p>å¨ <code class="highlighter-rouge">MDX for Kylin</code> ä¸å¯ä»¥æ ¹æ®æè¿æ¥ç Kylin ä¸ç Cube æ¥å建 <code class="highlighter-rouge">Dataset</code>ï¼å®ä¹ Cube å
³ç³»ï¼å建ä¸å¡ææ ã为æ¹ä¾¿ä½éªï¼ç¨æ·å¯ä»¥ç´æ¥ä» S3 ä¸è½½ Dataset æ件导å
¥å° <code class="highlighter-rouge">MDX for Kylin</code> ä¸ï¼</p>
+
+<p>1.ä» S3 ä¸è½½ Dataset æ件å°æ¬å°æºå¨</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>wget https://s3.cn-north-1.amazonaws.com.cn/public.kyligence.io/kylin/kylin_demo/covid_trip_project_covid_trip_dataset.json
+</code></pre>
+</div>
+
+<p>2.è®¿é® <code class="highlighter-rouge">MDX for Kylin</code> çé¢</p>
+
+<p>å¨æµè§å¨è¾å
¥ <code class="highlighter-rouge">http://${kylin_node_public_ip}:7080</code> è®¿é® <code class="highlighter-rouge">MDX for Kylin</code> 页é¢ï¼ä»¥ <code class="highlighter-rouge">ADMIN/KYLIN</code> çç¨æ·åå¯ç ç»åç»å½ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/16_mdx_web_ui.png" alt="" /></p>
+
+<p>3.确认 Kylin è¿æ¥</p>
+
+<p><code class="highlighter-rouge">MDX for Kylin</code> ä¸å·²ç»é
ç½®äºéè¦è¿æ¥ç kylin èç¹çä¿¡æ¯ï¼é¦æ¬¡ç»å½éè¦è¾å
¥ kylin èç¹çç¨æ·ååå¯ç ä¹å°±æ¯ <code class="highlighter-rouge">ADMIN/KYLIN</code>ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/17_connect_to_kylin.png" alt="" /></p>
+
+<p><img src="/images/blog/kylin4_on_cloud/18_exit_management.png" alt="" /></p>
+
+<p>4.导å
¥ Dataset</p>
+
+<p>è¿æ¥ Kylin æååç¹å»å³ä¸è§çå¾æ éåºç®¡ççé¢ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/19_kylin_running.png" alt="" /></p>
+
+<p>åæ¢å° <code class="highlighter-rouge">covid_trip_project</code> 项ç®ï¼å¨ Dataset 页é¢ä¸ç¹å» <code class="highlighter-rouge">Import Dataset</code>ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/20_import_dataset.png" alt="" /></p>
+
+<p>éæ©ååä» S3 ä¸è½½çæ件 <code class="highlighter-rouge">covid_trip_project_covid_trip_dataset.json</code> 导å
¥ã</p>
+
+<p><code class="highlighter-rouge">covid_trip_dataset</code> ä¸å®ä¹äºåååææ ç年累计ãæ累计ãå¹´å¢éãæå¢éï¼åæ¶é´å±çº§ãå°åºå±çº§çç¹æ®ç»´åº¦ã度éï¼ä»¥åæ°å èºçç
æ»çãåºç§è½¦å¹³åé度çä¸å¡ææ ãå¦ä½æå¨å建 Dataset 请åèï¼<a href="https://cwiki.apache.org/confluence/display/KYLIN/Create+Dataset+in+MDX+for+Kylin">Create dataset in MDX for Kylin</a>ï¼MDX for Kylin æåé¾æ¥è¯·åèï¼<a href="https://kyligence.github.io/mdx-kylin/">MDX for Kylin 使ç¨æå</a>ã</p>
+
+<h2 id="section-2">æ°æ®åæ</h2>
+
+<h3 id="tableau-">éè¿ Tableau è¿è¡æ°æ®åæ</h3>
+
+<p>æ们以æ¬å° windows æºå¨ä¸ç tableau 为ä¾è¿æ¥ MDX for Kylin è¿è¡æ°æ®åæã</p>
+
+<p>1.éæ© Tableau å
ç½®ç <code class="highlighter-rouge">Microsoft Analysis Service</code> æ¥è¿æ¥ <code class="highlighter-rouge">MDX for Kylin</code> (éè¦æåå®è£
<code class="highlighter-rouge">Microsoft Analysis Services</code> 驱å¨ï¼å¯ä» tableau å®ç½ä¸è½½ï¼<a href="https://www.tableau.com/support/drivers?_ga=2.104833284.564621013.1647953885-1839825424.1608198275">Microsoft Analysis Services 驱å¨ä¸è½½</a>)</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/21_tableau_connect.png" alt="" /></p>
+
+<p>2.å¨å¼¹åºç设置页é¢ä¸å¡«å <code class="highlighter-rouge">MDX for Kylin</code> çè¿æ¥å°åï¼ä»¥åç¨æ·ååå¯ç ï¼è¿æ¥å°å为 <code class="highlighter-rouge">http://${kylin_node_public_ip}:7080/mdx/xmla/covid_trip_project</code>:</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/22_tableau_server.png" alt="" /></p>
+
+<p>3.éæ© <code class="highlighter-rouge">covid_trip_dataset</code> ä½ä¸ºæ°æ®éï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/23_tableau_dataset.png" alt="" /></p>
+
+<p>4.ç¶åå³å¯å¨å·¥ä½è¡¨ä¸è¿è¡æ°æ®åæï¼ç±äºæä»¬å¨ <code class="highlighter-rouge">MDX for Kylin</code> ä¸å·²ç»ç»ä¸å®ä¹äºä¸å¡ææ ï¼æä»¥å¨ tableau ä¸å¶ä½æ°æ®åææ¥è¡¨æ¶ï¼å¯ä»¥ç´æ¥ææ½å®ä¹å¥½çä¸å¡ææ å°å·¥ä½è¡¨ä¸è¿è¡å±ç¤ºã</p>
+
+<p>5.é¦å
åæç«æ
æ°æ®ï¼éè¿ç¡®è¯äººæ°ãç
æ»ç两个ææ æ¥ç»å¶å½å®¶çº§å«çç«æ
å°å¾ï¼åªéè¦å°å°åºå±çº§ä¸ç <code class="highlighter-rouge">COUNTRY_SHORT_NAME</code> æ¾å°å·¥ä½è¡¨çåä¸ ï¼å°äºå
å®ä¹å¥½çæ°å¢ç¡®è¯äººæ°æ»å <code class="highlighter-rouge">SUM_NEW_POSITIVE_CASES</code> åç
æ»çææ <code class="highlighter-rouge">CFR_COVID19</code> æ¾å°å·¥ä½è¡¨çè¡ä¸ï¼ç¶åéæ©ä»¥å°å¾å½¢å¼å±ç¤ºæ°æ®ç»æï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/24_tableau_covid19_map.png" alt="" /></p>
+
+<p>å
¶ä¸ï¼å¾æ é¢ç§¯ä»£è¡¨æ»äº¡äººæ°çº§å«ï¼å¾æ é¢è²æ·±æµ
代表ç
æ»ç级å«ãéè¿ç«æ
å°å¾å¯ä»¥çåºï¼ç¾å½åå°åº¦çç¡®è¯äººæ°ç¸å¯¹è¾å¤ï¼ä½æ¯è¿ä¸¤ä¸ªå½å®¶çç
æ»çä¸å
¶ä»å¤§å¤æ°å½å®¶æ²¡æææ¾å·®å«ï¼èç¡®è¯äººæ°å¾å°çç§é²ãç¦åªé¿å¾ã墨西å¥çå½å®¶çç
æ»çåå±
é«ä¸ä¸ãä»è¿ä¸ªç°è±¡å
¥æï¼ä¹è®¸å¯ä»¥ææå°æ´æ·±å±æ¬¡çåå ã</p>
+
+<p>ç±äºæ们设置äºå°åºå±çº§ï¼æ以å¯ä»¥å°å½å®¶çº§å«çç«æ
å°å¾ä¸é»å°ç级å«ï¼æ¥çå个å½å®¶å
é¨å个å°åºçç«æ
æ
åµï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/25_tableau_province.png" alt="" /></p>
+
+<p>å¨ province 级å«çç«æ
å°å¾æ¾å¤§çç¾å½çç«æ
ç¶åµï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/26_tableau_us_covid19.png" alt="" /></p>
+
+<p>å¯ä»¥åç°ï¼ç¾å½æ¯ä¸ªå·çç
æ»ç没æææ¾å·®è·ï¼é½å¨ 0.01 å·¦å³ï¼å¨ç¡®è¯äººæ°ä¸ï¼CaliforniaãTexasãFlorida 以å纽约å¸å 个å°åºææ¾åé«ï¼è¿å 个å°åºç»æµåè¾¾ã人å£ä¼å¤ï¼æ°å èºçç¡®è¯äººæ°ä¹éä¹æåãä¸é¢é对纽约å¸åºç§è½¦æ°æ®éï¼ç»åç«æ
åå±æ
åµï¼åæç«æ
å½¢å¿ä¸äººä»¬ä¹ååºç§è½¦åºè¡çæ°æ®ååã</p>
+
+<p>6.对äºçº½çº¦å¸åºç§è½¦è®¢åæ°æ®éï¼åå«ä»ä»¥ä¸ä¸¤ä¸ªä¸å¡é®é¢å
¥æï¼</p>
+
+<ul>
+ <li>åæ纽约å¸å个è¡åºåºè¡ç¹å¾ï¼å¯¹æ¯è®¢åæ°éãåºè¡é度çåºè¡ææ </li>
+</ul>
+
+<p>å° lookup 表 <code class="highlighter-rouge">PICKUP_NEWYORK_ZONE</code> ä¸çå段 <code class="highlighter-rouge">BOROUGH</code> ææ½å°å·¥ä½è¡¨çåä¸ï¼å°ææ <code class="highlighter-rouge">ORDER_COUNT</code>ã<code class="highlighter-rouge">trip_mean_speed</code> ææ½å°å·¥ä½è¡¨çè¡ä¸ï¼ä»¥ç¬¦å·å°å¾çæ¹å¼å±ç¤ºï¼é¢è²æ·±æµ
代表平åé度ãé¢ç§¯å¤§å°ä»£è¡¨è®¢åæ°éï¼å¯ä»¥çå°ä»æ¼åé¡¿åºåºåçåºç§è½¦è®¢åæ¯å«çè¡åºæ»åé½è¦é«ï¼ä½æ¯å¹³åé度æå°ï¼Queens è¡åºæ¬¡ä¹ï¼Staten Island åæ¯åºç§è½¦æ´»å¨æå°çä¸ä¸ªè¡åºãä» Bronx åºåç
åºç§è½¦å¹³åé度é«è¾¾ 82 è±é/å°æ¶ï¼æ¯å
¶ä»è¡åºçå¹³åé度é½é«åºå åãä»è¿äºåºè¡ç¹å¾å¯ä»¥æ å°åºçº½çº¦å¸å个è¡åºç人å£å¯éç¨åº¦ä»¥åç»æµåè¾¾ç¨åº¦ã</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/27_tableau_taxi_1.png" alt="" /></p>
+
+<p>ç¶åå° lookup 表 <code class="highlighter-rouge">PICKUP_NEWYORK_ZONE</code> ä¸çå段 <code class="highlighter-rouge">BOROUGH</code> æ¢æ <code class="highlighter-rouge">DROPOFF_NEWYORK_ZONE</code> ä¸ç <code class="highlighter-rouge">BOROUGH</code>ï¼ç»è®¡åºç§è½¦è®¢åå°è¾¾è¡åºçæ°éåå¹³åé度ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/27_tableau_taxi_2.png" alt="" /></p>
+
+<p>ç¸æ¯åºåè¡åºçæ°æ®ï¼brooklyãQueens å Bronx ä¸ä¸ªè¡åºçå°è¾¾æ°æ®é½ææ¯è¾ææ¾çå·®å«ï¼ä»æ¯ä¾å
³ç³»ä¸æ¥çï¼å°è¾¾ brookly å Bronx çåºç§è½¦è®¢åè¦è¿è¿å¤äºä» Brookly å Bronx åºåç订åï¼å°è¾¾ Queens è¡åºç订åæ°éåææ¾å°äºä» Queens è¡åºåºåç订åã</p>
+
+<ul>
+ <li>ç«æ
åå纽约å¸å±
æ°ä¹ååºç§è½¦çåºè¡ä¹ æ¯ååï¼æ´ååè¿ç¨åºè¡è¿æ¯è¿ç¨</li>
+</ul>
+
+<p>éè¿å¹³ååºè¡éç¨åæå±
æ°åºè¡ä¹ æ¯ååï¼å°ç»´åº¦ <code class="highlighter-rouge">MONTH_START</code> ææ½å°å·¥ä½è¡¨çè¡ï¼å°ææ <code class="highlighter-rouge">trip_mean_distance</code> ææ½å°å·¥ä½è¡¨çåï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/28_tableau_taxi_3.png" alt="" /></p>
+
+<p>æ ¹æ®æ±ç¶å¾çç»æå¯ä»¥åç°ï¼ç«æ
åå人们çåºè¡ä¹ æ¯åçäºææ¾çååï¼ä» 2020.03 å¼å§å¹³ååºè¡éç¨æææ¾åé«ï¼çè³æçæ份åçæ°åå¢é¿ï¼å¹¶ä¸ç«æ
å¼å§åæ¯ä¸ªæçå¹³ååºè¡éç¨åçå¾ä¸ç¨³å®ãåºäºè¿ç§æ°æ®è¡¨ç°ï¼æ们å¯ä»¥åç»åæ份维度çç«æ
æ°æ®è¿è¡èååæï¼å° <code class="highlighter-rouge">SUM_NEW_POSITIVE_CASES</code> å <code class="highlighter-rouge">MTD_ORDER_COUNT</code> ææ½å°å·¥ä½è¡¨çè¡ä¸ï¼å¹¶å¨çéå¨ä¸å¢å çéæ¡ä»¶ <code class="highli
ghter-rouge">PROVINCE_STATE_NAME=New York</code>ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/29_tableau_taxi_4.png" alt="" /></p>
+
+<p>å¯ä»¥çå°ä¸ä¸ªæ趣çç°è±¡ï¼ç«æ
åæååçåçæ¶ååºç§è½¦è®¢åéæ¥å§åå°ï¼èå¹³ååºè¡éç¨å¢å¤§ï¼è¯´æ大家åå°äºå¾å¤ä¸å¿
è¦ççè·ç¦»åºè¡ï¼æè
éç¨åºç§è½¦ä»¥å¤çæ´å®å
¨ç交éæ¹å¼è¿è¡äºçè·ç¦»åºè¡ã对æ¯ä¸ç§æ°æ®çæ²çº¿ååï¼å¯ä»¥çå°ç«æ
严éç¨åº¦å人们çåºè¡æ
åµè¡¨ç°åºå¾é«çç¸å
³æ§ï¼ç«æ
严éæ¶åºç§è½¦è®¢åéåå°ï¼å¹³ååºè¡éç¨æåï¼ç¶åç«æ
好转ï¼åºç§è½¦è®¢åé
å¢å¤§ï¼å¹³ååºè¡éç¨åè½ã</p>
+
+<h3 id="excel-">éè¿ Excel è¿è¡æ°æ®åæ</h3>
+
+<p>æäº <code class="highlighter-rouge">MDX for Kylin</code> ç帮å©ï¼æä»¬å¨ Excel ä¸ä¹å¯ä»¥è¿æ¥ Kylin è¿è¡å¤§æ°æ®åæãè¿æ¬¡æµè¯ä¸ï¼æ们使ç¨æ¬å° windows æºå¨ä¸ç Excel è¿æ¥ MDX for Kylin è¿è¡æ¼ç¤ºã</p>
+
+<p>1.æå¼ Excelï¼éæ© æ°æ® -> è·åæ°æ® -> æ¥èªæ°æ®åº -> èª <code class="highlighter-rouge">Analysis Services</code>ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/30_excel_connect.png" alt="" /></p>
+
+<p>2.å¨æ°æ®è¿æ¥å导ä¸å¡«åMDX for Kylin è¿æ¥ä¿¡æ¯ï¼æå¡å¨å称为 <code class="highlighter-rouge">http://${kylin_node_public_ip}:7080/mdx/xmla/covid_trip_project</code>ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/31_excel_server.png" alt="" /></p>
+
+<p><img src="/images/blog/kylin4_on_cloud/32_tableau_dataset.png" alt="" /></p>
+
+<p>3.ç¶å为å½åçæ°æ®è¿æ¥å建æ°æ®éè§è¡¨ï¼å¨æ°æ®éè§è¡¨å段ä¸ï¼æ们å¯ä»¥çå°ï¼å¨ Excel ä¸è¿æ¥ <code class="highlighter-rouge">MDX for Kylin</code> ä¸ç dataset è·åæ°æ®ä¿¡æ¯ï¼å¯ä»¥ä¸ Tableau ä¿æå®å
¨ä¸è´ï¼æ 论åæ人åæ¯å¨ Tableau è¿æ¯ Excel ä¸è¿è¡åæï¼é½æ¯å¨ä¸è´çæ°æ®æ¨¡åã维度åä¸å¡ææ çåºç¡ä¸ï¼è¾¾å°ç»ä¸è¯ä¹çææã</p>
+
+<p>4.å¨ Tableau ä¸æ们对 <code class="highlighter-rouge">covid19</code> å <code class="highlighter-rouge">newyork_trip_data</code> 两个æ°æ®éè¿è¡äºç«æ
å°å¾ç»å¶åè¶å¿åæãå¨ Excel ä¸å¯¹äºåæ ·çæ°æ®éåæ°æ®åºæ¯ï¼æ们å¯ä»¥æ¥çæ´å¤çæç»æ°æ®ã</p>
+
+<ul>
+ <li>对äºç«æ
æ°æ®ï¼ä¸ºæ°æ®éè§è¡¨éåå°åºå±çº§å段 <code class="highlighter-rouge">REGION_HIERARCHY</code>ï¼ä»¥åäºå
å®ä¹å¥½çæ°å¢ç
ä¾æ°æ»å <code class="highlighter-rouge">SUM_NEW_POSITIVE_CASES</code> åç
æ»çææ <code class="highlighter-rouge">CFR_COVID19</code>ï¼</li>
+</ul>
+
+<p><img src="/images/blog/kylin4_on_cloud/33_tableau_covid19_1.png" alt="" /></p>
+
+<p>ç±äºå°åºå±çº§çæä¸å±ä¸º <code class="highlighter-rouge">CONTINENT_NAME</code>ï¼æ以é»è®¤å±ç¤ºæ´²çº§å«çç¡®è¯äººæ°åç
æ»çï¼å¯ä»¥çå°ç¡®è¯äººæ°æå¤çæ´²æ¯æ¬§æ´²ï¼ç
æ»çæé«çæ¯éæ´²ãå¨è¿å¼ æ°æ®éè§è¡¨ä¸æ们å¯ä»¥æ¹ä¾¿çä¸é»å°æ´ä¸å±çå°åºçº§å«æ¥çæ´ç»ç²åº¦çæç»æ°æ®ï¼æ¯å¦æ¥çäºæ´²å½å®¶çç«æ
æ°æ®ï¼å¹¶æ ¹æ®ç¡®è¯äººæ°è¿è¡éåºæåºï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/34_excel_covid20_2.png" alt="" /></p>
+
+<p>æ°æ®æ¾ç¤ºï¼äºæ´²å½å®¶ä¸ç¡®è¯äººæ°æååä¸çå½å®¶åå«æ¯å°åº¦ãåè³å
¶åä¼æã</p>
+
+<ul>
+ <li>对äºçº½çº¦å¸åºç§è½¦è®¢åæ°æ®ï¼é对 âç«æ
对äºåºç§è½¦è®¢åæ°éææ ææ¾å½±åâ çé®é¢ï¼é¦å
ä»å¹´ä»½ç维度ä¸æ¥çåºç§è½¦è®¢åæ°éç年累计åå¢éï¼æ°å»ºéè§è¡¨éæ©æ¶é´å±çº§ç»´åº¦ <code class="highlighter-rouge">TIME_HIERARCHY</code>ã<code class="highlighter-rouge">YOY_ORDER_COUNT</code> å <code class="highlighter-rouge">YTD_ORDER_COUNT</code>ï¼</li>
+</ul>
+
+<p><img src="/images/blog/kylin4_on_cloud/35_excel_taxi_1.png" alt="" /></p>
+
+<p>å¯ä»¥çå°ï¼2020 å¹´ç«æ
çå导è´åºç§è½¦è®¢åæ°éæ¥å§åå°ï¼2020年订åéå¢é为 -0.7079ï¼åå°äº 70% çåºè¡è®¢åï¼2021 年订åéå¢éä»ä¸ºè´æ°ï¼ä½æ¯ç¸æ¯ 2020 å¹´ç«æ
åæ订åéåå°é度æ¾ç¼äºè®¸å¤ã</p>
+
+<p>å±å¼æ¶é´å±çº§ï¼å¯ä»¥æ¥çå£åº¦çº§å«ãæ级å«ç´å°å¤©çº§å«ç订å累计å¼ï¼éæ© <code class="highlighter-rouge">MOM_ORDER_COUNT</code> å <code class="highlighter-rouge">ORDER_COUNT</code> å°éè§è¡¨ä¸è¿å¯ä»¥åæ¶æ¥çæ度订åå¢é以åå个æ¶é´å±çº§ç订åæ°éï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/36_excel_taxi_2.png" alt="" /></p>
+
+<p>2020 å¹´ 3 æ份ï¼è®¢åå¢é为 -0.52ï¼åºç§è½¦è®¢åå·²ç»åºç°ææ¾åå°ï¼4 æ份æ´æ¯è·è³ -0.92ï¼åå°äº 90% ç订åï¼åæå¼å§æ
¢æ
¢å¢é¿ï¼ä½æ¯ä¹å§ç»è¿ä½äºç«æ
ä¹åçæ°éã</p>
+
+<h3 id="api--kylin-">éè¿ API éæ Kylin å°æ°æ®åæå¹³å°</h3>
+
+<p>é¤äº ExcelãTableau è¿ç§åä¸ BI å·¥å
·ï¼å¾å¤ä¼ä¸å
é¨ä¼å¼åèªå·±çæ°æ®åæå¹³å°ï¼å¨è¿ç±»èªç æ°æ®åæå¹³å°ä¸ï¼ç¨æ·ä»ç¶å¯ä»¥éè¿è°ç¨ API çæ¹å¼å° Kylin + MDX for Kylin ä½ä¸ºåæå¹³å°çåºç¡åºåº§ï¼ä¿è¯ç»ä¸çæ°æ®å£å¾ãå¨è¿æ¬¡æ¼ç¤ºä¸ï¼æ们å°å±ç¤ºå¦ä½éè¿ Olap4j å MDX for Kylin åéæ¥è¯¢ï¼è·å¾åæç»æï¼Olap4j æ¯ä¸ä¸ªä¸ JDBC 驱å¨ç±»ä¼¼ï¼è½å¤è®¿é®ä»»æ OLAP æå¡ç Java åºã</p>
+
+<p>æ们æä¾äºä¸ä¸ªç®åç demo å¯ä»¥æ¹ä¾¿ç¨æ·ç´æ¥è¿è¡æµè¯ï¼æºç ä½äº <a href="https://github.com/apache/kylin/tree/mdx-query-demo">mdx query demo</a>ï¼</p>
+
+<p>1.ä¸è½½ demo æ¼ç¤ºç¸å
³ jar å
:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>wget https://s3.cn-north-1.amazonaws.com.cn/public.kyligence.io/kylin/kylin_demo/mdx_query_demo.tgz
+tar -xvf mdx_query_demo.tgz
+cd mdx_query_demo
+</code></pre>
+</div>
+
+<p>2.è¿è¡ demo</p>
+
+<p>è¿è¡ demo ä¹åä¿è¯è¿è¡ç¯å¢å®è£
äº java8ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/37_jdk_8.png" alt="" /></p>
+
+<p>è¿è¡ demo éè¦ä¸¤ä¸ªåæ°ï¼mdx èç¹ç ip å éè¦è¿è¡ç mdx æ¥è¯¢ï¼ç«¯å£é»è®¤ä¸º 7080ï¼è¿éç mdx èç¹ ip å°±æ¯ kylin èç¹ç public ipï¼</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>java -cp olap4j-xmla-1.2.0.jar:olap4j-1.2.0.jar:xercesImpl-2.9.1.jar:mdx-query-demo-0.0.1.jar io.kyligence.mdxquerydemo.MdxQueryDemoApplication "${kylin_node_public_ip}" "${mdx_query}"
+</code></pre>
+</div>
+
+<p>å¦æç¨æ·å¨è¿è¡ demo æ¶æ²¡æéè¿å½ä»¤è¡è¾å
¥éè¦æ§è¡ç mdx è¯å¥ï¼åä¼é»è®¤æ§è¡ä»¥ä¸ mdx è¯å¥ç»è®¡ä»åºåè¡åºç维度ä¸å个è¡åºç订åæ°éåå¹³åéç¨ï¼</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>SELECT
+{[Measures].[ORDER_COUNT],
+[Measures].[trip_mean_distance]}
+DIMENSION PROPERTIES [MEMBER_UNIQUE_NAME],[MEMBER_ORDINAL],[MEMBER_CAPTION] ON COLUMNS,
+NON EMPTY [PICKUP_NEWYORK_ZONE].[BOROUGH].[BOROUGH].AllMembers
+DIMENSION PROPERTIES [MEMBER_UNIQUE_NAME],[MEMBER_ORDINAL],[MEMBER_CAPTION] ON ROWS
+FROM [covid_trip_dataset]
+</code></pre>
+</div>
+
+<p>å¨è¿æ¬¡æ¼ç¤ºä¸æ们ç´æ¥æ§è¡é»è®¤æ¥è¯¢ï¼æ§è¡æåä¹åï¼ç»è¿ç®åå¤ççæ¥è¯¢ç»æä¼è¾åºå°å½ä»¤è¡ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/38_demo_result.png" alt="" /></p>
+
+<p>å¯ä»¥çå°ï¼è¿è¡ Demo ä¹åæåè·å¾äºéè¦æ¥è¯¢çæ°æ®ï¼æ°æ®ç»ææ¾ç¤ºï¼ä» Manhattan åºåçåºç§è½¦è®¢åæ°éæå¤ï¼è®¢åå¹³åéç¨åªæ大约 2.4 è±éï¼ç¬¦å Manhattan å°çé¢ç§¯å°ä¸äººå£ç¨ å¯çç¹ç¹ï¼èä» Bronx ç订åå¹³åéç¨è¾¾å° 33 è±éï¼æåçé«äºå
¶ä»ä»»ä½è¡åºï¼å¯è½æ¯ç±äº Bronx å°å¤åå»çç¼æ
ã</p>
+
+<p>ä¸ Tableau å Excel ç¸åï¼å¨ Demo ä¸ç¼åç mdx è¯è¨ä¸å¯ä»¥ç´æ¥ä½¿ç¨å¨ Kylin 以å MDX for Kylin ä¸å®ä¹çææ ãå¨ä¼ä¸èªç æ°æ®åæå¹³å°ä¸ï¼ç¨æ·å¯ä»¥å¯¹æ¥è¯¢è¿åçæ°æ®ç»æè¿è¡è¿ä¸æ¥åæï¼æ ¹æ®å±ç¤ºéæ±çææ¥è¡¨ã</p>
+
+<h3 id="section-3">ç»ä¸çæ°æ®å£å¾</h3>
+
+<p>éè¿ä»¥ä¸ç§ä¸åçæ°æ®åææ¹å¼è¿æ¥ Kylin + MDX for Kylin è¿è¡æ°æ®åæå±ç¤ºï¼æ们å¯ä»¥åç°ï¼åå© Kylin å¤ç»´æ°æ®åºå MDX for Kylin è¯ä¹å±åè½ï¼æ 论ç¨æ·å¨ä¸å¡åºæ¯ä¸ä½¿ç¨åªç§æ¹å¼åææ°æ®ï¼é½å¯ä»¥ä½¿ç¨ç¸åçæ°æ®æ¨¡ååä¸å¡ææ ï¼è¾¾å°ç»ä¸æ°æ®å£å¾çç®çã</p>
+
+<h2 id="section-4">éæ¯é群</h2>
+
+<h3 id="section-5">éæ¯æ¥è¯¢é群</h3>
+
+<p>å¨ä¸è¿°åæå®æä¹åï¼æ们å¯ä»¥æ§è¡é群éæ¯å½ä»¤æ¥éæ¯æ¥è¯¢é群ãå¦æç¨æ·å¸æåæ¶éæ¯ Kylin 以å MDX for Kylin çå
æ°æ®åº RDSãçæ§èç¹ä»¥å VPCï¼é£ä¹å¯ä»¥æ§è¡é群éæ¯å½ä»¤ï¼</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>python deploy.py --type destroy-all
+</code></pre>
+</div>
+
+<h3 id="aws-">æ£æ¥ AWS èµæº</h3>
+
+<p>å¨éæ¯ææé群èµæºåï¼<code class="highlighter-rouge">CloudFormation</code> ä¸ä¸ä¼ä¿çä¸é¨ç½²å·¥å
·ç¸å
³çä»»ä½ Stackãå¦æç¨æ·æ³è¦å é¤ S3 ä¸ä¸é¨ç½²å·¥å
·ç¸å
³çæ件以åæ°æ®ï¼å¯ä»¥æå¨å é¤ S3 å·¥ä½ç®å½ä¸ç以ä¸æ件夹ï¼</p>
+
+<p><img src="/images/blog/kylin4_on_cloud/39_check_s3_demo.png" alt="" /></p>
+
+<h2 id="section-6">æ»ç»</h2>
+
+<p>éè¿è¿æ¬¡æ¼ç¤ºæç¨ï¼åªéè¦ä¸ä¸ª AWS è´¦å·ï¼ç¨æ·å°±å¯ä»¥ä½¿ç¨äºä¸é¨ç½²å·¥å
·ï¼åå©äº Kylin çé¢è®¡ç®ææ¯åå¤ç»´æ¨¡åï¼ä»¥åMDX for Kylin çåºç¡ææ 管çï¼å¿«éä¸æ¹ä¾¿çæ建åºäº Kylin + MDX for Kylin çäºä¸å¤§æ°æ®åæå¹³å°ï¼å¯¹æ¥åç§ BI å·¥å
·è¿è¡ææ¯éªè¯ï¼è¾¾å°éæ¬å¢æãç»ä¸æ°æ®å£å¾çç®çã</p>
+
+
+ </article>
+
+</div>
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ <!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+-->
+
+<footer id="underfooter">
+ <div>
+ <div class="row">
+ <div class="col-md-12 widget">
+ <div class="widget-body">
+ <div class="footer-img">
+ <a href="http://www.apache.org">
+ <img id="asf-logo" height="78px" alt="Apache Software Foundation" src="/assets/images/apache_footer.png">
+ </a>
+ </div>
+ <p style="padding-top: 11px;">
+ The contents of this website are © 2015 Apache Software Foundation under the terms of the
+ <a href="http://www.apache.org/licenses/LICENSE-2.0"> Apache License v2 </a>.
+ </p>
+ <p style="margin-bottom: 11px;">
+ Apache Kylin and its logo are trademarks of the Apache Software Foundation.
+ </div>
+
+ </div>
+ </div>
+ </div>
+ <!-- /row of widgets -->
+
+ </div>
+ <div></div>
+
+</footer>
+
+ <script src="/assets/js/jquery-1.9.1.min.js"></script>
+ <script src="/assets/js/bootstrap.min.js"></script>
+ <script src="/assets/js/main.js"></script>
+ </body>
+</html>
+
+
+
+