Hadoop(二)

Hadoop_Day02


Hadoop的安装和搭建

1、上传解压配置环境变量

# 1、解压
tar -xvf hadoop-3.1.1.tar.gz.gz

# 2、配置环境变量
vim /etc/profile

# 3、在最后增加配置
export HADOOP_HOME=/usr/local/soft/hadoop-3.1.1
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

# 4、使环境变量剩下
source /etc/profile

2、修改配置文件

# 1、进入hadoop配置文件所在位置,修改hadoop配置文件
cd /usr/local/soft/hadoop-3.1.1/etc/hadoop

# 2、修改core-site.xml配置文件,在configuration中间增加配置
vim core-site.xml
# 增加配置
<configuration>
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://master:9000</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/usr/local/soft/hadoop-3.1.1/tmp</value>
</property>
<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>
</configuration>

# 3、修改hdfs-site.xml配置文件,在configuration中间增加配置
vim hdfs-site.xml
# 增加配置
<configuration>
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>
<property>
  <name>dfs.permissions</name>
  <value>false</value>
</property>
</configuration>

# 4、修改yarn-site.xml配置文件,在configuration中间增加配置
vim yarn-site.xml
# 增加配置
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>master</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>


> mapreduce.framework.name:用于执行MapReduce作业的运行时框架。

> mapreduce.jobhistory.address:Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,我们可以通过*mr-**jobhistory-daemon.sh start historyserver**命令来启动Hadoop历史服务器。我们可以通过Hadoop jar的命令来实现我们的程序jar包的运行,关于运行的日志,我们一般都需要通过启动一个服务来进行查看,就是我们的JobHistoryServer,我们可以启动一个进程,专门用于查看我们的任务提交的日志。mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address默认的值分别是0.0.0.0:10020和0.0.0.0:19888

vim mapred-site.xml
# 2、修改
	<property>
    	<name>mapreduce.framework.name</name>
    	<value>yarn</value>
    </property>

    <property>  
    	<name>mapreduce.jobhistory.address</name>  
    	<value>master:10020</value>  
    </property>  

    <property>  
    	<name>mapreduce.jobhistory.webapp.address</name>  
    	<value>master:19888</value>  
	</property> 



# 5、修改hadoop-env.sh配置文件
vim hadoop-env.sh
# 增加配置
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home


# 6、修改hadoop-env.sh配置文件
vim workers
# 增加配置
node1
node2

方法1:在Hadoop安装目录下找到sbin文件夹,修改里面的四个文件

1、对于start-dfs.sh和stop-dfs.sh文件,添加下列参数:

#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

2、对于start-yarn.sh和stop-yarn.sh文件,添加下列参数:

#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

方法2:修改hadoop-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

将hadoop文件夹分发到字节点中

scp -r hadoop-3.1.1 node1:`pwd`
scp -r hadoop-3.1.1 node2:`pwd`

3、初始化hdfs

# 初始化
hdfs namenode -format

4、启动hadoop

# 启动hadoop
start-all.sh

# 停止hadoop
# stop-all.sh

# hdfs web ui
http://master:9870

# yarn web ui
http://master:8088

排查问题

#  进入日志所在目录
cd /usr/local/soft/hadoop-3.1.1/logs

# 1、namenode启动失败
cat hadoop-root-namenode-master.log

# 2、resourcemanager启动失败
cat hadoop-root-resourcemanager-master.log

# 3、datanode启动失败
cat hadoop-root-datanode-master.log

格式化集群(暴力方式)

1. 关闭集群
stop-all.sh
2. 删除每个节点的hadoop根目录下的tmp目录
rm -rf tmp/
3. 重新格式化 在hadoop的bin目录下执行
hdfs namenode -format
4. 重新启动
start-all.sh

还有一个问题是3.1.1版本特有的问题

在编写mapreduce代码之后,在虚拟机中使用hadoop jar jar包名 主类名 路径1 路径2的方式执行mapreduce任务会报错

报的错误是mapred-site.xml文件中有问题

实际上是没有识别到hadoop classpath

解决方案1

使用hadoop classpath找出classpath路径,复制粘贴到yarn-site.xml中,键值对的键是yarn.application.classpath,值就是之前复制粘贴的那个

解决方案2

在环境变量中添加

export HADOOP_CLASSPATH = `hadoop classpath` 

Hadoop中常见的shell命令

Hadoop中的常见的shell命令

1、如何将linux本地的数据上传到HDFS中呢?
hadoop fs -put 本地的文件 HDFS中的目录
hdfs dfs -put 本地的文件 HDFS中的目录

2、如何创建HDFS中的文件夹呢?
需求:想创建/shujia/bigdata17
hadoop fs -mkdir /shujia/bigdata17
hdfs dfs -mkdir /shujia/bigdata17

3、查看当前HDFS目录下的文件和文件夹
hadoop fs -ls /shujia/bigdata17
hdfs dfs -ls /shujia/bigdata17

4、将HDFS的文件下载到Linux本地中
hadoop fs -get HDFS中的文件目录 本地要存放文件的目录
hdfs dfs -get HDFS中的文件目录 本地要存放文件的目录

5、删除命令(如果垃圾回收站大小小于被删除文件的大小,直接被删除,不经过回收站)
hadoop fs -rm ....  # 仅删除文件
hadoop fs -rmr .... # 删除文件夹

6、移动文件
hadoop fs -mv 目标文件  目的地路径

7、HDFS内部复制文件
hadoop fs -cp [-p] ... ... # 如果想复制文件夹,加上-p参数

Namenode的作用

  • 记录元数据信息

    • 文件的归属(所属者,所属组)

    • 文件的权限(r-w-x)

    • 文件的大小

    • 文件的上一次修改时间

    • 文件与bolck块与每个block块在哪一个DataNode上三者之间的映射

      注:block块信息不会持久化存储在NN中,每个block块与DN之间的关系是集群启动之后子节点向主节点汇报生成的,DN不只是向NN汇报自身存放哪些block块信息,而且会向NN汇报自身的健康状况(CPU,内存,磁盘)

  • NameNode会经常接受client客户发送过来的请求

  • namenode和datenode之间会保持心跳机制(ping-pang),三秒钟之内没有应答就说明DN出现异常了,10分钟内没有应答就说明NN宕机了

namenode是完全基于内存的,执行速度快,不会与磁盘进行任何的数据交换,但会存在两个问题一个是数据的持久化,一个是数据保存在内存中断电丢失问题


DateNode的作用

  • 数据会存放在硬盘上,存放文件的数据信息(block块),以及验证文件完整性的校验信息(.meta文件)
  • 汇报
    • 启动时
      • 汇报健康状态
    • 运行中
      • 向NN保持心跳机制
  • 当客户端读写数据的时候,首先会先去NN查询file与block与DN的映射,然后客户端直接与DN建立连接,然后读写数据

为什么Hadoop不适合存储小文件

  • 元数据管理开销:在Hadoop中,Namenode负责管理整个文件系统的元数据。对于每个文件和目录,都需要在Namenode中维护一条记录,包括文件名、权限、块信息等。当存储大量小文件时,这会导致元数据管理的开销非常大,占用过多的内存和计算资源。

  • 传输的开销:由于小文件数量众多,读取和传输大量小文件时,会增加网络传输的开销和I/O操作的次数,影响整体性能。

  • 作业调度和处理效率:Hadoop的调度器通常将一个作业划分为多个任务(task),每个任务处理一个数据块。当处理大量小文件时,每个小文件都需要被单独处理,这会导致任务的调度和切换开销过大,降低了作业执行的效率。


传统的内存持久化方案

  • 日志机制:

    • 优点:绝对不会丢失数据

    • 缺点:

      • 有可能日志中存在大量的无效日志
      • log日志文件的大小不可控,随着时间的发展,集群启动的时间会越来越长
  • 拍摄快照(将内存中的数据写入到磁盘中——序列化,将磁盘的内容写回到内存中——反序列化):

    • 缺点:

      • 关机时间过长
      • 如果是异常关机,数据还在内存中,没法写入到硬盘
      • 如果写出的频率过高,导致内存使用效率低
    • 优点:

      • 启动时间较短

SecondaryNameNode对于内存数据持久化存储的解决方案

在Hadoop集群打开之后我们可以在hadoop的安装目录下的tmp/dfs/name/current下找到如下文件

在这里插入图片描述

  • 刚开始的时候namenode中会有两个文件一个是edits_inprogress_1,一个是fsimage_0,刚开始的时候edits_inprogress_1经过100次操作变成edits_inprogress_1-100,之后将edits_inprogress_1-100和fsimage_0同步一份给到secondarynamenode上去进行合并,生成fsimage_100同步回来

  • 下次合并的阈值是edits_inprogress文件达到64M(老版是edits_inporgess文件达到64M,新版是100 0000 次操作)或者1h之后,重复上述步骤

    注:最多只保留最近的两个fsimage文件

    出发Checkpoint的域值是根据具体的Hadoop集群配置和需求而定,没有固定的默认值。

    在Hadoop中,Checkpoint是用于备份和恢复NameNode元数据的机制。当满足一定条件时,例如编辑日志文件数量达到一定阈值、时间间隔超过一定时间等,系统会触发Checkpoint操作来创建一个新的checkpoint,并将current编辑日志文件转移到归档目录中。

    Checkpoint的频率和阈值可以通过Hadoop的配置参数进行调整。具体而言,以下两个参数可以影响Checkpoint的触发:

    1. dfs.namenode.checkpoint.period 该参数指定了两次Checkpoint之间的最小时间间隔,默认为1小时。你可以根据自己的需求调整该值,以控制Checkpoint的触发频率。
    2. dfs.namenode.checkpoint.txns 该参数指定了在达到多少个新的编辑日志事务(transactions)时触发Checkpoint,默认为1000000。你可以根据集群的负载和资源使用情况,调整该值来平衡Checkpoint操作的影响。

    请注意,在调整这些参数之前,建议先了解当前集群的性能和资源使用情况,以及对数据一致性和故障恢复的要求。同时,更改这些参数可能会对集群的性能和容错能力产生影响,需要谨慎评估和测试。

    最佳的Checkpoint配置参数值是依据实际需求和环境进行调优。如果你想了解在你的特定环境中应该使用的合适值,建议参考Hadoop官方文档或向Hadoop社区寻求帮助。


安全模式相关命令

hadoop dfsadmin -safemode leave 强制 NameNode 退出安全模式
hadoop dfsadmin -safemode enter 进入安全模式
hadoop dfsadmin -safemode get 查看安全模式状态
hadoop dfsadmin -safemode wait 等待一直到安全模式结束


机架感知节点选择

第一个节点:
集群内部(优先考虑和客户端相同的节点作为第一个节点)
集群外部(选择资源丰富且不繁忙的节点作为第一个节点)
第二个节点:
第二个节点选择与第一个节点不同机架的其他节点
第三个节点:
与第二个相同机架相同的其他节点
第N个节点:
与前面节点不重复的其他节点

以下是两种机架感知模式

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值