前言
吃水不忘挖井人,我看的课是这个,课程带着安装,搞虚拟机,很详细,推荐一波
思维导图
环境
Hadoop102:
cd / 表示的是返回/
cd ~ 表示的是返回/home/fools
$HADOOP_HOME 配置的位置为/opt/module/hadoop-3.1.3
集群出现问题
如果某个集群namenode或datanode等出现异常,这时候只要先停掉每个集群sbin/stop-xxxxx.sh
,删除每个服务器的data,logs目录rm -rf data/ logs/
,然后再初始化hdfs namenode -format
,就可以复原了
hdfs存储路径
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1116405649-192.168.10.102-1632297070587/current/finalized/subdir0/subdir0
hadoop概述
大数据主要解决海量数据的采集,存储,分析计算问题。
hadoop四大优势:
- 高可靠性:底层维护多个数据副本,某单元出现问题,也不会导致数据丢失
- 高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点
- 高效性:mapreduce使hadoop并行工作,以加快任务处理速度
- 高容错性: 能够自动将失败的任务重新分配
版本区别:
HDFS
hadoop distributed file system,分布式文件系统
-
NameNode:管理数据存储在什么位置;存储文件的元数据:文件名,文件目录结构,文件属性,以及每个文件所在的块列表和DataNode
-
DataNode:具体存储文件块数据,以及块数据的校验和
-
Secondary NameNode(2NN):每隔一段时间对NameNode元数据备份
YARN
yet another resource negotiator,是一种资源协调者,是hadoop的资源管理器
- resource manager是整个集群资源的管理者
- NodeManager是单个节点服务器资源的管理者
- client客户端提交作业给resouce manager,可以存储在多个
- 每个Node manager上可以有多个container容器,相当于一个独立的服务器,每个container中包含applicatoinMaster(AM),是单个任务运行的老大
MapReduce
将任务交给很多人去做,然后将结果一起汇总在服务器
大数据生态体系
HDFS
概述
定义
分布式文件管理系统,适合一次写入,多次读出(可以追加)
优缺点
-
优点
高容错性:数据保存为多个副本,一个丢失后可以快速恢复
适合处理大数据:可以处理文件规模很大,文件数量很多的文件
可以构建在廉价机器上
-
缺点
不适合低延时访问
无法高效搜索小文件
不支持并发写入
不支持文件随机修改,只支持追加
组成
- NameNode:管理者master
所有HDFS的原数据名称都在这里存储
副本的配置策略
管理映射信息(哪一块数据存储在哪一块DataNode)
处理客户读写请求
- DataNode:slave
存储实际的数据块
执行数据块的读写
- Client:客户端
文件切分:上传HDFS之前,client会按照NameNode的块大小的要求(一般是128MB)进行切分,然后再上传
与NameNode交互,获取位置信息
与DataNode交互,获取或写入数据
提供一些命令来管理,访问HDFS
HDFS文件块大小普遍为128M,256M,这主要是和磁盘的传输速率有关,因为寻址时间为传输时间的1%是最佳状态。
如果块太大,寻址很快,传输较慢
如果块太小,寻址很慢,传输很快
Shell命令
其实hdfs的shell操作就是普通的shell操作前面加上hadoop fs -
,后面的内容和linux中差别不大
在使用xshell之前需要开启hadoop集群
`myhadoop.sh start`
or
`sbin/start-dfs.sh`
`sbin/start-yarn.sh`
举例:
想查看help:hadoop fs -help rm
创建文件:hadoop fs -mkdir /sanguo
上传
下载
另外还有其他的正常操作:
-ls
-cat
-cp
-mv
-tail
-rm
HDFS API
其实万变不离其宗:
获取文件系统----创建目录----关闭资源
fs = FileSystem.get(uri,configuration,user);
fs.mkdirs(new Path("/xiyou/huaguoshan1"));
fs.close()
我们需要的操作只是获取文件系统的内容要写清楚,函数的参数传递清楚,关闭资源
package com.atguigu.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
// 正常的流程:获取文件系统----创建目录----关闭资源
public class HDFSclient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
// 链接的集群地址
URI uri = new URI("hdfs://hadoop102:8020");
// 创建一个配置文件
Configuration configuration = new Configuration();
// 用户
String user = "fools";
//获取用户客户端对象
fs = FileSystem.get(uri,configuration,user);
}
@After
public void close() throws IOException {
// 关闭资源
fs.close();
}
@Test
public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
// 创建一个文件夹
fs.mkdirs(new Path("/xiyou/huaguoshan1"));
}
@Test
public void testPut() throws IOException {
fs.copyFromLocalFile(false,false,
new Path("C:\\Xshell7/sunwukong.txt"),new Path("hdfs://hadoop102/xiyou/huaguoshan"));
}
// 优先级:hdfs-default.xml-->hdfs-site.xml-->项目资源目录下resource配置-->代码里面配置
@Te