跳转至

实验 2 - 熟悉常用的 Linux 和 Hadoop 操作

本次实验相对简单但较冗长。如果你已经有一定的 Linux/UNIX shell 使用经验,应该能相对顺利地完成。

登录到系统,我们开始吧。

使用 SSH 连接

在实验 1 中,你可能已经尝试过了。你可以在启动虚拟机以后就把它放到一边去(比如:最小化),然后使用 ssh 连接到虚拟机:

ssh hadoop@192.168.178.100

常用的 Linux 命令

正在使用 macOS?

如果你正在使用 macOS,由于 macOS 是类 UNIX 系统,你可以直接在系统上完成这个章节除 Hadoop 命令以外的部分,不需要用到虚拟机。打开“终端”应用即可(按 Cmd+Space 打开“聚焦”搜索,输入“终端”也可)。

我们来尝试使用一些常用的 Linux 命令来完成一些简单的任务。

env - 环境变量工具

  • 打印环境变量
    env
    
  • env 命令输出内容保存到 /tmp/env.tmp
    env > /tmp/env.tmp
    

cd - 切换目录

命令来源

cd: change directory

  • 切换到 /usr/local 目录
    cd /usr/local
    
  • 前往上级目录
    cd ..
    
  • 前往自己的家目录
    cd ~
    

特殊的目录符号

常见的目录包括以下几个:

  • ~:家目录,用户的主目录
  • .:当前目录
  • ..:上级目录

ls - 列出文件

命令来源

ls: list directory contents

  • 查看 /usr 下所有文件
    ls -la /usr
    

mkdir - 创建目录

命令来源

mkdir: make directories

  • /tmp 创建一个 a 目录
    cd /tmp
    mkdir a
    
  • 在当前目录下创建目录 a1/a2/a3/a4
    mkdir -p a1/a2/a3/a4
    

cp - 复制文件

命令来源

cp: copy files and directories

  • 将刚刚临时创建的 env.tmp 文件复制到 /tmp,命名 env-copy.tmp
    cp /tmp/env.tmp /tmp/env-copy.tmp
    
  • 新建一个目录 /tmp/d1,复制到 /tmp/d2
    mkdir /tmp/d1
    cp -r /tmp/d1 /tmp/d2
    

mv - 移动文件

命令来源

mv: move (rename) files

  • /tmp/env-copy.tmp 移动到 /tmp/a
    mv /tmp/env-copy.tmp /tmp/a
    
  • /tmp/a 重命名为 /tmp/b
    mv /tmp/a /tmp/b
    

rm - 删除文件

命令来源

rm: remove files or directories

  • 删除 /tmp/b/env-copy.tmp
    rm /tmp/b/env-copy.tmp
    
  • 删除 b 目录
    rm -r /tmp/b
    

cat - 查看或合并文件内容

命令来源

cat: concatenate files and print on the standard output

/bin/cat/,不是这只猫猫

/bin/cat

  • 查看 /tmp/env.tmp 文件内容
    cat /tmp/env.tmp
    

moreless - 交互式阅读文件内容

moreless 不是一样的

lessmore 形似,但具有大量优化,详情可见 Ubuntu Manpage .

在大多数情况下,less 可以作为 more 的更佳平替。

  • 使用 more 交互式查看 /tmp/env.tmp 文件内容(按 Q 退出)
    cat /tmp/env.tmp | more
    
  • 使用 less 交互式查看 /tmp/env.tmp 文件内容(按 Q 退出)
    cat /tmp/env.tmp | less
    

headtail - 查看文件的前/后若干行

  • 查看 /tmp/env.tmp 的前 5 行
    cat /tmp/env.tmp | head -n5
    
  • 查看 /tmp/env.tmp 的后 5 行
    cat /tmp/env.tmp | tail -n5
    

touch - 修改文件时间戳

时间不对?

你得到的输出可能是 Nov 11 08:00 /tmp/hello,这是为什么呢?先自己思考一下吧 ;)

同时,touch 命令还允许很多种“时间”描述,你可以尝试:

touch -d "next thursday" /tmp/hello

然后查看结果。

你可以阅读 Ubuntu Manpage 来了解更多。

  • 创建文件 /tmp/hello
    touch /tmp/hello
    
  • 修改文件的创建日期为 2022/11/11
    touch -d2022-11-11T00:00:00Z /tmp/hello
    
  • 查看文件信息
    ls -la /tmp/hello
    

chmod - 调整文件权限

命令来源

chmod: change file mode bits

  • 调整 /tmp/hello 权限为 0755
    chmod 0755 /tmp/hello
    

chown - 调整文件所有者

命令来源

chown: change file owner and group

  • 切换到 super 用户
    su - super
    
  • 调整 /tmp/hello 所有者为 root
    sudo chown root:root /tmp/hello
    
  • 移除这个文件
    sudo rm /tmp/hello
    
  • 退出 super 用户
    exit
    

find - 查找文件

  • 建一个目录,放一些东西供我们查找用
    mkdir /tmp/find
    
    mkdir /tmp/find/foo
    echo "test" > /tmp/find/foo/test.txt
    
    mkdir /tmp/find/bar
    mkdir /tmp/find/bar/test.txt
    
  • /tmp/find 目录查找文件名为 test.txt文件
    find /tmp/find -type f -name "test.txt"
    

tar - 压缩文件实用工具

  • /tmp 新建 tartest 目录,打包成 test.tar.gz
    cd /tmp
    mkdir tartest
    tar -zc tartest -f test.tar.gz
    
  • 解压缩到 /tmp 目录
    rm -r tartest
    tar -zxf /tmp/test.tar.gz
    

grep - 查找文本

  • /tmp/env.tmp 查找 SHELL
    grep 'SHELL' /tmp/env.tmp
    

杂项

  • 创建一个临时文件,用于临时将 JAVA_HOME 设置到环境变量2
    echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64' > /tmp/java_home.source
    source /tmp/java_home.source
    
  • 查看 JAVA_HOME
    echo $JAVA_HOME
    
  • 清理我们在 /tmp 创建的文件
    rm -r /tmp/env.tmp /tmp/a1 /tmp/d1 /tmp/d2 /tmp/find /tmp/test.tar.gz /tmp/tartest
    

常用的 Hadoop 命令

  • 启动 Hadoop
  • 使用 hadoop 身份登录到 namenode
  • 在 HDFS 创建用户目录
    hdfs dfs -mkdir -p /user/hadoop
    
  • 在本地文件系统生成临时文件,使用 uname -a 输出
    uname -a > /tmp/uname.txt
    
  • 将生成的 uname.txt 上传到 HDFS 的 /user/hadoop 目录
    hdfs dfs -put /tmp/uname.txt /user/hadoop/uname.txt
    
  • 将 HDFS 中的 /user/hadoop/testrc 复制到本地
    hdfs dfs -get /user/hadoop/uname.txt /tmp/uname-downloaded.txt
    
  • 查看下载文件内容
    cat /tmp/uname-downloaded.txt
    

结束了?

结束了。实验 2 相对简单,但目的是初步熟悉常用的 Linux 命令,如何在系统里导航和执行最基本的任务。接下来,你会用到这里的经验的。

Changelog / 更新日志

以下为一些本手册的主要变化,可能不包括所有变更。

  • 2023/03/17
    • 调整了部分命令,以免对系统配置发生修改
    • 修改了 hadoop fs 命令为更加针对 HDFS 的 hdfs dfs 命令
  • 2023/03/09
    • 增加了“命令来源”板块
    • 调整了提示框的布局
    • 调整了语法高亮

  1. 已经很少有人使用 rmdir 命令了 

  2. 如果你是 ARM 架构虚拟机,你可能需要调整为 /usr/lib/jvm/java-1.8.0-openjdk-arm64