31

大数据分析工程师入门(十):Linux 命令基础

 4 years ago
source link: https://www.tuicool.com/articles/fURJVf3
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

zeimaqZ.jpg!web

导语

前面9篇文章,我们介绍了各种基础理论知识,相信大家已经跃跃欲试,要开始动手实战了。那么本文将介绍下Linux的常用操作,学完本文知识点后,就可以真正把前面所学,应用在实践中了。

为什么讲Linux?

目前互联网公司的技术架构基本都是基于Linux系统的,大数据的相关技术框架,也都是优先支持Linux,并且在Linux系统上运行得更稳定。

这主要是因为Linux系统是一个开源的系统,并且是经过大量测试和实践检验的,是非常稳定和可靠的。如果你在互联网公司工作,很大可能性会使用到Linux服务器,所以我们需要对它有个大致了解,熟悉常用的命令,方便开展工作。

本文的主要目标

本文不会深入讲解Linux系统,而是围绕常用命令来进行讲解。主要目标是让大家掌握常用的操作,为大家登入到Linux,进行任务的提交、日志查看、文件打包、执行调度等工作,提供指导和帮助。

本文的讲解思路

  • Linux简介:主要是想简单介绍下Linux,让大家对它有个初步认识。

  • Linux常用命令:我们的目标不是Shell编程,所以不会讲解很深,重点是讲解他们有什么用,怎么去用。由于命令太多,考虑篇幅问题,只讲解常用的命令,其他不常用的就不一一举例了。

  • 实战小案例 :第二部分单独讲解每个命令的作用,第三部分我们把他们串起来,完成一个日常工作中的小任务。

×××

以下为正文

0 1

Linux简介

Linux经常被拿来和Windows操作系统对比,但准确来说, Linux只是一个操作系统内核,而并不是一个操作系统产品。 我们通常所说的Linux系统,是对使用Linux内核作为系统内核的操作系统的统称。

Linux内核最初只是由芬兰人Linus Torvalds( 绝对的大神) 在上大学期间出于个人爱好而编写的。在互联网公司,使用最多的Linux发行版操作系统产品是CentOS。

Linux最大的特点是开源,CentOS也是提供给大家免费使用的。Linux之所以这么流行,不仅仅是因为它开源,更与其优秀的特性密切相关。Linux背后有强大的开源社区支持,Linux是一个完善的多用户、多任务,支持多进程、多CPU的系统,具有非常高的稳定性、可靠性和安全性,有非常完善的网络服务和各种操作指令。

不过,对我们来说,这些信息了解即可,重要的是要掌握下一节的这些命令。

0 2

Linux常用命令

2.1

cd/pwd

cd命令是change directory的缩写,主要用于切换当前工作目录。

# 语法

cd [dirName]

cd命令非常简单,我们要掌握的是多种简便的目录指代,如下表格所示:

命令

作用

cd ~

进入当前用户home目录

cd (无任何参数)

进入当前用户home目录

cd -

切换至上一个工作目录

cd .

进入当前目录,相当于没变

cd ..

进入上一级目录

cd ../..

进入上两级目录

cd /

进入根目录

cd dirName

进入dirName指向的目录,dirName可以是绝对路径(以/或~开头),也可以是相对路径

pwd命令的作用是显示用户的当前工作目录,其结果是以绝对路径的方式显示的。

2.2

Is

ls命令用于罗列出指定目录下的内容(包含目录和文件),不加任何选项时,只显示非隐藏目录和文件的名称。

# 语法

ls [options] [dirName...]

# ...表示可以写多个目录

配合其他选项使用,ls可以发挥出巨大的威力,常用参数如下:

选项

作用

-a

列出目录下所有文件和目录(包含命名以"."开头的隐藏文件和目录)

-l

罗列出更详细的信息,包含权限、大小、拥有者、最后修改时间等

-t

根据修改时间降序排列展示

-R

递归遍历目录下的子目录,列出所有子目录下的文件和目录

-r

反转显示顺序,以相反的顺序展示

常用选项组合如下所示:

ls -lrt dirName ,含义为以修改时间升序排序,展示dirName目录下的文件和目录的详细信息。最后修改过的文件将会显示在最下方,方便将他们找出,进行下一步动作。我们在查看日志文件排查错误时,经常会用这个命令组合,找出最近有更新的日志文件。

ls -alR dirName ,含义为递归遍历dirName目录下的子目录,罗列出所有文件和目录(包含隐藏的)及其详细信息。该命令组合,常用来查找目标文件的位置。

2.3

cp/mv

cp命令主要用于复制文件和目录。

# 语法

cp [options] source... dest

# ...表示可以写多个目录

其常用选项如下所示:

选项

作用

-r

当复制的是目录时,必须加上此参数,表示递归复制目录下的子目录

-f

如果目标目录或文件已存在,则进行强制覆盖且不给出提示。

-i

与-f选项相反,在冲突时,会提示用户确认是否覆盖

mv命令主要用于移动文件或目录,或重命名。

# 语法

mv [options] source... dest

当dest和source处于相同目录下时,则相当于执行了重命名操作。其常用选项为-f和-i,和上面cp命令的对应选项作用一致,这里就不赘述了。

2.4

mkdir/rmdir/touch

mkdir命令用于创建目录,可以一次创建多个目录。

# 语法

mkdir [-p] dirName...

# -p选项作用为,如果父目录不存在,则一并创建。

rmdir命令用于删除空目录,其作用和mkdir正好相反。

# 语法

rmdir [-p] dirName...

# -p选项作用为,当子目录删除后如果父目录下无其他内容,则一并删除。

touch命令常用于创建一个空的新文件,也可以用来修改已有文件的时间属性。但是我们通常会用这个命令来创建一个用于标记的隐藏文件,如下面的用法:

~$ touch .success

# 在当前目录下创建一个隐藏文件,用于标记已操作成功

2.5

rm

rm命令用于删除文件或目录。

# 语法

rm [options] fileOrDir...

常用选项如下:

选项

作用

-r

当复制的是目录时,必须加上此参数,表示递归复制目录下的子目录

-f

如果目标目录或文件已存在,则进行强制覆盖且不给出提示。

-i

与-f选项相反,在冲突时,会提示用户确认是否覆盖

2.6

vi/vim

使用rm命令删除后,将无法恢复,所以使用此命令时请谨慎小心。最佳实践是,先用ls命令看下要删除的目录,确认下面的目录和文件是否不再需要,再执行删除。

vi是Linux上的文本编辑命令,用于修改文件内容。vim是vi命令的升级版,功能更加丰富。vi/vim的功能非常强大,拥有很多快捷键,让你在没有鼠标的情况下,依然可以很轻松的完成文档的编辑修改工作。

由于篇幅有限,这里就不展开讲它的具体的使用方法了,大家可以参考Set_alone的这篇文章《Linux——vi命令详解》

(https://blog.csdn.net/cyl101816/article/details/82026678)来进行更深入地学习。

这里我只说明几点注意事项:

  • 如果只是为了查看某个文件,请尽量不要使用vi/vim打开文件,因为你会占用这个文件。尤其不提倡长时间打开不退出,这样当你的终端连接断开后,会在服务器上留下正在编辑的文件。下个要编辑的人无法确认是否有人正在编辑中。

  • 尽量不要去打开非常大的文件,因为vi/vim会把文件load到内存中,如果文件很大,非常浪费内存,也容易造成终端卡死。

  • 尽量不要打开正在写入的文件,因为如果你修改了,相当于同时有两个进程在修改文件,容易造成状态的不一致。

2.7

cat/tac/more/less

这四个命令都是用来查看文件内容的。

其中,cat是将文件内容按照写入顺序全部输出到标准输出流(没有重定向的话,就会打印在控制台上); tac则是将顺序颠倒后,输出到标准输出流,即最后写入的行最先输出;more的功能和cat类似,区别是more可以一页一页地查看文件内容;而cat是一次性全部输出。

less和more的功能非常类似,最新的more命令也可以支持向上翻页,因此他们目前区别为less支持上下键翻页,而more不支持,less的搜索功能比more更强大好用。

对于more和less来说,通常使用space键(空格键)或f键向下翻页,使用b键向前翻页,使用enter键向下翻一行(如果想翻多行,可以在按下enter前输入行数),less还可以使用上方向键向上翻页,使用下方向键向下翻页。

对于cat命令还有一个应用场景是合并多个文件,示例如下:

# 假设当前目录下有三个文件分别为a.txt、b.txt、c.txt,我们的目标是合并成一个文件x.txt,

# 则可以通过如下方式实现

~$ cat a.txt b.txt c.txt > x.txt

# 上面的">"的含义为,将标准输出流重定向到x.txt文件,即将标准输出的内容写入到x.txt

# 通过上述命令,就实现了3个文件的合并

# "~$"表示命令行的输入提示符

2.8

head/tail

head命令的作用为读取并输出文件的前N行到标准输出中(如果没有重定向,会打印到控制台上)。常用的选项为-n,后面跟读取的行数。示例如下:

# 读取并输出文件的前100行到控制台

~$ head -n 100 a.txt

# 简写形式为

~$ head -100 a.txt

tail命令的作用和head相反,是读取并输出文件的后N行到标准输出中。常用选项也是-n,用法与head相同。另外,tail命令还有一些其他功能,如加上-f选项后,可以追踪文件末尾,将新写入的内容,持续输出到标准输出流中,对于实时查看服务器端用户行为日志是非常有帮助的。

2.9

nohup

nohup的作用为忽略挂断信号,使得目标进程在session关闭后仍然可以继续运行。

如果我们的目标是要进程持续运行下去,那么首先我们要在末尾使用"&",将进程挂在后台运行。但是这样仍然不能保证程序会一直运行,原因是,当我们使用远程终端登入Linux时,会开启一个session,随后启动的所有进程都是这个session进程的子进程。当用户退出session时,session进程会关闭,同时所有子进程都会收到挂断信号,也会关闭。

因此,如果你想让你启动的进程不被关闭,就需要忽略挂断信号,这时就会使用到nohup命令了。

# nohup使用示例

~$ nohup sh ./spark-submit.sh mainClass > spark.log 2>&1 &

# 其中,">"表示标准输出的重定向,"2>&1"表示将标准错误流重定向到标准输出里,

# 这样就会一并输出到spark.log文件中,通过这种方式启动的进程将不会受到终端断开的影响。

2.10

tar/zip/unzip

这三个命令的主要作用是打包和解包。tar命令可以将多个文件或目录打成一个tar文件,其功能很强大,选项非常多,这里我们只展示最常用的组合,示例如下所示:

# tar命令示例

# 打包压缩

~$ tar -zcvf dir.tgz dir/

# 上述命令表示将dir目录下面的文件和子目录,打包并使用gzip压缩为一个dir.tgz文件

# z表示使用gzip压缩,如果想使用bzip2压缩,可以将z替换为j;不想压缩可以去掉

# c表示压缩,建立新的归档文件

# v表示显示指令的执行过程,即都处理了哪些文件或目录

# f表示指定备份文件名

# 这里需要注意的是,dir/的路径尽量使用相对路径,不要使用绝对路径,否则很容易踩坑


# 解压文件

~$ tar -zxvf dir.tgz -C /tmp

# -x选项表示解压,从压缩状态还原为原始状态

# -C表示指定解压后的目录位置

zip命令也是打包,不同的是打出的是zip包,并且zip默认使用deflate算法进行压缩。常用形式如下所示:

# 打包

~$ zip -r dir.zip dir/

# -r表示递归处理,压缩的是目录时,此选项是必须的

# 这条命令会把dir目录及其下所有文件和子目录,压缩成dir.zip文件


# 解压

~$ unzip dir.zip

2.11

gzip/bzip/zcat/bzcat

gzip和bzip2常用于文件的压缩和解压。让我们来直接看下命令示例吧。

# gzip压缩

~$ gzip -v a.txt

# -v选项会打印出压缩的比例

# 命令执行后,源文件a.txt就不见了,会产生一个新文件a.txt.gz


# gzip解压

~$ gzip -dv a.txt.gz

# -d选项表示解压,由于有v选项,所以会打印出文件的压缩比

# 命令执行后,压缩文件a.txt.gz就不见了,但会多出一个源文件a.txt


# 查看gzip压缩文件的信息

~$ gzip -l a.txt.gz

# -l选项会展示压缩文件内部的文件列表及压缩比例


# bzip2压缩

~$ bzip2 -1 -k a.txt

# -1表示使用最小压缩比,压缩速度比较快(注意,这里是数字1不是字母l)

# -k表示保留源文件,如果去掉该选项将会和gzip命令一样,只有压缩后的文件,源文件会被删除


# bzip2解压

~$ bzip2 -d -k a.txt.bz2

# -d表示解压

# -k表示保留解压前的压缩文件

有时我们想要查看下压缩文件的内容,但是又不想去解压它,这时就要用到zcat和bzcat命令了,他们分别用于查看gzip压缩文件和bzip2压缩文件。使用示例如下:

# 查看gz文件

~$ zcat a.txt.gz


# 查看bz2文件

~$ bzcat a.txt.bz2


# 我们还可以配合管道查看hdfs上的压缩文件,例如:

~$ hdfs dfs -cat /data/a.txt.bz2 | bzcat

2.12

chmod/chown

chmod命令用于更改文件或目录的权限,而chown用于更改文件或目录的拥有者。下面我们逐个对他们进行说明。

# chmod语法

chmod -R [ugoa][+-=][rwx] fileOrDir...

# -R选项表示递归处理所有子目录和文件

# u表示该文件的拥有者,g表示与该文件的拥有者属于同一组(group)的用户,o表示其他用户,a表示三者都包含。

# +表示增加权限,-表示取消权限,=表示唯一设定权限

# r表示可读取,w表示可写入,x表示可执行


# 还有一种写法是通过数字来标识权限,r用数字4表示,w用数字2表示,x用数字1表示,具体的权限就是三者之和,有这个权限就加上对应的数字,无这个权限则不加。例如

~$ chmod -R 755 b.sh

# 上述命令表示b.sh将要拥有的权限为rwxr-xr-x

# chown语法

chown -R user.group fileOrDir...

# 或者

chown -R user:group fileOrDir...

# 还有一种简写形式

chown -R user. fileOrDir...

# 上述命令会自动推断出user用户所在组

# -R选项表示递归处理所有子目录和文件

2.13

ifconfig/ip

这两个命令常用于查看本机的IP地址,有时在定位问题时会用到。其使用示例如下:

~$ ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1454

inet 10.19.35.248 netmask 255.255.0.0 broadcast 10.19.255.255

# 输出结果的第二行inet后面就是本机IP,为减少篇幅占用,隐藏了部分输出结果


~$ ip addr

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1454 qdisc pfifo_fast state UP qlen 1000

link/ether 52:54:00:2d:2e:20 brd ff:ff:ff:ff:ff:ff

inet 10.19.35.248/16 brd 10.19.255.255 scope global eth0

valid_lft forever preferred_lft forever

# 输出结果中inet后面就是本机IP,为减少篇幅占用,隐藏了部分输出结果

2.14

df/du

df命令常用于查看磁盘使用情况,常用选项如下所示:

~$ df -h

Filesystem Size Used Avail Use% Mounted on

/dev/vda1 20G 12G 8.2G 60% /

devtmpfs 3.9G 0 3.9G 0% /dev

tmpfs 3.9G 0 3.9G 0% /dev/shm

tmpfs 3.9G 401M 3.5G 11% /run

tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup

/dev/vdb 200G 36G 165G 18% /data

tmpfs 783M 0 783M 0% /run/user/0

tmpfs 783M 0 783M 0% /run/user/1000

# -h选项表示以人类可读方式展示,而不是直接以字节数这种不直观的方式展示

du命令常用于显示目录或文件的总大小,常用选项组合如下所示:

~$ du -sch logs/ data/

1.8G logs/

868M data/

2.6G total

# -s选项表示只显示汇总摘要,不显示明细

# -c选项表示显示总和大小

# -h选项表示以人类可读方式显示

2.15

grep

grep命令用于过滤出符合条件的内容,该命令使用频率很高,且经常和其他命令搭配一起使用。

# 语法

grep [options] pattern fileOrDir...

其常用的选项如下表所示:

选项

作用

-c

计算符合匹配条件的行数

-A

后面跟数字N,表示除显示匹配上的行外,还显示其后面N行

-B

后面跟数字N,表示除显示匹配上的行外,还显示其前面N行

-C

后面跟数字N,表示除显示匹配上的行外,还显示其前后各N行;也可以简写成在中划线("-")后面直接跟数字。

-E

支持正则语法

-i

忽略字母的大小写

-o

只显示匹配上的内容

-R

表示递归遍历目标目录

# 使用示例

~$ grep -i datanode hdfs-site.xml

# 忽略大小写,查找包含datanode的行


~$ grep -20 -i error namenode.log

# 忽略大小写,查找namenode.log文件中包含error字样的前后20行内容

2.16

top/free

top命令常用于查看当前占用cpu或内存资源最高的进程。直接执行top,将显示按照cpu使用率降序排列的进程列表,在展示页面输入大写字母"M",可以按照内存使用率降序排列。通过top命令,我们可以获取到占用cpu或内存资源最高的进程的pid,之后可以通过ps命令(见下一节),查看具体是什么进程。

free命令常用来查看内存的使用情况。通常搭配-h选项使用,以人类可读的方式显示内存使用信息,如下所示:

~$ free -h

total used free shared buff/cache available

Mem: 188G 123G 14G 410M 50G 63G

Swap: 49G 39G 10G

# total列表示总内存大小,used是已使用内存大小,free表示未分配内存大小,available表示可使用内存大小

2.17

ps

ps命令常用于查找某个进程的详细信息,通常会配合grep一起使用。常用的选项组合为-ef或-aux,两个选项组合的差别不大,只是显示结果的方式略有不同,使用哪个都可以。

# 过滤出所有java进程

~$ ps -ef | grep java


# 找出某个pid的详细信息

~$ ps -aux | grep 11543


# 找出包含某个特定标识的进程

~$ ps -ef | grep -i datanode

2.18

jps

jps实际上并不是Linux命令,是java提供的用于查看java进程的命令,但是由于其使用频率很高,因此也在这里简单讲下。其常用方式如下:

~$ jps -lvm | grep -i zeppelin

# -l选项表示显示程序主类的长类名

# -v选项表示输出传递给JVM的参数

# -m选项表示输出传递给主类的参数

需要注意的是,jps命令只能查看当前用户下的java进程,如果要看所有用户的java进程,请使用ps命令配合grep,详见本文ps命令讲解的第一个示例。另外,只有配置了java环境变量(安装了java),才会有jps命令,否则是没有的。

2.19

ncftpgget/ncftpput

ncftpget命令常用于从ftp服务器下载文件,而对应的,ncftpput用于上传文件至ftp服务器,其常用方法如下:

# 上传本地文件至ftp服务器

ncftpput -z -uftpuser -p'ftppassword' -P21 ftp_ip ftp_dir/ local_file

# -z选项表示使用断点续传功能

# -u选项后面跟登录ftp的用户名

# -p选项后面跟登录ftp的密码

# -P选项后面跟ftp服务器的端口号

# 后面的三个参数分别为ftp服务器的IP地址,要上传到ftp服务器的目标目录,要上传的本地文件名


# 下载ftp服务器上的文件到本地

ncftpget -z -uftpuser -p'ftppassword' -P21 ftp_ip loca_dir ftp_file

# 和ncftpput命令相似,只是最后两个参数不同,local_dir表示要下载到本地的哪个目录下,ftp_file表示ftp服务器上的文件名称

2.20

crontab

Linux自带的非常强大的定时调度工具,非常的稳定。其常用的选项如下:

选项

作用

-e

编辑当前用户定时表,会默认使用内置的vi编辑器

-r

清空当前用户的定时表

-l

查看当前用户的定时表内容

crontab表达式的含义及写法,如下所示:这里需要重点关注的是,在键盘上字母e和字母r是挨着的,因此使用crontab命令时,千万不能手太快,要看清输入的是e还是r再按回车键,避免误操作把定时表给清空了。

# Example of job definition:

# .---------------- minute (0 - 59)

# | .------------- hour (0 - 23)

# | | .---------- day of month (1 - 31)

# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...

# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# | | | | |

# * * * * * user-name command to be executed

如果你忘记了上述内容,没有关系,可以通过以下命令,查看到上面的解释:

~$ cat /etc/crontab

# 该命令输出的结果包含上述的表达式解释


# 这里我给出一个crontab的的具体示例

15 8,18 * * 1 /usr/bin/python /data/scripts/remove_expired.py > /dev/null 2>&1

# 上述crontab的含义为每周一的8点和18点的15分,执行一次后面的脚本,并忽略输出

2.21

su

su命令用于切换当前用户。其常见使用形式如下:

# 示例

~$ su spark

# 或者

~$ su - spark

上面两种方式的区别为,使用第二种方式时,不仅会切换用户而且还会切换当前工作目录到目标用户的home目录,shell环境也会一并切换。因此,强烈建议使用第二种形式,不然容易遇到各种坑爹的环境问题。

2.22

date

date命令用于获取系统的当前时间,可以配合格式化,获取你想要的时间形式。date命令的使用方法非常灵活,感兴趣的同学可以自行百度一下。我这里只举几个常用的例子:

# 获取今天的日期

~$ date '+%Y%m%d'

# 获取昨天的日期

~$ date -d '1 day ago' '+%Y-%m-%d'

# 针对指定日期进行加1天

~$ date -d '20190625 1 day' '+%Y%m%d'

# 第3条命令返回结果为20190626

2.23

wc

wc命令通常用于统计文件的行数、字数和字节数。比如,你要输出10000个选中的用户标识给业务方,在最后给出文件前,你可以使用这个命令验证下,是否刚好是10000行。其常用形式如下:

# 计算result.csv的行数

~$ wc -l result.csv

# 计算标准流内容的行数

~$ cat result.csv | wc -l

2.24

netstat/Isof

这两个命令都可以用于查看端口的监听情况,通常配合grep使用,其常用形式如下:

# 查看8080端口被哪个进程监听

~$ netstat -anlp | grep 8080 | grep LISTEN

# 或者

~$ lsof -i:8080 | grep LISTEN

# 如果没有输出结果,则说明无进程监听目标端口


# 查看8080端口上目前建立了多少个连接

~$ lsof -i:8080 | grep ESTABLISHED | wc -l

2.25

SH

shell命令,方便查看shell脚本的执行过程,常用于排查脚本问题。使用形式如下:

~$ sh -x submit.sh

# 将会输出运行过程中所有被执行的shell命令

2.26

man/help

这两个命令都是帮助命令,当你忘记某个命令的选项的具体含义或使用方法时,可以通过这两个命令来查看具体的使用信息。

也就是说,上面讲了那么多命令的用法,如果你没记住,也没关系,只要记得命令的名称,使用man或help就可以查看其详细文档了。

# man命令使用示例

~$ man netstat

对于help命令要说明的一点是,内外部命令的使用形式略有不同,内部命令是指shell自带的命令,其他的命令都属于外部命令。其使用形式如下所示:

# 内部命令使用help

~$ help cd

# 外部命令使用help

~$ ls --help

实际上,你不需要去记哪些是内部命令,哪些是外部命令,反正只有这两种形式,这个不行,就换另一种试试就可以了。

0 3

实战案例

实际工作中,我们经常需要组合多种命令来完成一个特定的任务,下面我们举3个真实的用例,来演示下多命令配合的场景。

3.1

找出符合过滤规则的进程并全部杀掉

通常会有一种场景是,需要找出包含某个关键字的进程,并统一杀掉。例如,zeppelin运行很久后,可能就会出现SparkContext失效的问题,导致代码运行报错的情况,需要杀死所有相关的SparkSubmit进程,然后重启ZeppelinServer。其命令示例如下:

~$ jps -lvm | grep zeppelin | grep SparkSubmit | awk '{print $1}' | xargs kill -9

这里我们引入了3个新的命令,简单解释下。awk是一个文本处理指令,这里写的表达式含义为,用空格切分每行内容,并取其第一列,这里第一列就是进程pid。xargs命令的作用是将管道数据转换成命令行参数,这里的用法是将管道传过来的多个进程pid,转换成后面的kill命令的参数。kill命令加上-9选项常用于强制杀死进程。

因此,上面的命令串的含义为,罗列当前用户下的所有java进程,并过滤出包含zeppelin和SparkSubmit关键字的进程,取出它们的pid,并传递给kill命令,进行强制杀死操作。

值得注意的是,为防止误杀,在执行这条命令前,可以先执行命令的前面三段,然后确认下是否都是要杀死的进程,确认无误后再执行。

3.2

找到日志文件中的错误堆栈信息

还有一种常见的场景是,某服务运行不正常,你怀疑可能在运行过程中有报错,但是日志文件的末尾已经被写入了大量其他信息,这时你可以通过tail和grep的搭配完成错误信息的收集。

其代码示例如下:

~$ tail -n 2000 namenode.log | grep -i -A 30 -B 5 -E "error|exception"

上面命令串的含义为读取namenode.log文件的末尾2000行,然后通过grep命令,忽略大小写过滤出包含error或者exception字符的行,并打印匹配行前面5行和后面30行的内容。这样不仅可以找出错误,还可以把异常堆栈信息找出来。

3.3

上传前一天的日志到HDFS并启动一个Spark任务分析它

这个场景对大数据分析师来说,一定不陌生。我们今天通过几条命令,来简单演示下这个过程。

具体命令如下:

# 获取前一天的日期

~$ yesterday=`date -d '1 day ago' '+%Y-%m-%d'`

# 拼接出要上传的本地文件名

~$ local_file="user_op_data_${yesterday}.log"

# 上传至HDFS

~$ hdfs dfs -put $local_file /data_warehouse/ods/user_data

# 执行特定的spark分析作业

~$ nohup sh submit.sh $yesterday > spark.log 2>&1 &

上面几行命令简单演示了上传数据文件并启动分析作业的示例,需要重点关注的是,反引号("`")可以把命令的执行结果返回,并通过等号赋值给某个变量,如示例中将date命令的执行结果赋值给了yesterday变量。通过$符号可以获取变量的值,并和其他字符拼接成字符串。

submit.sh脚本是已经写好的spark作业脚本,只需要传入日期即可,这里只是为了演示下nohup和sh命令的用法。

最后,通过nohup启动一个忽略挂断信号的进程,这样即使执行过程中终端退出,也不会影响分析作业的执行。

总结

本文针对大数据分析工程师日常工作中常用的命令进行了初步的讲解,掌握了这些命令的用法基本上可以满足工作的需要。

如果想要深入理解和使用某个命令,大家可以再通过其他网络资源,进一步学习。希望本文的梳理对大家有所帮助。

-end-

Mbm2qeq.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK