hadoop01
大数据一般处理流程:
数据源:关系型数据库、日志文件、三方数据
--> 数据采集或同步:sqoop(RDBMS与HDFS直接的导入与导出)、flume(日志文件,给HDFS及kafka)、kafka(实时数据处理)
--> 数据存储:HDFS、Hbase、ES
--> 数据清洗:MapReduce、Hive(ETL)、SparkCore、sparksql等
--> 数据分析:MapReduce、Hive、SparkSQL、impala、kylin
--> 数据展示:metastore、Javaweb、hcharts、echarts
Hadoop架构图
一.部署
1.本地模式
下载tar包https://downloads.apache.org/hadoop/common/
安装环境需要有jdk
#下载 wget https://downloads.apache.org/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz #解压 tar -zxvf hadoop-3.4.0.tar.gz #添加环境变量 vim /etc/profile export HADOOP_HOME=/data/tools/hadoop-3.4.0 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH #测试 cat >>1.txt<< EOF abc bcd yht gyu uio hadoop hive hi hello EOF for i in {1..1000};do cat 1.txt >> 2.txt;done for i in {1..1000};do cat 3.txt >> 3.txt;done #此时 3.txt大约是一个200m的文件 #执行hadoop命令,其中. output依次表示输入输出文件夹,输入输出都是以文件夹而不是文件执行的 hadoop jar ../tools/hadoop-3.4.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar wordcount . output
hadoop的目录为
输出文件夹output是不能手动创建的,只有在输出文件夹不存在且执行命令自动创建才可以,否则会报错,output中的文件为
2.伪分布式集群
分布式的文件系统是用的hdfs而不是本地文件系统
2.1修改配置文件
添加hosts解析
vim /etc/hosts 10.12.20.15 hadoop01
添加ssh免密登录
ssh-copy-id 10.12.20.15
修改core-site.xml文件。hadoop3.x默认端口为9820,tmp目录不可以手动创建,需要自动生成
vim /data/tools/hadoop-3.4.0/etc/hadoop/core-site.xml <configuration>
<!-- 设置namenode节点 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop01:9820</value> </property> <!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 --> <property> <name>hadoop.tmp.dir</name> <value>/data/tools/hadoop-3.4.0/tmp</value> </property> </configuration>
修改hdfs-site.xml文件
vim /data/tools/hadoop-3.4.0/etc/hadoop/hdfs-site.xml
<configuration> <!-- 配置副本数,默认为3个,伪分布只有一个节点,因此次数设置为1 --> <property> <name>dfs.replication</name> <value>1</value> </property> <!-- secondarynamenode守护进程的http地址:主机名和端口号,端口号默认为9868.参考守护进程布局 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop02:9868</value> </property> <!-- namenode守护进程的http地址:主机名和端口号,端口号默认为9870.参考守护进程部署 --> <property> <name>dfs.name.http-address</name> <value>hadoop01:9870</value> </property> </configuration>
修改hadoop-env.sh文件,添加
vim /data/tools/hadoop-3.4.0/etc/hadoop/hadoop-env.sh export JAVA_HOME=/data/tools/jdk export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root
在/data/tools/hadoop-3.4.0/etc/hadoop/workers中配置所有的datanode的守护进程,因为伪分布集群,所以使用默认的localhost就可以。
2.2启动集群
格式化集群
hdfs namenode -format
在hadoop-3.4.0文件夹中生成了tmp及logs目录
启动集群,需要提前添加免密登录,否则报错Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
start-dfs.sh
在web中访问http://10.12.20.15:9870/可以看到页面hdfs的监控界面
但是访问文件系统hdfs报错Failed to retrieve data from /webhdfs/v1/?op=LISTSTATUS: Server Error
在hadoop-env.sh中由jdk17换为jdk11后,重启hadoop stop-dfs.sh/hadoop start-dfs.sh 访问正常。
3.在伪分布中使用hadoop
在伪分布中,文件不再是存储在本地而是存储在hdfs中,需要将文件上传到hdfs中
先创建一个input文件夹,然后将之前生成的.txt文件拷贝到input文件夹
mkdir input mv *.txt input #hdfs命令上传input文件夹到hdfs的根目录 hdfs dfs -put input/ /
在web界面可以看到上传的文件
执行hadoop命令
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar wordcount /input /output
注意其中/input /output均为hdfs中的文件夹,而不是本地的文件,本地并不会生成/output。在使用伪分布式之后,所有的文件都是使用的hdfs上的。在web界面也看看到
使用hdfs命令查看文件内容
hdfs dfs -cat /output/*
可以看到
3.完全分布式集群
有多台机器协同工作
NameNode 主节点,负责文件的访问处理请求等,需要单独部署在一台硬件性能好的机器
DataNode 子节点,维护自己节点上的数据,数据存储
SecondaryNameNode 是NameNode的备份,不要和NameNode在一台机器上
3.1准备工作:关闭防火墙 网络互通 hosts解析 ssh免密认证 时间 同步 jdk和hadoop的环境变量配置
#关闭防火墙 systemctl stop firewalld systemctl status firewalld #添加host解析 vim /etc/hosts 10.12.20.13 hadoop03 10.12.20.14 hadoop02 10.12.20.15 hadoop01 #三台服务器互相免密登录,同事也需要本机对本机的免密 ssh-copy-id 10.12.20.13 ssh-copy-id 10.12.20.14 ssh-copy-id 10.12.20.15 #在每台服务器上同步时间 ntpdate ntpserver.xxx.com.cn #安装jdk cd /data/tools tar -zxvf jdk-11.0.20_linux-x64_bin.tar.gz -C /data/tools ln -s jdk-11.0.20 jdk #安装hadoop tar -zxvf hadoop-3.4.0.tar.gz -C /data/tools ln -s hadoop-3.4.0 hadoop #配置环境变量 vim /etc/profile export JAVA_HOME=/data/tools/jdk export HADOOP_HOME=/data/tools/hadoop export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#source使之生效
source /etc/profile
3.2修改配置文件
core-site.xml
vim hadoop/etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop01:9820</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/tools/hadoop/tmp</value> </property> </configuration>
hdfs-site.xml
vim hadoop/etc/hadoop/hdfs-site.xml <configuration> <!-- 配置副本数,默认为3个,伪分布只有一个节点,因此次数设置为1 --> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- secondarynamenode守护进程的http地址:主机名和端口号,端口号默认为9868.参考守护进程布局 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop02:9868</value> </property> <!-- namenode守护进程的http地址:主机名和端口号,端口号默认为9870.参考守护进程部署 --> <property> <name>dfs.name.http-address</name> <value>hadoop01:9870</value> </property> </configuration>
hadoop-env.sh
vim hadoop/etc/hadoop/hadoop-env.sh export JAVA_HOME=/data/tools/jdk export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root
workers
vim hadoop/etc/hadoop/workers
hadoop01
hadoop02
hadoop03
将hadoop01上的hadoop及jdk文件拷贝到hadoop02和hadoop03上
scp -r jdk-11.0.20 hadoop-3.4.0 hadoop02:/data/tools/ scp -r jdk-11.0.20 hadoop-3.4.0 hadoop03:/data/tools/
然后在两台服务器上分别添加软连接
cd /data/tools ln -s hadoop-3.4.0 hadoop ln -s jdk-11.0.20 jdk
3.3 启动hdfs
由于前面做伪分布的时候已经生成了tmp文件夹,所以需要先删除这个tmp文件夹 rm -rf hadoop/tmp/
在hadoop1上格式化集群
hdfs namenode -format
在hadoop1上启动集群
start-dfs.sh
启动命令
#启动HDFS所有进程(NameNode、SecondaryNameNode、DataNode) start-dfs.sh #停止HDFS所有进程(NameNode、SecondaryNameNode、DataNode) stop-dfs.sh #hdfs --daemon start 单独启动一个进程,在哪个节点执行就在哪个服务器启动当前节点上的进程 hdfs --daemon start namenode #只启动NameNode hdfs --daemon start secondarynameNode #只启动SecondaryNameNode hdfs --daemon start datanode #只启动DataNode #hdfs --daemon stop 单独停止一个进程,在哪个节点执行就在哪个服务器停止当前节点上的进程 hdfs --daemon stop namenode #只停止NameNode hdfs --daemon stop secondarynameNode #只停止SecondaryNameNode hdfs --daemon stop datanode #只停止DataNode #hdfs --workers --daemon start 启动所有指定进程 hdfs --workers --daemon start datanode #启动所有节点上的DataNode #hdfs --workers --daemon stop 停止所有指定进程 hdfs --workers --daemon stop datanode #停止所有节点上的DataNode
查看全集群节点的进程(通过写脚本)
vim /data/test/shell/jps-cluster.sh #!/bin/bash HOSTS=( hadoop01 hadoop02 hadoop03) for HOST in ${HOSTS[*]} do echo "---------- $HOST----------" ssh -T $HOST << DELTMITER jps | grep -iv jps exit DELTMITER done
添加权限,其中"a"代表 “all”,也就是给所有用户添加可执行权限
chmod a+x jps-cluster.sh
加入系统启动目录
cp jps-cluster.sh /usr/bin/
直接执行jps-cluster.sh就可以看到全集群的进程。
4.HDFS的Shell操作
HDFS是一个分布式文件系统,我们可以使用一些命令来操作HDFS集群上的文件。如:文件上传、下载、拷贝等。
HDFS的Shell操作主命令都是hdfs dfs,其他的操作直接向后拼接即可。
创建目录
[-mkdir [-p] <path> ...] #-p多层级创建 hdfs dfs -mkdir /data hdfs dfs -mkdir -p /data/a/b
上传命令
[-put [-f] [-p] [-l] <localsrc>...<dst>] #将本地文件系统的文件上传到分布式系统 调用格式:hdfs dfs -put /本地文件、分布式文件系统路径 如: hdfs dfs -put /root/a.txt /data hdfs dfs -put /root/logs/* /data 另外还有命令copyFromLocal相当于put上传 hdfs dfs -copyFromLocal a.txt / moveFromLocal 是移动,本地文件上传后会消失 hdfs dfs -moveFromLocal a.txt /
查看命令
#查看目录里的内容 #-h大小按照M或者G为单位,-R递归则子目录, -d查看文件夹 [-ls [-d] [-h] [-R] <path> ...] 调用格式:hdfs dfs -ls / #查看文件内容 [-cat [-gnoreCrc] <src> ...] 调用格式:hdfs dfs -cat /a.txt #查看文件从前往后看 [-head <file>] 调用格式:hdfs dfs -head /a.txt #查看文件从后往前看 [-tail [-f] <file>] 调用格式:hdfs dfs -tail /a.txt
下载命令
[-get <src> <localdst>] #下载文件 hdfs dfs -get /a.log ./ #下载文件夹 ##如果dst不写是下载到当前目录下 hdfs dfs -get /test1
合并下载
[-getmerge <src> <localdst>] #将文件系统/test2/下的所有文件中的内容合并下载到本地的c.txt hdfs dfs -getmerge /test2/* c.txt
删除操作
[-rm [-r] <src>] hdfs dfs -rm /*.txt #删除文件夹需要加上-r hdfs dfs -rm -r /test1
拷贝操作
#复制命令,其中src和dst都是文件系统的位置而不是本地的 [-cp <src> <dst>] #调用:将hdfs1复制到hdfs2 hdfs dfs -cp /software/jdk-11.0.20.tar.gz /
移动操作
#移动命令,其中src和dst都是文件系统的位置而不是本地的 [-move <src> <dst>] #调用方法 将hdfs1移动到hdfs2 hdfs dfs -move /jdk-11.0.20.tar.gz /software/jdk11.tar.gz
创建空文件
[-touchz <path>]
hdfs dfs -touchz /test/b.txt
向文件中追加内容
HDFS的文件系统上的文件,不允许进行文件中的数据插入、删除、修改操作、只支持向文件的末尾追加内容
[-appendToFile <localsrc> <dst>] #调用方法,将本地的文件追加到hdfs的文件中 hdfs dfs -appendToFile /data/test/input/1.txt /test/b.txt
修改文件权限
[-chgrp [-R] GROUP PATH] [-chmod [-R] <MODE[,MODE]...| OCTALMODE> PATH...] [chown [-R] [OWNER][:GROUP]] PATH...] #修改文件权限 hdfs dfs -chmod 777 /b.txt #递归修改文件夹权限 hdfs dfs -chmod -R 777 /test #修改用户组 hdfs dfs -chown appadm /b.txt
修改文件副本数
[-setrep [-R] <rep> <path> ...] 调用格式:hdfs dfs -setrep 3 / 将hdfs根目录及子目录的内容设置为3个副本 注意:当设置的副本数与初始化默认的副本数量不一致时,集群会做出反应,比原来多了会自动进行复制。数量可以增加也可以减少 #给文件设置副本数 hdfs dfs -setrep 3 /b.txt #递归给文件夹中的所有文件设置副本数 hdfs dfs -setrep 3 /test
文件测试
hdfs dfs [generic options] -test -[ defsz ] <path> 参数说明: -e:文件是否存在,存在返回0 -z:文件是否为空,为空返回0 -d:是否是目录,是返回0 调用格式:hdfs dfs -test -d 文件 实例: hdfs dfs -test -d /test && echo "OK" || echo "NO" 解释: 测试当前内容是否为文件夹,如果是返回OK,如果不是返回NO
查看文件夹及子文件数量
hdfs dfs [generic options] -count [-q] [-h] <path>
调用格式:hdfs dfs -count /test
查看磁盘使用率及文件大小
#查看磁盘使用率,-h大小有单位 path文件夹 [-df [-h] -[s] <path>] hdfs dfs -df -h / #查看文件大小,-s求和 [-du [-h] -[s] <path>] hdfs dfs -du -h /test
文件状态查看
hdfs dfs [generic options] -stat [format] <path> ... 命令的作用:当向hdfs上写文件时,可以通过dfs.blocksize配置来设置文件的block的大小。这就导致了hdfs上的不同的文件block的大小是不同的。有时候想知道hdfs上某个文件的block大小,可以预先估算一下计算的task的个数。stat的意义:可以看文件的一些属性。 调用格式:hdfs dfs -stat [format] 文件路径 format的形式: %b:打印文件的大小(目录大小为0) %n:打印文件名 %o:打印block的size %r:打印副本数 %y:utc时间 yyyy-MM-dd HH:mm:ss %Y:打印自1970年1月1日依赖的utc的微秒数 %F:目录打印directory,文件打印regular file 例如: hdfs dfs -stat %b /test/b.txt
回收站
可以开启回收站,然后将回收站的文件找回来。core-site.xml修改完之后不用重启集群,直接生效。
开启了回收站之后,rm删除掉了文件会放在/user/root/.Trash/Current/文件夹中,其中fs.trash.checkpoint.interval设置的时间是将Current中的文件移出来到检查点文件夹中的时间。fs.trash.interval中设置的时间是检查点文件夹中删除的时间。当fs.trash.checkpoint.interval的值为0时,相当于与fs.trash.interval的值是一样的。
<!-- 设置检测点删除的时间间隔,单位是分钟,如果设置为0表示不启用回收站--> <property> <name>fs.trash.interval</name> <value>1440</value> </property> <!-- 检查点创建的时间间隔,单位是分钟 --> <!-- 这个值应该小于或者等于fs.trash.interval。如果设置为0,则会将 这个值设置为fs.trash.interval的值--> <property> <name>fs.trash.checkpoint.interval</name> <value>0</value> </property>
回收站的基本操作
#删除文件目录,删除之后会将文件于东到回收站 hdfs dfs -rm -r /test #清空回收站的数据 hdfs dfs -expunge #直接删除文件目录,不进入回收站 hdfs dfs -rm -r -skipTrash /test2 #找回文件 hdfs dfs -mv /user/root/.Trash/Current/test /test
在开启了trash后执行-rm操作会返回
2024-04-09 13:49:58,175 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop01:9820/test' to trash at: hdfs://hadoop01:9820/user/root/.Trash/Current/test
HDFS的块默认为128M,与磁盘每秒的读写速率相关,读写速率越大可以设置越大的块。
HDFS不适合小文件存储,每个块的元数据的内存占用是150B,不满128M的块也会占用这样的156B内存,一亿个块不论大小都会占用20G左右的内存。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?