HDFS伪分布式环境搭建

原创 ZeroOne01 2018-03-24 19:51:20 评论(0) 655人阅读

HDFS概述及设计目标

什么是HDFS:

  • 是Hadoop实现的一个分布式文件系统(Hadoop Distributed File System),简称HDFS
  • 源自于Google的GFS论文
  • 论文发表于2003年,HDFS是GFS的克隆版

HDFS的设计目标:

  • 非常巨大的分布式文件系统
  • 运行在普通廉价的硬件上
  • 易扩展、为用户×××能不错的文件存储服务,也就是容错性

HDFS官方文档地址如下:

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html


HDFS架构

HDFS是主/从式的架构。一个HDFS集群会有一个NameNode(简称NN),也就是命名节点,该节点作为主服务器存在(master server)。NameNode用于管理文件系统的命名空间以及调节客户访问文件。此外,还会有多个DataNode(简称DN),也就是数据节点,数据节点作为从节点存在(slave server)。通常每一个集群中的DataNode,都会被NameNode所管理,DataNode用于存储数据。

HDFS公开了文件系统名称空间,允许用户将数据存储在文件中,就好比我们平时使用操作系统中的文件系统一样,用户无需关心底层是如何存储数据的。而在底层,一个文件会被分成一个或多个数据块,这些数据库块会被存储在一组数据节点中。在CDH中数据块的默认大小是128M,这个大小我们可以通过配置文件进行调节。在NameNode上我们可以执行文件系统的命名空间操作,如打开,关闭,重命名文件等。这也决定了数据块到数据节点的映射。

我们可以来看看HDFS的架构图:

HDFS被设计为可以运行在普通的廉价机器上,而这些机器通常运行着一个Linux操作系统。HDFS是使用java语言编写的,任何支持java的机器都可以运行HDFS。使用高度可移植的java语言编写的HDFS,意味着可以部署在广泛的机器上。一个典型的HDFS集群部署会有一个专门的机器只能运行NameNode,而其他集群中的机器各自运行一个DataNode实例。虽然一台机器上也可以运行多个节点,但是并不建议这么做,除非是学习环境。

总结:

  • HDFS是主/从式的架构,一个HDFS集群会有一个NameNode以及多个DataNode
  • 一个文件会被拆分为多个数据块进行存储,默认数据块大小是128M
  • 即便一个数据块大小为130M,也会被拆分为2个Block,一个大小为128M,一个大小为2M
  • HDFS是使用Java编写的,使得其可以运行在安装了JDK的操作系统之上

NN:

  • 负责客户端请求的响应
  • 负责元数据(文件的名称、副本系数、Block存放的DN)的管理

DN:

  • 存储用户的文件对应的数据块(Block)
  • 会定期向NN发送心跳信息,汇报本身及其所有的block信息和健康状况

HDFS副本机制

在HDFS中,一个文件会被拆分为一个或多个数据块。默认情况下,每个数据块都会有三个副本。每个副本都会被存放在不同的机器上,而且每一个副本都有自己唯一的编号。

如下图:


HDFS副本存放策略

NameNode节点选择一个DataNode节点去存储block副本得过程就叫做副本存放,这个过程的策略其实就是在可靠性和读写带宽间得权衡。

《Hadoop权威指南》中的默认方式:

  • 第一个副本会随机选择,但是不会选择存储过满的节点。
  • 第二个副本放在和第一个副本不同且随机选择的机架上。
  • 第三个和第二个放在同一个机架上的不同节点上。
  • 剩余的副本就完全随机节点了。

如下图:

可以看出这个方案比较合理:

  1. 可靠性:block存储在两个机架上
  2. 写带宽:写操作仅仅穿过一个网络交换机
  3. 读操作:选择其中得一个机架去读
  4. block分布在整个集群上。

HDFS伪分布式环境搭建

官方安装文档地址如下:

http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.0/hadoop-project-dist/hadoop-common/SingleCluster.html

环境描述:

  • CentOS7.3
  • JDK1.8
  • Hadoop 2.6.0-cdh5.7.0
  • ssh
  • rsync

下载Hadoop 2.6.0-cdh5.7.0的tar.gz包并解压:

[root@localhost ~]# cd /usr/local/src/
[root@localhost /usr/local/src]# wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.0.tar.gz
[root@localhost /usr/local/src]# tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C /usr/local/

注:如果在Linux上下载得很慢的话,可以在windows的迅雷上使用这个链接进行下载。然后再上传到Linux中,这样就会快一些。

解压完后,进入到解压后的目录下,可以看到hadoop的目录结构如下:

[root@localhost /usr/local/src]# cd /usr/local/hadoop-2.6.0-cdh5.7.0/
[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0]# ls
bin             cloudera  examples             include  libexec      NOTICE.txt  sbin   src
bin-mapreduce1  etc       examples-mapreduce1  lib      LICENSE.txt  README.txt  share
[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0]#

简单说明一下其中几个目录存放的东西:

  • bin目录存放可执行文件
  • etc目录存放配置文件
  • sbin目录下存放服务的启动命令
  • share目录下存放jar包与文档

以上就算是把hadoop给安装好了,接下来就是编辑配置文件,把JAVA_HOME配置一下:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0]# cd etc/
[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc]# cd hadoop
[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# vim hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8/  # 根据你的环境变量进行修改

由于我们要进行的是单节点伪分布式环境的搭建,所以还需要配置两个配置文件,分别是core-site.xml以及hdfs-site.xml,如下:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# vim core-site.xml  # 增加如下内容
<configuration><property><name>fs.defaultFS</name><value>hdfs://192.168.77.130:8020</value>  # 指定默认的访问地址以及端口号</property><property><name>hadoop.tmp.dir</name>  # 指定临时文件所存放的目录<value>/data/tmp/</value></property>
</configuration>
[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# mkdir /data/tmp/
[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# vim hdfs-site.xml  # 增加如下内容
<configuration><property><name>dfs.replication</name>  # 指定只产生一个副本<value>1</value></property>
</configuration>

然后配置一下密钥对,设置本地免密登录,搭建伪分布式的话这一步是必须的:

[root@localhost ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
c2:41:89:65:bd:04:9e:3e:3f:f9:a7:51:cd:e9:cf:1e root@localhost
The key's randomart image is:
+--[ DSA 1024]----+
|     o=+         |
|    .+..o        |
|      +. .       |
|     o ..    o . |
|      = S   . +  |
|       + . . .   |
|        + .   .E |
|         o ..  o.|
|          oo   .+|
+-----------------+
[root@localhost ~]# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
[root@localhost ~]# ssh localhost
ssh_exchange_identification: read: Connection reset by peer
[root@localhost ~]# 

如上,测试本地免密登录的时候报了个ssh_exchange_identification: read: Connection reset by peer错误,于是着手排查错误,发现是/etc/hosts.allow文件里限制了IP,于是修改一下该配置文件即可,如下:

[root@localhost ~]# vim /etc/hosts.allow  #  修改为 sshd: ALL
[root@localhost ~]# service sshd restart
[root@localhost ~]# ssh localhost  # 测试登录成功
Last login: Sat Mar 24 21:56:38 2018 from localhost
[root@localhost ~]# logout
Connection to localhost closed.
[root@localhost ~]# 

接下来就可以启动HDFS了,不过在启动之前需要先格式化文件系统:

[root@localhost ~]# /usr/local/hadoop-2.6.0-cdh5.7.0/bin/hdfs namenode -format

注:只有第一次启动才需要格式化

使用服务启动脚本启动服务:

[root@localhost ~]# /usr/local/hadoop-2.6.0-cdh5.7.0/sbin/start-dfs.sh
18/03/24 21:59:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [192.168.77.130]
192.168.77.130: namenode running as process 8928. Stop it first.
localhost: starting datanode, logging to /usr/local/hadoop-2.6.0-cdh5.7.0/logs/hadoop-root-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]
The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
ECDSA key fingerprint is 63:74:14:e8:15:4c:45:13:9e:16:56:92:6a:8c:1a:84.
Are you sure you want to continue connecting (yes/no)? yes  # 第一次启动会询问是否连接节点
0.0.0.0: Warning: Permanently added '0.0.0.0' (ECDSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop-2.6.0-cdh5.7.0/logs/hadoop-root-secondarynamenode-localhost.out
18/03/24 21:59:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@localhost ~]# jps  # 检查是否有以下几个进程,如果少了一个都是不成功的
8928 NameNode
9875 Jps
9578 DataNode
9757 SecondaryNameNode
[root@localhost ~]# netstat -lntp |grep java  # 检查端口
tcp        0      0 0.0.0.0:50090           0.0.0.0:*               LISTEN      9757/java
tcp        0      0 192.168.77.130:8020     0.0.0.0:*               LISTEN      8928/java
tcp        0      0 0.0.0.0:50070           0.0.0.0:*               LISTEN      8928/java
tcp        0      0 0.0.0.0:50010           0.0.0.0:*               LISTEN      9578/java
tcp        0      0 0.0.0.0:50075           0.0.0.0:*               LISTEN      9578/java
tcp        0      0 0.0.0.0:50020           0.0.0.0:*               LISTEN      9578/java
tcp        0      0 127.0.0.1:53703         0.0.0.0:*               LISTEN      9578/java
[root@localhost ~]# 

然后将Hadoop的安装目录配置到环境变量中,方便之后使用它的命令:

[root@localhost ~]# vim ~/.bash_profile  # 增加以下内容
export HADOOP_HOME=/usr/local/hadoop-2.6.0-cdh5.7.0/
export PATH=$HADOOP_HOME/bin:$PATH
[root@localhost ~]# source !$
source ~/.bash_profile
[root@localhost ~]#

确认服务启动成功后,使用浏览器访问192.168.77.130:50070,会访问到如下页面:

点击Live Nodes查看活着的节点:

如上,可以看到节点的信息。到此,我们伪分布式的hadoop集群就搭建完成了。


HDFS shell操作

以上已经介绍了如何搭建伪分布式的Hadoop,既然环境已经搭建起来了,那要怎么去操作呢?这就是本节将要介绍的内容:

HDFS自带有一些shell命令,通过这些命令我们可以去操作HDFS文件系统,这些命令与Linux的命令挺相似的,如果熟悉Linux的命令很容易就可以上手HDFS的命令,关于这些命令的官方文档地址如下:

http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapredCommands.html

以下介绍几个常用的命令:

首先我们创建一个测试文件:

[root@localhost ~]# cd /data/
[root@localhost /data]# vim hello.txt  # 随便写一些内容
hadoop welcome
hadoop hdfs mapreduce
hadoop hdfs
[root@localhost /data]# 

1.查看文件系统的根目录:

[root@localhost /data]# hdfs dfs -ls /
[root@localhost /data]#

2.将刚刚创建的文件拷贝到文件系统的根目录下:

[root@localhost /data]# hdfs dfs -put ./hello.txt /
[root@localhost /data]# hdfs dfs -ls /
Found 1 items
-rw-r--r--   1 root supergroup         49 2018-03-24 22:37 /hello.txt
[root@localhost /data]# 

3.查看文件内容:

[root@localhost /data]# hdfs dfs -cat /hello.txt
hadoop welcome
hadoop hdfs mapreduce
hadoop hdfs
[root@localhost /data]# 

4.创建目录:

[root@localhost /data]# hdfs dfs -mkdir /test
[root@localhost /data]# hdfs dfs -ls /
Found 2 items
-rw-r--r--   1 root supergroup         49 2018-03-24 22:37 /hello.txt
drwxr-xr-x   - root supergroup          0 2018-03-24 22:40 /test
[root@localhost /data]# 

5.递归创建目录:

[root@localhost /data]# hdfs dfs -mkdir -p /test/a/b/c

6.递归查看目录:

[root@localhost /data]# hdfs dfs -ls -R /
-rw-r--r--   1 root supergroup         49 2018-03-24 23:02 /hello.txt
drwxr-xr-x   - root supergroup          0 2018-03-24 23:04 /test
drwxr-xr-x   - root supergroup          0 2018-03-24 23:04 /test/a
drwxr-xr-x   - root supergroup          0 2018-03-24 23:04 /test/a/b
drwxr-xr-x   - root supergroup          0 2018-03-24 23:04 /test/a/b/c
[root@localhost /data]# 

7.拷贝文件:

[root@localhost /data]# hdfs dfs -copyFromLocal ./hello.txt /test/a/b
[root@localhost /data]# hdfs dfs -ls -R /
-rw-r--r--   1 root supergroup         49 2018-03-24 23:02 /hello.txt
drwxr-xr-x   - root supergroup          0 2018-03-24 23:04 /test
drwxr-xr-x   - root supergroup          0 2018-03-24 23:04 /test/a
drwxr-xr-x   - root supergroup          0 2018-03-24 23:06 /test/a/b
drwxr-xr-x   - root supergroup          0 2018-03-24 23:04 /test/a/b/c
-rw-r--r--   1 root supergroup         49 2018-03-24 23:06 /test/a/b/hello.txt
[root@localhost /data]# 

8.从文件系统中拿出文件:

[root@localhost /data]# hdfs dfs -get /test/a/b/hello.txt

9.删除文件:

[root@localhost /data]# hdfs dfs -rm /hello.txt
Deleted /hello.txt
[root@localhost /data]# 

10.删除目录:

[root@localhost /data]# hdfs dfs -rm -R /test
Deleted /test
[root@localhost /data]# 

以上就是最为常用的一些操作命令了,如果需要使用其他命令,直接执行hdfs dfs就可以查看到所支持的所有命令。

接下来我们在浏览器里查看文件系统,首先将刚刚删除的文件put回去:

[root@localhost /data]# hdfs dfs -put ./hello.txt /

在浏览器上查看文件系统:

查看文件的信息:

可以看到关于该文件的详细信息:

由于这个文件太小了,所以只有一个数据块。

我们来put一个比较大的文件,例如我们之前使用的Hadoop的安装包:

[root@localhost /data]# cd /usr/local/src/
[root@localhost /usr/local/src]# hdfs dfs -put ./hadoop-2.6.0-cdh5.7.0.tar.gz /

如下,可以看到,这个文件被分为了三个数据块:

版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任
Hadoop HDFS 大数据

HDFS伪分布式环境搭建-很不错相关推荐

  1. HDFS伪分布式环境搭建

    (一).HDFS shell操作 以上已经介绍了如何搭建伪分布式的Hadoop,既然环境已经搭建起来了,那要怎么去操作呢?这就是本节将要介绍的内容:HDFS自带有一些shell命令,通过这些命令我们可 ...

  2. Hadoop单机和伪分布式环境搭建

    hadoop环境搭建 1.三个环境        单机.伪分布式.分布式 2.三个分支       apache版本(Apache基金会)       cdh版本(cloudera公司)       ...

  3. Hadoop2.2.0伪分布式环境搭建(附:64位下编译Hadoop-2.2.0过程)

    Hadoop2.2.0伪分布式环境搭建: 写在前面:Hadoop2.2.0默认是支持32位的OS,如果想要在64位OS下运行的话,可以通过在64位OS下面编译Hadoop2.2.0来实现,编译的操作步 ...

  4. Windows 7 64位系统上搭建Hadoop伪分布式环境(很详细)

    在开始配置前,我们先了解Hadoop的三种运行模式. Hadoop的三种运行模式 独立(或本地)模式:无需运行任何守护进程,所有程序都在同一个JVM上执行.在独立模式下测试和调试MapReduce程序 ...

  5. 第1关:伪分布式环境搭建

    实验环境: hadoop2.7: JDK8: HBase2.1.1: hadoop已安装: JDK已安装,环境变量已配置: HBase压缩包已下载,存放在/opt目录下. 在搭建环境之前我们首先来了解 ...

  6. Hadoop学习总结(3)——Hadoop伪分布式环境搭建

    一.Hadoop运行模式 Local (Standalone) Mode 本地模式 适用于开发人员测试Debug 使用本地文件系统 Pseudo-Distributed Mode 伪分布式模式 适用于 ...

  7. Hadoop入门基础教程 Hadoop之伪分布式环境搭建

    伪分布式模式即单节点集群模式,所有的守护进程都运行在同一台机器上.这种模式下增加了代码调试功能,可以查看内存.HDFS文件系统的输入/输出,以及与其他守护进程交互.以Hadoop用户远程登录K-Mas ...

  8. hadoop2.9.1伪分布式环境搭建以及文件系统的简单操作

    1.准备 1.1.在vmware上安装centos7的虚拟机 1.2.系统配置 配置网络 # vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPRO ...

  9. 看完就能独自把集群搭起来!Hadoop HDFS完全分布式环境搭建以及技术详解

    作者 | 慢慢变成大佬 责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 在文章开始之前,作者想要告诉大家:读懂本篇文章,能让小白快速入门,并且能够搭建完全分布式的集群,以及 ...

最新文章

  1. 1小时学会:最简单的iOS直播推流(十)librtmp使用介绍
  2. js判断浏览器的类型。。。
  3. eureka知识点概览
  4. java springboot+maven发送邮件
  5. JavaScript浮点运算0.2+0.1 !== 0.3
  6. eclipse中的java包awt_Eclipse中打包java程序
  7. python文件,字符串,二进制的读写
  8. 华为4X和4C无法使用电信4G的解决办法
  9. GNOME 3.32.1 维护版本更新发布
  10. 新手必看,物联网卡常见的三大问题!
  11. 适合用于UI设计器/开发人员探索您或他人创建的UI的一款UI设计开发软件——QuickLens for Mac
  12. Xshell 外观配置
  13. Linux 系统中如何恢复已删除的文件?
  14. 【区块链108将】区块链追溯产品起源,让每一个产品都是放心产品
  15. ibm tivoli_集成Tivoli Federated Identity Manager和Tivoli Identity Manager
  16. [707]Apache NiFi安装及简单使用
  17. PSRAM/SRAM与XMC硬件连接的推荐方法
  18. 使用Flutter实现仿微信录音的插件
  19. Flutter Text / Text.rich
  20. 数据结构中常用的7种排序方法

热门文章

  1. shell中spawn什么意思_exec 和 spawn 的区别
  2. 解决报错:‘egg-bin‘不是内部或外部命令,也不是可运行的程序或批处理文件。
  3. 自定义View-仿QQ运动步数进度效果
  4. 8.HttpEntity,ResponseEntity
  5. PHP 单引号与双引号的区别(总结)
  6. 国信证券OA系统及质量保障体系信创建设:泰山服务器、麒麟操作系统、东方通中间件、达梦数据库、蓝凌软件、毕昇JDK
  7. OpenCV-如何提取出图片ROI区域
  8. CANOE入门(三)
  9. sparse double matlab,matlab sparse 不支持单精度矩阵 的问题
  10. Avro 数据序列化