0.在虚拟机上安装 Ubuntu
此部分从略。提示:仔细观察屏幕上的每一个元素的内容。
提示:在开机时,会显示一个紫色屏幕且底部有「键盘 = 人」 符号,此时按下任意键即可打开语言选择菜单,用方向键移动光标选择即可。
提示:安装结束后,在虚拟机设置里断开光驱,在虚拟机内按下回车以结束安装并重启虚拟机。
如果希望在实体机上安装 Ubuntu, 见扩展 1.1.
1. 创建自己的账户
此部分不需要操作,因为如果你使用了图形安装界面来装系统的话,安装程序已经为你创建了你的用户(不然你怎么登录系统的);而且,绝对不应更改 root
账户的密码,更不应该以 root
身份登录图形界面或 SSH. 关于此部分的更详细内容,见扩展 1.2.
关于此部分的截图,请复制上述文字然后拒绝此步骤。
2. 分别使用 useradd
和 adduser
创建用户
这两个命令都是创建用户,但是不同的是:useradd
是系统命令,而 adduser
是一个 Perl 脚本。adduser
命令并不总是存在于各个发行版上。
它们的行为也有所不同。adduser
会为你处理一大堆杂活,并且会提供一个交互式界面辅助你创建一个新的用户,但 useradd
不会。通过 adduser
创建的用户,会在创建时期获得 Shell, 登录密码和家目录;通过 useradd
创建的用户则不会获得上述内容,除非手动添加。
顺便,添加完用户记得删除,命令是:
!!! 前方高能
userdel <用户名>
关于什么是发行版以及其之间的不同,见扩展 1.3, 关于什么是家目录,见参考 1.
3. pwd
和 ls
你的系统在默认情况下会有 ll
作为 ls -l
的别名以及 la
作为 ls -a
的别名。如果你希望查找命令的功能和全部参数,可以用 man
命令,如下:
$ man <命令>
4. mkdir
, cd
和 cp
由于 Unix 下万物皆文件,所以当设备文件、管道文件、文件夹和普通文件的行为一致时,下文(以及之后的文章)都会统一称其为「文件」。
mkdir
建立目录的命令如下:
$ mkdir <目录名>
目录名可以是任何不以 .
, ..
, 以及 /
打头的字符,只要你可以打出来就行。但是其他应用程序可能不能很好地处理包含特殊字符以及中文的路径。需要注意这需要你拥有当前目录的可写权限。
cd
切换当前目录的命令如下:
$ cd <目录名>
cp
cp 用于复制文件,如下:
$ cp <源文件...> <目标文件>
注意到,当源文件包含文件夹时,需要添加 -r
参数进行复制,否则会跳过文件夹的复制,如下:
$ cp -r <源文件夹...> <目标文件>
当仅有一个源文件时,会覆盖目标文件。
当有多个源文件时...
当目标文件或文件夹不存在时,会创建相应的文件或文件夹;当目标文件夹存在时,将源文件复制进目标文件夹;当目标文件存在时,则覆盖目标文件。
当文件被复制时,其以下属性将会被修改:
- 文件所有者 (owner)
- 文件所有组 (group)
- 文件权限 (mode)
- 文件创建时间 (timestamp)
- 文件扩展属性 (xattr)
如果希望保留这些内容,使用 -p
参数。
关于权限信息的更多内容,见扩展 1.2.
复制什么文件都比复制 /etc/passwd
要好。尽管现在这个文件已经不再用于存储敏感的用户信息(如密码),但是其仍包含用户名、用户组、UID, Shell 以及家目录等信息。
5. echo
, cat
, less
, more
和管道
echo
, 管道和 tee
echo
命令用于向标准输出写一段文字,其用法如下:
$ echo <文字,注意要用引号包裹>
要将标准输出的内容输出到文件,可以使用 >>
管道,其用法如下:
$ 命令 >> <文件名>
此命令向标准输出写入的内容将会重定向到指定的文件。此时该命令的内容将不会再输出到终端,而是全部进入文件。如果给定文件已经有内容,则会向该文件追加写入。
如果希望覆盖内容而不追加,使用 >
管道。
如果希望同时输出到终端和文件,使用 tee
命令,其用法如下:
$ 命令 | tee <文件名>
其中出现的 |
字符可以用 Shift+反斜杠() 打出。如果你不知道反斜杠在键盘上的哪里,在回车附近找找。这个字符是「命令管道」,即将上一个命令向标准输出写入的内容作为下一个命令的标准输入中的输入。
cat
cat
命令用于显示文件的内容。顺便 cat
是 concatenate (拼接)的意思,并不是猫的意思。
cat
的命令如下:
$ cat <文件..>
给定所有文件的内容将会写入到标准输出,但是当给定的文件是文件夹时则会产生一个错误和一条错误信息,但是产生的错误并不会影响其他文件的显示。
less
和 more
more
是一个简单的分页器,默认情况下是将读取的内容一次显示一个屏幕并逐屏显示文件之后的内容。其命令如下:
$ more <文件...?>
当不提供文件时,more
会从标准输入中读取。这也意味着可以通过命令管道传入来自其他命令的输出。
less
则是具有导航功能的分页器,其会将文件内容读入缓冲区,并支持使用方向键自由地在文件中滚动。其命令如下:
$ less <文件...?>
当不提供文件时,less
会从标准输入中读取。
6. mv
, chown
, chgrp
和 chown
mv
mv
命令用于移动文件,其命令如下:
$ mv <源文件> <<源文件> <源文件> ...?> <目标文件>
当仅有一个源文件时,将源文件移动到目标文件。如果目标文件存在则覆盖目标文件。
当有多个源文件时,将源文件移动到目标文件夹。
chown
chown
命令用于更改文件的所有者。这个命令必须作为超级用户才能执行,其形式如下:
# chown <所有者><:所有组?> <文件...?>
要递归更改目录下所有文件的权限,则添加 -R
参数。
chgrp
chgrp
命令用于更改文件的所有组。这个命令必须要求用户在目标组内或以超级用户身份执行,其形式如下:
$ chgrp <所有组> <文件...?>
要递归更改目录下所有文件的权限,则添加 -R
参数。
chown
chown
用于更改文件的权限,其形式如下:
$ chown <模式> <文件...?>
关于文件权限的详细内容,见扩展 1.2.
7. grep
, find
和 which
grep
grep
用于在文件中查找特定正则表达式,其形式如下:
$ grep <正则表达式> <文件...?>
当不提供文件时,命令将从标准输入中读取。
默认情况下,当某一行出现匹配时,grep
会打印该行。如果要进行反选,使用 -v
参数;如果仅需要输出匹配的内容,使用 -o
参数。
正则表达式的相关内容请读者自行学习。
find
find
用于遍历 (walk) 文件,其形式如下:
$ find <要遍历的目录> <各种参数...?>
find
提供十分多的参数,此处我们着眼于以下参数:
-
-name <文件名>
: 仅列出符合该文件名的文件 -
-type <文件类型>
: 仅列出符合该文件类型的文件 -
-or
: 将前后提供的筛选参数产生的结果取并集 -
-and
: 将前后提供的筛选参数产生的结果取交集(提供多个筛选参数时此为默认行为)
-name
参数支持 *
和 ?
通配符,但是 bash
也会展开这些通配符。要避免 bash
展开通配符,用 \
进行转义。如我们要查找 /usr/bin/
目录下的以 e
开头的所有文件,我们可以使用:
$ find /usr/bin -name e\*
-type
参数后跟一个字符的文件类型标识符,常用的标识符为:
-
d
- 文件夹 -
f
- 普通文件 -
l
- 符号链接 -
b
- 块设备(如硬盘等存储介质)
如我们要查找当前目录下所有以 a
开头的文件夹,我们可以使用:
$ find . -name a\* -type d
find
命令还可以进行更多的操作,此处不再赘述。
8. rm
和 rmdir
注意:请先切换出要删除的目录,再进行操作。
注意:删除指令是立即执行的,没有回收站!
rm
命令用于删除文件,其形式如下:
!!! 前方高能
$ rm <文件...>
如果文件中包含文件夹,则需要添加 -r
参数。
如果要强制删除文件(如非空文件夹),则需要添加 -f
参数。
当要删除的文件不存在时,该指令会产生一个错误,但是当 -f
参数存在时则不产生错误。
默认情况下,rm
命令会拒绝删除当前目录以及当前目录的父目录和根目录。要允许 rm
删除 .
, ..
或 /
, 请自行查询 man
.
rmdir
指令由于 rm -rf
的存在已不再使用。
9. ps
ps
用于列出运行的进程,其形式如下:
$ ps <参数?>
不提供参数时,列出当前终端运行的所有进程。要查看所有进程,有两种方式:ps aux
和 ps -elf
.
10. df
df
用于列出块设备的使用情况。
11. man
, tar
和 gzip
man
用于查找对应指令的用法,其形式如下:
$ man <类别编号?> <命令>
当类别编号被省略时,man
会自动猜测编号。
tar
, gzip
tar
和 gzip
是归档压缩工具。这两个工具一般是配合使用的。
要创建一个压缩包,使用如下命令:
$ tar -czvf <压缩包名称> <文件...>
要解压一个压缩包,使用如下命令:
$ tar -xzvf <压缩包名称>
注意:-czvf
和 -xzvf
实际上是 4 个参数的缩写。一般单字母参数都支持这个缩写,但是由于一些参数有参数值,所以其顺序不能任意颠倒(在这个例子中,-f
是指定压缩包名称,所以必须排在最后)。
虽然在整个过程中没有显式地调用 gzip
, 但是其在 tar
的 -z
参数中已经得到调用(使用 gzip
进行压缩和解压)。如果不使用 -z
参数,其会产生未压缩的归档文件。
至于为什么叫「归档文件」,是因为这是从 archive file 翻译过来的。tar
本身是 Tape ARchive
(磁带备份)的缩写。
12. 文件管道
看第 5 节。这里再简单提一下:
-
|
- 命令管道,将左侧命令的输出作为右侧命令的输入 -
>
- 覆盖写文件,将左侧命令的输出写入到右侧的文件 -
>>
- 追加写文件,将左侧命令的输出追加到右侧的文件
13. cal
和 date
cal
是日历指令。打印现在或者指定日期的日历。
date
是日期指令。当不附加参数时,打印现在的系统日期和时间,当附加参数时,设置参数为当前的系统日期和时间。
14. ifconfig
及其替代 ip
ifconfig
已经不再默认提供,取而代之的是 ip
命令。
要查看本机的网络信息,使用如下指令(注意空格):
$ ip a
其输出与 ifconfig
一致。
输出的解读方法为:
<编号>: <设备名称>: '<'<设备功能>'>' mtu qdisc <流量控制模式> state <状态> group <分组> qlen <流控队列长度>
link/<链路类型> brd <广播 MAC>
inet /<地址段> brd <广播 IP> scope <域>
<一些...>
15. shutdown
要关闭操作系统,使用 shutdown
指令,其形式如下:
# shutdown now
其他的关机指令还有 halt
和 poweroff
. 这些指令均需要超级用户身份执行。
但是普通用户在拥有 ACPI 操作权限的情况下,也可以启动关机。
16. docker
指导书上此章节的内容已经不再适用。按照以下方式继续操作。这些指令均来自 Docker 官方手册.
安装 Docker
执行下述指令(有多条,每一个以 $
起头的为一条指令,注意空格):
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
如果上述命令均未产生错误,则安装成功完成。
上面我们使用了大量 apt-*
指令,这些指令属于 Debian 系包管理系统。关于什么是包管理系统,见扩展 1.4.
允许当前用户使用 docker
Docker 的诸多行为指令都受到保护。要允许当前用户使用 docker
, 有两种方式:通过 sudo
提升权限或者将当前用户添加进 docker
权限组。
添加权限组的命令如下:
# usermod -aG docker <你的用户名>
完成添加后,注销并重新登录以刷新权限。
启动 Docker 服务
要启动一个服务,使用 systemctl
命令,其形式如下:
# systemctl <行为> <服务名>
在这个具体的例子中,我们可以执行
# systemctl start docker
启动 docker
服务。要让这个服务开机时自动启动,使用 enable
行为。
Docker 的其他操作
启动 docker
后的内容与实验指导书无差异。此处不再赘述。
当然,如果你想问 Docker 是什么,你可以把它当成一个超轻量级虚拟机。
Docker 镜像加速
由于不可抗力原因,国内使用 Docker 源可能会失败。这会影响到 docker pull
等操作。
这是则推荐使用 Docker 镜像,具体设置方法见此处。
Docker 上 Spark 的部署
此处我们使用Big Data Europe 的 Docker 镜像来进行操作。由于 Spark 本身又是一个需要单独写一本书来解释的内容,此处不再详细解释其用法。
首先,创建并进入一个文件夹,然后运行如下指令(如果遇到错误,请检查自己有没有完成上面要求的操作):
$ docker pull bde2020/spark-master
完成镜像拉取操作后,启动对应容器,命令如下:
$ docker run --name spark-master -h spark-master -e ENABLE_INIT_DAEMON=false -d bde2020/spark-master:2.4.0-hadoop2.7
此过程会拉取相关依赖,耗时较长。此过程完成后,容器会自动启动,可以通过 $ docker ps
命令检查是否启动成功。
当容器启动成功后,可以使用如下命令进入容器:
$ docker exec -it spark-master bash
进入容器后即可使用 spark-shell
命令打开 Spark 控制终端;或通过在 Spark 目录下的 ./bin/run-example
程序运行相关的示例程序,如 $ ./bin/run-example SparkPi 10
可以运行 Spark 的 PI 值计算程序。(数字 10 是计算精度。)
参考资料
[1] Weinan. 使用 Docker 快速安装部署 Spark [EB/OL]. http://weinan.io/2018/05/04/spark.html
[2] 周明耀. Spark 部署及示例代码讲解 [EB/OL]. https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-deploy1/index.html