在讲Hadoop之前我们需要知道一个问题:为什么我们学习大数据要学习Hadoop
不卖关子 原因如下:
1. 分布式存储:Hadoop提供了分布式存储系统,最著名的是Hadoop Distributed File System(HDFS)。这使得大规模数据能够分布式存储在集群中,提高了数据的容错性和可靠性。
2. 分布式计算:?Hadoop的核心组件之一是MapReduce,它是一种分布式计算模型。通过MapReduce,可以对大规模数据进行并行处理,从而加速计算过程,特别是对于需要处理海量数据的任务。
3. 扩展性:?Hadoop是一个高度可扩展的系统,能够容纳成百上千台服务器。这意味着随着数据规模的增加,可以简单地通过添加更多的计算节点来提高系统的性能。
4. 容错性:?Hadoop具有强大的容错机制。在一个大规模的集群中,由于硬件故障等原因,节点可能会失败。Hadoop能够自动检测故障,并在其他节点上重新执行任务,保障数据的完整性。
5. 开源生态系统:Hadoop是一个开源项目,具有庞大的社区支持。它的生态系统包括了许多相关工具和框架,如Hive(数据仓库)、Pig(数据流编程)、HBase(分布式数据库)等,为大数据处理提供了全面的解决方案。
6. 行业标准:?Hadoop已经成为处理大数据的事实标准。许多大型企业和组织都在使用Hadoop来存储和分析海量数据。因此,学习Hadoop使你更容易适应和贡献于大数据领域。
那我们便正式开始学习Hadoop
分布式: 多台机器做不同的事情, 然后组成1个整体.
集群: 多台机器做相同的事情.
多台机器既可以组成 中心化模式(主从模式), 也可以组成 去中心化模式(主备模式)
我们用比较生动的语言描述一下让大家更好理解 我们先想象一个饭店
单机模式就是一个人买菜切菜炒菜,但是一个人做所有事压力太大,很容易倒下,如果这个人倒下了那么饭店就停业。
分布式就相当于三个人,一个负责买菜一个负责洗菜切菜另一个负责炒菜。分工均匀,不会让人太累。但是如果任何一个人出了问题,那么饭店也是无法营业的。
集群就相当于三个人,每一个人都负责买菜 洗菜 切菜 炒菜 这样任何一个人出现问题,饭店也可以正常营业。
分布式集群就相当于饭店很大有很多人,几个人负责买菜,几个人负责切菜洗菜,几个人负责炒菜。任何人出了问题都不会影响饭店营业
国外
Yahoo雅虎, 节点4.2W+, 超10W核, 总存储350PB+, 每月提交作业 1000W+
国内
阿里巴巴, 节点3000+, 超4W核心, 内存超100TB, 每月提交作业 450W+
Hadoop的组成
HDFS: 分布式存储框架
MapReduce: 分布式计算框架
Yarn: 任务接收和调度器
HDFS: Hadoop Distributed FileSystem分布式文件存储系统
namenode: 主节点
1.管理整个HDFS集群
2.维护和管理元数据
问:什么是元数据(metadata)?答:描述数据的数据就被称之为: 元数据例如: 图书在哪层,哪个区域,哪个书架.
文件的存储路径,大小,时间,权限.
SecondaryNameNode: 辅助节点辅助namenode管理元数据的
datanode: 从节点
1.维护和管理源文件
2.负责数据的读,写操作
3.定时向namenode报活
JobTracker: 主节点
1.负责任务的接收
2.负责任务的调度
3.负责任务的监控
4.负责资源的调度和分配.
TaskTracker:从节点负贡接收并执行JobTracker分配过来的计算任务
JobTracker的任务过于繁重,容易宕机,存在: 单点故障的问题
HDFS集群与Hadoop 1 没有不同,不同的是另一边?Hadoop2/3没有MapReduce集群的概念
Hadoop集群高可用模式
重点来了Hadoop集群高可用模式
搭建方式
方式1: Standalone mode 单机模式
把所有的服务(namenode, SecondaryNameNode, datanode, ResourceManager, nodemanager)装到1台机器, 适用于: 学习, 调试.
方式2: Cluster mode 集群模式
node1: namenode, datanode, ResourceManager, nodemanager
node2: SecondaryNameNode, datanode, nodemanager
node3: datanode nodemanager
Hadoop集群环境搭建我们后面在将这里就不做冗余阐述。
在node1中执行 start-all.sh 命令, 即可启动Hadoop集群.
然后在node1中单独运行 mapred --daemon start historyserver 启动历史服务.
然后在三台虚拟机中分别输入 jps 查看服务
之后就可以在浏览器中输入如下的的端口号进行访问了.
HDFS的WebUI界面: ip:9870 细节: 如果是Hadoop2.X, 端口号是: 50070
Yarn的WebUI界面: ip:8088, 只记录本次启动Hadoop集群至关闭, 所有的计算任务.
历史服务的WebUI界面: ip:19888, 记录Hadoop从搭建好至现在, 所有的计算任务.
Hadoop框架提供了MapReduce的测试包, 具体如下
如何使用上述的测试包, 计算圆周率:
?
# 建议cd先进入到Hadoop提供的MR的测试包所在的路径下:
cd /export/server/hadoop/share/hadoop/mapreduce
# 执行MR包(MR任务的)格式:?? ? ? ? ? ? ? ? ? ??
yarn jar hadoop-mapreduce-examples-3.3.0.jar pi 2 50
# 上述格式解释:
yarn jar?? ??? ??? ??? ??? ??? ??? ??? ?固定格式, 说明要把某个jar包交给yarn调度执行.
hadoop-mapreduce-examples-3.3.0.jar?? ??? ?Hadoop提供的MR任务的测试包
pi?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?要执行的任务名
2?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?表示MapTask的任务数, 即: 几个线程来做这个事儿.
50?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?投点数, 越大, 计算结果越精准.
如何使用上述的测试包, 计算: 单词的次数
# 建议cd先进入到Hadoop提供的MR的测试包所在的路径下:
cd /export/server/hadoop/share/hadoop/mapreduce
# 执行MR包(MR任务的)格式:
yarn jar hadoop-mapreduce-examples-3.3.0.jar wordcount 数据源文件路径 目的地目录路径
# 上述格式解释:
数据源文件路径 # 必须是HDFS的文件路径, 即: 要进行单词统计的文件(绝对)路径
目的地目录路径 # 必须是HDFS的目录路径, 且该目录必须不存在, 因为MR结果是 覆盖写入.
# 细节: HDFS只支持 绝对路径, 不支持相对路径, 且HDFS的路径和Linux一样, 都是 /开头的.
# 示例
yarn jar hadoop-mapreduce-examples-3.3.0.jar wordcount hdfs://node1:8020/input/word.txt hdfs://node1:8020/output
# 上述的 hdfs://node1:8020/ 是完整写法, 8020是HDFS的客户端地址, 可以简写为:
yarn jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input/word.txt /output
HDFS文件系统可存储超大文件,时效性稍差。
HDFS具有硬件故障检测和自动快速恢复功能。
HDFS为数据存储提供很强的扩展能力。
HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改。
HDFS可在普通廉价的机器上运行。
心跳机制:
1.datanode会定时(3秒)向namenode发送心跳包,告诉namenode,我还活着.2.如果超过一定时间(630秒),namenode没收到datanode的心跳包,就认为它宕机了.此时就会将该datanode的块信息,交由其它活跃的datanode来存储.3.所有的datanode会定时(6个小时),向namenode汇报一次自己完整的块信息,让namenode校验更新
负载均衡:
namenode会保证所有的datanode的资源使用率,尽量保持一致
副本机制:
可以提高容错率,默认的副本数是: 3
如果当前副本总数 > 默认的副本数(3),namenode会自动删除某个副本如果当前副本总数 < 默认的副本数(3),namenode会自动增加该副本.如果当前活跃的机器总数 《 默认的副本数(3),例如: 默认3副本,但是现在只有2台机器活跃了就会强制进入到 安全模式(safemode),安全模式下: 只能读,不能写
更多配置,详见Hadoop官方文档:
https://hadoop. apache. org/docs/r3. 3. 0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xm
# HDFS的Shell命令, 类似于Linux的Shell命令, 格式稍有不同, 具体如下:
hadoop fs -选项 参数 # 既能操作HDFS文件系统, 还能操作本地文件系统.
hdfs dfs -选项 参数 # 只能操作HDFS文件系统.
# 细节: 操作HDFS路径的时候, 建议加上前缀 hdfs://node1:8020/
# -ls命令, 查看指定的HDFS路径下所有的内容.
hadoop fs -ls / # 查看根目录下所有内容(不包括子级)
hadoop fs -lsr / # 查看根目录下所有内容(包括子级), 该命令已过时, 不推荐用.
hadoop fs -ls -R / # 查看根目录下所有内容(包括子级), 该命令已过时, 不推荐用.
# mkdir命令, 创建目录
hdfs dfs -mkdir /aa # 创建单级.
hdfs dfs -mkdir -p /aa/bb/cc/dd # 创建多级目录.
# cat命令, 查看文件内容.
hadoop fs -cat /input/word.txt
# mv命令, 剪切. 只能是 HDFS路径 => HDFS路径
hadoop fs -mv /input/word.txt /aa
# cp命令, 拷贝. 只能是 HDFS路径 => HDFS路径
hadoop fs -cp /input/word.txt /aa
# rm命令, 删除.
hadoop fs -rm /aa/bb/word.txt
hadoop fs -rmr /aa # 递归删除aa文件夹
hadoop fs -rm -r /aa # 递归删除aa文件夹, 效果同上.
# put命令, 把Linux系统的文件 上传到 HDFS文件系统中.
hadoop fs -put 1.txt /input # 1.txt是Linux的文件路径, /input是HDFS的目录路径
# get命令, 把HDFS文件系统的某个文件 下载到 Linux系统的文件中.
hadoop fs -get /input/1.txt ./ # 1.txt是HDFS的文件路径, ./Linux的路径.