Hadoop

Hadoop

Hadoop 安装 & 配置

Hadoop & Yarn安装步骤

参考: Apache Hadoop 2.9.2 – Hadoop Cluster Setup

  1. /etc/hosts, ssh登录 // 使slave可以ssh到master
    • /etc/hosts: 所有slave可互相ping hostname
    • authorized_keys : master可以ssh任意slave
  2. hadoop配置文件
    • hadoop-env.sh : HADOOP_CONF_DIR 指定加载哪个目录下的配置文件
    • slaves: 只有namenode需配置
    • core-site.xml:(https://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/core-default.xml)
      • fs.defaultFS : hdfs://namenode:9000 ## hdfs文件端口
      • hadoop.tmp.dir : /opt/data/hadoop/tmp 其它目录会基于此路径
    • hdfs-site.xml:(https://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml)
      • dfs.namenode.secondary.http-address : 第二NameNode web管理端口
      • dfs.replication : 3 ## 数据需要备份的数量, 默认是3, 如果此数大于集群的机器数会出错
      • dfs.namenode.name.dir : /opt/data/hadoop/namenode ## NameNode持久存储名字空间及事务日志的本地文件系统路径
      • dfs.datanode.data.dir : /opt/data/hadoop/datenode ## DataNode存放块数据的本地文件系统路径
      • dfs.namenode.http-address : namenode:50070 ## 浏览器可访问管理页面
      • dfs.webhdfs.enabled : 开启WebHDFS (REST API)功能
    • mapred-site.xml:
      • mapreduce.framework.name: yarn
      • mapreduce.jobhistory.address: 10020
      • mapreduce.jobhistory.webapp.address: 19888
    • yarn-site.xml
      • yarn.resourcemanager.webapp.address: 8088 ## yarn框架中各个 task 的资源调度及运行状况通过通过该web界面访问
  3. 格式化namenode: hdfs namenode -format
  4. 启动HDFS NameNode: sbin/hadoop-daemon.sh start namenode
  5. 启动HDFS DateNode: sbin/hadoop-daemons.sh start datanode
    • 或者在namenode上直接一个脚本启动: sbin/start-dfs.sh namenode和datanode的所有hdfs
  6. 启动yarn: sbin/start-yarn.sh脚本一次启动ResourceManager和NodeManager, 如果要分别启动:
    • yarn-daemon.sh --config /opt/conf/hadoop start nodemanager
    • yarn-daemon.sh --config /opt/conf/hadoop start resourcemanager
  7. 查看集群状态: bin/hdfs dfsadmin -report
  8. 测试hdfs写: echo "hello world" | hadoop fs -put - /dir/hadoop/hello_world.txt && hadoop fs -cat /dir/hadoop/hello_world.txt
  9. 一些web ui:

一些重要参数

@todo

客户端 API & 命令行

Hadoop命令

  • 参考: Apache Hadoop 2.7.3 – Hadoop Commands Guide
  • hadoop dfs: 针对dfs的命令, 已经Deprecated, 推荐使用hdfs dfs
  • hadoop fs: 本地与dfs交互的命令
    • hadoop fs -cat file:///file3 /user/hadoop/file4
    • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
    • hadoop dfs -df /user/hadoop/dir1
    • hadoop fs -du -h /user/hadoop/dir1 hdfs://nn.example.com/user/hadoop/dir1
    • hadoop fs -put <localsrc> ... <dst>
  • 查看版本: hadoop version
  • 在 Hadoop 集群提交 MR 作业: hadoop jar <jar> [mainClass] arg

HDFS命令

Yarn命令

* 参考: Apache Hadoop 2.7.3 – YARN Commands

HDFS 文件系统解析

Block size

操作系统中都有文件块(Block)的概念,稳健以块的形式存储在磁盘中,文件块是系统读写操作的最小的单位。
HDFS 中的 Block 是一种抽象的概念,它比操作系统中的文件块大很多:

  • 从2.7.3版本开始 block size 的默认大小为128M,之前版本的默认值是64M.
  • 可以通过修改 hdfs-site.xml 文件中的 dfs.blocksize 对应的值。
  • 在实际应用中,hdfs block 块的大小设置为多少合适呢?为什么有的是64M,有的是128M、256M、512呢?

概念:

  • 寻址时间:HDFS 中找到目标文件 block 块所花费的时间。
  • 传输时间:
  • 文件块越大,寻址时间越短,但磁盘传输时间越长;文件块越小,寻址时间越长,但磁盘传输时间越短。

block 不能设置过大,也不要能设置过小

  • 如果块设置过大,一方面从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;另一方面,MapReduce 中的 map 任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。
  • 如果设置过小,一方面存放大量小文件会占用 NameNode 中大量内存来存储元数据,而 NameNode 的内存是有限的,不可取;另一方面块过小,寻址时间增长,导致程序一直在找 block 的开始位置。因此,块适当设置大一些,减少寻址时间,那么传输一个有多个块组成的文件的时间主要取决于磁盘的传输速度。

block 多大合适?

1)HDFS 中平均寻址时间大概为10ms;

2)经过大量测试发现,寻址时间为传输时间的1%时,为最佳状态,所以最佳传输时间为:10ms/0.01=1000s=1s

3)目前磁盘的传输速度普遍为100MB/s,最佳 block 大小计算:100MB/s*1s=100MB, 所以我们设置 block 大小为128MB.

4)实际中,磁盘传输速率为200MB/s 时,一般设定 block 大小为256MB;磁盘传输速率为400MB/s 时,一般设定 block 大小为512MB.

@ref: Hdfs block数据块大小的设置规则 - 学习大数据入门到放弃 - 博客园

副本机制

HDFS 的机架感知(rack awareness),又叫机架策略(rack-aware replica placement policy),用来决定副本存放位置,以默认的副本数=3为例:

  • 1)第一个副本块保存在 HDFS Client 同一个的 DataNode ;
  • 2)第二个副本块保存在 HDFS Client 所在 DataNode 同机架的其他 DataNode ;
  • 3)第三个副本块保存不同机架的某个 DataNode ;

@ref:

NameNode & DataNode

(1)NameNode 节点是 HDFS 中主节点,维护整个 HDFS 文件系统的文件目录树、元数据信息和文件的数据块索引,即每个文件对应的数据块列表。这些信息以 FSImage 和 Edit Log 来组织。

FSImage 中保存着某一时刻的 HDFS 文件目录树、元数据和数据块索引等信息,后续的对这信息系的修改则保存在编辑日志 Edit Log 中;

除了维护 FSImage 和 Edit Log, NameNode 节点还提供对客户端的请求响应。

(2)Secondary NameNode: 主要用于定期合并 NameNode 节点上的 FSImage 和 Edit Log ,每个集群都有一个 Secondary NameNode 的独立节点。

Secondary NameNode 和 NameNode 的区别在于:它不接受或记录 HDFS 的任何实时变化,只是根据集群配置的时间间隔不停的获取 HDFS 的某一个时间节点的 FSImage 和 Edit Log,合并得到一个新的镜像 FSImage,然后该镜像会上传到 NameNode,替换原有的镜像文件,并清空 Edit Log。

NameNode 节点是 HDFS 集群中的单一故障点,通过 Secondary NameNode 的检查点,可以减少停机时间并减低 NameNode 节点中元数据丢失的风险。但是 Secondary NameNode 不支持 NameNode 节点的故障自动恢复,须手人工干预。

(3)DataNode 是 HDFS 集群中的数据节点,所用数据块都存储在 DataNode 节点上,客户端从 DataNode 节点存储或读取数据。在客户端操作文件块 Block 时,先由 NameNode 节点告知客户端数据块所在的 DataNode,然后客户端直接与 DataNode 节点通信,

DataNode 节点还会和其他 DataNode 进行通信,复制数据块,保证数据的冗余。

DataNode 作为从节点,会不断地通过“心跳”向 NameNode 节点报告其上的数据信息。

@ref: Hadoop深入学习:HDFS分布式文件系统的体系结构