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左右的内存。

 

posted @   潇潇暮鱼鱼  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示