Hadoop
中文手册:https://hadoop.apache.org/docs/r1.0.4/cn/
从钉钉群里下载模板机:
Hadoop集群
地址信息:192.168.245.141 hadoop141(master:ResourceManager\ SecondaryNameNode\QuorumPeerMain\HMaster\JobHistoryServer\NameNode)
192.168.245.142 hadoop142(slave)
192.168.245.143 hadoop143(slave)
登录账号和密码:root/hadoop
启动zookeeper的命令:zk-startall.sh
停止zookeepeer的命令:zk-stopall.sh
启动hadoop集群的命令:start-all.sh
停止hadoop集群的命令:stop-all.sh
启动hbase的命令:start-hbase.sh
停止hbase的命令:stop-hbase.sh
检查集群的信息:
检查hadoop是否配好环境变量:
检查相关目录是否齐全:
检查你的系统盘里是否存放了hadoop.dll文件
检查hosts文件是否配置了当前集群的信息:
Hadoop的应用
1.为什么要使用集群(服务器)?
文本、硬盘、磁盘…,随着时代发展,数据越来越珍贵,想办法保存数据,保存的数据的安全性,为了数据的安全所以要将数据备份,备份的要求:1.能够快速的找到;2.要保证你的备份数据要和正在使用的数据保持一致(数据的一致性);3.响应的速度。
2.搭建集群后能做什么?
(1)实现数据的备份,(2)能够保存更多的数据,(3)能够支持瞬时的高并发,(4)提供类似于服务器
3.和现实生活中有什么关系?
购物、聊天、实时更新、…
Hadoop的组成
hadoop1.x和hadoop2.x的区别
hadoop1.x:MapReduce(计算+资源调度)\HDFS(数据存储)
hadoop2.x:MapReduce(计算)\HDFS(数据存储)\Yarn(资源调度)
在hadoop1.x中hadoop的MapReduce同时负责处理业务逻辑运算和资源调度,耦合性大,在hadoop2.x之后,增加了yarn负责资源调度,mapreduce只负责计算,大大提高了计算的速率。
HDFS(数据存储)架构
namenodes(nn)
存储文件的元数据(meta),如:文件名、文件目录结构、文件的属性,以及每个文件块列表和块所在的datanodes。
datanodes(dn)
在本地文件系统存储文件块数据,以及块数据的校验和
secondary namenodes(2nn)
每隔一段时间对namenode元数据进行备份
YARN的结构(资源调度)
ResourceManager
(1)处理客户端发来的请求
(2)检测每个节点的状态
(3)启动监控ApplicationMaster
(4)资源的分配和调度
NodeManager
(1)管理每个节点的资源
(2)处理来自ResourceManger的命令
(3)处理来自ApplicationMaster的命令
ApplicationManager
(1)负责数据的切分
(2)为应用程序申请资源(内存)并分配给内部的任务
(3)任务的监控
Container
是Yarn中的资源抽象(内存、磁盘、网络等)
MapReduce(计算)的架构
分为两个过程:Map、Reduce
Map阶段负责并行处理输入的数据
Reduce阶段负责对Map阶段的结果进行汇总
一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务
HDFS
HDFS(Hadoop Distributed File System)本身就是一个文件系统,用来存储文件,通过目录树来定位文件;其次,他是分布式的由很多个服务器组成,来实现其功能。
HDFS的使用场景:适合一次性的写入,多次读出的场景,并且不支持文件的修改,使用和来做数据分析
HDFS的优缺点
优点
(1)高容错性
1.数据会保存多个副本(由配置信息和集群个数一起决定),它通过增加副本的形式,来提高容错性
2.当某一个副本丢失,会自动恢复
(2)适合大数据处理
(3)适合搭建在廉价集群上,通过多副本的机制,提高可靠性
缺点
(1)不适合低延时数据访问
(2)无法高效的对大量小文件进行存储(会占用NameNode大量的内存来存储文件目录和快信息、小文件的存储寻址时间会拉长)
(3)仅支持文件的append(追加)
HDFS的组成架构
NameNode是Master:管理HDFS的名称空间,配置副本策略,管理块(Block)映射信息,处理客户端的读写请求。
DataNode是Slave:存储实际的数据块,执行数据块的读写操作
Client是客户端:与NameNode的交互,获取文件的位置信息,与DataNode交互,读取或者写入数据。还会提供一些命令来操作HDFS,比如说NameNode的格式化。通过一些命令来访问HDFS,就比如HDFS的增删查改的操作
HDFS的文件块大小(面试重点)
HDFS中的文件在物理上是分块存储的(Block),块的大小通过配置参数(dfs.application)来规定。默认老版本64M,新版本上是128MB。
思考:为什么块的大小不能设置的太大,也不能设置太小?
(1)HDFS的块设置太小,会增加寻址时间
(2)如果块的的大小太大,从磁盘传输数据的时间会明显的大于定位块的时间,导致程序在处理块数据时,非常的慢。
HDFS块的大小取决于电脑的磁盘传输速率
HDFS的Shell操作
基本语法
hadoop fs具体的命令 or hdfs dfs 具体的命令
准备工作
启动集群
-help:输出这个命令的参数
上传
(1)从本地上传到HDFS(-moveFromLocal)剪切(从本地剪切到HDFS上)
[root@hadoop141 hadoop]# hadoop fs -moveFromLocal ./xiaozhuang.txt /shixun/File
moveFromLocal: `/shixun/File': No such file or directory: `hdfs://hadoop141:9000/shixun/File'
[root@hadoop141 hadoop]# hadoop fs -moveFromLocal ./xiaozhuang.txt /shixun/File
[root@hadoop141 hadoop]# ls -l
(2)从本地文件系统中拷贝到HDFS中(-copyFromLocal)复制(会保留本地文件)
[root@hadoop141 hadoop]# hadoop fs -copyFromLocal ./BigData.txt /shixun/File
(3)等同与copyFromLocal(put)(HDFS的路径后面必须加/,如果不加会认为路径最后一个为文件的名字,创建该文件)
[root@hadoop141 hadoop]# hadoop fs -put ./BigData.txt /shixun/File
[root@hadoop141 hadoop]# hadoop fs -put ./BigData.txt /shixun/File/
(4)追加一个文件到已经存在的文件末尾(-appenToFile)
[root@hadoop141 hadoop]# touch Java.txt
[root@hadoop141 hadoop]# vi Java.txt
[root@hadoop141 hadoop]# cat Java.txt
Java
Hadoop
HDFS
[root@hadoop141 hadoop]# hadoop fs -appendToFile ./Java.txt /shixun/File/BigData.txt
[root@hadoop141 hadoop]# vi HDFS.txt
[root@hadoop141 hadoop]# hadoop fs -appendToFile ./HDFS.txt /shixun/File/BigData.txt
下载
(1)从HDFS拷贝到本地(-copyToLocal)
[root@hadoop141 hadoop]# hadoop fs -help copyToLocal
-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst> :
Identical to the -get command.
[root@hadoop141 hadoop]# hadoop fs -copyToLocal /shixun/File/BigData.txt ./
copyToLocal: `./BigData.txt': File exists
[root@hadoop141 hadoop]# hadoop fs -copyToLocal /shixun/File/BigData.txt ./
(2)等同于copyToLocal(get)
[root@hadoop141 hadoop]# hadoop fs -get /shixun/File/BigData.txt ./
(3)合并下载多个文件(-getmerge),例如/shixun/File下有多个文件,最终将每个文件中的内容合并到hebing.txt,并下载
[root@hadoop141 hadoop]# hadoop fs -getmerge /shixun/File/* ./hebing.txt
HDFS直接操作
(1)显示目录信息(-ls)
[root@hadoop141 hadoop]# hadoop fs -ls /
(2)新建目录(-mkdir)
[root@hadoop141 hadoop]# hadoop fs -mkdir /sanguo
[root@hadoop141 hadoop]# hadoop fs -mkdir /sanguo/shuguo
(3)显示文件内容(-cat)
[root@hadoop141 hadoop]# hadoop fs -cat /shixun/File/BigData.txt
Java
Hadoop
HDFS
我是末尾的文件信息HDFS
(4)Linux文件写系统中的一个修改文件的所属权限(-chgrp/-chmod/-chown)
[root@hadoop141 hadoop]# hadoop fs -chmod 666 /shixun/File/BigData.txt
[root@hadoop141 hadoop]# hadoop fs -chown neuedu:neuedu /shixun/File/BigData.txt
(5)从HDFS的一个路径拷贝到另一个路径(-cp)
[root@hadoop141 hadoop]# hadoop fs -cp /shixun/BigData.txt /sanguo/shuguo/
(6)从HDFS的一个路径移动到另一个路径(-mv)
[root@hadoop141 hadoop]# hadoop fs -mv /shixun/BigData.txt /sanguo/
(7) 显示一个文件的末尾1kb的数据
[root@hadoop141 hadoop]# hadoop fs -tail /shixun/File/BigData.txt
Java
Hadoop
HDFS
我是末尾的文件信息HDFS
(8)删除文件或者文件夹(-rm)
[root@hadoop141 hadoop]# hadoop fs -rm /sanguo/BigData.txt
Deleted /sanguo/BigData.txt
(9)删除空目录(-rmdir)
[root@hadoop141 hadoop]# hadoop fs -rmdir /sanguo/shuguo
rmdir: `/sanguo/shuguo': Directory is not empty
(10)统计文件夹的大小(-du)
[root@hadoop141 hadoop]# hadoop fs -du /shixun/File/
49 98 /shixun/File/BigData.txt
25 50 /shixun/File/xiaozhuang.txt
(11)设置副本数(-setrep)
[root@hadoop141 hadoop]# hadoop fs -setrep 10 /shixun/File/BigData.txt
Replication 10 set: /shixun/File/BigData.txt
[root@hadoop141 hadoop]# hadoop fs -du /shixun/File/
49 490 /shixun/File/BigData.txt
25 50 /shixun/File/xiaozhuang.txt
注意:这里设置的副本数只是记录在NameNode的元数据中,是否真的有这么多副本数,取决于DataNode 的数量,目前我们的集群中只有2个DataNode,所以也只有2个副本,只有当DataNode增加到10个的时候,副本数才能达到10个。
HDFS的API操作
创建一个maven工程
1.导入jar包
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
<scope>test</scope>
</dependency>
2.创建项目目录及上传文件的类
2.上传文件
package com.neuedu;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.util.Progressable;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @Author:sng
* @Time:2023/8/14 9:17
* @File:HDFS_CopyFormLocal
* @Project_Name:HDFS_API
* @Product_Name:IntelliJ IDEA
**/
public class HDFS_CopyFormLocal {
public void test_CopyFromLocal() throws IOException, URISyntaxException, InterruptedException {
// 1.获取文件系统
Configuration conf = new Configuration();
// 2.配置在集群上运行
/**
* 指定运行当前程序的用户为root的第二种方法
* 编辑配置--->虚拟机参数(VM options)--> -DHADOOP_USER_NAME=root
*/
conf.set("fs.defaultFS", "hdfs://hadoop141:9000");
FileSystem fs = FileSystem.get(conf);
/**
* 指定运行当前程序的用户为root的第一种方法
* @param uri of the filesystem :连接HDFS的地址
* @param conf the configuration to use :HDFS的一些配置信息
* @param user to perform the get as :指定运行当前程序的用户
*/
// FileSystem fs = FileSystem.get(new URI("hdfs://hadoop141:9000"),conf,"root");
// 将文件上传到HDFS里
/**
* @param delSrc whether to delete the src:上传到hdfs后,本地的这个文件是否删除,默认值为false
* @param src path :本地文件文件的路径
* @param dst path :HDFS目标的路径
*/
fs.copyFromLocalFile(false,new Path("D:\\桌面\\HDFS_API.txt"),new Path("/shixun/File/"));
// 3.资源关闭
fs.close();
}
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
HDFS_CopyFormLocal hdfs_copyFormLocal = new HDFS_CopyFormLocal();
hdfs_copyFormLocal.test_CopyFromLocal();
}
}
配置运行程序用户为root的第二种方式:
3.创建文件夹
package com.neuedu.mkdirs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
/**
* @Author:sng
* @Time:2023/8/14 10:35
* @File:HDFS_Mkdirs
* @Project_Name:HDFS_API
* @Product_Name:IntelliJ IDEA
**/
public class HDFS_Mkdirs {
public void test_Mkdirs(){
Configuration configuration = new Configuration();
try {
FileSystem fs = FileSystem.get(configuration);
// 创建目录
fs.mkdirs(new Path("/shixun/HDFS_API"));
// 关闭资源
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HDFS_Mkdirs hdfs_mkdirs = new HDFS_Mkdirs();
hdfs_mkdirs.test_Mkdirs();
}
}
4.下载文件
package com.neuedu.CopyToLocal;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem