HDFS入门和应用开发:实战微博HDFS案例(上)_mysql

一、背景

微博有大量的用户数据,为了分析微博用户的行为。我们可以将微博的数据上传到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命令行客户端,使用方法如下:

Usage: hdfs [SHELL_OPTIONS] COMMAND [GENERIC_OPTIONS] [COMMAND_OPTIONS]

 

选项:

COMMAND_OPTIONS

Description

SHELL_OPTIONS

常见的shell选项,例如:操作文件系统、管理hdfs集群..

GENERIC_OPTIONS

多个命令支持的公共选项

COMMAND COMMAND_OPTIONS

用户命令、或者是管理命令

 

示例:

# 查看HDFS中/parent/child目录下的文件或者文件夹
hdfs dfs -ls  /parent/child

 

  1. 所有HDFS命令都可以通过bin/hdfs脚本执行。
  2. 还有一个hadoop命令也可以执行文件系统操作,还可以用来提交作业,此处我们均使用hdfs,为了更好地区分和对hdfs更好的支持。

(2)说明

  1. 文件系统shell包括与Hadoop分布式文件系统(HDFS)以及Hadoop支持的其他文件系统(如本地FS,HFTP FS,S3 FS等)直接交互的各种类似shell的命令
  2. 所有FS shell命令都将路径URI作为参数。URI格式为scheme://authority/path。对于HDFS,该scheme是hdfs,对于本地FS,该scheme是file。scheme和authority是可选的。如果未指定,则使用配置中指定的默认方案
  3. 命令示例如下:
# 查看指定目录下的文件
hdfs dfs -ls  hdfs://namenode:host/parent/child
# hdfs-site.xml中的fs.defaultFS中有配置
hdfs dfs -ls  /parent/child

(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参数可以递归创建目录

hdfs dfs -mkdir /dir1
hdfs dfs -mkdir /dir2
hdfs dfs -p -mkdir /aaa/bbb/ccc

(2)创建目录规划

[root@node1 ~]# hdfs dfs -mkdir /common
[root@node1 ~]# hdfs dfs -mkdir /workspace
[root@node1 ~]# hdfs dfs -mkdir /tmp/
[root@node1 ~]# hdfs dfs -mkdir /warehouse
[root@node1 ~]# hdfs dfs -mkdir /source

(3)在WebUI中查看目录

HDFS入门和应用开发:实战微博HDFS案例(上)_大数据_02

五、需求:使用命令查看HDFS中的目录

(1)ls命令

格式: hdfs dfs -ls  URI

作用:类似于Linux的ls命令,显示文件列表

hdfs dfs -ls  /

选项

  1. -R:表示递归展示目录下的内容

(2)查看HDFS根目录下的所有内容

[root@node1 ~]# hdfs dfs -ls /
Found 7 items
drwxr-xr-x   - root supergroup          0 2020-10-15 22:29 /common
drwxr-xr-x   - root supergroup          0 2020-10-15 22:29 /source
drwxr-xr-x   - root supergroup          0 2020-10-15 22:29 /tmp
drwxr-xr-x   - root supergroup          0 2020-10-15 22:29 /warehouse
drwxr-xr-x   - root supergroup          0 2020-10-15 22:29 /workspace

六、需求:上传蔡徐坤微博评论数据到HDFS

HDFS入门和应用开发:实战微博HDFS案例(上)_mysql_03

在资料/数据集文件夹中,有一个caixukun.csv数据集。里面包含了大量蔡徐坤微博相关的评论数据集,我们需要将这些数据集上传到HDFS中。此处,我们需要将这些原始数据集上传到以下目录:

/source/weibo/star/comment_log/20190810_node1.itcast.cn/

命名方式:/source/{产品线}/{业务线}/{日志名称}/{日期}_{上报日志的机器}。

 

操作步骤:

  1. 先将目录创建出来。
  2. 再使用put命令将数据上传到该目录中。

(1)put命令

-put参数可以将单个的源文件src或者多个源文件src从本地文件系统拷贝到目标文件系统中(<dst>对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中。

语法格式:

hdfs dfs -put <localsrc >  ... <dst>

(2)上传微博评论数据

  1. 创建对应的文件夹。
hdfs dfs -mkdir -p /source/weibo/star/comment_log/20190810_node1.itcast.cn/
  1. 上传文件到文件夹中。
  2. 先将数据集上传到Linux
[root@node1 ~]# rz
rz waiting to receive.
?a? zmodem ′??.  °′ Ctrl+C ??.
Transferring caixukun.csv...
  100%   31496 KB 7874 KB/s 00:00:04       0 ′?
  1. 再使用put命令上传到HDFS中
hdfs dfs -put caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn
  1. 查看创建的目录和文件。
[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命令。

为了测试,我们要执行以下操作。

  1. 删除之前上传的文件。
  2. 重新使用moveFromLocal上传。

(1)rm命令

删除参数指定的文件和目录,参数可以有多个,删除目录需要加-r参数如果指定-skipTrash选项,那么在回收站可用的情况下,该选项将跳过回收站而直接删除文件;否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件暂时放到回收站中。

hdfs dfs -rm [-r] [-skipTrash] URI [URI…]

(2)删除HDFS上的文件

hdfs dfs -rm /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv

(3)moveFromLocal 命令

和put参数类似,但是源文件localsrc拷贝之后自身被删除

语法格式:

hdfs dfs -moveFromLocal <localsrc>  <dst>

(4)上传数据文件并自动删除本地

[root@node1 ~]# hdfs dfs -moveFromLocal caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn/
[root@node1 ~]# ll
total 0
[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 23:04 /source/weibo/star/comment_log/20190810_node1.itcast.cn
-rw-r--r--   3 root supergroup     30.8 M 2020-10-15 23:04 /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv

八、需求:查看HDFS文件内容

要查看HDFS上的内容,有一种办法,我们可以先从HDFS将文件下载到Linux,然后我们用less命令、或者cat命令就可以查看了。

 

所以,操作步骤如下:

  1. 使用get命令,从HDFS下载文件到Linux
  2. 使用less命令,在Linux上查看下载的文件

(1)get

将文件拷贝到本地文件系统,可以通过指定-ignorecrc选项拷贝CRC校验失败的文件。-crc选项表示获取文件以及CRC校验文件。

语法格式:

hdfs dfs -get [-ignorecrc ]  [-crc]  <src> <localdst>

(2)下载并查看

[root@node1 ~]# hdfs dfs -get /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
[root@node1 ~]# ll
total 31500
-rw-r--r-- 1 root root 32252088 Oct 15 23:11 caixukun.csv
[root@node1 ~]# less caixukun.csv

九、需求:直接查看HDFS中的文件内容

上面这种方法稍微有点麻烦,每次查看都得先下载,然后再查看。在HDFS中,可以使用-cat命令直接查看。

(1)cat命令

将参数所指示的文件内容输出到控制台。

 

语法格式:

hdfs dfs  -cat  URI [uri  ...]

(2)查看微博评论数据文件

hdfs dfs -cat /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv

我们发现,这个命令确实可以查看数据文件。但我们知道,HDFS上存储的都是很大的数据文件,这样查看一次要拉取这么大的数据输出到控制台,这是很耗时的。在生产环境中,我们要慎用。我们可以使用 head 命令,一次只查看下前1 KB的数据,它的性能更好、速度更快。或者使用 tail 命令,

(3)head命令

显示要输出的文件的开头的1KB数据。

 

语法格式:

hdfs dfs -head URI

(4)tail命令

 

显示文件结尾的1kb数据。

 

语法格式:

hdfs dfs -tail [-f] URI

与Linux中一样,-f选项表示数据只要有变化也会输出到控制台。

(5)快速查看HDFS文件内容

[root@node1 ~]# hdfs dfs -head /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
attitudes_count,comments_count,reposts_count,mid,raw_text,source,user.description,user.follow_count,user.followers_count,user.gender,user.id,user.mbrank,user.mbtype,user.profile_url,user.profile_image_url,user.screen_name,user.statuses_count,user.urank,user.verified,user.verified_reason
0,0,0,4348037901878739,也许可有可无是我的存在//@葵的妈奎的妹坤的妻:[抱抱][抱抱][抱抱][抱抱]哥哥,好想你呀@蔡徐坤,Android,,0,1,m,6974721802,0,0,https://m.weibo.cn/u/6974721802?uid=6974721802,https://tvax3.sinaimg.cn/default/images/default_avatar_male_180.gif,用户6974721802,88,4,False,
0,0,0,4348037901708511,我讨厌你中间加什么字最甜?我讨厌没你...蔡徐坤//@蔡徐坤我老公鸭://@AK47-KAKAKA:#东方风云榜让世界看见蔡徐坤#??| #蔡徐坤的未完成#,Android,,0,1,m,7011557609,0,0,https://m.weibo.cn/u/7011557609?uid=7011557609,https://tvax1.sinaimg.cn/crop.0.7.100.100.180/007EvMqRly8g0jwyht72ij302s037gls.jpg,用户7011557609,34,3,False,
0,0,0,4348037901
[root@node1 ~]# hdfs dfs -tail /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
 is wait wait wait,三星android智能手机,,0,1,m,7012474822,0,0,https://m.weibo.cn/u/7012474822?uid=7012474822,https://tvax2.sinaimg.cn/crop.0.0.640.640.180/007EzD2Cly8g0kfgdi3o9j30hs0hsq3t.jpg,专业护坤HDy295,58,3,False,
0,0,0,4348675595735533,"dei tuoi gioielli l’Orrore non è il meno attraente,",魅蓝 metal,,0,1,m,7012393763,0,0,https://m.weibo.cn/u/7012393763?uid=7012393763,https://tvax1.sinaimg.cn/crop.0.0.640.640.180/007EzhXdly8g0kb3negv1j30hs0hsgms.jpg,专业护菜X8F284,84,2,False,
0,0,0,4348677269012416,"del giorno, delle strade",前后2000万 OPPO R11,,0,1,m,7011819449,0,0,https://m.weibo.cn/u/7011819449?uid=7011819449,https://tvax3.sinaimg.cn/crop.0.0.640.640.180/007EwSy5ly8g0kb463rggj30hs0hswff.jpg,葵花宝典ot4840,84,3,False,
0,0,0,4348677256325540,"Verso di te, candela, la falena abbagliata",小米手机,,0,1,m,7011819506,0,0,https://m.weibo.cn/u/7011819506?uid=7011819506,https://tvax3.sinaimg.cn/crop.0.0.640.640.180/007EwSz0ly8g0kb43nxmbj30hs0hsdgm.jpg,陪坤左右XPj463,84,3,False,

我们发现,现在很快就查看到了文件内容。

十、需求:拷贝一份数据到20190811目录

假设现在需要开始分析20190811这一天的用户行为信息。但分析的同时,我们需要也一并把上一天的数据加载进来。所以,此处我们需要将20190810这一天的数据,拷贝到20190811这一天的数据。

 

我们首先需要把 20190811 这一天的目录创建出来,然后可以开始拷贝了。

(1)cp拷贝命令

将文件拷贝到目标路径中。如果<dest>  为目录的话,可以将多个文件拷贝到该目录下。

 

语法格式:

hdfs  dfs  -cp URI [URI ...] <dest>

 

命令行选项:

  1. -f 选项将覆盖目标,如果它已经存在
  2. -p 选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)。

(2)拷贝执行数据到新目录

# 创建目录
hdfs dfs -mkdir -p /source/weibo/star/comment_log/20190811_node1.itcast.cn/
# 拷贝文件
hdfs dfs -cp /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv /source/weibo/star/comment_log/20190811_node1.itcast.cn/