鲲鹏+麒麟V10源码编译ClickHouse 21.8.14实战指南
简介面向国产化信创环境的大数据从业者与运维工程师这份资源提供在华为鲲鹏920aarch64架构与麒麟V10操作系统上编译完成的ClickHouse 21.8.14安装包解决ARM平台下OLAP数据库部署时编译器兼容、库依赖与性能调优等难题。压缩包共20个文件约115.69MB以可执行二进制程序为主涵盖clickhouse-server、clickhouse-client、clickhouse-keeper、clickhouse-copier、clickhouse-benchmark等核心组件另附config.xml、users.xml配置文件及install.sh、uninstall.sh一键安装与卸载脚本并集成clickhouse-server.service系统服务单元便于开机自启。已有2147人学习下载。借助现成二进制与脚本读者可跳过源码编译环节在麒麟V10上快速完成依赖检查、用户创建、目录配置与服务注册直接投入建表、导入数据、SQL查询与性能监控等实际分析工作为自主可控环境下的大数据处理提供可复用的部署基础。1. 鲲鹏麒麟V10上装ClickHouse 21.8.14为什么源码编译是唯一的路在鲲鹏服务器上装 ClickHouse如果你习惯性打开终端敲下apt-get install clickhouse-server或者去官网下个 x86_64 的 tgz 包直接解压大概率会在启动那一刻看到一行冷冰冰的Exec format error。这不是配置写错了是 CPU 架构根本不匹配——鲲鹏是 ARM64aarch64而 ClickHouse 官方长期只提供 x86_64 的预编译二进制。更麻烦的是麒麟 V10 操作系统基于国产内核深度定制glibc 版本、依赖库路径和主流发行版都有差异即便找到 ARM 版通用包也未必能在这套系统上跑稳。所以在鲲鹏麒麟 V10 这个组合下源码编译几乎是唯一能让你拿到一个可控、可调试、可长期运行的 ClickHouse 21.8.14 的方式。这篇笔记记录的就是我从零编译到验证跑通的完整过程适合正在国产化环境里部署 OLAP 组件的运维和开发也适合第一次接触 ARM 交叉编译、想少走弯路的同行。2. 编译前环境准备鲲鹏架构下的依赖清单与版本锁定2.1 确认系统架构与内核版本动手之前先别急着装依赖把底子摸清楚。很多编译失败不是缺库而是系统信息没对齐导致后面 CMake 找错了路径。# 确认 CPU 架构必须输出 aarch64 uname -m # 查看麒麟 V10 的具体版本和内核 cat /etc/kylin-release uname -r # 查看 glibc 版本ClickHouse 21.8 对 glibc 有最低要求 ldd --version | head -1uname -m输出aarch64说明是 ARM64 环境如果输出x86_64那说明你连错机器了。/etc/kylin-release里一般会标明是 V10 SP1 还是 SP2SP2 的 glibc 通常更新一些编译时遇到的兼容问题会少。ldd --version看 glibc 版本21.8.14 这个版本建议 glibc 不低于 2.28麒麟 V10 默认满足但如果之前有人手动升级过系统库这里要特别留意。2.2 安装编译工具链与核心依赖麒麟 V10 的软件源里包不算新但编译 ClickHouse 21.8.14 够用了。我一般会一次性把下面这组依赖装齐避免编译到一半报缺库再回头补。# 更新源并安装基础编译工具 sudo yum install -y gcc gcc-c cmake3 ninja-build git wget # 安装 ClickHouse 编译所需的开发库 sudo yum install -y openssl-devel zlib-devel libicu-devel \ libxml2-devel readline-devel ncurses-devel \ python3-devel ccache # 确认 cmake 版本21.8 要求 cmake 3.10 cmake3 --version这里有几个点值得展开。cmake3在麒麟源里是独立包直接敲cmake可能指向旧版本所以后面所有 CMake 命令我都用cmake3。ccache不是必须的但源码编译 ClickHouse 动辄一两个小时加上它第二次编译能省一半时间属于后悔药级别的工具。libicu-devel是处理字符集和排序规则的缺了它编译到一半会报 ICU 相关错误而且这个错误往往出现在编译后期非常浪费时间。2.3 调整系统参数与创建编译用户ClickHouse 编译过程对文件句柄数和内存有一定要求尤其是链接阶段。另外不建议直接用 root 编译权限太宽容易把系统库路径搞乱。# 临时提高文件句柄限制 ulimit -n 65535 # 创建专用编译用户 sudo useradd -m -s /bin/bash chbuilder sudo passwd chbuilder # 切换到编译用户 su - chbuilderulimit -n只对当前会话生效如果编译中途断开重连记得重新执行。专用用户chbuilder的好处是编译产物都在它自己的 home 目录下不会污染系统路径后面清理也方便。如果团队里多人维护建议把这个用户的 home 目录放在独立分区避免编译临时文件把根分区撑满。3. 获取源码与配置编译参数从 git clone 到 cmake 生成3.1 拉取 ClickHouse 21.8.14 源码ClickHouse 的源码仓库比较大直接 clone 完整历史会非常慢。我一般用浅克隆加指定 tag 的方式只拿需要的版本。# 浅克隆指定分支减少下载量 git clone --branch v21.8.14.5-lts --depth 1 \ https://github.com/ClickHouse/ClickHouse.git # 进入源码目录 cd ClickHouse # 确认当前 commit 和 tag git log --oneline -1 git describe --tags--branch v21.8.14.5-lts对应的是 21.8 系列的 LTS 版本--depth 1表示只拉取最近一次提交不下载完整历史。如果你所在网络对 GitHub 访问不稳定可以先用wget下载对应版本的 tar.gz 包再解压效果一样。git describe --tags用来确认你拿到的确实是 21.8.14 相关版本避免拉错分支。3.2 配置 CMake 编译选项ClickHouse 的 CMake 选项很多但在鲲鹏麒麟这个场景下真正需要关注的就那么几个。下面是我在多次编译后固定下来的一套配置。# 创建独立编译目录保持源码目录干净 mkdir -p build cd build # 执行 cmake 配置 cmake3 .. \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/usr/local/clickhouse \ -DENABLE_TESTSOFF \ -DENABLE_UTILSON \ -DUSE_INTERNAL_SSL_LIBRARYON \ -DUSE_INTERNAL_ZLIB_LIBRARYON \ -DUSE_INTERNAL_ICU_LIBRARYOFF \ -DCMAKE_C_COMPILERgcc \ -DCMAKE_CXX_COMPILERg \ -DCMAKE_CXX_FLAGS-marcharmv8-a -O2逐项说明一下。CMAKE_BUILD_TYPERelease是必须的Debug 版本编译更慢且运行性能差。CMAKE_INSTALL_PREFIX指定安装路径我习惯放在/usr/local/clickhouse和系统包管理器隔离。ENABLE_TESTSOFF关掉测试用例编译能省大量时间。USE_INTERNAL_SSL_LIBRARYON和USE_INTERNAL_ZLIB_LIBRARYON让 ClickHouse 使用自带的 SSL 和 zlib 库避免麒麟系统库版本不匹配导致的链接错误。USE_INTERNAL_ICU_LIBRARYOFF是因为麒麟源里的 ICU 版本够用用系统的能减小二进制体积。-marcharmv8-a是针对鲲鹏处理器的优化标志如果编译报非法指令可以去掉这个参数改用默认。3.3 处理 CMake 配置阶段的常见报错CMake 配置阶段最容易出问题的就是找不到某个库或者版本不满足。下面是我遇到过的几个典型情况。# 如果报找不到 OpenSSL export OPENSSL_ROOT_DIR/usr/lib64/openssl # 如果报 Python 版本不对 export PYTHON_EXECUTABLE/usr/bin/python3 # 如果报 ccache 未找到但你又想用 export CCACHE_PATH/usr/bin/ccacheOPENSSL_ROOT_DIR在麒麟 V10 上有时需要手动指定因为 OpenSSL 的头文件和库文件可能不在 CMake 默认搜索路径里。PYTHON_EXECUTABLE指向系统 Python3ClickHouse 编译过程中会用到 Python 脚本生成一些代码。这些环境变量在重新执行cmake3之前 export 一下即可不需要写进系统配置文件。4. 编译与安装ninja 加速与产物部署4.1 启动编译并控制并发数ClickHouse 源码编译非常吃资源并发数开太大容易内存溢出开太小又慢得让人怀疑人生。我的经验是看机器内存来定。# 查看 CPU 核心数和内存 nproc free -h # 启动编译-j 后面跟并发数 ninja -j$(nproc) # 如果内存不足 32G建议降低并发 ninja -j4nproc输出的是 CPU 核心数但并发数不能直接等于核心数。ClickHouse 单个编译单元峰值内存可能到 2-3GB如果机器只有 16GB 内存-j16几乎必然触发 OOM。我一般按「内存 GB 数除以 3」来估算安全并发数。编译过程中如果看到c: fatal error: Killed signal terminated program cc1plus基本就是内存不够降低-j重新来即可ninja 会从断点继续不会从头编译。4.2 安装编译产物编译完成后安装步骤相对简单但路径和权限要处理好。# 执行安装 sudo ninja install # 查看安装目录结构 ls -lh /usr/local/clickhouse/ ls -lh /usr/local/clickhouse/bin/安装完成后/usr/local/clickhouse/bin/下应该有clickhouse这个主程序/usr/local/clickhouse/etc/下会有默认配置文件。如果bin目录为空说明编译阶段有问题需要回头看 ninja 的输出日志。安装目录的权限建议保持 root 所有后续用 systemd 管理服务时更规范。4.3 创建数据目录与配置文件ClickHouse 默认配置里数据目录是/var/lib/clickhouse日志目录是/var/log/clickhouse-server这些目录需要手动创建并授权。# 创建数据与日志目录 sudo mkdir -p /var/lib/clickhouse /var/log/clickhouse-server sudo chown -R clickhouse:clickhouse /var/lib/clickhouse sudo chown -R clickhouse:clickhouse /var/log/clickhouse-server # 创建 clickhouse 系统用户 sudo useradd -r -s /sbin/nologin clickhouseclickhouse用户是运行服务的专用账户-r表示系统用户-s /sbin/nologin禁止登录。数据目录和日志目录的属主必须是这个用户否则服务启动时会报权限拒绝。如果之前已经存在这些目录检查一下属主是否正确。5. 避坑与排查鲲鹏麒麟编译中最容易翻车的五个点5.1 编译到一半报 Killed signal现象ninja 编译过程中突然中断终端输出c: fatal error: Killed signal terminated program cc1plus。原因并发编译时内存耗尽系统 OOM Killer 杀掉了编译进程。解决降低ninja -j的并发数比如从-j16降到-j4然后重新执行ninja。ninja 会自动从上次中断的地方继续不需要重新 cmake。如果机器内存实在太小可以临时加 swap 分区顶一下。5.2 链接阶段报 undefined reference to__aarch64_...现象编译到最后链接可执行文件时报一堆undefined reference错误符号名里带aarch64。原因CMake 配置时用了-marcharmv8-a但系统 GCC 版本较旧不支持某些指令集扩展。解决去掉-DCMAKE_CXX_FLAGS里的-marcharmv8-a改用默认编译选项重新 cmake。或者升级 GCC 到 9 以上版本再试。麒麟 V10 自带的 GCC 版本一般是 7.x对 ARMv8 新指令支持有限。5.3 启动时报Cannot allocate memory现象ClickHouse 服务启动失败日志里写Cannot allocate memory或mmap failed。原因麒麟 V10 默认的vm.max_map_count值偏小ClickHouse 需要大量内存映射。解决修改系统参数并生效。# 临时生效 sudo sysctl -w vm.max_map_count262144 # 永久生效 echo vm.max_map_count262144 | sudo tee -a /etc/sysctl.conf sudo sysctl -p5.4 客户端连接报Connection refused现象clickhouse-client连接本机 9000 端口被拒绝但服务进程存在。原因配置文件里listen_host默认只绑定了127.0.0.1或者防火墙拦截了端口。解决检查/usr/local/clickhouse/etc/clickhouse-server/config.xml里的listen_host配置改成0.0.0.0允许外部访问。同时确认麒麟 V10 的 firewalld 是否放行了 9000 和 8123 端口。5.5 查询时中文乱码或排序异常现象插入中文数据后查询显示乱码或者ORDER BY结果不符合预期。原因编译时 ICU 库链接不正确或者客户端字符集设置不对。解决确认 cmake 时USE_INTERNAL_ICU_LIBRARYOFF且系统安装了libicu-devel。客户端连接时加上--charsetutf8参数。如果还是乱码检查麒麟系统的 locale 设置确保LANG是zh_CN.UTF-8或en_US.UTF-8。6. 装完怎么验证从服务启动到查询跑通的完整检查链编译安装完成不等于能用我习惯按下面这条链路走一遍每一步都确认通过再交给业务方。6.1 启动服务并检查进程状态# 前台启动方便看日志输出 sudo -u clickhouse /usr/local/clickhouse/bin/clickhouse-server \ --config-file/usr/local/clickhouse/etc/clickhouse-server/config.xml # 另开终端确认进程和端口 ps -ef | grep clickhouse-server ss -tlnp | grep -E 9000|8123前台启动能看到实时日志如果配置有问题会直接打印错误。确认9000TCP 协议和8123HTTP 协议两个端口都处于监听状态。如果只监听了一个检查配置文件里对应的tcp_port和http_port是否被注释掉了。6.2 用客户端执行验证查询# 连接本地服务 /usr/local/clickhouse/bin/clickhouse-client --host 127.0.0.1 --port 9000 # 在客户端里执行 SELECT version(); SELECT 1 1; SHOW DATABASES;SELECT version()应该返回21.8.14.5和编译版本一致。SELECT 1 1返回2说明查询引擎正常。SHOW DATABASES至少能看到default和system两个库。如果客户端连接报认证错误检查配置文件里users段的密码设置默认default用户是空密码。6.3 建表插入查询全链路测试-- 创建测试表 CREATE TABLE test_arm ( id UInt32, name String, ts DateTime ) ENGINE MergeTree() ORDER BY id; -- 插入数据 INSERT INTO test_arm VALUES (1, 鲲鹏测试, now()), (2, 麒麟验证, now()); -- 查询验证 SELECT * FROM test_arm ORDER BY id;建表时ENGINE MergeTree()是 ClickHouse 最核心的表引擎ORDER BY id指定排序键。插入中文数据能正常显示说明字符集没问题。查询结果按 id 排序输出说明存储和查询链路都通了。这一步跑通基本可以确认这套编译产物在生产环境可用。6.4 配置 systemd 托管服务前台启动验证通过后改成 systemd 管理方便开机自启和日志收集。# /etc/systemd/system/clickhouse-server.service [Unit] DescriptionClickHouse Server Afternetwork.target [Service] Typesimple Userclickhouse Groupclickhouse ExecStart/usr/local/clickhouse/bin/clickhouse-server --config-file/usr/local/clickhouse/etc/clickhouse-server/config.xml Restarton-failure LimitNOFILE65535 [Install] WantedBymulti-user.targetLimitNOFILE65535对应前面 ulimit 的设置systemd 环境下需要单独声明。Restarton-failure让服务异常退出后自动拉起。写完执行systemctl daemon-reload systemctl enable --now clickhouse-server即可。从那以后我每次编译完 ClickHouse都会强制走一遍「前台启动 → 客户端查询 → 建表插入 → systemd 托管」这条链路少一步都可能在上线后才发现问题。希望这份笔记帮你在鲲鹏麒麟的环境里少踩几个坑顺利把 ClickHouse 21.8.14 跑起来。本文还有配套的精品资源点击获取

相关新闻

Forward 2.71 安装配置全流程:从环境检查到转发验证

Forward 2.71 安装配置全流程:从环境检查到转发验证

简介:Forward 2.71 安装程序面向网络管理员、IT 运维人员及网络技术学习者,用于网络数据包捕获、协议解析与故障排查,帮助定位高延迟、丢包、带宽占用异常等问题。压缩包为 zip 格式,共 1194 个文件,约 69.78MB&#x…

2026/10/17 12:53:47 阅读更多 →
C# 控制 IT6722A 可编程电源的 SCPI 实战框架

C# 控制 IT6722A 可编程电源的 SCPI 实战框架

简介:本资源是一套基于C#开发的ITECH IT6722A可编程直流电源控制示例工程,面向自动化测试工程师、电子测量开发人员及工业控制领域初中级开发者,解决PC端远程操控电源设备的核心需求,涵盖SCPI指令封装、状态寄存器管理与人机交互界…

2026/10/17 14:41:20 阅读更多 →
YOLO-World开放词表检测实战:源码架构与工程落地解析

YOLO-World开放词表检测实战:源码架构与工程落地解析

简介:YOLO-World资源包整合了下一代YOLO检测器的PyTorch源码、预训练权重、预训练与微调代码及配套文档,适合目标检测方向的研究者、算法工程师以及具备一定PyTorch基础的进阶学习者。作者采用prompt-then-detect的提示后检测范式,让模型通过…

2026/10/17 14:23:46 阅读更多 →

最新新闻

STM32F103裸机PWM精准输出包:寄存器级1kHz/75%占空比实测<0.3%误差

STM32F103裸机PWM精准输出包:寄存器级1kHz/75%占空比实测<0.3%误差

简介:本资源是一个基于STM32F1系列的双极性SPWM波形生成与控制工程代码包,面向电力电子、嵌入式开发及电机驱动方向的初学者与进阶工程师,解决逆变器系统中高精度正弦波调制信号生成与滤波频率可调的实际问题。压缩包共142个文件,…

2026/10/17 14:41:25 阅读更多 →
Java数据结构与算法分析:递归、大O与链表习题答案精讲

Java数据结构与算法分析:递归、大O与链表习题答案精讲

简介:《数据结构与算法分析(Java语言描述)》第三版习题答案文档,面向正在学习数据结构与算法、需要核对解题思路的Java开发者及计算机专业学生。内容聚焦教材前几章的经典题目,涵盖递归程序设计、数学归纳法证明、文件…

2026/10/17 14:41:25 阅读更多 →
PyTorch入门实战:从张量与自动求导到CNN图像分类

PyTorch入门实战:从张量与自动求导到CNN图像分类

1. 入门之前,先理解PyTorch的设计思路与核心概念 1.1 为什么大家现在都在用PyTorch PyTorch入门这个话题,我在不同场合聊过很多次。带过的朋友里有刚接触编程的大三学生,也有从其他框架转过来的后端工程师,大家问的第一个问题往往…

2026/10/17 14:41:25 阅读更多 →
Hive动态分区为何必须Shuffle?原理与调优实战

Hive动态分区为何必须Shuffle?原理与调优实战

1. 项目概述:为什么动态分区在 Hive 里既香又烫手?“Hive 优化动态分区实现 开启reduce 需要shuffle”——这个标题不是一句技术口号,而是某天凌晨三点我盯着 YARN UI 上卡在 99% 的 MapReduce 任务时,一边灌着第三杯冷咖啡、一边…

2026/10/17 14:41:25 阅读更多 →
SQL Server 游标循环与 FOR 循环实战:TaoToken 统一 Key 下的调试与验证

SQL Server 游标循环与 FOR 循环实战:TaoToken 统一 Key 下的调试与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 14:41:25 阅读更多 →
具身智能进阶开发:从感知到控制的完整技术链路与工程实践

具身智能进阶开发:从感知到控制的完整技术链路与工程实践

做具身智能这几年,我最大的感受是:这个方向不缺热度,缺的是能把系统跑通的人。很多人一上来就追大模型、追VLA,结果连ROS2的坐标变换都没搞明白,仿真环境里物体抓得稳稳的,一上真机就到处乱撞。我之前在团队…

2026/10/17 14:40:24 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →