首页 > 代码库 > [hadoop读书笔记] 第三章 HDFS

[hadoop读书笔记] 第三章 HDFS

 

 

P49

当数据集的大小超过一台计算机存储能力时,就有必要对数据集分区(partition)并将分区存储到若干台独立的计算机上。

管理网络中跨多台计算机存储的系统就叫分布式文件系统  Distributed FileSystem

而基于Hadoop构建的DFS就称之为HDFS。

 

P49-50

HDFS的设计思路:以流数据访问模式来存储超大文件,运行在商用硬件集群上。

技术分享

技术分享

 

P51

HDFS 数据块:默认为64MB,是HDFS进行数据读写的最小单位,作为独立的存储单元存在。

一个打文件可以切分为多个块存储在不同节点的磁盘上,数据的备份是以块的方式来备份的。

 

P52

显示块信息命令:fsck

列出文件系统中各个文件由哪些块构成:hadoop fsck / -files -blocks

 

P56

fs.default.name - core-site.xml

用于设置Hadoop的默认文件系统,由URI指定,通常为:hdfs://ip:port/

表示将HDFS作为Hadoop的默认文件系统。HDFS的守护进程将会通过该属性来确定namenode的主机和端口。

如果不配置端口号  hdfs://ip/ 则默认端口为8020 ,namenode将会运行在8020端口上。

<property>    <name>fs.default.name</name>    <value>hdfs://192.168.200.123:9000</value></property>

 

dfs.replication - hdfs-site.xml

用于设置数据块的副本数量,默认为3。如果是伪分布式配置时,则配置为1。

<configuration>        <property>                <name>dfs.replication</name>                <value>1</value>        </property>        <property>                <name>dfs.namenode.name.dir</name>                <value>/wdcloud/data/hadoop/name</value>        </property>        <property>                <name>dfs.datanode.data.dir</name>                <value>/wdcloud/data/hadoop/data</value>        </property>        <property>                <name>dfs.permissions</name>                <value>false</value>        </property></configuration>

 

文件系统基本操作

查看帮助:hadoop fs -help

举例:

(1)将文件从本地文件系统复制到HDFS:

hadoop fs -copyFromLocal    本地文件路径/a.txt    hdfs://ip:port/user/xxx/a.txt

 

当core-site.xml中配置了URI时,可以省略 hdfs://ip:port,直接运行

hadoop fs -copyFromLocal    本地文件路径/a.txt    /user/xxx/a.txt

 

使用相对路径将文件复制到HDFS的home目录(/user/xxx/):

hadoop fs -copyFromLocal    本地文件路径/a.txt   a.txt

 

(2)将文件从HDFS复制到本地文件系统

hadoop fs -copyToLocal xxx.txt(HDFS 的 home 下)    xxx.copy.txt(本地文件系统)

 

(3)创建文件夹 

hadoop fs -mkdir books

 

(4)列出目录文件 

hadoop fs -ls .

drwxr-xr-  -  tom supergroup 0 2009-04-02 22:41 /user/tom/books

drwxr-xr-  1  tom supergroup 118 2009-04-02 22:29 /user/tom/xxx.txt

 

第一列文件模式

第二列数据块备份数目,目录作为元数据存储在namenode而非datanode中

3、4显示文件所属用户和组

5显示文件大小,字节为单位,目录为0

6、7列是文件的最后修改日期和时间

第8列是文件或目录的绝对路径

 

P58 Hadoop文件系统

Hadoop的文件系统的概念是抽象的 HDFS只是其中的一种实现。Java抽象类org.apache.hadoop.FileSystem定义了hadoop文件系统接口,有如下的具体实现:

技术分享

使用URI可用于Hadoop与文件系统进行实时交互,如:

列出本地文件系统根目录下的文件:hadoop fs -ls file:///

技术分享

列出HDFS文件系统根目录下的文件 

技术分享

技术分享

 

P61

namenode内置web服务器:默认运行在50070端口上,提供目录服务

datanode内置web服务器:默认运行在50075端口上,以数据流方式传输

 

配置:

dfs.webhdfs.enable - true

访问namenode的hdfs使用50070端口,访问datanode的webhdfs使用50075端口。访问文件、文件夹信息使用namenode的IP和50070端口,访问文件内容或者进行打开、上传、修改、下载等操作使用datanode的IP和50075端口。要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hefs-site.xml中的dfs.webhdfs.enabled为true。

端口配置

Hadoop 管理介面 - mapred-site.xml<property>  <name>mapred.job.tracker.http.address</name>  <value>0.0.0.0:50030</value></property>Hadoop Task Tracker 状态 - mapred-site.xml<property>  <name>mapred.task.tracker.http.address</name>  <value>0.0.0.0:50060</value></property> Hadoop DFS 状态 - hdfs-site.xml<property>  <name>dfs.http.address</name>  <value>0.0.0.0:50070</value></property>
curl操作webhdfs
创建并写一个文件 curl -i -X PUT "http://localhost:50070/webhdfs/v1/<PATH>?op=CREATE [&overwrite=<true|false>][&blocksize=<LONG>][&replication=<SHORT>] [&permission=<OCTAL>][&buffersize=<INT>]“ curl -i -X PUT -T <LOCAL_FILE> "http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>? op=CREATE...“ 注意这个地方填入的是DataNode的信息 在一个文件内追加内容 curl -i -X POST "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=APPEND[&buffersize=<INT>]” curl -i -X POST -T <LOCAL_FILE> "http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>? op=APPEND...“ 注意该条命令获得的是DataNode的信息。 打开并读取一个文件 curl -i -L "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN [&offset=<LONG>][&length=<LONG>][&buffersize=<INT>]“ 创建一个目录 curl -i -X PUT "http://<HOST>:<PORT>/<PATH>?op=MKDIRS[&permission=<OCTAL>]“ 重名命文件、文件夹 curl -i -X PUT "<HOST>:<PORT>/webhdfs/v1/<PATH>?op=RENAME&destination=<PATH>" 删除文件/文件夹 curl -i -X DELETE "http://<host>:<port>/webhdfs/v1/<path>?op=DELETE [&recursive=<true|false>]“ 文件/ 文件夹的状态信息 curl -i “http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILESTATUS“ 目录列表 curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS” 获取目录的上下文环境汇总信息 curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETCONTENTSUMMARY" 获取Check Sum File curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILECHECKSUM” 获取Home 目录 curl -i "http://<HOST>:<PORT>/webhdfs/v1/?op=GETHOMEDIRECTORY” 设置权限 curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETPERMISSION [&permission=<OCTAL>]“ 设置所有者 curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETOWNER [&owner=<USER>][&group=<GROUP>]" 设置备份 curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETREPLICATION [&replication=<SHORT>]“

 

P63

使用Java接口与Hadoop文件系统进行交互

FileSystem:与Hadoop中某文件系统进行交互的API

DistributedFileSystem:与HDFS文件系统进行交互的API

 

P64 通过FileSystem API 读取数据

 

1、检索文件系统

public static FileSystem get(Configuration conf)

返回core-site.xml中配置的默认文件系统,若没有配置,使用本地文件系统

 

public static FileSystem get(URI uri,Configuration conf)

返回给定的URI指定的文件系统,若URI为空,返回默认文件系统

 

public static FileSystem get(URI uri,Configuration conf,String user)

作为给定用户访问文件系统

 

Configuration:封装了客户端或服务器的配置

 

如果确定获取本地文件系统,直接使用

public static LocalFileSystem getLocal(Configuration conf)

 

2、获取文件输入流

public FSDataInputStream open(Path f) - 默认缓冲区大小4KB

public abstract FSDataInputStream open(Path f,int bufferSize) 

 FSDataInputStream  - 这个类继承了java.io.DataInputStream接口,支持随机访问,可以从流的任意位置读取数据

实例:

技术分享

 

P68 通过FileSystem API 写入数据

 

public FSDataOutputStream create(Path f)

public FSDataOutputStream append(Path f)

 

例子:将本地文件复制到hadoop文件系统

技术分享

 

P72 查询文件系统

 技术分享

 

[hadoop读书笔记] 第三章 HDFS