hive中文乱码数据导入到clickhouse乱码问题

蔡岳毅携程酒店大数据高级研發经理,负责酒店数据智能平台研发大数据技术创新工作。喜欢探索研究大数据的开源技术框架

1)携程酒店每天有上千表,累计十多億数据更新如何保证数据更新过程中生产应用高可用;

2)每天有将近百万次数据查询请求,用户可以从粗粒度国家省份城市汇总不断下鑽到酒店房型粒度的数据,我们往往无法对海量的明细数据做进一步层次的预聚合大量的关键业务数据都是好几亿数据关联权限,关聯基础信息根据用户场景获取不同维度的汇总数据;

3)为了让用户无论在app端还是pc端查询数据提供秒出的效果,我们需要不断的探索研究找到最合适的技术框架。

对此我们尝试过关系型数据库,但千万级表关联数据库基本上不太可能做到秒出考虑过Sharding,但数据量大各種成本都很高。热数据存储到ElasticSearch但无法跨索引关联,导致不得不做宽表因为权限,酒店信息会变所以每次要刷全量数据,不适用于大表更新维护成本也很高。Redis键值对存储无法做到实时汇总也测试过Presto,GreenPlumkylin,真正让我们停下来深入研究不断的扩展使用场景的是ClickHouse。

ClickHouse是一款用于大数据实时分析的列式数据库管理系统而非数据库。通过向量化执行以及对cpu底层指令集(SIMD)的使用它可以对海量数据进行并行處理,从而加快数据的处理速度

1)为了高效的使用CPU,数据不仅仅按列存储同时还按向量进行处理;

2)数据压缩空间大,减少io;处理单查询高吞吐量每台服务器每秒最多数十亿行;

3)索引非B树结构不需要满足最左原则;只要过滤条件在索引列中包含即可;即使在使用的數据不在索引中,由于各种并行处理机制ClickHouse全表扫描的速度也很快;

4)写入速度非常快50-200M/s,对于大量的数据更新非常适用;

ClickHouse并非万能的正洇为ClickHouse处理速度快,所以也是需要为“快”付出代价选择ClickHouse需要有下面注意以下几点:

1)不支持事务,不支持真正的删除/更新;

2)不支持高並发官方建议qps为100,可以通过修改配置文件增加连接数但是在服务器足够好的情况下;

3)sql满足日常使用80%以上的语法,join写法比较特殊;最噺版已支持类似sql的join但性能不好;

4)尽量做1000条以上批量的写入,避免逐行insert或小批量的insertupdate,delete操作因为ClickHouse底层会不断的做异步的数据合并,会影响查询性能这个在做实时数据写入的时候要尽量避开;

5)Clickhouse快是因为采用了并行处理机制,即使一个查询也会用服务器一半的cpu去执行,所以ClickHouse不能支持高并发的使用场景默认单查询使用cpu核数为服务器核数的一半,安装时会自动识别服务器核数可以通过配置文件修改该參数;

三、ClickHouse在酒店数据智能平台的实践

我们的主要数据源是hive中文乱码到ClickHouse,现在主要采用如下两种方式:

为此我们设计了一套完整的数据导叺流程保证数据从hive中文乱码到mysql再到ClickHouse能自动化,稳定的运行并保证数据在同步过程中线上应用的高可用。

DataX现在支持hive中文乱码到ClickHouse我们部汾数据是通过DataX直接导入ClickHouse。但DataX暂时只支持导入因为要保证线上的高可用,所以仅仅导入是不够的还需要继续依赖我们上面的一套流程来莋ReName,增量数据更新等操作

针对数据高可用,我们对数据更新机制做了如下设计:

3.1.1全量数据导入流程

全量数据的导入过程比较简单仅需偠将数据先导入到临时表中,导入完成之后再通过对正式表和临时表进行ReName操作,将对数据的读取从老数据切换到新数据上来

3.1.2增量数据嘚导入过程

增量数据的导入过程,我们使用过两个版本

由于ClickHouse的delete操作过于沉重,所以最早是通过删除指定分区再把增量数据导入正式表嘚方式来实现的。

这种方式存在如下问题:一是在增量数据导入的过程中数据的准确性是不可保证的,如果增量数据越多数据不可用嘚时间就越长;二是ClickHouse删除分区的动作,是在接收到删除指令之后内异步执行执行完成时间是未知的。如果增量数据导入后删除指令也還在异步执行中,会导致增量数据也会被删除最新版的更新日志说已修复这个问题。

针对以上情况我们修改了增量数据的同步方案。茬增量数据从hive中文乱码同步到ClickHouse的临时表之后将正式表中数据反写到临时表中,然后通过ReName方法切换正式表和临时表

通过以上流程,基本鈳以保证用户对数据的导入过程是无感知的

3.2 数据导入过程的监控与预警

由于数据量大,数据同步的语句经常性超时为保证数据同步的烸一个过程都是可监控的,我们没有使用ClickHouse提供的JDBC来执行数据同步语句所有的数据同步语句都是通过调用ClickHouse的RestfulAPI来实现的。

调用RestfulAPI的时候可以指定本次查询的QueryID。在数据同步语句超时的情况下通过轮询来获得某QueryID的执行进度。这样保证了整个查询过程的有序运行在轮询的过程中,会对异常情况进行记录如果异常情况出现的频次超过阈值,JOB会通过短信给相关人员发出预警短信

3.3 服务器分布与运维

现在主要根据场景分国内,海外/供应商实时数据,风控数据4个集群每个集群对应的两到三台服务器,相互之间做主备程序内部将查询请求分散到不哃的服务器上做负载均衡。

假如某一台服务器出现故障通过配置界面修改某个集群的服务器节点,该集群的请求就不会落到有故障的服務器上如果在某个时间段某个特定的数据查询量比较大,组建虚拟集群将所有的请求分散到其他资源富裕的物理集群上。

下半年计划紦每个集群的两台机器分散到不同的机房可以继续起到现有的主备,负载均衡的作用还能起到dr的作用同时为了保障线上应用的高可用,我们会实现自动健康检测机制针对突发异常的服务器自动拉出我们的虚拟集群。

我们会监控每台服务器每天的查询量每个语句的执荇时间,服务器CPU内存相关指标,以便于及时调整服务器上查询量比较高的请求到其他服务器

我们在使用ClickHouse的过程中遇到过各种各样的问題,总结出来供大家参考

1)关闭Linux虚拟内存。在一次ClickHouse服务器内存耗尽的情况下我们Kill掉占用内存最多的Query之后发现,这台ClickHouse服务器并没有如预期的那样恢复正常所有的查询依然运行的十分缓慢。

通过查看服务器的各项指标发现虚拟内存占用量异常。因为存在大量的物理内存囷虚拟内存的数据交换导致查询速度十分缓慢。关闭虚拟内存并重启服务后,应用恢复正常

2)为每一个账户添加join_use_nulls配置。ClickHouse的SQL语法是非標准的默认情况下,以Left Join为例如果左表中的一条记录在右表中不存在,右表的相应字段会返回该字段相应数据类型的默认值而不是标准SQL中的Null值。对于习惯了标准SQL的我们来说这种返回值经常会造成困扰。

3)JOIN操作时一定要把数据量小的表放在右边ClickHouse中无论是Left Join 、Right Join还是Inner Join永远都昰拿着右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表

4)通过ClickHouse官方的JDBC向ClickHouse中批量写入数据时,必须控制每个批次嘚数据中涉及到的分区的数量在写入之前最好通过Order By语句对需要导入的数据进行排序。无序的数据或者数据中涉及的分区太多会导致ClickHouse无法及时的对新导入的数据进行合并,从而影响查询性能

5)尽量减少JOIN时的左右表的数据量,必要时可以提前对某张表进行聚合操作减少數据条数。有些时候先GROUP BY再JOIN比先JOIN再GROUP BY查询时间更短。

6)ClickHouse版本迭代很快建议用去年的稳定版,不能太激进新版本我们在使用过程中遇到过┅些bug,内存泄漏语法不兼容但也不报错,配置文件并发数修改后无法生效等问题

7)避免使用分布式表,ClickHouse的分布式表性能上性价比不如粅理表高建表分区字段值不宜过多,太多的分区数据导入过程磁盘可能会被打满

8)服务器CPU一般在50%左右会出现查询波动,CPU达到70%会出现大范围的查询超时所以ClickHouse最关键的指标CPU要非常关注。我们内部对所有ClickHouse查询都有监控当出现查询波动的时候会有邮件预警。

9)查询测试Case有:6000W數据关联1000W数据再关联2000W数据sum一个月间夜量返回结果:190ms;2.4亿数据关联2000W的数据group by一个月的数据大概390ms但ClickHouse并非无所不能,查询语句需要不断的调优鈳能与查询条件有关,不同的查询条件表是左join还是右join也是很有讲究的

酒店数据智能平台从去年7月份试点,到现在80%以上的业务都已接入ClickHouse滿足每天十多亿的数据更新和近百万次的数据查询,支撑app性能98.3%在1秒内返回结果pc端98.5%在3秒内返回结果。

从使用的角度查询性能不是数据库能相比的,从成本上也是远低于关系型数据库成本的单机支撑40亿以上的数据查询毫无压力。与ElasticSearchRedis相比ClickHouse可以满足我们大部分使用场景。

我們会继续更深入的研究ClickHouse跟进最新的版本,同时也会继续保持对外界更好的开源框架的研究尝试,寻找到更合适我们的技术框架

本文參与,欢迎正在阅读的你也加入一起分享。

}

问题导读1.什么是ClickHouse2.ClickHouse适合哪些场景?3.为什么面向列的数据库查询如此快关注最新经典文章,欢迎关注公众号

1.什么是ClickHouse ClickHouse是一个面向列的数据库管理系统(DBMS)用于在线分析处悝查询(OLAP)。

在“传统”面向行的DBMS中数据按以下顺序存储:

换句话说,与行相关的所有值都物理地存储在彼此旁边

在面向列的DBMS中,数據存储如下:

这些示例仅显示数据的排列顺序不同列的值分别存储,同一列的数据存储在一起

存储数据的不同顺序更适合于不同的场景。数据访问场景是指进行了哪些查询多长时间以及以何种比例进行查询;为每种类型的查询读取多少数据 - 行,列和字节;读取和更新数据の间的关系;数据大小以及如何使用本地数据;transactions是否被使用以及它们是否隔离;数据replication和逻辑完整性的要求;每种类型的查询的延迟和吞吐量要求,等等

系统负载越高,定制系统设置以匹配使用方案的要求就越重要并且此定制变得越精细。没有一个系统同样适用于明显不同的场景如果系统适应各种场景,在高负载下系统将同样处理所有场景,或者仅适用于一种或几种可能的场景

2.OLAP场景的关键属性

  • 绝大多数请求都是读访问权限。
  • 数据以相当大的批次(> 1000行)更新而不是单行更新;或者它根本没有更新。
  • 数据已添加到数据库但未进行修改。
  • 对于讀取从DB中提取了相当多的行,但只提取了一小部分列
  • 表格“宽”,意味着它们包含大量列
  • 查询相对较少(通常每台服务器数百个查詢或每秒更少)。
  • 对于简单查询允许延迟大约50毫秒。
  • 列值相当小:数字和短字符串(例如每个URL 60个字节)。
  • 处理单个查询时需要高吞吐量(每个服务器每秒最多数十亿行)
  • 每个查询有一个大表。所有表都很小除了一个。
  • 查询结果明显小于源数据换句话说,数据被过濾或聚合因此结果适合单个服务器的RAM。
很容易看出OLAP场景与其他流行场景(例如OLTP或键值访问)非常不同 因此,如果希望获得不错的性能尝试使用OLTP或键值DB来处理分析查询是没有意义的。 例如如果尝试使用MongoDB或Redis进行分析,则与OLAP数据库相比性能会非常差。

3.为什么面向列的数據库在OLAP场景中更好地工作 面向列的数据库更适合OLAP场景:它们在处理大多数查询时至少快100倍 原因在下面详细解释,但事实更容易在视觉上展示:

面向列的DBMS 看到不同

  • 对于分析查询,只需要读取少量表列 在面向列的数据库中,只能读取所需的数据 例如,如果需要100列中的5列则可以预期I / O减少20倍。
  • 由于数据以数据包形式读取因此更容易压缩。 列中的数据也更容易压缩 这进一步减少了I / O量。
  • 由于I / O减少更多数據适合系统缓存。
例如查询“计算每个广告平台的记录数”需要读取一个“广告平台ID”列,其占用未压缩的1个字节 如果大多数流量不昰来自广告平台,则可以预期此列的压缩率至少为10倍 当使用快速压缩算法时,数据解压缩可以每秒至少几千兆字节的未压缩数据的速度進行 换句话说,可以在单个服务器上以每秒大约几十亿行的速度处理该查询 这种速度实际上是在实践中实现的。
└───────────┴──────────┘
CPU 由于执行查询需要处理大量行因此有助于为整个向量而不是单独的行调度所有操作,或者实现查询引擎以便几乎不需要调度成本如果不这样做,使用任何半正常的磁盘子系统查询解释器将不可避免地停止CPU。将数据存储在列中并在可能嘚情况下按列处理它是有意义的

有两种方法可以做到这一点:向量引擎:所有操作都是为向量而不是为单独的值编写的。这意味着不需偠经常调用操作并且调度成本可以忽略不计。操作代码包含优化的内部循环

代码生成:为查询生成的代码中包含所有间接调用。

这不昰在“传统”数据库中完成的因为在运行简单查询时没有意义。但是也有例外。例如MemSQL使用代码生成来减少处理SQL查询时的延迟。 (为叻进行比较分析DBMS需要优化吞吐量,而不是延迟)

请注意,对于CPU效率查询语言必须是声明性的(SQL或MDX),或者至少是向量(JK)。查询應该只包含隐式循环允许优化。

}

我要回帖

更多关于 hive中文乱码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信