https://archive.apache.org/dist/
https://hadoop.apache.org/docs/r3.1.4/
HDFS是主从架构,主节点是namenode,从节点是datanode
![image.png](https://img-blog.csdnimg.cn/img_convert/48c4ea7411ad75879d6233821e3d84dd.png#averageHue=#fbfbfb&clientId=u7f919bba-9188-4&from=paste&height=212&id=uacd450c9&originHeight=212&originWidth=465&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29806&status=done&style=none&taskId=ud652cce0-3c84-4faf-b259-277086da4fb&title=&width=465)
HDFS角色的功能
HDFS的BLOCK只是一个逻辑单位
假如BLOCK的大小设置为128M,意思是这个BLOCK最大是128M
BLOCK的大小可以通过:hdfs-site.xml中的dfs.blocksize参数来进行设置
#格式
hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
#使用1-使用绝对前缀方式
hdfs://node1:8020/dir/a.txt
hadoop fs -put a.txt hdfs://node1:8020/dir
#使用1-使用相对前缀方式
/dir/a.txt
hadoop fs -put a.txt /dir
在HDFS中,Namenode管理的元数据具有两种类型:
1、文件自身属性信息
文件名称、权限,修改时间,文件大小,副本数,数据块大小。
2、文件块位置映射信息
记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。
目录 | 说明 |
---|---|
/source | 用于存储原始采集数据 |
/common | 用于存储公共数据集,例如:IP库、省份信息、经纬度等 |
/workspace | 工作空间,存储各团队计算出来的结果数据 |
/tmp | 存储临时数据,每周清理一次 |
/warehouse | /warehouse存储hive数据仓库中的数据 |
# 一键操作命令
stop-dfs.sh
start-dfs.sh
#格式
hadoop fs -命令 参数 #该命令可以操作任何文件系统
hdfs dfs -命令 #该命令只能操作HDFS文件系统
#文件的上传
hadoop fs -put a.txt /dir
hdfs dfs -put a.txt /dir
# 上传后并删除本地文件
hadoop fs -moveFromLocal a.txt /dir
hdfs dfs -moveFromLocal a.txt /dir
#文件的下载 -get 目标路径 下载路径
hadoop fs -get /dir/a.txt /root
hdfs dfs -get /dir/a.txt /root
# 查看命令
hadoop fs -cat /dir/a.txt
hdfs dfs -cat /dir/a.txt
# 查看文件开头1kb数据
hadoop fs -head /dir/a.txt
hdfs dfs -head /dir/a.txt
# 查看文件结尾1kb数据
hadoop fs -tail /dir/a.txt
hdfs dfs -tail /dir/a.txt
#创建文件夹 -单级
hadoop fs -mkdir /dir2
hdfs dfs -mkdir /dir2
#创建文件夹-多级
hadoop fs -mkdir -p /aaa/bbb/ccc
hdfs dfs -mkdir -p /aaa/bbb/ccc
#删除文件
hadoop fs -rm /a.txt
hdfs dfs -rm /a.txt
#删除文件夹
hadoop fs -rm -r /a.txt
hdfs dfs -rm -r /a.txt
#在HDFS上进行文件的复制
hadoop fs -cp /dir/1.txt / #这里的两个路径都是HDFS路径
hdfs dfs -cp /dir/1.txt / #这里的两个路径都是HDFS路径
#在HDFS上进行文件的移动(剪切)
hadoop fs -mv /dir/1.txt / #这里的两个路径都是HDFS路径
hadoop fs -mv /dir/1.txt / #这里的两个路径都是HDFS路径
# 追加文件
hadoop fs -appendToFile /file /dir #追加文件路径, 追加路径
hadoop fs -appendToFile /file /dir
#调整HDFS文件副本的数量
hdfs dfs -setrep -w 2 /1.txt
# 查看edits_log 和 dfsimage路径, 进入里面的current
hdfs getconf -confKey dfs.namenode.name.dir
安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。
在安全模式下,HDFS主要做两件事情
在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在当整个系统达到安全标准时,HDFS自动离开安全模式。
hdfs dfsadmin -safemode get #查看安全模式状态
hdfs dfsadmin -safemode enter #进入安全模式
hdfs dfsadmin -safemode leave #离开安全模式
NameNode完整的元数据 = fsimage文件 + edits日志文件
SecondaryNameNode主要是用来合并NameNode的edits logs到fsimage文件中
checkpoint就是将fsimage和edits log 合并生成新的fsimage,解决以下问题
1、触发checkpoint操作时, SNN会发请求给NN,NN收到后,会生成一个edits new,用于记录后续操作记录
2、SNN会将edits 和 fsimage复制到本地,进行加载到内存,并执行edits文件,执行结束后,会将内存中的数据dump成一个新的fsimage文件,并将它传给NN, 替换原来的fsimages ,edits new也会改回edits
通过core-site.xml配置这两个触发参数
dfs.namenode.checkpoint.period=3600 //两次连续的checkpoint之间的时间间隔。默认1小时
dfs.namenode.checkpoint.txns=1000000 //最大没有执行checkpoint事务的数量,满足将强制执行紧急checkpoint,即使尚未达到检查点周期。默认100万事务数量。
主要有两种方式:
#方式1 指定用户名,命令执行后,需要输入密码 -r表示拷贝是的目录
scp -r local_folder remote_username@remote_ip:remote_folder
# 简化版写法,默认以root用户身份访问
scp -r local_folder remote_ip:remote_folder
#推送
scp -r /root/dir root@node2:/root #指定远程访问的用户身份
scp -r /root/dir node2:/root #简化写法:默认以root用户身份访问
#拉取
scp -r root@node1:/root/dir /root #把远端的文件拉取到本地
hadoop distcp hdfs://node1:8020/jdk-8u241-linux-x64.tar.gz hdfs://node10:8020/
$ hadoop distcp
usage: distcp OPTIONS [source_path...] <target_path>
-append //拷贝文件时支持对现有文件进行追加写操作
-async //异步执行distcp拷贝任务
-bandwidth <arg> //对每个Map任务的带宽限速
-delete //删除相对于源端,目标端多出来的文件
-diff <arg> //通过快照diff信息进行数据的同步
-overwrite //以覆盖的方式进行拷贝,如果目标端文件已经存在,则直接覆盖
-p <arg> //拷贝数据时,扩展属性信息的保留,包括权限信息、块大小信息等等
-skipcrccheck //拷贝数据时是否跳过cheacksum的校验
-update //拷贝数据时,只拷贝相对于源端 ,目标端不存在的文件数据
Trash机制,类似回收站和垃圾桶,默认情况是不开启的,保留时间可以自行配置,目录:/user/ u s e r n a m e / . T r a s h / c u r r e n t 在可配置的时间间隔内, H D F S 会为 ∗ ∗ C u r r e n t ∗ ∗ 目录下的文件创建一个以日期命名的检查点目录,即 ∗ ∗ / u s e r / {username}/.Trash/current 在可配置的时间间隔内,HDFS会为**Current**目录下的文件创建一个以日期命名的检查点目录,即**/user/ username/.Trash/current在可配置的时间间隔内,HDFS会为∗∗Current∗∗目录下的文件创建一个以日期命名的检查点目录,即∗∗/user/{username}/.Trash/**。过期的检查点会被删除。
相关配置属性,在core-site.xml文件:
<property>
<name>fs.trash.intervalname>
<value>1440value>
property>
<property>
<name>fs.trash.checkpoint.intervalname>
<value>0value>
property>
fs.trash.interval:分钟数,当超过这个分钟数后检查点会被删除。如果为零,Trash回收站功能将被禁用。fs.trash.checkpoint.interval:检查点创建的时间间隔(单位为分钟)。其值应该小于或等于fs.trash.interval。如果为零,则将该值设置为fs.trash.interval的值。每次运行检查点时,它都会从当前版本中创建一个新的检查点,并删除在数分钟之前创建的检查点。
# 删除文件跳过Trash, 只需要加个 -skipTrash参数
hadoop fs -rm -skipTrash /root/a.txt
# 恢复
hadoop fs -mv /user/root/.Trash/Current/xx/* /xx/
# 清空
hadoop fs -expunge
#---------在上传到HDFS之前,将小文件合并---------------------
#方式1
hadoop fs -appendToFile *.txt /big.txt
#方式2
FileInputStream inputStream = new FileInputStream(file1); //根据File对象获取输入流
IOUtils.copy(inputStream,outputStream);
#---------在上传到HDFS之后,将小文件合并---------------------
#方式3
Archive档案,将小文件打包形成一个归档文件
HDFS并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在NameNode占用内存,如果存在大量的小文件,它们会吃掉NameNode节点的大量内存。Hadoop Archives可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。
#1、创建Archive文件
#将/config目录下的所有文件进行打包归档,归档之后的包命名为test.har,将打包后的归档文件放在/outputdir
hadoop fs -mkdir /config
cd /export/server/hadoop-3.1.4/etc/hadoop/
hadoop fs -put ./* /config
hadoop archive -archiveName test.har -p /config /outputdir
#2、查看归档后的part-0文件
#将所有小文件的内容都显示到终端上(没有意义)
hadoop fs -cat /outputdir/test.har/part-0
## 注意:har访问只显示原文件,索引标识都隐藏起来。
har://scheme-hostname:port/archivepath/
## 如果没有提供scheme-hostname,那么会使用默认文件系统
har:///archivepath/
#3、查看归档包中有哪些小文件(显示小文件名)
hadoop fs -ls har://hdfs-node1:8020/outputdir/test.har
#4、单独显示或者操作其中的某个小文件
hadoop fs -cat har://hdfs-node1:8020/outputdir/test.har/capacity-scheduler.xml
hadoop fs -cat har:///outputdir/test.har/capacity-scheduler.xml
#5、将归档包中的小文件还原,
mkdir /config2
hadoop fs -cp har:///outputdir/test.har/* /config2
#1、开启指定目录的快照功能
hdfs dfsadmin -allowSnapshot /config
#2、关闭指定目录的快照功能
hdfs dfsadmin -disallowSnapshot /config
#3、创建快照,使用默认的名字,快照在/config/.snapshot/s20220212-164145.611目录
hdfs dfs -createSnapshot /config
#4、创建快照,自己来指定名字
hdfs dfs -createSnapshot /config mysnap1
#5、给快照重命名
hdfs dfs -renameSnapshot /config mysnap1 mysnap2
#6、比较两个快照的差异
# + 表示增加文件 - 减少文件 M 修改文件
hdfs snapshotDiff /config s20220212-164145.611 mysnap2
#7、恢复快照
hdfs dfs -cp -ptopax /config/.snapshot/mysnap1 /config3
#、删除快照
#如果一个目录有快照,则该目录不能直接被删除,必须把所有快照都删除了,才能删除该目录
hdfs dfs -deleteSnapshot /config mysnap2
hadoop fs -chmod 777 /config #变更目录或文件的权限位
hadoop fs -chmod -R 777 /config #变更目录及子目录的权限位
hadoop fs -chown lft: /config #变更目录或文件的所属用户
hadoop fs -chown :lft /config #变更目录或文件的所属用户组
hadoop fs -chown lft:lft /config #变更目录或文件的所属用户和用户组
<property>
<name>dfs.hosts.excludename>
<value>/export/server/hadoop-3.1.4/etc/hadoop/excludesvalue>
property>
192.168.88.161 node1 node1.itcast.cn
192.168.88.162 node2 node2.itcast.cn
192.168.88.163 node3 node3.itcast.cn
192.168.88.164 node4 node4.itcast.cn
scp /root/.ssh/authorized_keys node2:/root/.ssh
scp /root/.ssh/authorized_keys node3:/root/.ssh
scp /root/.ssh/authorized_keys node4:/root/.ssh
10.在node1的/export/server/hadoop-3.1.4/etc/hadoop/workers修改以下内容:
node1
node2
node3
node4
11.在node4上重新配置hadoop
rm -fr /export/server/hadoop-3.1.4/data/*
12.在node4上启动hdfs
hdfs --daemon start datanode
13.设置负载均衡
hdfs dfsadmin -setBalancerBandwidth 104857600 #设置贷款
hdfs balancer -threshold 5 #设置block数量
namespaceID:namenode名称空间id
在单节点或者高可用情况下,整个集群只有一个namespaceID
在联邦机制下,当横向扩展namenode时,扩展几个namenode,就会有几个namespaceID
clusterID:集群id,不管是单节点,高可用,联邦都属于同一个集群,所有clusterID都相同
blockpoolID:数据池ID
在单节点或者高可用情况下,整个id都相同
在联邦机制下,当有多个namenode同时工作,每一个namenode都有自己的数据池,都有自己的blockpoolID
集群部署节点角色的规划(3节点)
------------------
node1 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node
node2 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node
node3 nodemanager datanode zookeeper journal node
------------------
安装步骤:
1.安装配置zooekeeper集群(可选)
1.1解压
mkdir -p /opt/export/server
tar -zxvf zookeeper-3.4.5.tar.gz -C /opt/export/server
1.2修改配置
cd /opt/export/server/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改:dataDir=/opt/export/data/zkdata
在最后添加:
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
保存退出
然后创建一个tmp文件夹
mkdir /opt/export/data/zkdata
echo 1 > /opt/export/data/zkdata/myid
1.3将配置好的zookeeper拷贝到其他节点
scp -r /opt/export/server/zookeeper-3.4.5 node2:/opt/export/server
scp -r /opt/export/server/zookeeper-3.4.5 node3:/opt/export/server
编辑node2、node3对应/opt/export/data/zkdata/myid内容
node2:
mkdir /opt/export/data/zkdata
echo 2 > /opt/export/data/zkdata/myid
node3:
mkdir /opt/export/data/zkdata
echo 3 > /opt/export/data/zkdata/myid
2.安装配置hadoop集群
2.0 node1和node2安装以下软件
yum install psmisc -y
2.1解压
在三台主机创建以下目录:
mkdir -p /opt/export/server
mkdir -p /opt/export/software
mkdir -p /opt/export/opt/export/data/zkdata
在node1上将hadoop安装包上传到/opt/export/software目录,并解压
tar zxvf hadoop-3.1.4-bin-snappy-CentOS7.tar.gz -C /opt/export/server
在node1上创建以下目录
mkdir -p /opt/export/server/hadoop-3.1.4/data
mkdir -p /opt/export/server/hadoop-3.1.4/journaldata
2.2配置3台主机的修改hadoop环境变量
vim /etc/profile
export HADOOP_HOME=/opt/export/server/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
3.在node1上修改配置文件
##############################################################################
3.1 修改hadoop-env.sh
cd /opt/export/server/hadoop-3.1.4/etc/hadoop
vim hadoop-env.sh
export JAVA_HOME=/export/server/jdk1.8.0_241
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
###############################################################################
3.2 修改core-site.xml
<configuration>
<!-- HA集群名称,该值要和hdfs-site.xml中的配置保持一致 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- hadoop本地磁盘存放数据的公共目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/export/server/hadoop-3.1.4/data</value>
</property>
<!-- ZooKeeper集群的地址和端口-->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
###############################################################################
3.3 修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:9870</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:9870</value>
</property>
<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/export/server/hadoop-3.1.4/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定该集群出故障时,哪个实现类负责执行故障切换 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
###############################################################################
3.4 修改mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
###############################################################################
3.5 修改yarn-site.xml
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node2</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
3.6 修改workers
node1
node2
node3
3.7 修改start-yarn.sh和stop-yarn.sh,在第二行添加以下内容
vim /opt/export/server/hadoop-3.1.4/sbin/start-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
vim /opt/export/server/hadoop-3.1.4/sbin/stop-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
3.8 分发hadoop包
cd /opt/export/server/
scp -r hadoop-3.1.4 root@node2:$PWD
scp -r hadoop-3.1.4 root@node3:$PWD
4.启动集群
###注意:严格按照下面的步骤!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4.1启动zookeeper集群(分别在node1、node2、node3上启动zk)
zkServer.sh start
#查看状态:一个leader,两个follower
zkServer.sh status
4.2手动启动journalnode(分别在在node1、node2、node3上执行)
/opt/export/server/hadoop-3.1.4/sbin/hadoop-daemon.sh start journalnode
#运行jps命令检验,多了JournalNode进程
4.3格式化namenode
#在node1上执行命令:
/opt/export/server/hadoop-3.1.4/bin/hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置的目录下生成个hdfs初始化文件,
#在node1启动namenode进程
/opt/export/server/hadoop-3.1.4/bin/hdfs --daemon start namenode
##在node2上启动备用namenode并进行元数据同步
/opt/export/server/hadoop-3.1.4/bin/hdfs namenode -bootstrapStandby
4.4格式化ZKFC(在active(node1)上执行即可)
/opt/export/server/hadoop-3.1.4/bin/hdfs zkfc -formatZK
4.5启动HDFS(在node1上执行)
/opt/export/server/hadoop-3.1.4/sbin/start-dfs.sh
4.6启动YARN(在node1上执行)
/opt/export/server/hadoop-3.1.4/sbin/start-yarn.sh
如果node2上没有启动ResourceManage,则还需要手动在standby上手动启动备份的 resourcemanager
/opt/export/server/hadoop-3.1.4/sbin/yarn-daemon.sh start resourcemanager
测试集群工作状态的一些指令 :
hdfs dfsadmin -report 查看hdfs的各节点状态信息