Hadoop Getting Started
一、关于 Hadoop
- 1 Hadoop是什么:
- Hadoop是Apache的开源的分布式存储以及分布式计算平台
- 官网
- 2 Hadoop的两个核心组成:
-
HDFS
: 分布式文档系统,存储海量的数据 -
MapReduce
: 并行处理框架,实现任务分解和调度
-
- 3 Hadoop的用途:
- 搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务.
搜索引擎
日志分析
商业智能
数据挖掘
- 搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务.
- 4 Hadoop的优势:
1.高扩展
2.低成本
3.成熟的生态圈(Hadoop Ecosysten)
- 5 Hadoop的生态系统及版本:
HDFS + MapReduce + 开源工具
-
1.HIVE
: 只需要编写简单的SQL语句, 转化成Hadoop任务 -
2.HBASE
:- 存储结构化数据的分布式数据库.
- 和传统的关系型数据库区别, Hbase放弃失特性,追求更高的扩展
和HDFS区别: Hbase提供数据的随机读写和实时访问, 实现对表数据的读写功能.
-
3.Zookeeper
: 监控Hadoop集群的状态,管理Hadoop集群的配置…
-
二、Hadoop的安装(Ubuntu 14.04)
-
Step 1: 准备Linux, 这里用Ubuntu 14.04
- Step 2: 安装JDK, 这里用OpenJDK 1,7
sudo apt-get update; sudo apt-get install -y openjdk-7-jdk
- 设置JAVA环境, 编辑 ~/.bashrc或~/.zshrc 在末尾添加
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
- 使JAVA环境生效:
-
source ~/.bashrc
Orsource ~/.zshrc
-
- Step 3: 下载Hadoop, 并解压到$HOME目录
- Step 4 配置Hadoop: Hadoop目录: $HOME/hadoop-1.2.1
- 四个配置文档,
配置文档目录: $HOME/hadoop-1.2.1/conf
:core-site.xml
hadoop-env.sh
hdfs-site.xml
mapred-site.xml
- 四个配置文档,
// 1 编辑hadoop-env.sh: `vim hadoop-env.sh`
* 找到JAVA_HOME, 取消注释(去掉`#`),修改为刚才设置的JAVA_HOME地址
* `export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64`
// 2 `vim core-site.xml`
<configuration>
<property>
<!-- 这是注释, Hadoop的工作目录 -->
<!-- 该目录不要手动创建 -->
<name>hadoop.tmp.dir</name>
<value>/home/potter/hadoop</value>
</property>
<property>
<!-- 元数据目录 -->
<!-- name 目录不要创建 -->
<name>dfs.name.dir</name>
<value>/home/potter/hadoop/name</value>
</property>
<property>
<!-- 文档系统的name node -->
<name>fs.default.name</name>
<!-- potter 是 hostname, 9000 是hadoop的端口号 -->
<value>hdfs://potter:9000</value>
</property>
</configuration>
// 3 vim hdfs-site.xml
<configuration>:
<property>
<!-- 文档系统数据的存放目录 -->
<!-- data 目录不要创建, 否则存在权限问题, 如果出现问题,请查看HADOOP_HOME目录下的logs目录文档 -->
<name>dfs.data.dir</name>
<value>/home/potter/hadoop/data</value>
</property>
</configuration>
// 4 vim mapred-site.xml
<configuration>:
<property>
<!-- 任务调度去访问路径 -->
<name>mapred.job.tracker</name>
<value>potter:9001</value>
</property>
</configuration>
// 5 配置 Hadoop 环境
// vim ~/.bashrc
export HADOOP_HOME=$HOME/hadoop-1.2.1
export PATH=$HADOOP_HOME/bin:$PATH
// 使环境生效
source ~/.bashrc
// 6 基本环境配置好了,现在继续做必要的操作
// 6.1 Hadoop配置成功与否
% hadoop # 显示帮助则说明hadoop配置没问题
// 6.2 对 namenode 进行格式化, 否则无法启动namenode服务
% hadoop namenode -format
# 成功执行后, /home/potter/hadoop目录及子目录dfs被创建
// 6.3 启动服务
% start-all.sh
# 成功执行后, /home/potter/hadoop/data及/home/potter/hadoop/mapred目录被创建
// 6.3.1 停止服务: stop-all.sh
// 6.4 JPS 查看服务
% jps
如果存在 Jps
JobTracker
NameNode
DataNode
SecondaryNameNode
TaskTracker
六个任务,则说明Hadoop配置没问题
// 6.5 常见问题:
1. NameNode 和 DataNode 启动不成功解决:
保证前面配置一致, 则可能在start-all.sh之前没有format namenode.
这时只要stop-all.sh, 再hadoop namenode -format, 然后在start-all.sh即可
2. DataNode 启动不成功解决:
data目录不要手动创建,已创建,请删除,重新stop-all.sh && start-all.sh即可
3. 其他, 请查看$HADOOP_HOME目录下的logs目录
// 6.6 查看Hadoop的文档命令
% hadoop fs -ls /
% hadoop fs -ls /home
% hadoop fs -ls /home/ubuntu
% hadoop fs -ls /home/ubuntu/hadoop
Hadoop 基本概念: HDFS + MapReduce
三、HDFS 系统
- 1 块(Block)
- HDFS的文档被分成块(Block)进行存储.
- HDFS块的默认大小为64MB
- 块是文档存储处理的逻辑单元
HDFS 中有两类节点NameNode + DataNode
- 2 NameNode
- 是HDFS的管理节点,存放文档元数据
- 1 文档与数据块的映射表
- 2 数据块与数据节点的映射表
客户通过NameNode找到DataNode, 将多个DataNode拼成一个可用的数据
- 是HDFS的管理节点,存放文档元数据
- 3 DataNode
- 是HDFS的工作节点,存放数据块
三-2、HDFS中数据管理与容错
- 1 每个数据块有
3个副本
,分布在两个机架内的三个节点.(一个机架可以存放多个DataNode, 数据块存放在DataNode中.其中两份在一个机架,另一个在另一个机架.)以此来保证容错. - 2
心跳检测
: DataNode定期向NameNode发送心跳消息. - 3
SecondaryNameNode
: 二级NameNode定期同步元数据镜像文档和修改日志NameNode发生故障时,备胎转正.
三-3、文档读写的流程
- HDFS中
文档读取
的流程:Step 1: 客户端向NameNode发送文档读取请求
Step 2: NameNode根据客户端发来的文档路径, 查看元数据
Step 3: NameNode会根据元数据,返回客户端这些数据块及其存放的DataNode
Step 4: 找到数据块存放的DataNode,读取并组装
- HDFS中
文档写入
的流程:Step 1: 客户端文档拆分成块, 每个大小问DataNode的默认大小64MB.
Step 2: 客户端发送通知给NameNode
Step 3: NameNode 从机架中查找可用的DataNode返回客户端
Step 4: 客户端根据NameNode返回的DataNode, 将数据块写入DataNode
Step 5: 一个数据块写入DataNode后,进行流水线复制两份到不同机架的DataNode
Step 6: 没一个DataNode复制完成后(一个复制两个),更新元数据
Step 7: 写入第二个数据块到DataNode, 重复Step 5...
三-4、HDFS的特点
1.数据冗余,硬件容错
-
2.流式数据访问
: 一次写入,多次读写; 一旦写入,不会被修改 -
3.存储大文档
: 如果文档很小,对NameNode的压力很大 - 适用性和局限性:
适合数据批量读写,吞吐量高.
不适合交互式应用,低延迟很难满足
适合一次写入多次读写,顺序读写
不支持多用户并发写相同文档
三-5、HDFS命令行操作
# hdfs 提供Shell接口, 所以命令和Shell操作很类似
# 直接输入 hadoop fs 可以获得帮助
# 1 查看文档夹
% hadoop fs -ls /
# 2 新建目录
% hadoop fs -mkdir input
# 该命令会在/usr/potter下创建input目录
# 其中potter为你的hostname
# 用 hadoop fs -ls /usr/potter 查看
# 3 将本地文档提交到hdfs, local_file为本地任意文档
% hadoop fs -put local_file input/
# 查看文档
% hadoop fs -ls /user/potter/input
# 查看文档内容
% hadoop fs -cat /usr/potter/input/local_file
# 4 删除文档或目录
% hadoop fs -rm path/to/file
# 5 从HDFS中获取文档到本地
% hadoop fs -get input/remote_file local_new_name
四、MapReduce框架
四-1. MapReduce 原理
-
分而治之
:一个大任务分成多个小的子任务(map), 并行执行后,合并结果(reduce)
- 栗子: 老师让多个组长一起发作业(map), 老师收作业(reduce)
map: 大变小加上并行执行, reduce: 小变大, 但是map和reduce并不是相反的过程
- 实际栗子:
- 1 从100GB的网站访问日志文档中找出访问次数最多的IP地址.
四-2. MapReduce 运行流程
- 基本概念:
-
Job & Task
: 一个Job被分成多个Task, Task又分为MapTask和ReduceTask -
JobTracker
: 客户端提交Job(任务)来, JobTracker将Job分为MapJob和ReduceJob, MapJob 和 ReduceJob又将任务交给Map TaskTracker 和 Reduce TaskTracker- 1 作业调度
- 2 分配任务、监控任务执行进度
- 3 监控TaskTracker的状态
-
TaskTracker
:- 1 执行任务
- 2 向JobTracker汇报任务状态
-
- 执行流程:
1.输入数据或者数据也来自HDFS
2.将输入数据分片,执行Map任务(Job), 交给Map端的TaskTracker
3.中间结果: Key-Value
4.执行Recude任务(Job), 交给Reduce端的TaskTracker
5.将输出结果写回到HDFS
- MapReduce的容错机制
- 1 重复执行(4次失败后放弃)
- 2 推测执行
五、MapReduce的应用案例
案例一、WordCount单词计数
- 问题: 计算文档中出现每个单词的频数, 输出结果按照字母顺序进行排序.
- 思路:
- 将文档按行进行切分,每行执行Map操作, 计算每个结果, 然后再Reduce合并
原文链接 大专栏 https://www.dazhuanlan.com/2019/08/16/5d5609c737710/