阿里云 E-MapReduce(简称EMR)是运行在阿里云平台上的一种大数据处理的系统解决方案。ClickHouse 作为开源的列式存储数据库,主要用于在线分析处理查询(OLAP),能够使用 SQL 查询实时生成分析数据报告。而阿里云 EMR ClickHouse 则提供了开源 OLAP 分析引擎 ClickHouse 的云上托管服务。
本系列文章将从以下几个方面详细介绍 EMR ClickHouse 的操作指南:
- ClickHouse 概述
- 快速入门 (本文)
- ClickHouse 运维
- 数据导入
- 常见问题
EMR ClickHouse 操作指南 — 快速入门
一、创建集群
——创建 ClickHouse 集群的详细操作步骤和相关配置。
前提条件
已在目标地域创建一个专有网络和交换机,详情请参见 使用专有网络 和 使用交换机 。
背景信息
机型、内存和磁盘的设置,请参见 Usage Recommendations。
操作步骤
- 进入创建集群页面。
- 登录 阿里云E-MapReduce控制台。
- 在顶部菜单栏处,根据实际情况选择地域和资源组。
- 地域:创建的集群将会在对应的地域内,一旦创建不能修改。
- 资源组:默认显示账号全部资源。
- 单击创建集群,进行创建。
- 配置集群信息。
创建集群时,您需要对集群进行软件配置、硬件配置和基础配置。
注意:集群创建完成后,除了集群名称以外,其他配置均无法修改,所以在创建时请仔细确认各项配置。
- 软件配置
配置项 | 说明 |
集群类型 | 选择 ClickHouse。 |
产品版本 | 默认最新的软件版本。 |
必选服务 | 默认的服务组件,后期可以在管理页面中启停服务。 |
可选服务 | 根据您的实际需求选择其他的一些组件,被选中的组件会默认启动相关的服务进程。 说明 组件越多,对机器的配置要求也越高,所以在下面的步骤中您需要根据实际的组件数量进行机器选型,否则可能没有足够的资源运行这些服务。 |
高级设置 | 软件自定义配置:可指定 JSON 文件对集群中的基础软件(例如Hadoop、Spark 和 Hive 等)进行配置,详细使用方法请参见软件配置。默认不开启。 |
- 硬件配置
区域 | 配置项 | 说明 |
付费类型 | 付费类型 | 默认包年包月。当前支持的付费类型如下:
|
网络配置 | 可用区 | 可用区为在同一地域下的不同物理区域,可用区之间内网互通。通常使用默认的可用区即可。 |
网络类型 | 默认专有网络。 | |
VPC | 选择在该地域的VPC。如果没有可用的VPC,单击创建VPC/子网(交换机)前往新建。 | |
交换机 | 选择在对应 VPC 下可用区的交换机,如果在这个可用区没有可用的交换机,则需要新创建一个。 | |
安全组名称 |
注意: 禁止使用 ECS 上创建的企业安全组。 您可以直接输入安全组名称来新建一个安全组。如果已有在使用的安全组,则可以直接选择使用。安全组详情请参见 安全组概述。 |
|
实例 | 选型配置 | 您可以根据需要选择实例规格,详情请参见实例规格族。
|
- 基础配置
在基础信息区域,配置如下参数。
注意: 暂不支持高级配置区域的参数,因此请勿设置。
配置项 | 说明 |
集群名称 | 集群的名字,长度限制为1~64个字符,仅可使用中文、字母、数字、中划线(-)和下划线(_)。 |
Shard数量 | 分片的数量。不支持修改。 说明: 创建集群时,Shard 数量会被自动计算, |
Replica数量 |
副本的数量。默认为2。 说明: 如果需要保证 ClickHouse 集群的高可用,Replica数量至少为2。 |
挂载公网 |
集群是否挂载弹性公网IP地址,默认不开启。 说明: 不开启挂载公网,将无法使用EMR控制台访问链接与端口功能查看开源组件的 Web UI。 |
密钥对 | 关于密钥对的使用详情请参见 SSH密钥对。 |
登录密码 | 设置 Master 节点的登录密码,密码规则:8~30个字符,且必须同时包含大写字母、小写字母、数字和特殊字符。 特殊字符包括:感叹号(!)、at(@)、井号(#)、美元符号($)、百分号(%)、乘方(^)、and(&)和星号(*)。 |
说明: 页面右边会显示您所创建集群的配置清单以及集群费用。根据不同的付费类型,展示不同的价格信息。
- 选中 E-MapReduce 服务条款复选框。
- 单击创建。创建集群后可以通过刷新页面来查看进度,当集群状态显示为空闲时,集群创建成功。
二、快速使用 ClickHouse
——快速将数据随机写入 ClickHouse 集群各个节点的本地表
前提条件
已创建 ClickHouse 集群,详情参见上文。
操作步骤
- 使用 SSH 方式登录 ClickHouse 集群,详情请参见登录集群。
- 执行以下命令,下载官方样例数据集。
curl https://datasets.clickhouse.tech/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
- 执行如下命令,启动 ClickHouse 客户端。
clickhouse-client
您也可以使用默认的 default 用户启动 ClickHouse 客户端。
clickhouse-client -u default --password
说明: 因为默认密码为空,所以直接按回车键,即可启动 ClickHouse 客户端。
- 执行如下命令,创建数据库。
可以使用 on ClUSTER 参数在集群的所有节点创建数据库, 默认集群标识为cluster_emr。
CREATE DATABASE IF NOT EXISTS demo on CLUSTER cluster_emr
返回信息如下所示。
- 在集群上的所有节点创建一张复制表(Replicated表)。
复制表(Replicated表)会根据副本的个数,实现数据的多副本,并实现数据的最终一致性。
CREATE TABLE demo.hits_local ON CLUSTER cluster_emr ( `WatchID` UInt64, `JavaEnable` UInt8, `Title` String, `GoodEvent` Int16, `EventTime` DateTime, `EventDate` Date, `CounterID` UInt32, `ClientIP` UInt32, `ClientIP6` FixedString(16), `RegionID` UInt32, `UserID` UInt64, `CounterClass` Int8, `OS` UInt8, `UserAgent` UInt8, `URL` String, `Referer` String, `URLDomain` String, `RefererDomain` String, `Refresh` UInt8, `IsRobot` UInt8, `RefererCategories` Array(UInt16), `URLCategories` Array(UInt16), `URLRegions` Array(UInt32), `RefererRegions` Array(UInt32), `ResolutionWidth` UInt16, `ResolutionHeight` UInt16, `ResolutionDepth` UInt8, `FlashMajor` UInt8, `FlashMinor` UInt8, `FlashMinor2` String, `NetMajor` UInt8, `NetMinor` UInt8, `UserAgentMajor` UInt16, `UserAgentMinor` FixedString(2), `CookieEnable` UInt8, `JavascriptEnable` UInt8, `IsMobile` UInt8, `MobilePhone` UInt8, `MobilePhoneModel` String, `Params` String, `IPNetworkID` UInt32, `TraficSourceID` Int8, `SearchEngineID` UInt16, `SearchPhrase` String, `AdvEngineID` UInt8, `IsArtifical` UInt8, `WindowClientWidth` UInt16, `WindowClientHeight` UInt16, `ClientTimeZone` Int16, `ClientEventTime` DateTime, `SilverlightVersion1` UInt8, `SilverlightVersion2` UInt8, `SilverlightVersion3` UInt32, `SilverlightVersion4` UInt16, `PageCharset` String, `CodeVersion` UInt32, `IsLink` UInt8, `IsDownload` UInt8, `IsNotBounce` UInt8, `FUniqID` UInt64, `HID` UInt32, `IsOldCounter` UInt8, `IsEvent` UInt8, `IsParameter` UInt8, `DontCountHits` UInt8, `WithHash` UInt8, `HitColor` FixedString(1), `UTCEventTime` DateTime, `Age` UInt8, `Sex` UInt8, `Income` UInt8, `Interests` UInt16, `Robotness` UInt8, `GeneralInterests` Array(UInt16), `RemoteIP` UInt32, `RemoteIP6` FixedString(16), `WindowName` Int32, `OpenerName` Int32, `HistoryLength` Int16, `BrowserLanguage` FixedString(2), `BrowserCountry` FixedString(2), `SocialNetwork` String, `SocialAction` String, `HTTPError` UInt16, `SendTiming` Int32, `DNSTiming` Int32, `ConnectTiming` Int32, `ResponseStartTiming` Int32, `ResponseEndTiming` Int32, `FetchTiming` Int32, `RedirectTiming` Int32, `DOMInteractiveTiming` Int32, `DOMContentLoadedTiming` Int32, `DOMCompleteTiming` Int32, `LoadEventStartTiming` Int32, `LoadEventEndTiming` Int32, `NSToDOMContentLoadedTiming` Int32, `FirstPaintTiming` Int32, `RedirectCount` Int8, `SocialSourceNetworkID` UInt8, `SocialSourcePage` String, `ParamPrice` Int64, `ParamOrderID` String, `ParamCurrency` FixedString(3), `ParamCurrencyID` UInt16, `GoalsReached` Array(UInt32), `OpenstatServiceName` String, `OpenstatCampaignID` String, `OpenstatAdID` String, `OpenstatSourceID` String, `UTMSource` String, `UTMMedium` String, `UTMCampaign` String, `UTMContent` String, `UTMTerm` String, `FromTag` String, `HasGCLID` UInt8, `RefererHash` UInt64, `URLHash` UInt64, `CLID` UInt32, `YCLID` UInt64, `ShareService` String, `ShareURL` String, `ShareTitle` String, `ParsedParams` Nested(Key1 String,Key2 String,Key3 String,Key4 String,Key5 String,ValueDouble Float64), `IslandID` FixedString(16), `RequestNum` UInt32, `RequestTry` UInt8 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/hits_local', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID)
说明: {shard}和{replica}是阿里云EMR为ClickHouse集群自动生成的宏定义,可以直接使用。
返回信息如下图所示。
- 执行以下命令,创建分布式(Distributed)表。
分布式表不存储数据,仅仅是底层表的一个View,但可以在多个服务器上进行分布式查询。本例中使用随机函数rand(),表示数据会随机写入各个节点的本地表。
CREATE TABLE demo.hits_all on CLUSTER cluster_emr AS demo.hits_local ENGINE = Distributed(cluster_emr, demo, hits_local, rand())
- 退出 ClickHouse 客户端,在样例数据的目录下执行以下命令,导入数据。
clickhouse-client --query "INSERT INTO demo.hits_all FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv
- 重新启动 ClickHouse 客户端,查看数据。
因为数据是随机写入的,各节点数据量可能不同。
- 查看 emr-header-1 节点 demo.hits_all 的数据量。
select count(*) from demo.hits_all
返回信息如下。
- 查看 emr-header-1 节点 demo.hits_local 的数据量。
select count(*) from demo.hits_local
返回信息如下。
- 查看 emr-worker-1 节点 demo.hits_local 的数据量。
说明: 其余节点,您也可以按照以下步骤来查看 demo.hits_local 的数据量。
-
执行以下命令,在 Master 节点切换到 hadoop 账号。
su hadoop -
执行以下命令,切换到 emr-worker-1 节点。
ssh emr-worker-1 - 执行以下命令,查看 demo.hits_local 的数据量。
-
执行以下命令,在 Master 节点切换到 hadoop 账号。
select count(*) from demo.hits_local
返回信息如下。
三、访问模式
访问 E-MapReduce(简称EMR)上的 ClickHouse 集群支持通过原生 JDBC 访问和通过负载均衡 SLB 访问两种方式
背景信息
- 通过原生 JDBC 访问 ClickHouse 集群的架构图如下:
- 通过负载均衡器 SLB 访问 ClickHouse 集群的架构图如下:
前提条件
- 已创建 E-MapReduce 的 ClickHouse 集群,详情请参见前文。
- 已创建 SLB 服务,详情请参见创建实例。
注意: 如果是想通过负载均衡器SLB访问ClickHouse集群,则需要创建SLB服务。并且在创建SLB服务时,如果实例类型选择的是私网,则在选择专有网络时,必须选择与EMR ClickHouse集群相同的VPC。
通过原生 JDBC 访问 ClickHouse 集群
- 获取主机的IP地址。
- 登录 阿里云E-MapReduce控制台。
- 在顶部菜单栏处,根据实际情况选择地域和资源组。
- 单击上方的集群管理页签。
- 在集群管理页面,单击相应集群所在行的详情。
- 在左侧导航栏,单击主机列表。在此页面您可以查看ClickHouse集群的IP地址。
- 配置JDBC以访问ClickHouse集群,详情请参见ClickHouse JDBC driver。
通过负载均衡器 SLB 访问 ClickHouse 集群
- 配置 SLB 服务,详情请参见配置实例。
通常情况下,ClickHouse 使用 SLB 服务仅需要配置 HTTP 及 TCP 两种协议的监听,如果您有需要,也可以配置HTTPS的监听。配置监听详情,请参见 添加TCP监听、添加HTTP监听 和 添加HTTPS监听 。
- 注意:
- TCP监听所使用的虚拟服务器组,其端口应为ClickHouse通过TCP连接到服务器的端口,默认为9000。您可以在EMR控制台ClickHouse服务的配置页面,在搜索区域搜索tcp_port参数,参数值即为TCP端口。
- HTTP监听所使用的虚拟服务器组,其端口应为ClickHouse通过HTTP连接到服务器的端口,默认为8123。您可以在EMR控制台ClickHouse服务的配置页面,在搜索区域搜索http_port参数,参数值即为HTTP端口。
- 在实例管理页面,获取 SLB 的服务地址
- 配置 JDBC 以访问 ClickHouse 集群,详情请参见ClickHouse JDBC driver。
后续
您已经学习了 ClickHouse 快速入门,本系列还包括其他内容:
- ClickHouse 概述
- ClickHouse 运维
- 数据导入
- 常见问题
获取更详细的 EMR ClickHouse 相关信息,可至产品文档页查看:
https://help.aliyun.com/document_detail/212195.html
扫描下方二维码加入 EMR 相关产品钉钉交流群一起参与讨论吧!