hadoopd的环境搭建
首先在官网下载JDK和Hadoop
Index of /dist/hadoop/common/hadoop-3.3.1 (apache.org)https://archive.apache.org/dist/hadoop/common/hadoop-3.3.1/
Java Archive Downloads - Java SE 8u211 and later (oracle.com)https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
登录Linux到root用户下,创建两个文件目录,例如:module,software两个文件目录,通过FinalShell将两下载好的两个文件上传到module目录下,通过命令将两个文件解压到创建的另外一个目录中去
tar -zxvf jdk-8u271-linux-x64.tar.gz -C /opt/module/
tar -zxvf hadoop-3.3.1.tar.gz -C /opt/module/
解压完两个文件之后,配置环境变量。
sudo vim /etc/profile.d/my_env.sh
配置完上面的两个路径,执行:source /etc/profile 刷新一下我们配置的文件,分别写Java查看配置jdk是否成功,Hadoop查看配置Hadoop是否成功
当出现这样的内容说明我们创建成功了。
Hadoop的文件目录
bin:存放Hadoop 的命令,常用命令: hadoop、hdfs、mapred、yarn等,用户可以使用这些脚本管理和使用Hadopop.
etc:存放着大量的配置文件
nclude:对外提供的编程库的.h头文件(具体动态库和静态库在lib目录中),常用于C++程序访问HDFS或者编写MapReduce程序
lib / native:对外native存放的是本地动态链接库
libexec:各个服务对外用的shell配置文件所在目录,可用于配置日志输出、启动参数等基本信息
sbin:存放一些集群相关的命令,例如:start-dfs.sh、start-yarn.sh
share:说明文档、各个模块编译后的jar包、官方写的java调用hadoop示例程序
工作模式
本地模式(Local/Standalone Mode):单台服务器,数据存储在本地。用来演示案例
伪分布式模式(Pseudo-Distributed Mode)单台服务器,数据存储在HDFS上。用于测试生产环境
完全分布式模式(Fully-Distributed Mode):多台服务器组成集群,数据存储在HDFS上,多台服务器工作。在企业中大量使用。
本地模式(WordCount)
创建在Hadoop文件下面创建一个wcinput文件夹
在wcinput文件下创建一个word.txt文件
编辑word.txt文件
执行此命令,最后程序会创建
output
文件夹,并在里面生成两个文件:
part-r-00000
、
_SUCCESS
。
_SUCCESS
是成功标志文件,
part-r-00000
是结果文件
wordcount
可以对文档中每个字符串进行出现次数统计
结果输出文件夹为 output。执行程序前该output文件夹不能存在,程序会自动创建该文件夹,如果存在会抛出异常
集群搭建
准备三台服务器
hadoop102
、
hadoop103
、
hadoop104
,关闭防火墙、设置静态IP、配置主机名称和主机映射。安装JDK、Hadoop,配置环境变量 (前面已经完成)
配置集群
在
hadoop102
上已经搭建好了 jdk、hadoop,所以可以直接复制到其他服务器上:
scp 可以实现服务器与服务器之间的数据拷贝
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).lost connection当出现这种错误,说明权限不够。编辑 /etc/ssh/sshd_config 将PasswordAuthentication 前的的#去掉,保存退出后重启ssh:systemctl restart sshd.service 并改成开机自启systemctl enable sshd.service
成功将两个文件复制到Hadoop3
在hadoop4上使用scp从hadoop2上拉取:scp -r root@hadoop2:/opt/module/hadoop-3.3.1 ./
scp -r root@hadoop2:/opt/module/jdk1.8.0_271 ./ 拉取和复制建议都尝试一下
rsync远程同步工具
rrsync:用于备份和镜像。特点速度快、避免复制相同内容和支持符号链接的优点。rsync和scp区别:rsync复制文件的速度要比scp快,rsync只对差异文件做更新,scp是把所有文件都复制过去
rsync -av 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
# -a :归档拷贝
# -v :显示复制过程
# --delete 当目的路径文件或文件夹比源路径多(源路径删除了文件),删除目的路径的文件
例如:删除Hadoop3中/opt/hadoop-3.3.1/wcinput
但是在执行的时候发现报错如下:rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2] 发现是没有权限 通过chomd 777赋权和升级了rsync,执行命令还是报错。最后用pwd 查看当前路径以及去hadoop3里也查看了路径。选择粘贴路径才成功 。问题处在路径上(我使用了绝对路径,相对路径出错解决不了)
chmod 777 /opt/module/hadoop-3.3.1
yum -install rsync
rsync -av /opt/module/hadoop-3.3.1 root@hadoop3:/opt/module/hadoop-3.3.1/
xsync
可以编写一个shell脚本调用
rsync
命令,将文件同步到所有服务器的相同目录下。 在
/bin
中新建一个shell脚本文件
xsync
,内容如下:
#!/bin/bash
# 1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Argument
exit
fi
# 2. 遍历集群所有机器
for host in hadoop2 hadoop3 hadoop4
do
echo ================== $host =====================
# 3. 遍历所有目录,逐个发送
for file in $@
do
# 4. 判断文件是否存在
if [ -e $file ]
then
# 5. 获取父目录
# -P 如果cd后面是一个软链接,-P可以进入软链接指向的真正文件夹
pdir=$(cd -P $(dirname $file); pwd)
# 6. 获取当前文件名称
fname=$(basename $file)
# -p 如果存在则不创建,如果不存在则创建
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
比如环境变量配置文件
/etc/profile.d/my_env.sh
,可以使用sudo进行同步:这样Hadoop3,Hadoop4 都能找到
此外个别使用sudo时,因为xsync不在root的命令列表,所以需要使用./进行调用
sudo ./bin/xsync /etc/profile.d/my_env.sh
ssh免密登录
因为脚本中使用了
ssh
命令和
rsync
命令去连接其他服务器,所以每台服务器都要输入两次密码,比较繁琐,可以配置ssh免密登录。
ssh免密登录原理图:
如果当前服务器使用
ssh
命令连接过其他服务器,那么在该用户家目录下就会生成一个
.ssh
文件夹,里面存有一个
known_hosts
文件,文件中保存的有该用户曾经使用
ssh
命令远程连接过的服务器。
配置
hadoop2、
hadoop3
、
hadoop4免密交互登录。在Hadoop2上
# 选择非对称加密算法为rsa算法
ssh-keygen -t rsa
# 然后一路回车即可
命令执行后,会在用户目录下的
.ssh
文件夹中生成一个公钥文件
id_rsa.pub
、一个私钥文件
id_rsa
将
hadoop102
上的公钥
id_rsa.pub
拷贝到
hadoop3
、
hadoop4
:
进行免密之后,在
hadoop103
、
hadoop104
的
.ssh
文件夹中会多一个
authorized_keys
文件,里面记录了允许哪些客户机免密登录自己。
authorized_keys
文件中的内容其实就是
hadoop102
的公钥文件
id_rsa.pub
中的内容。另外,还需要对自己设置免密登录,否则
hadoop2
使用
ssh
连接 hadoop2` 本身时也需要密码。然后在
hadoop3
、
hadoop4
上也执行上述同样的操作,使集群中的几台服务器可以互相免密登录。 下面是配置完之后的测试显示正常:
配置文件配置
NameNode
和
SecondaryNameNode
不要安装到同一台服务器上
ResourceManager
也很消耗内存,不要和
NameNode
、
SecondaryNameNode
配置在同一台机器上
Hadoop集群 = HDFS集群 + Yarn集
Yarn集群和HDFS集群:逻辑上分离、物理上在一起。
逻辑上,Yarn集群的启动和HDFS集群的启动并没有直接的依赖关系。
物理上,Yarn集群、HDFS集群,都是在同一个安装了Hadoop的集群内。
Hadoop配置文件分为两类:默认配置文件和自定义配置文件。
core-site.xml
、
hdfs-site.xml
、
yarn-site.xml
、
mapred-site.xml
四个配置文件存放在
hadoop-3.3.1/etc/hadoop
这个路径上,用户可以根据项目需求重新进行修改配置。
配置核心文件
core-site.xml:**vim core-site.xml** 将下表中的内容写在<configuration>中
<!-- 指定NameNode的地址 -->
<!-- core-defualt.xml中该项默认值为本地Linux路径,因为我们集群要用HDFS,所以要改成HDFS路径 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop2:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<!-- core-default.xml中该项默认值为 /tmp/hadoop-${user.name},因为 /tmp在Linux中是临时目录,一段时间(默认一个月)会删除,所以要调整为自定义目录 -->
<!-- 我们指定的data文件夹如果不存在,hadoop会自动进行创建 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.2.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为tengyer(即hdfs中的用户) -->
<!-- 如果不配置,那么在浏览器中默认的是Mr.who,该用户删除hdfs文件时,会提示无权限。-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>tengyer</value>
</property>
配置HDFS的
hdfs-site.xml:**vim**
**hdfs-site.xml **将下表中的内容写在<configuration>中
<!-- NameNode对外暴露的Web端访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop2:9870</value>
</property>
<!-- 2NN 对外暴露的Web端访问地址(2NN安装在hadoop104上) -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop4:9868</value>
</property>
配置Yarn的
yarn-site.xml
:
**vim yarn-site.xml** 将下表中的内容写在<configuration>中
<!-- 指定MR走shuffle -->
<!-- 在yarn-default.xml中该项默认值为空,但是官方推荐使用mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址(ResourceManager安装在hadoop103) -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<!-- Hadoop3.1.x需要配置,因为yarn-default.xml中该项默认值缺少了HADOOP_MAPRED_HOME -->
<!-- 到了Hadoop3.2.x就不需要再配置该项了,可以直接使用yarn-default.xml中的默认值 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
配置MapReduce的
mapred-site.xml
:**vim **
**mapred-site.xml** 将下表中的内容写<configuration>中
<!-- 指定MapReduce程序运行在Yarn上 -->
<!-- mapred-default.xml中该项默认值是local,即在本地运行 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置完成后,将
hadoop102
的这些配置同步分发给
hadoop3
、
hadoop4
:
xsync hadoop/
配置workers
workers内容即为集群中的各台主机,默认的是
localhost
。因为我们使用集群方式,所以可以删掉
localhost
,然后把几台主机都配置进来。需要在
HADOOP-3.3.1/etc/hadoop/workers
中将几台节点都添加进去:该文件将来会作为hadoop集群启动的脚本一部分,所以主机名后面不能有空格、结尾也不能有空行
hadoop2
hadoop3
hadoop4
将
works
文件分发给其他服务器:xsync works
启动集群
初始化
如果是第一次启动集群,需要进行初始化操作,在
hadoop2
节点上格式化NameNode。执行命令:
hdfs namenode -format
初始化完毕后,文件夹中生成
data
和
logs
两个文件夹
下面就是配置完查到的主机信息:
启动HDFS 及遇到的问题
在启动Hadoop时,出现如下错误,是因为我们以 root 用户身份操作 HDFS 的 Namenode,但是没有定义 HDFS_NAMENODE_USER 环境变量;
解决方案:
在环境变量添加配置:完成之后在其他几台的Hadoop上也将环境变量添加,会解决yarn启动问题
vim /etc/profile.d/my_env.sh
添加内容:
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
再重启一下配置,再启动hdfs就好了,问题也解决了。
source /etc/profile
启动完毕后,在三台服务器上依次使用
jps
查看其上面运行的 hdfs、yarn 的java进程
启动YARN及遇到的问题
在
hadoop2
服务器上启动集群
./start-dfs.sh
启动失败,遇到如下错误:
是因为我们自己配的环境变量有问题。参考启动HDFS步骤和添加内容一致:
浏览器访问NameNode
关于在浏览器访问NameNode,我们配置了Hadoop:9870 这是普通用户的访问方式,但是对于root用户浏览器访问NameNode 可以在网页写成 root用户的静态ip:9870 以下截图亲测有效。如果不能成功 ,查看防火墙:systemctl status firewalld 状态, 如果是active那就说明是防火墙阻止了浏览器访问。关闭防火墙再试试:**systemctl stop firewalld **再次访问就可以成功。关闭状态:
浏览器访问NameNode:
在Hadoop2 上创建文件: hdfs fs -mkdir /wincput 到浏览器上查看 创建目录
启动YARN
根据集群规划,我们的ResourceManager节点为
hadoop3
。在
hadoop3
上启动YARN:sbin/start-yarn.sh
wordcount
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examoles-3.3.1.jar wordcount /wcinput wcoutput
wordcount 如果报错,使用chmod +x赋权。
chmod +r /opt/module/hadoop-3.3.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar
再次报错使用相对路径就会成功。绝对路经没有扫描到。
执行完就能在浏览器上查到运行IP了
集群崩溃时的处理
集群中如果有服务器 DataNode服务被
kill
或异常终止了,或者节点的
data
文件夹被删除了(只删除一两台节点不影响集群,因为hdfs有3个备份,所以需要三台服务器的data都被删掉),此时集群便属于崩溃状态。
如果需要重新格式化NameNode,则可以进行以下操作:
在
hadoop103
上关闭集群Yarn,在
hadoop102
上关掉集群hdfs
sbin/stop-yarn.sh
sbin/stop-dfs.sh
删除所有节点上的
data
、
logs
文件夹
rm -rf /opt/module/hadoop-3.3.1/data
rm -rf /opt/module/hadoop-3.3.1/logs
重新进行NameNode格式化
hdfs namenode -format
如果不删除所有节点上的
data
、
logs
,就直接重启hdfs或者进行NameNode格式化,那么NameNode依然无法启动。因为两次NameNode格式化产生的
namespaceID
不同,而
namespaceID
是和DataNode中的版本号唯一绑定的。如果DataNode中的数据没有被清空,NameNode又格式化产生了新的
namespaceID
,和DataNode中的版本号无法绑定,就会造成NameNode无法启动。
配置历史服务器
为了查看程序的历史运行状况,需要配置一下历史服务器。在hadoop2
vim mapred-site.xml
文件中添加如下配置:
<!-- 在configuration标签中加入如下配置 -->
<!-- 配置历史服务器的内部服务端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop2:10020</value>
</property>
<!-- 配置历史服务器暴露的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop2:19888</value>
</property>
将配置信息复制分发到其他服务器:
hadoop3
节点上重启 Yarn:sbin/stop-yarn.sh sbin/start-yarn.sh
在
hadoop2
上启动历史服务器进程:mapred --daemon start historyserver
测试historyserver
到/opt/module/hadoop-3.3.1/share/hadoop/mapreduce路径下执行语句:hadoop jar hadoop-mapreduce-examples-3.3.1.jar wordcount /wcinput /wcoutput 在浏览器上查看:
配置日志聚集功能
我们配置的历史服务器虽然可以查看到历史 job 的运行信息,但是如果点击后面的
logs
链接查看其详细日志,却无法查看,提示
Aggregation is not enabled.
(日志聚集功能未开启)。我们开启了日志聚集功能后,可以很方便的查看程序运行详情,方便开发调试。开启日志聚集功能,需要重新启动 NodeMananger、ResourceMananger、HistoryServer。**在
hadoop2
的
yarn-site.xml
中加入配置:vim
yarn-site.xml
**
<!-- 在configuration中加入以下配置 -->
<!-- 配置日志聚集功能,yarn-default.xml中该项默认为false -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址,设置聚集到历史日志服务器上,方便查看 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop2:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间:7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
然后分发给其他服务器:xsync yarn-site.xml
在
hadoop2
上停止历史服务器:mapred --daemon stop historyserver
在
hadoop3
上重启Yarn:sbin/stop-yarn.sh sbin/start-yarn.sh
hadoop2
上启动历史服务器:mapred --daemon start historyserver
集群的启停方式总结
整体启动、停止 HDFS:sbin/start-dfs.sh sbin/stop-dfs.sh
整体启动、停止 YARN:sbin/start-yarn.sh sbin/stop-yarn.sh
分别启动、停止 HDFS 组件:
hdfs --daemon start/stop namenode/datanode/secondarynamenode
启动、停止YARN组件:
yarn --daemon start/stop resourcemanager/nodemanager
在Hadoop-3.3.1的bin目录下编写shell脚本:**vim myhadoop.sh **集中启动、停止:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No args Input..."
exit;
fi
case $1 in
"start")
echo "============= 启动hadoop集群 ======================"
echo "------------- 启动 hdfs ---------------------------"
ssh hadoop2 "/opt/module/hadoop-3.3.1/sbin/start-dfs.sh"
echo "------------- 启动 yarn ---------------------------"
ssh hadoop3 "/opt/module/hadoop-3.3.1/sbin/start-yarn.sh"
echo "---------- 启动 historyserver ----------------------"
ssh hadoop2 "/opt/module/hadoop-3.3.1/bin/mapred --daemon start historyserver"
;;
"stop")
echo "================ 关闭hadoop集群 =========================="
echo "-------------- 关闭historyserver ------------------------"
ssh hadoop2 "/opt/module/hadoop-3.3.1/bin/mapred --daemon stop historyserver"
echo "---------------- 关闭 yarn ------------------------------"
ssh hadoop3 "/opt/module/hadoop-3.3.1/sbin/stop-yarn.sh"
echo "---------------- 关闭 hdfs ------------------------------"
ssh hadoop2 "/opt/module/hadoop-3.3.1/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
在编写完自定义脚本一定要赋权(777代表所有权限):chmod 777 myhadoop.sh
编写脚本,遍历集群中服务器调用
jps
查看上面的进程启动情况 :
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo ================= $host =================
ssh $host jps
done
将编写好的这两个脚本分发给其他服务器:xsync bin 注意回到上层目录再分发
Hadoop 3.x中常用端口:
HDFS NameNode 内部通讯端口:8020/9000/9820
HDFS NameNode 对用户的web查询端口:9870
Yarn查看任务运行情况的web页面端口:8088
历史服务器对外暴露的web页面端口:19888
HDFS 概述
HDFS就是一种分布式文件管理系统(Hadoop分布式文件管理系统),用于存储文件,通过目录树来定位文件。有很多服务器联合起来实现其功能,集群中的服务器有各自的角色。适合一次写入、多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
优点:
● 高容错性:
数据自动保存多个副本。多副本的形式提高容错性;同时,数据丢失有备份可自动恢复
● 适合处理大数据:能够处理数据规模达到GB、TB、甚至PB级别的数据;能够处理百万规模以上的文件数量;
● 可以构建在廉价机器上,通过多副本机制提高可靠性
缺点:
● 不适合低延时数据访问,比如毫秒级的存储数据是做不到的(适合高吞吐量的批量数据读写,不适合交互式应用)
● 无法高效的对大量小文件进行存储。
存储大量小文件的话,会占用NameNode大量的内存来存储文件目录和块信息,但是NameNode的内存是有限的;
HDFS架构
hadoop官网:https://hadoop.apache.org/docs
NameNode
NameNode:简称NN,就是Master,是一个管理者
管理HDFS的名称空间,存放文件元数据
配置副本策略
管理数据块(block)映射信息(文件与数据块的映射、数据块与数据节点的映射)
处理客户端读写请求
DataNode
DataNode:就是Slave。根据NameNode的指令执行实际的操作
存储实际的数据块
执行数据块的读/写操作
Secondary NameNode
Secondary NameNode:简称2NN。不是NameNode的热备,当NameNode宕机时,并不能马上替换NameNode提供服务
服务NameNode,分担其工作量,比如定期合并 Fsimage 和 Edits,并推送给NameNode
在紧急情况下,可辅助恢复NameNode
上面的Hadoop官方绘制的HDFS架构图中并没有2NN,因为在企业中一般会将NameNode搭建成高可用,而不是使用2NN。
Client:客户端
文件切分。文件上传 HDFS 时,Client将文件切分成一个个的Block然后进行上传
与NameNode交互,获取文件的位置信息
与DataNode交互,读取或写入数据
Client提供一些命令来管理HDFS,比如NameNode格式化
Client可以通过一些命令来访问HDFS,比如对HDFS进行增删改查操作
HDFS 文件块
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数 dfs.blocksize 来规定(位于 hdfs-default.xml中), hadoop 2.x、hadoop 3.x 中默认大小是 128M,hadoop 1.x中默认大小是 64M。
数据块大小 128M,如果一个文件大小只有1kb,那么只会占用这个数据块中1kb大小的空间,剩余空间依然可以让其他文件进行占用。
最佳的文件块大小配置:机械硬盘的HDFS数据块最佳大小为128M,固态硬盘的HDFS数据块最大小为256M。
计算方式:
- 假设寻址时间为10ms,即查找到目标block的时间为10ms
- 根据实践,寻址时间为传输时间的 1% 时,系统为最佳状态。因此传输时间为 10ms / 0.01 = 1s。即花费10ms找到这个数据块,花费1s读完这个数据块的内容。
- 目前机械硬盘传输速度约 100M/s, 固态硬盘 200M/s - 300M/s
- 所以,对于机械硬盘:1s时间可以传输 100M数据,所以数据块设置为 128M 较为合适。对于固态硬盘,数据块大小设置为256M较为合适。
数据块大小设置规则:
如果数据块设置的太小,会增加寻址时间,程序一直在找块的开始位置
如果数据块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间,导致程序在处理这块数据时比较缓慢
HDFS特性
主从架构:
● HDFS 集群是标准的 master/slave 主从架构集群
● 一般一个HDFS集群是由一个 NameNode 和一定数量的 DataNode组成
● NameNode 是 HDFS主节点,DataNode是 HDFS 从节点,两种角色各司其职,共同协调完成分布式的文件存储服务
分块存储:
● HDFS中的文件在物理上是分块存储(block)的,默认大小是128M,不足128M则本身就是一块
● 块的大小可以通过配置参数来规定,参数位于 hdfs-site.xml中 dfs.blocksize
副本机制:
● 文件的所有block都会有副本,副本数量可以在文件创建时指定,也可以在之后通过命令改变
● 副本数由参数 dfs.replication 控制,默认值是 3。 也就是除了本身外,还会额外再复制2份。
元数据管理。
在HDFS中,NameNode管理的元数据分为两类:
● 文件自身属性信息:文件名称、权限、修改时间、文件大小、复制因子、数据块大小
● 文件块位置映射信息:记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上
namespace:
● HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和Linux等大多数现有的文件系统类似
● NameNode负责维护文件系统的namespace名称空间,任何堆文件系统名称空间或属性的修改都将被namenode记录下来
● HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件。
数据块存储:
● 文件的各个block具体存储管理由DataNode节点承担
● 每一个block都可以在多个datanode上存储
Hadoop基本命令
**<local-src>: **这是本地文件的路径或目录的位置,它是要复制到HDFS的文件或目录的源路径。
**<hdfs-destination>: **这是HDFS中目标路径的位置,表示文件或目录将被复制到HDFS的位置。
上传文件到HDFS:
hadoop fs -copyFromLocal <local-src> <hdfs-destination>
从HDFS下载文件:
hadoop fs -copyToLocal <hdfs-src> <local-destination>
在HDFS上创建目录:
hadoop fs -mkdir <hdfs-directory>
在HDFS上删除文件或目录:
hadoop fs -rm <hdfs-path>
列出HDFS上的文件和目录:
hadoop fs -ls <hdfs-path>
查看HDFS上文件的内容:
hadoop fs -cat <hdfs-file>
移动文件或目录到另一个位置:
hadoop fs -mv <source-path> <destination-path>
合并本地文件到HDFS:
hadoop fs -put <local-src> <hdfs-destination>
从HDFS中拷贝文件到本地文件系统:
hadoop fs -get <hdfs-src> <local-destination>
设置HDFS文件的副本数:
hadoop fs -setrep -w <replication-factor> <hdfs-file>
获取HDFS上文件或目录的摘要信息:
hadoop fs -du -s <hdfs-path>
将本地文件系统上的所有文件拷贝到HDFS目录:
hadoop fs -copyFromLocal <local-src>/ <hdfs-destination>*
查看HDFS上的块信息:
hadoop fs -blocksize <hdfs-file>
查看整个文件系统的磁盘空间使用情况:
hdfs dfs -df -h /
查看特定目录的磁盘空间使用情况:
hdfs dfs -du -h /path/to/directory
查看磁盘上最大的文件或目录:
hdfs dfs -du -h / | sort -rh | head -n 10
版权归原作者 weixin_45837583 所有, 如有侵权,请联系我们删除。