Hadoop实践之HDFS

What?


Hadoop 生态


HDFS:

Hadoop Distributed File System
分布式存储系统

http://hadoop.apache.org

high-throughput 高吞吐

  • Hadoop Common
  • Hadoop Distributed File System (HDFS™)
  • Hadoop YARN
  • Hadoop MapReduce

组件

  • name node 主节点
    • 接收读写服务
    • 接收datanode 汇报的block信息
    • 保存metadate元信息(基于内存存储)
  • data node 从节点
    • 存储block
  • secondary name node
    • 整理 fsimage和 edites 日志 得到最新fsimage
      • 避免nn重启后重新汇集所有文件meta信息
    • SNN执行合并时间和机制
      • 根据配置文件设置的时间间隔 fs.checkpoint.period默认3600秒
      • 根据配置文件设置 edits log 大小 fs.checkpoint.size 规定 edits 文件的最大值默认是 64MB

存储模型block

  • 偏移量标记位置
  • 块大小默认64M(物理暂用空间按实际文件大小不会浪费)

存储方式

  • 按大小被切分成若干个 block ,存储到不同节点上
  • 默认情况下每个 block 都有 2 个副本 共 3 个副本
  • 副本数不大于节点数

内含机制

  • 心跳
  • 负载均衡
  • 多副本

Why?


分布式

  • 容错
  • 突破单机性能
  • 效率高
  • 可扩展

优点

分布式的特性:

  • 适合大数据处理:GB 、TB 、甚至 PB 级及以上的数据
  • 百万规模以上的文件数量:10K+ 节点。
  • 适合批处理:移动计算而非数据(MR),数据位置暴露给计算框架

自身特性:

  • 可构建在廉价机器上:
  • 高可靠性:通过多副本提提高
  • 高容错性:数据自动保存多个副本;副本丢失后,自动恢复,提供 了恢复机制

缺点

  • 低延迟高数据吞吐访问问题
    • 比如不支持毫秒级
    • 吞吐量大但有限制于其延迟
  • 小文件存取占用 NameNode 大量内存(寻道时间超过读取时间 (99%))
  • 不支持文件修改:一个文件只能有一个写者(深入)

How?


HDFS 读写流程

  • 通过拓扑网络寻找最近的节点

是否按照block list 顺序读取block 信息?

多节点并行读,单节点串读?

安装

http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/SingleCluster.html

必备:

  • java
  • ssh

检查:

  • echo JAVA_HOME
  • ssh免密钥设置参照我的VMWare虚拟机笔记中的配置
  • 防火墙是否关闭service iptables status
  • 时间同步软件是否安装

下载

http://www.apache.org/dyn/closer.cgi/hadoop/common/

下载至目录 /opt/soft

解压

tar zxvf hadoop-2.5.1_x64.tar.gz

修改配置

  • cd /opt/soft/hadoop-2.5.1
  • vi etc/hadoop/hadoop-env.sh
    • export JAVA_HOME=/opt/soft/jdk1.7.0_25将jdk变量指向自己的jdk路径,保存退出
  • mkdir data
  • vi etc/hadoop/core-site.xml添加下列配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://sj-node1:9000</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/soft/hadoop-2.5.1/data</value>
    </property>
    </configuration>
  • vi ./etc/hadoop/hdfs-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <configuration>
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>sj-node2:50090</value>
    </property>
    <property>
    <name>dfs.namenode.secondary.https-address</name>
    <value>sj-node2:50091</value>
    </property>
    </configuration>
  • 修改slavesvi ./etc/hadoop/slaves

    • 新建masters文件vi ./etc/hadoop/masters以sj-node2作为第二主机

    将配置好的传到其它节点

  • [root@sj-node1 soft]# scp -r hadoop-2.5.1 sj-node2:/opt/soft/
  • [root@sj-node1 soft]# scp -r hadoop-2.5.1 sj-node3:/opt/soft/
  • [root@sj-node1 soft]# scp -r hadoop-2.5.1 sj-node4:/opt/soft/

格式化NN

[root@sj-node1 hadoop-2.5.1]# bin/hdfs namenode -format
只需在NN几点也就是sj-node1上执行,确认没有错误,data目录下有文件生成

启动

[root@sj-node1 hadoop-2.5.1]# sbin/start-dfs.sh
注意检查启动的时候控制台有没有报错

启动后检查访问web

命令测试

  • 创建文件夹
    • bin/hadoop fs -mkdir /testdir
  • 上传文件
    • [root@sj-node1 hadoop-2.5.1]# bin/hadoop fs -put README.txt /testdir