专栏首页云计算技术专栏Linux运维实战篇之大文件切割
原创

Linux运维实战篇之大文件切割

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授课经验。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • kubernetes系列教程(二十一)dashboard使k8s普及大众

    前面的kubernets系列文章介绍了通过命令行和yaml文件的方式对kubernetes中资源的管理,命令行和yaml文件方式管理对于管理员来说无疑是利器,而...

    HappyLau谈云计算
  • 每天10分钟玩转Ceph(二)探索RBD块存储接口

    部署完Ceph集群之后,如何在Ceph集群中存储文件呢?ceph提供了三种接口供用户使用,分别是:

    HappyLau谈云计算
  • kubernetes系列教程(十)深入学习持久化存储PV和PVC

    上一篇文章中kubernetes系列教程(九)初识Pod存储管理介绍了kubernetes中存储Volume的使用,volume支持多种不同的内置驱动,使用vo...

    HappyLau谈云计算
  • UML类图

    小小明童鞋
  • (转)UML类图

    UML中类与类,已经类与接口,接口与接口的关系有:泛化(generalization),关联(association),依赖(dependency),实现(re...

    祝你万事顺利
  • 类图画法?这样记

    很多新手甚至老手有时候都无法徒手画类图,其中原因可能就是关系线太难记。下面是我总结的类图UML中的概念和Java中的映射,以及对应的关系线。

    ImportSource
  • [linux][perf]list过长导致CPU消耗过高的问题分析

    某机器上网络出现时断时续的问题,网络的同事发现ovs进程的CPU消耗很高,硬件offload的规则下发卡住的问题。即通过netlink向内核发送消息卡住。

    皮振伟
  • UML类图总结

    对弈
  • 在Java 中安全使用接口引用

    我使用Java 开发过很多项目,这其中包括一些Web 应用和Android 客户端应用。作为Android 开发人员,Java 就像我们的母语一样,但Andro...

    小鄧子
  • 从另一个角度理解java并发

    掌握了Sequential Consistency一致性模型之后,我们重新审视一下java的并发。

    大神带我来搬砖

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动