共计 10156 个字符,预计需要花费 26 分钟才能阅读完成。
HDFS 是一个分布式文件系统,安装完成之后使用起来类似于本地文件系统,但是它是一个网络文件系统,所以访问这种文件系统的方式和访问本地文件系统的方式还是有所差别的(本地文件系统的方式是基于系统调用的,当然也有类似 NFS 这样的网络文件系统可以使用和本地文件系统相同的访问方式,那是因为已经在内核中安装了 NFS,而 HDFS 只是一个应用层的服务程序罢了)。但是这些命令看上去还是和常用的 shell 命令很类似的。
首先,我们需要下载一个 Hadoop 程序包,hadoop 分为两个压缩文件,一个是源代码,一个是编译好的程序包,下载的地址:http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.6.0/,这里使用的是最新的 2.6.0 版本,下载好 hadoop-2.6.0.tar.gz 文件之后进行解压会有这些文件:
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ ls
bin etc include lib libexec LICENSE.txt logs NOTICE.txt README.txt sbin share
这些文件和我们在 linux 下安装的其他软件的目录结构差不多,所有的配置文件都在 /etc 下面,可执行文件放在 bin 目录下,sbin 放的是一些脚本文件。
要想单独启动一个 hdfs 用来尝试一下文件存储的功能,需要对下面的文件进行配置:
1、配置 etc/hadoop/hadoop-env.sh 文件,看了一下这里执行了一些 export 目录设置系统的环境变量。
需要配置里面的 JAVA_HOME 变量,设置为 java 安装路径
默认情况下 export JAVA_HOME=${JAVA_HOME},查看系统的 JAVA_HOME 路径并配置。
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0/etc/hadoop$ echo ${JAVA_HOME}
/home/linuxidc/java/jdk1.7.0_60
当然,也可以在这里面添加 HADOOP_HOME=hadoop 的安装目录,方面访问 hadoop 的根目录。
2、配置 etc/hadoop/core-site.xml 文件,从命名上可以看出这里是一些核心的配置项,hadoop 的配置都是使用 key:value 的方式,但是配置文件都是使用 xml 的方式,所以基本的结构都是这样子的:
<configuration>
<property>
<name>key</name>
<value>value</value>
</property>
</configuration>
这里需要配置的 key 是 hadoop.tmp.dir,这个配置的是 HDFS 系统以来的基础目录,如果不配置它会设置为 /tmp 目录下,而 /tmp 目录下的文件不是永久性的,所以可能出现问题。另外如果在 hdfs 的 namenode 和 datanode 目录不配置的情况下,默认也会存放在该目录中。
配置项 fs.default.name 设置的是 HDFS 的 namenode 的访问地址,因为 namenode 存放的是系统的所有元数据信息,也就是文件系统访问的入口,所以这个是必须要配置的,这里配置的是 hdfs://hzfengyu.netease.com:9000。要保证前面的域名是本机可以识别的。整个的配置文件如下:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hzfengyu/workplace/hadoop/data</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://hzfengyu.netease.com:9000</value>
</property>
</configuration>
————————————– 分割线 ————————————–
将本地文件拷到 HDFS 中 http://www.linuxidc.com/Linux/2013-05/83866.htm
从 HDFS 下载文件到本地 http://www.linuxidc.com/Linux/2012-11/74214.htm
将本地文件上传至 HDFS http://www.linuxidc.com/Linux/2012-11/74213.htm
HDFS 基本文件常用命令 http://www.linuxidc.com/Linux/2013-09/89658.htm
Hadoop 中 HDFS 和 MapReduce 节点基本简介 http://www.linuxidc.com/Linux/2013-09/89653.htm
《Hadoop 实战》中文版 + 英文文字版 + 源码【PDF】http://www.linuxidc.com/Linux/2012-10/71901.htm
Hadoop: The Definitive Guide【PDF 版】http://www.linuxidc.com/Linux/2012-01/51182.htm
————————————– 分割线 ————————————–
3、配置 etc/hadoop/hdfs-site.xml 文件,这个文件是 hdfs 的配置文件,需要配置如下几项:
dfs.replication:从命名上可以看出这里配置的是每一个 block 的复制的份数,这里我们为了测试,简单配置为 1.
dfs.namenode.name.dir:namenode 依赖的根目录文件
dfs.datannode.data.dir:datanode 依赖的根目录文件
完整的配置如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hzfengyu/workplace/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datannode.data.dir</name>
<value>/home/hzfengyu/workplace/hadoop/hdfs/data</value>
</property>
</configuration>
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-01/112129p2.htm
4、配置好了 hdfs 的两个程序的配置,接下来就可以启动进程了,首先要执行 HDFS 的格式化操作:
./bin/Hadoop namenode -format
执行完成之后,配置的 namenode 目录下会出现一些文件。
5、启动进程
分别要启动 namenode、datanode 和 secondarynamenode,分别执行一下命令:
./sbin/hadoop-daemon.sh start namenode
./sbin/hadoop-daemon.sh start datanode
./sbin/hadoop-daemon.sh start secondarynamenode
查看启动的 java 进程可以看到,他们都分别启动了:
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ jps
10012 Jps
9834 NameNode
9973 SecondaryNameNode
9890 DataNode
6、使用
HDFS 的目录格式是 hadoop fs -cmd,其中 cmd 是具体的目录,例如 ls、cp 等,现在我们 hadoop 是绿色安装的,所以这里先设置一下 hadoop 的路径到系统的 PATH 变量下:
export PATH=”${PATH}:${HADOOP_HOME}/sbin:${HADOOP_HOME}/bin”
接着就可以使用 hadoop fs -cmd 执行具体的命令了。
首先我们试着执行一下 ls 的命令:hadoop fs -ls,结果出现了这样的错误:
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ hadoop fs -ls
Java HotSpot(TM) Client VM warning: You have loaded library /home/linuxidc/workplace/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
It’s highly recommended that you fix the library with ‘execstack -c <libfile>’, or link it with ‘-z noexecstack’.
15/01/16 18:08:08 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
ls: `.’: No such file or directory
上面的 WARN 不用管,这里提示我们没有这个目录,其实就像我们在 linux 的 shell 下执行 ls 目录一样,默认 ls 打印的是当前目录下文件的信息,但是 shell 是一个进程,所以他可以保存我们当前进入到的目录,因此就可以使用 ”.” 和 ”..” 进入当前目录和父目录,也就是说可以使用相对路径,但是我们在客户端启动一个 HDFS 的命令启动的是一个单独的进程,所以也就没有当前目录的概念了,所以我们在这时只能使用绝对路径访问,如果我们在一个程序里面使用 HDFS 的客户端访问,这时候才可以使用相对路径。
好了,HDFS 的目录结构也是树形的结构,所以我们先看一下根目录下的信息,执行 hadoop fs -ls /,发现除了之前的 WARN 信息之外就没有其他的内容了,这是因为我们还没有在 HDFS 中存储任何文件。顺便提一下,HDFS 支持的命令如下:
Usage: hadoop fs [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] <localsrc> … <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> … <localdst>]
[-count [-q] [-h] <path> …]
[-cp [-f] [-p | -p[topax]] <src> … <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> …]]
[-du [-s] [-h] <path> …]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> … <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd …]]
[-ls [-d] [-h] [-R] [<path> …]]
[-mkdir [-p] <path> …]
[-moveFromLocal <localsrc> … <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> … <dst>]
[-put [-f] [-p] [-l] <localsrc> … <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <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] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> …]
[-touchz <path> …]
[-usage [cmd …]]
先来使用 df 看一下根目录的空间使用情况:fs -df -h /
Filesystem Size Used Available Use%
hdfs://linuxidc.netease.com:9000 18.6 G 24 K 8.4 G 0%
然后在使用 touchz 创建一个空文件:
hadoop fs -touchz /hello /world
然后执行 ls 目录查看这两个文件:
Found 2 items
-rw-r–r– 1 linuxidc supergroup 0 2015-01-16 18:21 /hello
-rw-r–r– 1 linuxidc supergroup 0 2015-01-16 18:21 /world
但是此时查看 datanode 目录下根本没有内容,这是因为创建两个空文件只需要在文件系统的命名空间上添加个叶节点,而不需真正的创建 block 写入数据,接着我们试着拷贝一个大文件:hadoop fs -put ../../hadoop.tar /,注意 cp 目录是在 hdfs 内部拷贝文件。
此时如果用 tcpdump 抓包查看会发现大量的网络数据包,使用的端口是 50010,查看会发现它是 datanode 的监听端口,也就是说数据传输是在客户端和 datanode 之间进行的。
此时再次执行 ls 目录会发现文件已经存在于根目录下了:
Found 3 items
-rw-r–r– 1 linuxidc supergroup 620369920 2015-01-16 18:26 /hadoop.tar
-rw-r–r– 1 linuxidc supergroup 0 2015-01-16 18:21 /hello
-rw-r–r– 1 linuxidc supergroup 0 2015-01-16 18:21 /world
此时会在 datanode 的目录下发现一个个的 block 文件:
总用量 597M
drwxrwxr-x 2 linuxidc linuxidc 4.0K 1 月 16 18:26 .
drwxrwxr-x 3 linuxidc linuxidc 4.0K 1 月 16 18:25 ..
-rw-rw-r– 1 linuxidc linuxidc 128M 1 月 16 18:25 blk_1073741825
-rw-rw-r– 1 linuxidc linuxidc 1.1M 1 月 16 18:25 blk_1073741825_1001.meta
-rw-rw-r– 1 linuxidc linuxidc 128M 1 月 16 18:26 blk_1073741826
-rw-rw-r– 1 linuxidc linuxidc 1.1M 1 月 16 18:26 blk_1073741826_1002.meta
-rw-rw-r– 1 linuxidc linuxidc 128M 1 月 16 18:26 blk_1073741827
-rw-rw-r– 1 linuxidc linuxidc 1.1M 1 月 16 18:26 blk_1073741827_1003.meta
-rw-rw-r– 1 linuxidc linuxidc 128M 1 月 16 18:26 blk_1073741828
-rw-rw-r– 1 linuxidc linuxidc 1.1M 1 月 16 18:26 blk_1073741828_1004.meta
-rw-rw-r– 1 linuxidc linuxidc 80M 1 月 16 18:26 blk_1073741829
-rw-rw-r– 1 linuxidc linuxidc 638K 1 月 16 18:26 blk_1073741829_1005.meta
每一个 block 的大小为 128M,每一个文件关联一个 meta 文件。
好了,这里我们简单介绍了一下部署和安装 HDFS 的步骤和一些基本的命令。
HDFS 是一个分布式文件系统,安装完成之后使用起来类似于本地文件系统,但是它是一个网络文件系统,所以访问这种文件系统的方式和访问本地文件系统的方式还是有所差别的(本地文件系统的方式是基于系统调用的,当然也有类似 NFS 这样的网络文件系统可以使用和本地文件系统相同的访问方式,那是因为已经在内核中安装了 NFS,而 HDFS 只是一个应用层的服务程序罢了)。但是这些命令看上去还是和常用的 shell 命令很类似的。
首先,我们需要下载一个 Hadoop 程序包,hadoop 分为两个压缩文件,一个是源代码,一个是编译好的程序包,下载的地址:http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.6.0/,这里使用的是最新的 2.6.0 版本,下载好 hadoop-2.6.0.tar.gz 文件之后进行解压会有这些文件:
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ ls
bin etc include lib libexec LICENSE.txt logs NOTICE.txt README.txt sbin share
这些文件和我们在 linux 下安装的其他软件的目录结构差不多,所有的配置文件都在 /etc 下面,可执行文件放在 bin 目录下,sbin 放的是一些脚本文件。
要想单独启动一个 hdfs 用来尝试一下文件存储的功能,需要对下面的文件进行配置:
1、配置 etc/hadoop/hadoop-env.sh 文件,看了一下这里执行了一些 export 目录设置系统的环境变量。
需要配置里面的 JAVA_HOME 变量,设置为 java 安装路径
默认情况下 export JAVA_HOME=${JAVA_HOME},查看系统的 JAVA_HOME 路径并配置。
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0/etc/hadoop$ echo ${JAVA_HOME}
/home/linuxidc/java/jdk1.7.0_60
当然,也可以在这里面添加 HADOOP_HOME=hadoop 的安装目录,方面访问 hadoop 的根目录。
2、配置 etc/hadoop/core-site.xml 文件,从命名上可以看出这里是一些核心的配置项,hadoop 的配置都是使用 key:value 的方式,但是配置文件都是使用 xml 的方式,所以基本的结构都是这样子的:
<configuration>
<property>
<name>key</name>
<value>value</value>
</property>
</configuration>
这里需要配置的 key 是 hadoop.tmp.dir,这个配置的是 HDFS 系统以来的基础目录,如果不配置它会设置为 /tmp 目录下,而 /tmp 目录下的文件不是永久性的,所以可能出现问题。另外如果在 hdfs 的 namenode 和 datanode 目录不配置的情况下,默认也会存放在该目录中。
配置项 fs.default.name 设置的是 HDFS 的 namenode 的访问地址,因为 namenode 存放的是系统的所有元数据信息,也就是文件系统访问的入口,所以这个是必须要配置的,这里配置的是 hdfs://hzfengyu.netease.com:9000。要保证前面的域名是本机可以识别的。整个的配置文件如下:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hzfengyu/workplace/hadoop/data</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://hzfengyu.netease.com:9000</value>
</property>
</configuration>
————————————– 分割线 ————————————–
将本地文件拷到 HDFS 中 http://www.linuxidc.com/Linux/2013-05/83866.htm
从 HDFS 下载文件到本地 http://www.linuxidc.com/Linux/2012-11/74214.htm
将本地文件上传至 HDFS http://www.linuxidc.com/Linux/2012-11/74213.htm
HDFS 基本文件常用命令 http://www.linuxidc.com/Linux/2013-09/89658.htm
Hadoop 中 HDFS 和 MapReduce 节点基本简介 http://www.linuxidc.com/Linux/2013-09/89653.htm
《Hadoop 实战》中文版 + 英文文字版 + 源码【PDF】http://www.linuxidc.com/Linux/2012-10/71901.htm
Hadoop: The Definitive Guide【PDF 版】http://www.linuxidc.com/Linux/2012-01/51182.htm
————————————– 分割线 ————————————–
3、配置 etc/hadoop/hdfs-site.xml 文件,这个文件是 hdfs 的配置文件,需要配置如下几项:
dfs.replication:从命名上可以看出这里配置的是每一个 block 的复制的份数,这里我们为了测试,简单配置为 1.
dfs.namenode.name.dir:namenode 依赖的根目录文件
dfs.datannode.data.dir:datanode 依赖的根目录文件
完整的配置如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hzfengyu/workplace/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datannode.data.dir</name>
<value>/home/hzfengyu/workplace/hadoop/hdfs/data</value>
</property>
</configuration>
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-01/112129p2.htm