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交互过程:
- Client在NameNode获取元数据信息(Block列表);
- 数据本身存储位置返回给Client;
- 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
- 配置java环境变量
- 参数配置 参考 : 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
查看。