1. 查阅大文件之痛
日常工作中需要对日志文件进行分析, 当日志文件过大时, Linux 中使用 VIM,cat,VIM,grep,awk 等这些工具对大文件日志进行分析将会成为梦魇, 具体表现在:
执行速度缓慢, 文件内容需要加载到内存中, 涉及大量的磁盘读;
耗费资源过多, 一个 4G 空间的日志文件需要至少 4G 的内存, 更大的呢?
内容难以复用, 分析过滤文件时会用管道对输出文件进行处理, 大文件下难以复用;
文件传输困难, 大文件需要传输给其他人进行分析, 文件太大, 全量传输带宽耗费大.
查阅大文件之痛
2. 如何愉快的破局
大数据离线处理框架 hadoop 可以处理这些场景, 然而 hadoop 也需要耗费较长的时间进行计算, 而且还需要去编写 MapReduce 任务, 诚然这种方法带来更大的难度和挑战. hadoop 中是通过将大文件切割成多个小文件, 通过多个 mapreduce 任务做并行处理, Linux 提供了一个简单易用的 split 工具, 可以实现将文件切割成多个小文件.
破局
split 提供两种方式对文件进行切割:
根据行数切割, 通过 - l 参数指定需要切割的行数
根据大小切割, 通过 - b 参数指定需要切割的大小
2.1 根据行数切割
如下以一个 3.4G 大小的日志文件做切割演示, 每一个文件按照 50000 行做切割, 指定文件名为 split-line,-d 参数以数字的方式显示
- # 源文件大小
- [root@VM_3_50_centos split]# ls -l 2020011702-www.happylauliu.cn.gz -h
-rw-r--r-- 1 root root 3.4G 1 月 17 09:42 2020011702-www.happylauliu.cn.gz
- # 按行切割
- [root@~]# split -l 50000 -d --verbose 2020011702-www.happylauliu.cn.gz split-line
正在创建文件 "split-line00"
正在创建文件 "split-line01"
正在创建文件 "split-line02"
正在创建文件 "split-line03"
正在创建文件 "split-line04"
正在创建文件 "split-line05"
正在创建文件 "split-line06"
正在创建文件 "split-line07"
正在创建文件 "split-line08"
正在创建文件 "split-line09"
正在创建文件 "split-line10"
...
正在创建文件 "split-line9168"
正在创建文件 "split-line9169"
正在创建文件 "split-line9170"
正在创建文件 "split-line9171"
- # 查看切割文件行数确认
- [root@VM_3_50_centos split]# wc -l split-line00
- 50000 split-line00
- [root@VM_3_50_centos split]# wc -l split-line01
- 50000 split-line01
- [root@VM_3_50_centos split]# wc -l split-line9170
- 50000 split-line9170
- [root@VM_3_50_centos split]# wc -l split-line9171
- 1020 split-line9171
- # 查看文件大小
- [root@VM_3_50_centos split]# ls -lh split-line0[0-9]
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line00
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line01
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line02
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line03
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line04
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line05
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line06
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line07
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line08
-rw-r--r-- 1 root root 14M 1 月 17 16:54 split-line09
指定行数后会自动做切割, 即达到 5000 行之后自动切割, 通过 - d 参数文件名会自动以数字的方式命名, 切割后, 每个文件大小为 14M, 此时再对文件进行分析将会方便边界很多, 同时文件数量也会很多, 可以增加行数的方式进行切割, 方便分析.
2.2 根据大小切割
除了按照行数切割之外, split 还支持通过文件大小进行切割, 通过指定 - b 参数指定文件大小进行切割, 文件大小单位支持 K, M, G, T, P, E, Z, 如下以切割为 500M 演示文件切割过程
[root@~]# split -b 500M -d --verbose 2020011702-www.happylauliu.cn.gz split-size
正在创建文件 "split-size00"
正在创建文件 "split-size01"
正在创建文件 "split-size02"
正在创建文件 "split-size03"
正在创建文件 "split-size04"
正在创建文件 "split-size05"
正在创建文件 "split-size06"
[root@VM_3_50_centos split]# ls -lh split-size0*
-rw-r--r-- 1 root root 500M 1 月 17 17:03 split-size00
-rw-r--r-- 1 root root 500M 1 月 17 17:03 split-size01
-rw-r--r-- 1 root root 500M 1 月 17 17:04 split-size02
-rw-r--r-- 1 root root 500M 1 月 17 17:04 split-size03
-rw-r--r-- 1 root root 500M 1 月 17 17:04 split-size04
-rw-r--r-- 1 root root 500M 1 月 17 17:04 split-size05
-rw-r--r-- 1 root root 444M 1 月 17 17:04 split-size06
2.3 多文件合并
split 是用户将大文件切割为多个小文件, 如果需要将多个小文件合并为一个文件怎么处理呢? 可以使用文件重定向方式实现, 如下演示两个小文件合并为一个文件
- [root@VM_3_50_centos split]# cat split-size01 split-size02>two-file-merge
- [root@VM_3_50_centos split]# ls -lh two-file-merge
-rw-r--r-- 1 root root 1000M 1 月 17 17:20 two-file-merge
合并方式通过读取文件的方式 + 输出重定向, 对于大文件一样会存在性能的问题, 建议根据需要使用.
如果觉得文章对您有帮助, 请订阅专栏, 分享给有需要的朋友吧
关于作者 刘海平 (HappyLau ) 云计算高级顾问 目前在腾讯云从事公有云相关工作, 曾就职于酷狗, EasyStack, 拥有多年公有云 + 私有云计算架构设计, 运维, 交付相关经验, 参与了酷狗, 南方电网, 国泰君安等大型私有云平台建设, 精通 Linux,Kubernetes,OpenStack,Ceph 等开源技术, 在云计算领域具有丰富实战经验, 拥有 RHCA/OpenStack/Linux 授课经验.
来源: https://www.qcloud.com/developer/article/1576576