ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
<div id="article_content" class="article_content clearfix"> <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css"> <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-25cebea3f9.css"> <div id="content_views" class="htmledit_views"> <h1><a name="t0"></a>1.OLAP详解</h1> <h2><a name="t1"></a>1.1.OLAP的场景特征</h2> <p>1、读多于写</p> <p>不同于事务处理(OLTP)的场景,比如电商场景中加购物车、下单、支付等需要在原地进行大量<a href="https://so.csdn.net/so/search?q=insert&amp;spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https://so.csdn.net/so/search?q=insert&amp;spm=1001.2101.3001.7020&quot;,&quot;extra&quot;:&quot;{\&quot;searchword\&quot;:\&quot;insert\&quot;}&quot;}" data-tit="insert" data-pretit="insert">insert</a>、update、delete操作,数据分析(OLAP)场景通常是将数据批量导入后,进行任意维度的灵活探索、BI工具洞察、报表制作等。</p> <p>数据一次性写入后,分析师需要尝试从各个角度对数据做挖掘、分析,直到发现其中的商业价值、业务变化趋势等信息。这是一个需要反复试错、不断调整、持续优化的过程,其中数据的读取次数远多于写入次数。这就要求底层数据库为这个特点做专门设计,而不是盲目采用传统数据库的技术架构。</p> <p>2、大宽表,读大量行但是少量列,结果集较小</p> <p>在OLAP场景中,通常存在一张或是几张多列的大宽表,列数高达数百甚至数千列。对数据分析处理时,选择其中的少数几列作为维度列、其他少数几列作为指标列,然后对全表或某一个较大范围内的数据做聚合计算。这个过程会扫描大量的行数据,但是只用到了其中的少数列。而聚合计算的结果集相比于动辄数十亿的原始数据,也明显小得多。</p> <p>3、数据批量写入,且数据不更新或少更新</p> <p>OLTP类业务对于延时(Latency)要求更高,要避免让客户等待造成业务损失;而OLAP类业务,由于数据量非常大,通常更加关注写入吞吐(Throughput),要求海量数据能够尽快导入完成。一旦导入完成,历史数据往往作为存档,不会再做更新、删除操</p> <p>4、无需事务,数据一致性要求低</p> <p>OLAP类业务对于事务需求较少,通常是导入历史日志数据,或搭配一款事务型数据库并实时从事务型数据库中进行数据同步。多数OLAP系统都支持最终一致性。</p> <p>5、灵活多变,不适合预先建模</p> <p>分析场景下,随着业务变化要及时调整分析维度、挖掘方法,以尽快发现数据价值、更新业务指标。而数据仓库中通常存储着海量的历史数据,调整代价十分高昂。预先建模技术虽然可以在特定场景中加速计算,但是无法满足业务灵活多变的发展需求,维护成本过高。</p> <h3><a name="t2"></a>1.1.1.技术选型</h3> <ul><li>少量数据:单机程序</li><li>中级数据:ES、MySQL的分库分表</li><li>海量数据:druid,kylin,doris,clickhouse</li><li>海量数据做查询分析高效:列式数据库,写模式(保证同一列的数据类型是一样的:方便压缩)</li></ul> <h2><a name="t3"></a>1.2.<a href="https://so.csdn.net/so/search?q=ClickHouse&amp;spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https://so.csdn.net/so/search?q=ClickHouse&amp;spm=1001.2101.3001.7020&quot;,&quot;extra&quot;:&quot;{\&quot;searchword\&quot;:\&quot;ClickHouse\&quot;}&quot;}" data-tit="ClickHouse" data-pretit="clickhouse">ClickHouse</a>官网解释</h2> <p>URL地址:https://clickhouse.tech/docs/zh/</p> <blockquote> <p>1、绝大多数请求都是读请求<br> 2、数据以相当大的批次(&gt; 1000行)更新,而不是单行更新;或者它根本没有更新。<br> 3、数据已添加到数据库,但不会进行修改。<br> 4、对于读取,每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列<br> 5、表格“宽”,意味着它们包含大量列。<br> 6、查询相对较少(通常每台服务器数百个查询或每秒更少)。<br> 7、对于简单查询,允许延迟大约50毫秒。<br> 8、列中的数据相对较小:一般来说,都是数字和短字符串(例如,每个URL 60个字节)<br> 9、处理单个查询时需要高吞吐量(每个服务器每秒最多数十亿行)。<br> 10、Transactions不是必需的。<br> 11、对数据一致性要求低。<br> 12、每个查询有一个大表。所有其他表都很小,除了这个大表。<br> 13、查询结果明显小于源数据。换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中</p> </blockquote> <h1><a name="t4"></a>2.ClickHouse</h1> <h2><a name="t5"></a>2.1.概述</h2> <p>源代码:C++</p> <p>典型特点总结:<span style="color:#f33b45;">ROLAP、在线实时查询、完整的DBMS、列式存储、不需要任何数据预处理、支持批量更新、具有非常完善的SQL支持和函数、支持高可用、不依赖Hadoop复杂生态、开箱即用</span></p> <p>简单的说,ClickHouse作为分析型数据库,<span style="color:#f33b45;">有三大特点:一是跑分快, 二是功能多 ,三是文艺范</span></p> <p>1.跑分快: ClickHouse跑分是Vertica的5倍快:</p> <blockquote> <p>clickHouse性能超过了市面上大部分的列式存储数据库,相比传统的数据ClickHouse要快100-1000X,ClickHouse还是有非常大的优势:<br> 100Million 数据集:ClickHouse比Vertica约快5倍,比Hive快279倍,比MySQL快801倍<br> 1Billion 数据集:ClickHouse比Vertica约快5倍,MySQL和Hive已经无法完成任务了</p> </blockquote> <p>2.功能多:ClickHouse支持数据统计分析各种场景</p> <blockquote> <p>支持类SQL查询,<br> 支持繁多库函数(例如IP转化,URL分析等,预估计算/HyperLoglog等)<br> 支持数组(Array)和嵌套数据结构(Nested Data Structure)<br> 支持数据库异地复制部署</p> </blockquote> <p>3.文艺范:目前ClickHouse的限制很多,生来就是为小资服务的</p> <blockquote> <p>相对较缺乏的文档,社区刚开始活跃,只有开源的C++源码<br> 不理睬Hadoop生态,走自己的路</p> </blockquote> <p>函数数量对比:Clickhouse:779个、hive-1.x:216个、hive-2.x:271个</p> <h2><a name="t6"></a>2.2使用场景</h2> <p>适合:用于结构良好清晰且不可变的事件或日志流分析。</p> <p>不适合:事务性工作(OLTP),高请求率的键值访问,低延迟的修改或删除已存在数据,Blob或文档存储,超标准化数据。</p> <h2><a name="t7"></a>2.3ClickHouse优缺点</h2> <h3><a name="t8"></a>2.3.1优点</h3> <p>1、真正的面向列的 DBMS</p> <p>ClickHouse 是一个 DBMS,而不是一个单一的数据库。它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置和重新启动服务器。</p> <p>2、数据压缩</p> <p>一些面向列的 DBMS(InfiniDB CE 和 MonetDB)不使用数据压缩。但是,数据压缩确实提高了性能。</p> <p>3、磁盘存储的数据</p> <p>许多面向列的 DBMS(SAP HANA 和 GooglePowerDrill)只能在内存中工作。但即使在数千台服务器上,内存也太小,无法在 Yandex.Metrica 中存储所有浏览量和会话。</p> <p>4、多核并行处理</p> <p>多核多节点并行化大型查询。</p> <p>5、在多个服务器上分布式处理</p> <p>在 ClickHouse 中,数据可以驻留在不同的分片上。每个分片都可以用于容错的一组副本,查询会在所有分片上并行处理。</p> <p>6、SQL支持</p> <p>ClickHouse SQL 跟真正的 SQL 有不一样的函数名称。不过语法基本跟 SQL 语法兼容,支持 JOIN、FROM、IN 和 JOIN 子句以及标量子查询支持子查询。</p> <p>7、向量化引擎</p> <p>数据不仅按列存储,而且由矢量 - 列的部分进行处理,这使开发者能够实现高 CPU 性能。</p> <p>8、实时数据更新</p> <p>ClickHouse 支持主键表。为了快速执行对主键范围的查询,数据使用合并树 (MergeTree) 进行递增排序。由于这个原因,数据可以不断地添加到表中。</p> <p>9、支持近似计算</p> <p>该库支持为有限数量的随机密钥(而不是所有密钥)运行聚合。在数据中密钥分发的特定条件下,这提供了相对准确的结果,同时使用较少的资源。</p> <p>10、数据复制和对数据完整性的支持</p> <p>ClickHouse 使用异步多主复制。写入任何可用的副本后,数据将分发到所有剩余的副本。系统在不同的副本上保持相同的数据。数据在失败后自动恢复。</p> <h3><a name="t9"></a>2.3.2缺点</h3> <ol><li>没有完整的事务支持,不支持Transaction:想快就别想Transaction</li><li>缺少完整的Update/Delete操作,缺少高频率、低延迟的修改或删除已存在数据的能力,仅能用于批量删除或修改数据。</li><li>聚合结果必须小于一台机器的内存大小:不是大问题</li><li>支持有限操作系统,正在慢慢完善</li><li>开源社区刚刚启动,主要是俄语为主,中文社区:http://www.clickhouse.com.cn</li><li>不适合key-value存储,不支持 Blob 等文档型数据库</li></ol> <h1><a name="t10"></a>3.安装与启动</h1> <h2><a name="t11"></a>3.1安装</h2> <h3><a name="t12"></a>3.1.1在线安装</h3> <p>yum install yum-utils -y</p> <p>rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG</p> <p>yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/clickhouse.repo</p> <p>yum install clickhouse-server clickhouse-client -y</p> <h3><a name="t13"></a>3.1.2离线安装</h3> <p>下载地址:https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; https://packagecloud.io/Altinity/clickhouse</p> <p>安装顺序:</p> <p>rpm -ivh clickhouse-common-static-20.5.4.40-1.el7.x86_64.rpm</p> <p>rpm -ivh clickhouse-server-common-20.5.4.40-1.el7.x86_64.rpm</p> <p>rpm -ivh clickhouse-server-20.5.4.40-1.el7.x86_64.rpm</p> <p>rpm -ivh clickhouse-client-20.5.4.40-1.el7.x86_64.rpm</p> <p>注意:<span style="color:#f33b45;">就算配置成集群了,每个服务器依然还是单独运行的。</span></p> <h3><a name="t14"></a>安装的成功的核心目录</h3> <p>(1)/etc/clickhouse-server:服务端的配置文件目录,包括全局配置config.xml和用户配置users.xml等。</p> <p>(2)/var/lib/clickhouse:默认数据存储目录,通常会修改默认路径配置,将数据保存到大容量磁盘挂载路径</p> <p>(3)/var/log/clickhouse-server:默认日志保存目录,通常会修改路径配置将日志保存到大容量磁盘挂载的路径</p> <h3><a name="t15"></a>可执行文件</h3> <blockquote> <p>clickhouse:主程序的可执行文件。<br> clickhouse-client:一个指向ClickHouse可执行文件的软链接,供客户端连接使用。<br> clickhouse-server:一个指向ClickHouse可执行文件的软链接,供服务端启动使用。<br> clickhouse-compressor:内置提供的压缩工具,可用于数据的正压反解。</p> </blockquote> <p></p> <h2><a name="t16"></a>3.2启动</h2> <h3><a name="t17"></a>3.2.1单机启动</h3> <p>前台启动:clickhouse-server --config-file=/etc/clickhouse-server/config.xml</p> <p>后台启动:nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml&nbsp; 1&gt;~/logs/clickhouse_std.log 2&gt;~/logs/clickhouse_err.log &amp;</p> <p>进程查看:ps -aux | grep clickhouse 、netstat -nltp | grep clickhouse</p> <p>如果报错:</p> <p style="text-align:center;"><img alt="" height="272" src="https://img-blog.csdnimg.cn/20210603231343635.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1l1YW5fQ1NERg==,size_16,color_FFFFFF,t_70" width="1200"></p> <p>解决方案:修改安装目录的权限!,默认使用clickhouse用户!命令为:</p> <p>cd /var/lib/、chown -R root:root clickhouse</p> <p>客户端启动:clickhouse-client --port 端口号。 在/etc/clickhouse-server/config.xml中的&lt;tcp_port&gt;9977&lt;/tcp_port&gt;</p> <h3><a name="t18"></a>3.2.2集群启动</h3> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.添加配置文件/etc/metrika.xml。分发到CK所在的服务器。如下所示:</p> <pre data-index="0" class="set-code-hide" name="code"><code class="language-XML hljs"><ol class="hljs-ln" style="width:1178px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;<span class="hljs-name">yandex</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">clickhouse_remote_servers</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">&lt;!-- 3分片1副本 --&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">perftest_3shards_1replicas</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">shard</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">&lt;!-- 数据自动同步 --&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">internal_replication</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">internal_replication</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">replica</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">host</span>&gt;</span>hadoop1<span class="hljs-tag">&lt;/<span class="hljs-name">host</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>9977<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">replica</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">shard</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">shard</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">replica</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">internal_replication</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">internal_replication</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">host</span>&gt;</span>hadoop2<span class="hljs-tag">&lt;/<span class="hljs-name">host</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>9977<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">replica</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">shard</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">shard</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">internal_replication</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">internal_replication</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">replica</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">host</span>&gt;</span>hadoop3<span class="hljs-tag">&lt;/<span class="hljs-name">host</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>9977<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">replica</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">shard</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">perftest_3shards_1replicas</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">clickhouse_remote_servers</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">&lt;!--zookeeper相关配置--&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">zookeeper-servers</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">node</span> <span class="hljs-attr">index</span>=<span class="hljs-string">"1"</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">host</span>&gt;</span>hadoop1<span class="hljs-tag">&lt;/<span class="hljs-name">host</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>2181<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">node</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">node</span> <span class="hljs-attr">index</span>=<span class="hljs-string">"2"</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">host</span>&gt;</span>hadoop2<span class="hljs-tag">&lt;/<span class="hljs-name">host</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>2181<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">node</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">node</span> <span class="hljs-attr">index</span>=<span class="hljs-string">"3"</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">host</span>&gt;</span>hadoop3<span class="hljs-tag">&lt;/<span class="hljs-name">host</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>2181<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">node</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">zookeeper-servers</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">&lt;!-- 配置文件中macros若省略,则建复制表时每个分片需指定zookeeper路径及副本名称,同一分片上路径相同,副本名称不同;若不省略需每个分片不同配置 --&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">macros</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">replica</span>&gt;</span>hadoop2<span class="hljs-tag">&lt;/<span class="hljs-name">replica</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">macros</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">networks</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">ip</span>&gt;</span>::/0<span class="hljs-tag">&lt;/<span class="hljs-name">ip</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="53"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">networks</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="54"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">&lt;!-- 配置压缩 --&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="56"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">clickhouse_compression</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="57"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">case</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="58"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">min_part_size</span>&gt;</span>10000000000<span class="hljs-tag">&lt;/<span class="hljs-name">min_part_size</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="59"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">min_part_size_ratio</span>&gt;</span>0.01<span class="hljs-tag">&lt;/<span class="hljs-name">min_part_size_ratio</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="60"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">method</span>&gt;</span>lz4<span class="hljs-tag">&lt;/<span class="hljs-name">method</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="61"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">case</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="62"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">clickhouse_compression</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="63"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="64"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;/<span class="hljs-name">yandex</span>&gt;</span></div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7365&quot;}"><img class="look-more-preCode contentImg-no-view" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png" alt="" title=""></span></div><div class="hljs-button {2}" data-title="复制" onclick="hljs.copyCode(event)"></div></pre> <p>&nbsp; &nbsp; &nbsp; &nbsp; 注意其中标签&lt;macros&gt;,不同服务器上的配置不一样。&nbsp;</p> <pre data-index="1"><code class="language-XML hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;<span class="hljs-name">macros</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">shard</span>&gt;</span>01<span class="hljs-tag">&lt;/<span class="hljs-name">shard</span>&gt;</span> <span class="hljs-comment">&lt;!-- 不用机器放的分片数不一样 --&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">replica</span>&gt;</span>rep_1_1<span class="hljs-tag">&lt;/<span class="hljs-name">replica</span>&gt;</span> <span class="hljs-comment">&lt;!-- 不同机器放的副本数不一样,这里表示分片一的第一个副本 --&gt;</span> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;/<span class="hljs-name">macros</span>&gt;</span></div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" onclick="hljs.copyCode(event)"></div></pre> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;手动创建可以直接被使用。这个是因为/etc/clickhouse-server/config.xml该配置文件有默认指定/etc/metrika.xml。如下,如果有需要修改,可添加:&lt;include_from&gt;...&lt;/include_from&gt;来手动指定路径。</p> <p><img alt="" height="78" src="https://img-blog.csdnimg.cn/6af316f6dbf54a59bec288d3d3e5dba5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWXVhbl9DU0RG,size_20,color_FFFFFF,t_70,g_se,x_16" width="904"></p> <p>&nbsp; &nbsp; &nbsp; &nbsp; 启动服务后,发现指定的集群无效,需要在/etc/clickhouse-server/config.xml文件中指定如下:</p> <pre data-index="2"><code class="language-XML hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;<span class="hljs-name">remote_servers</span> <span class="hljs-attr">incl</span>=<span class="hljs-string">"clickhouse_remote_servers"</span> /&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;<span class="hljs-name">zookeeper</span> <span class="hljs-attr">incl</span>=<span class="hljs-string">"zookeeper-servers"</span> <span class="hljs-attr">optional</span>=<span class="hljs-string">"true"</span> /&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;<span class="hljs-name">macros</span> <span class="hljs-attr">incl</span>=<span class="hljs-string">"macros"</span> <span class="hljs-attr">optional</span>=<span class="hljs-string">"true"</span> /&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;<span class="hljs-name">compression</span> <span class="hljs-attr">incl</span>=<span class="hljs-string">"clickhouse_compression"</span> <span class="hljs-attr">optional</span>=<span class="hljs-string">"true"</span> /&gt;</span></div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" onclick="hljs.copyCode(event)"></div></pre> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;启动zookeeper与CK服务端,可参照上面的检查启动是否OK:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zkServer.sh start</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml&nbsp; 1&gt;~/logs/clickhouse_std.log 2&gt;~/logs/clickhouse_err.log &amp;</p> <p></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.客户端连接:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clickhouse-client --host hadoop1 --port 9977 -m&nbsp; &nbsp;--user=bigdata&nbsp; --password=bigdata</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-m如果设定,允许多行查询。</p> <p><span style="color:#f33b45;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意集群的使用:</span></p> <p><span style="color:#f33b45;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果创建了一张表,这张表的引擎是分布式的引擎,那么这个表所存储在那个集群里面的机器,就是一个集群了。每个clickhouse中的部分表是单机的,部分表是分布式的。</span></p> <p><span style="color:#f33b45;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;普通建表语句都是单机的。创建分布式才会在所有节点都可以显示。</span></p> <p><span style="color:#f33b45;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create database if not exists mydb on cluster perftest_3shards_1replicas</span></p> <p></p> <p>3.设置连接用户名密码:vim /etc/clickhouse-server/users.xml 复制到所有节点</p> <pre data-index="3"><code class="language-XML hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;<span class="hljs-name">bigdata</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>bigdata<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">networks</span> <span class="hljs-attr">incl</span>=<span class="hljs-string">"networks"</span> <span class="hljs-attr">replace</span>=<span class="hljs-string">"replace"</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">ip</span>&gt;</span>::/0<span class="hljs-tag">&lt;/<span class="hljs-name">ip</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;/<span class="hljs-name">networks</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">profile</span>&gt;</span>default<span class="hljs-tag">&lt;/<span class="hljs-name">profile</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag">&lt;<span class="hljs-name">quota</span>&gt;</span>default<span class="hljs-tag">&lt;/<span class="hljs-name">quota</span>&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-tag">&lt;/<span class="hljs-name">bigdata</span>&gt;</span></div></div></li></ol></code><div class="hljs-button {2}" data-title="复制" onclick="hljs.copyCode(event)"></div></pre> <h1><a name="t19"></a>4.卸载 clickhouse</h1> <ol><li>查询是否安装 clickhouse:rpm -qa | grep clickhouse</li><li>卸载 clickhouse:rpm -e clickhouse-client-20.5.4.40-2.noarch --nodeps、rpm -e clickhouse-server-20.5.4.40-2.noarch --nodeps、rpm -e clickhouse-common-static-20.5.4.40-2.x86_64 --nodeps</li><li>删除数据目录:rm -rf /var/lib/clickhouse</li><li>删除集群配置文件:rm -rf /etc/metrika.xml</li><li>删除配置文件:rm -rf /etc/clickhouse-*</li><li>删除日志文件:rm -rf /var/log/clickhouse-server</li><li>删除 zookeeper 上 clickhouse 的数据:rmr /clickhouse</li><li>也可以进行全局寻找:然后执行删除操作:find / -name 'clickhouse'</li></ol> <p></p> <h1><a name="t20"></a>5.ClickHouse一些信息总结</h1> <ul><li>配置文件路径:/etc/clickhouse-server/config.xml</li><li>日志文件路径:/var/log/clickhouse-server/</li><li>建表信息路径:/var/lib/clickhouse/metadata/</li><li>表数据路径:/var/lib/clickhouse/data/</li></ul> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> </div><div><div></div></div> </div>