一、背景
微博有大量的用户数据,为了分析微博用户的行为。我们可以将微博的数据上传到HDFS,然后供其他大规模文本、情感分析程序来处理。
二、HDFS目录规划
当前我们的HDFS集群中应该是空空如也。因为我们并没有做任何的文件操作。为了方便我们将来管理文件系统,我们也对HDFS需要有一个目录规划,就像Linux一样。
目录规划:
目录 | 说明 |
/source | 用于存储原始采集数据 |
/common | 用于存储公共数据集,例如:IP库、省份信息、经纬度等 |
/workspace | 工作空间,存储各团队计算出来的结果数据 |
/tmp | 存储临时数据,每周清理一次 |
/warehouse | 存储hive数据仓库中的数据 |
三、HDFS操作-shell客户端
HDFS是存取数据的分布式文件系统,那么对HDFS的操作,就是文件系统的基本操作,比如文件的创建、修改、删除、修改权限等,文件夹的创建、删除、重命名等。对HDFS的操作命令类似于Linux的shell对文件的操作,如ls、mkdir、rm等。
(1)语法格式
Hadoop提供了文件系统的shell命令行客户端,使用方法如下:
|
选项:
COMMAND_OPTIONS | Description |
SHELL_OPTIONS | 常见的shell选项,例如:操作文件系统、管理hdfs集群.. |
GENERIC_OPTIONS | 多个命令支持的公共选项 |
COMMAND COMMAND_OPTIONS | 用户命令、或者是管理命令 |
示例:
|
- 所有HDFS命令都可以通过bin/hdfs脚本执行。
- 还有一个hadoop命令也可以执行文件系统操作,还可以用来提交作业,此处我们均使用hdfs,为了更好地区分和对hdfs更好的支持。
(2)说明
- 文件系统shell包括与Hadoop分布式文件系统(HDFS)以及Hadoop支持的其他文件系统(如本地FS,HFTP FS,S3 FS等)直接交互的各种类似shell的命令
- 所有FS shell命令都将路径URI作为参数。URI格式为scheme://authority/path。对于HDFS,该scheme是hdfs,对于本地FS,该scheme是file。scheme和authority是可选的。如果未指定,则使用配置中指定的默认方案
- 命令示例如下:
|
(3)shell命令选项
[root@node1 bin]# hdfs dfs -usage
Usage: hdfs dfs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-v] [-x] <path> ...]
[-expunge [-immediate]]
[-find <path> ... <expression> ...]
[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
[-head <file>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] [-s <sleep interval>] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
Generic options supported are:
-conf <configuration file> specify an application configuration file
-D <property=value> define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port> specify a ResourceManager
-files <file1,...> specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...> specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...> specify a comma-separated list of archives to be unarchived on the compute machines
The general command line syntax is:
command [genericOptions] [commandOptions]
四、需求:创建目录规划
(1)mkdir命令
格式 : hdfs dfs [-p] -mkdir <paths>
作用 : 以<paths>中的URI作为参数,创建目录。使用-p参数可以递归创建目录
|
(2)创建目录规划
|
(3)在WebUI中查看目录
五、需求:使用命令查看HDFS中的目录
(1)ls命令
格式: hdfs dfs -ls URI
作用:类似于Linux的ls命令,显示文件列表
|
选项
- -R:表示递归展示目录下的内容
(2)查看HDFS根目录下的所有内容
|
六、需求:上传蔡徐坤微博评论数据到HDFS
在资料/数据集文件夹中,有一个caixukun.csv数据集。里面包含了大量蔡徐坤微博相关的评论数据集,我们需要将这些数据集上传到HDFS中。此处,我们需要将这些原始数据集上传到以下目录:
/source/weibo/star/comment_log/20190810_node1.itcast.cn/
命名方式:/source/{产品线}/{业务线}/{日志名称}/{日期}_{上报日志的机器}。
操作步骤:
- 先将目录创建出来。
- 再使用put命令将数据上传到该目录中。
(1)put命令
-put参数可以将单个的源文件src或者多个源文件src从本地文件系统拷贝到目标文件系统中(<dst>对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中。
语法格式:
|
(2)上传微博评论数据
- 创建对应的文件夹。
|
- 上传文件到文件夹中。
- 先将数据集上传到Linux
|
- 再使用put命令上传到HDFS中
|
- 查看创建的目录和文件。
[root@node1 ~]# hdfs dfs -ls -h -R /source
drwxr-xr-x - root supergroup 0 2020-10-15 22:48 /source/weibo
drwxr-xr-x - root supergroup 0 2020-10-15 22:48 /source/weibo/star
drwxr-xr-x - root supergroup 0 2020-10-15 22:48 /source/weibo/star/comment_log
drwxr-xr-x - root supergroup 0 2020-10-15 22:51 /source/weibo/star/comment_log/20190810_node1.itcast.cn
七、需求:要求上传后把Linux本地文件自动删除
数据一旦上传到HDFS中后,就会一直保存下来,为了节省空间,可以把Linux本地的文件删除了。我们只需要执行 rm -f caixukun.csv即可。但我们想将来让HDFS上传后就自动删除该文件,我们可以使用moveFromLocal命令。
为了测试,我们要执行以下操作。
- 删除之前上传的文件。
- 重新使用moveFromLocal上传。
(1)rm命令
删除参数指定的文件和目录,参数可以有多个,删除目录需要加-r参数如果指定-skipTrash选项,那么在回收站可用的情况下,该选项将跳过回收站而直接删除文件;否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件暂时放到回收站中。
|
(2)删除HDFS上的文件
|
(3)moveFromLocal 命令
和put参数类似,但是源文件localsrc拷贝之后自身被删除
语法格式:
|
(4)上传数据文件并自动删除本地
|
八、需求:查看HDFS文件内容
要查看HDFS上的内容,有一种办法,我们可以先从HDFS将文件下载到Linux,然后我们用less命令、或者cat命令就可以查看了。
所以,操作步骤如下:
- 使用get命令,从HDFS下载文件到Linux
- 使用less命令,在Linux上查看下载的文件
(1)get
将文件拷贝到本地文件系统,可以通过指定-ignorecrc选项拷贝CRC校验失败的文件。-crc选项表示获取文件以及CRC校验文件。
语法格式:
|
(2)下载并查看
|
九、需求:直接查看HDFS中的文件内容
上面这种方法稍微有点麻烦,每次查看都得先下载,然后再查看。在HDFS中,可以使用-cat命令直接查看。
(1)cat命令
将参数所指示的文件内容输出到控制台。
语法格式:
hdfs dfs -cat URI [uri ...]
(2)查看微博评论数据文件
|
我们发现,这个命令确实可以查看数据文件。但我们知道,HDFS上存储的都是很大的数据文件,这样查看一次要拉取这么大的数据输出到控制台,这是很耗时的。在生产环境中,我们要慎用。我们可以使用 head 命令,一次只查看下前1 KB的数据,它的性能更好、速度更快。或者使用 tail 命令,
(3)head命令
显示要输出的文件的开头的1KB数据。
语法格式:
|
(4)tail命令
显示文件结尾的1kb数据。
语法格式:
|
与Linux中一样,-f选项表示数据只要有变化也会输出到控制台。
(5)快速查看HDFS文件内容
|
我们发现,现在很快就查看到了文件内容。
十、需求:拷贝一份数据到20190811目录
假设现在需要开始分析20190811这一天的用户行为信息。但分析的同时,我们需要也一并把上一天的数据加载进来。所以,此处我们需要将20190810这一天的数据,拷贝到20190811这一天的数据。
我们首先需要把 20190811 这一天的目录创建出来,然后可以开始拷贝了。
(1)cp拷贝命令
将文件拷贝到目标路径中。如果<dest> 为目录的话,可以将多个文件拷贝到该目录下。
语法格式:
hdfs dfs -cp URI [URI ...] <dest>
命令行选项:
- -f 选项将覆盖目标,如果它已经存在
- -p 选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)。
(2)拷贝执行数据到新目录
|