日常工作中需要对日志文件进行分析,当日志文件过大时,Linux中使用vim、cat、grep、awk等这些工具对大文件日志进行分析将会成为梦魇,具体表现在:
1 查阅大文件之痛
大数据离线处理框架hadoop可以处理这些场景,然而hadoop也需要耗费较长的时间进行计算,而且还需要去编写MapReduce任务,诚然这种方法带来更大的难度和挑战。hadoop是通过将大文件切割成多个小文件,通过多个mapreduce任务做并行处理,Linux提供了一个简单易用的split工具,可以实现将文件切割成多个小文件。
split提供两种方式对文件进行切割:
如下以一个3.4G大小的日志文件做切割演示,每一个文件按照50000行做切割,指定文件名为split-line,-d参数以数字的方式显示
- #源文件大小
- [root@~]# ls -lh happylauliu.cn.gz
- -rw-r--r-- 1 root root 3.4G 1月 17 09:42 happylauliu.cn.gz
-
- #按行切割
- [root@~]# split -l 50000 -d --verbose 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@~]# wc -l split-line00
- 50000 split-line00
- [root@~]# wc -l split-line9170
- 50000 split-line9170
- [root@~]# wc -l split-line9171
- 1020 split-line9171
-
- #查看文件大小
- [root@~]# 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,此时再对文件进行分析将会方便很多,同时文件数量也会很多,可以增加行数的方式进行切割,方便分析。
除了按照行数切割之外,split还支持通过文件大小进行切割,通过指定-b参数指定文件大小进行切割,文件大小单位支持K, M, G, T, P, E, Z,如下以切割为500M演示文件切割过程
- [root@~]# split -b 500M -d --verbose happylauliu.cn.gz split-size
- 正在创建文件"split-size00"
- 正在创建文件"split-size01"
- 正在创建文件"split-size02"
- 正在创建文件"split-size03"
- 正在创建文件"split-size04"
- 正在创建文件"split-size05"
- 正在创建文件"split-size06"
-
- [root@~]# 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
split将大文件切割为多个小文件,如果需要将多个小文件合并为一个文件怎么处理呢?
可以使用文件重定向方式实现,如下演示两个小文件合并为一个文件
- [root@~]# cat split-size01 split-size02 >two-file-merge
-
- [root@~]# ls -lh two-file-merge
- -rw-r--r-- 1 root root 1000M 1月 17 17:20 two-file-merge
合并方式通过读取文件的方式+输出重定向,对于大文件一样会存在性能的问题,建议根据需要使用。