Hadoop入门

  • 2020 年 1 月 27 日
  • 筆記

概述

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

Hadoop能做什么?

hadoop擅长日志分析,facebook就用Hive来进行日志分析,2009年时facebook就有非编程人员的30%的人使用HiveQL进行数据分析;淘宝搜索中的自定义筛选也使用的Hive;利用Pig还可以做高级的数据处理,包括Twitter、LinkedIn 上用于发现您可能认识的人,可以实现类似Amazon.com的协同过滤的推荐效果。淘宝的商品推荐也是!在Yahoo!的40%的Hadoop作业是用pig运行的,包括垃圾邮件的识别和过滤,还有用户特征建模。(2012年8月25新更新,天猫的推荐系统是hive,少量尝试mahout!)

Hadoop基础组件

  • Hadoop Common:支持hadoop其他模块运行的基础工具;
  • Hadoop Distribution File System(HDFS):分布式文件系统,提供对数据的接口访问。
  • Hadoop Yarn:任务调度、集群资源管理框架
  • Hadoop MapReduce:基于Yarn的并行处理大数据的系统。
  • Hadoop Submarine:hadoop机器学习引擎。
  • … …

Hadoop-HDFS

存储模型:字节

  • 文件线性切割(Block):偏移量 offset(byte)
  • Block分散存储在集群节点中
  • 单一文件Block大小一致,文件与文件可以不一致
  • Block可以设置副本数,副本无序分散在不同节点中
    • 副本数不要超过节点数,不然将会有replication部分,该服务器挂掉,整个服务将不可用(即,数据越大,完整性越难保障)
  • 文件上传可以设置Block大小和副本数
  • 已上传的文件Block副本数可以调整,大小不变
  • 2.0+ 版本默认文件大小为128M(取值范围1M~128M),副本数 3 bcocks
  • 只支持一次写入多次读取,同一时刻只有一个写入者
  • 可以append追加数据,不能改变单个文件大小(关系到offset——蝴蝶效应)

Hadoop-Block的副本放置策略

  • 第一副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点;
  • 第二个副本:放置在于第一个副本不同的机架的节点上;
  • 第三个副本:于第二个副本相同机架的节点;
  • 更多副本:随机节点

如下图:

Hadoop—架构模型

  • 文件元数据Metadata,文件数据
    • 元数据
    • 数据本身
  • (主)NameNode节点保存文件元数据:单节点 POSIX
  • (从)DataNode节点保存文件Block数据:多节点
  • DataNode与NameNode保持心跳,提交Block列表
  • HdfsClient与NameNode交互元数据信息(描述数据的信息,即属性)
  • HdfsClient与DataNode交互文件Block数据(CS)
  • DataNode利用服务器本地文件系统存储数据块

CS交互过程:

  1. Client在NameNode获取元数据信息(Block列表);
  2. 数据本身存储位置返回给Client;
  3. Client到DataNode节点获取数据。

Hadoop 3.0开篇介绍

Hadoop3 新特性

  • Classpath isolation:防止不同版本jar包冲突;
  • Shell重写
  • 支持HDFS中的擦除编码 Eraser Encoding
    • 支持的EC策略可以节省50%的存储空间,同时还可以承受更多的存储故障
  • DataNode内部添加了负载均衡 Disk Balancer
    • 磁盘之间的负载均衡
  • MapReduce任务级本地优化
  • MapReduce内存参数自动推断
    • mapreduce.{map,reduce}.memory.mb(旧) ==》mapreduce.{map,reduce}.java.opts(新)
  • 基于cgroup的内存隔离和IO Disk隔离
  • 支持更改分配容器的资源Container resizing

伪分布式安装(Pseudo-Distributed Operation)

  • 下载 hadoop 安装包,解压,修改配置;
  • 环境变量配置
    • 配置java环境变量 etc/hadoop/hadoop-env.sh : export JAVA_HOME=/usr/bin/java
    • 配置角色用户: export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDDATANODE_USER=root
  • 参数配置 参考 : core-default.xml hdfs-default.xml hdfs-rbf-default.xml mapred-default.xml yarn-default.xml Deprecated Properties
    • core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hostname:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> </configuration>
    • hdfs-site.xml: <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>hostname:9868</value> </property> </configuration>
    • workers: hostname
  • 启动:
    • 格式化文件系统: $ bin/hdfs namenode -format # 初始化文件信息及元数据信息,只需首次执行
    • 后台启动NameNode和DataNode: $ sbin/start-dfs.sh
    • web访问地址(NameNode):http://localhost:9870/
    • 创建执行MapReduce任务需要的HDFS目录: $ bin/hdfs dfs -mkdir /user $ bin/hdfs dfs -mkdir /user/<username>
    • 将要输入的文件拷贝到分布式文件系统: $ bin/hdfs dfs -mkdir input $ bin/hdfs dfs -put etc/hadoop/*.xml input
    • 运行一些示例任务: $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
    • 检查输出文件: $ bin/hdfs dfs -get output output $ cat output/* 或者在分布式文件系统查看输出文件 $ bin/hdfs dfs -cat output/*
  • 停止服务: $ sbin/stop-dfs.sh 关于hdfs相关命令,使用 --help 查看。