大数据高频面试题——hadoop详解

1.2 Hadoop

1.2.1 Hadoop常用端口号

在这里插入图片描述
8020 内部通信端口 内置的
9870 web端端口 可以修改的 一般端口为9870
在这里插入图片描述
19888 mapred-site.xml
在这里插入图片描述

1.2.2 Hadoop配置文件以及简单的Hadoop集群搭建

(1)配置文件:
Hadoop2.x core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml slaves
Hadoop3.x core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml workers
(2)简单的集群搭建过程:
在这里插入图片描述
配置集群
workers: datanode的节点地址
core-site.xml:

<configuration>
   <!-- 指定namenode位置  默认是 file:/// wcount 后的2个位置是 从这里决定的
   请根据实际情况替换hadoop102-->
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:8020</value>
      </property>

    <!--定义nn 和 dn 2nn 的存储位置 它是和hdfs-site 联系起来决定的   -->
      <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
      </property>

  <!-- 代理配置  hive中jdbc端使用  如果不设置 会出现 非当前用户 以当前用户操作 hdfs上的文件
              配置之后   用户通过jdbc使用   在hdfs上也是以对应用户进行操作的
  -->
      <property>
        <name>hadoop.proxyuser.atguigu.hosts</name>
        <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.atguigu.groups</name>
        <value>*</value>
      </property>
	  
	<!-- 指定web端操作的用户 如果不是的话    会报一个错
Permission denied: user=dr.who, access=WRITE, inode="/":atguigu:supergroup:drwxr-xr-x
-->  
      <property>
        <name>hadoop.http.staticuser.user</name>
        <value>atguigu</value>
      </property>
	  
	<!-- 配置hadoop支持什么压缩  默认是空
      lzop 是  支持切片的压缩
 -->
      <property>
        <name>io.compression.codecs</name>
        <value>
            org.apache.hadoop.io.compress.GzipCodec,
            org.apache.hadoop.io.compress.DefaultCodec,
            org.apache.hadoop.io.compress.BZip2Codec,
            org.apache.hadoop.io.compress.SnappyCodec,
            com.hadoop.compression.lzo.LzoCodec,
            com.hadoop.compression.lzo.LzopCodec
        </value>
    </property>
<!-- lzo去读的  不是hadoop去读的
 -->
    <property>
        <name>io.compression.codec.lzo.class</name>
        <value>com.hadoop.compression.lzo.LzoCodec</value>
    </property>  
	  
</configuration>

hdfs-site.xml :

<configuration>
   <!-- 指定2nn的位置 --> 
   	 <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:9868</value>
     </property>
     <!--  其他可以修改的部分
 		dfs.blocksize = 134217728  块大小
 		dfs.replication = 3  副本数
 		dfs.namenode.name.dir = file://${hadoop.tmp.dir}/dfs/name  NameNode存储位置
 		dfs.datanode.data.dir = file://${hadoop.tmp.dir}/dfs/data  DataNode存储位置
 		dfs.namenode.checkpoint.dir = file://${hadoop.tmp.dir}/dfs/namesecondary 2NN存储位置
     -->
        <!-- 白名单 服役新节点时使用--> 
    <property>
  <name>dfs.hosts</name>
  <value></value>
  <description>Names a file that contains a list of hosts that are
  permitted to connect to the namenode. The full pathname of the file
  must be specified.  If the value is empty, all hosts are
  permitted.</description>
</property>
        <!-- 黑名单 退役节点时使用--> 
<property>
  <name>dfs.hosts.exclude</name>
  <value></value>
  <description>Names a file that contains a list of hosts that are
  not permitted to connect to the namenode.  The full pathname of the
  file must be specified.  If the value is empty, no hosts are
  excluded.</description>
</property> 
</configuration>

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
     <!-- shuffle的方式 -->
 	<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
     <!-- 指定Resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
    </property>
        <!-- 环境变量的继承 -->
    <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>

    <!-- 给每个container分配的最小资源 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>

    <!-- 给每个container分配的最大资源-->
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
    </property>

    <!-- nodemanager将多少内存交给resourcemanager进行分配 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
	
	    <!-- 开启日志聚集   mapreduce 可能在不同节点上 需要把它们的日志聚集起来  -->  
  <property>
          <name>yarn.log-aggregation-enable</name>
          <value>true</value>
  </property>
  <!-- 日志访问路径 -->
      <property>  
          <name>yarn.log.server.url</name>  
          <value>http://hadoop102:19888/jobhistory/logs</value>  
  </property> 
  <!-- 日志保存时间   默认7天-->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
  </property>
  
          <!-- 虚拟内存检查  否则container需要的资源超过其分配的资源 会报错
         2.4 GB of 2.1 GB virtual memory used. Killing container.
 -->
       <property>
      <name>yarn.nodemanager.vmem-check-enabled</name>
      <value>false</value>
       </property>    

       <!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认
是 true -->
<property>
 <name>yarn.nodemanager.pmem-check-enabled</name>
 <value>false</value>
</property>

	
</configuration>

mapred-site.xml :

<configuration>
    <!-- 指定mapreduce程序运行在yarn -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>	
	     <!-- 历史服务器端地址-服务器上的网端 -->
	<property>
	    <name>mapreduce.jobhistory.address</name>
	    <value>hadoop102:10020</value>
	</property>
	<!-- 历史服务器web端地址 -->
	<property>
	    <name>mapreduce.jobhistory.webapp.address</name>
	    <value>hadoop102:19888</value>
	</property>
</configuration>

集群第一次启动: 格式化namenode
注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据
bin/hdfs namenode -format

群起
sbin/start-dfs.sh 在namenode节点
sbin/start-yarn.sh 在rm节点上

注意配置集群ssh免密登录

1.2.3 HDFS读流程和写流程

写数据:
在这里插入图片描述
1:
在这里插入图片描述
2:
在这里插入图片描述
3:
在这里插入图片描述
4:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

读数据:
在这里插入图片描述

1.2.4 HDFS小文件处理

1)会有什么影响
(1)1个文件块,占用namenode多大内存150字节
128G能存储多少文件块? 128 * 102410241024byte/150字节 = 9亿文件块
在这里插入图片描述

2)怎么解决
1)小文件优化的方向:
(1)在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
(2)在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并
(3)在MapReduce处理时,可采用CombineTextInputFormat提高效率。
(4)开启uber模式,实现jvm重用

  1. Hadoop Archive
    是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件,从而达到减少NameNode的内存使用
  2. SequenceFile
    SequenceFile是由一系列的二进制k/v组成,如果为key为文件名,value为文件内容,可将大批小文件合并成一个大文件
  3. CombineTextInputFormat
    CombineTextInputFormat用于将多个小文件在切片过程中(MR)生成一个单独的切片或者少量的切片。
  4. 开启uber模式,实现jvm重用。默认情况下,每个Task任务都需要启动一个jvm来运行,如果Task任务计算的数据量很小,我们可以让同一个Job的多个Task运行在一个Jvm中,不必为每个Task都开启一个Jvm.
    开启uber模式,在mapred-site.xml中添加如下配置
<!--  开启uber模式  通过-D 动态修改 -->   
<property>
  <name>mapreduce.job.ubertask.enable</name>
  <value>true</value>
</property>
<!-- uber模式中最大的mapTask数量,可向下修改  --> 
<property>
  <name>mapreduce.job.ubertask.maxmaps</name>
  <value>9</value>
</property>
<!-- uber模式中最大的reduce数量,可向下修改 -->
<property>
  <name>mapreduce.job.ubertask.maxreduces</name>
  <value>1</value>
</property>
<!-- uber模式中最大的输入数据量,默认使用dfs.blocksize 的值,可向下修改 -->
<property>
  <name>mapreduce.job.ubertask.maxbytes</name>
  <value></value>
</property>

1.2.5 Shuffle及优化

1、Shuffle过程 图
在这里插入图片描述
2、优化
1)Map阶段
(1)增大环形缓冲区大小。由100m扩大到200m
(2)增大环形缓冲区溢写的比例。由80%扩大到90% 减少溢写的次数
在这里插入图片描述

(3)减少对溢写文件的merge次数。(10个文件,一次20个merge)在这里插入图片描述

(4)不影响实际业务的前提下,采用Combiner提前合并,减少 I/O。

2)Reduce阶段
(1)合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间太多,会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。
(2)设置Map、Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间。
(3)规避使用Reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。
(4)增加每个Reduce去Map中拿数据的并行数
(5)集群性能可以的前提下,增大Reduce端存储数据内存的大小。
在这里插入图片描述

3)IO传输
采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZOP压缩编码器。
压缩:
(1)map输入端主要考虑数据量大小和切片,支持切片的有Bzip2、LZO。注意:LZO要想支持切片必须创建索引;
(2)map输出端主要考虑速度,速度快的snappy、LZO;
(3)reduce输出端主要看具体需求,例如作为下一个mr输入需要考虑切片;永久保存考虑压缩率比较大的gzip。

4)整体
(1)NodeManager默认内存8G,需要根据服务器实际配置灵活调整,例如128G内存,配置为100G内存左右,yarn.nodemanager.resource.memory-mb

(2)单任务默认内存8G,需要根据该任务的数据量灵活调整,例如128m数据,配置1G内存,yarn.scheduler.maximum-allocation-mb
(3)mapreduce.map.memory.mb :控制分配给MapTask内存上限,如果超过会kill掉进程(报:Container is running beyond physical memory limits. Current usage:565MB of512MB physical memory used;Killing Container)。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加MapTask内存,最大可以增加到4-5g
(4)mapreduce.reduce.memory.mb:控制分配给ReduceTask内存上限。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加ReduceTask内存大小为4-5g。
(5)mapreduce.map.java.opts:控制MapTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)
(6)mapreduce.reduce.java.opts:控制ReduceTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError)
(7)可以增加MapTask的CPU核数,增加ReduceTask的CPU核数 mapreduce.map.cpu.vcores mapreduce.reduce.cpu.vcores
(8)增加每个Container的CPU核数和内存大小 yarn.scheduler.minimum-allocation-vcores 必须启动前配置
(9)在hdfs-site.xml文件中配置多目录(多磁盘)datanode多磁盘
(10)NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。dfs.namenode.handler.count=,,比如集群规模为8台时,此参数设置为41。可通过简单的python代码计算该值,代码如下。

[atguigu@hadoop102 ~]$ python
>>> import math
>>> print int(20*math.log(8))
41
>>> quit()

在这里插入图片描述
在这里插入图片描述

1.2.6 Yarn工作机制

在这里插入图片描述

1.2.7 Yarn调度器

1)Hadoop调度器重要分为三类:
FIFO(最初的 队列) 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。
Apache默认的资源调度器是容量调度器;
CDH默认的资源调度器是公平调度器。、

2)区别:
FIFO调度器:支持单队列 、先进先出 生产环境不会用。
容量调度器:支持多队列(每个队列先进先出),保证先进入的任务优先执行。
公平调度器:支持多队列多并发,保证每个任务公平享有队列资源。

3)在生产环境下怎么选择?
大厂:如果对并发度要求比较高,选择公平,要求服务器性能必须OK;
中小公司,集群服务器资源不太充裕选择容量。

4)在生产环境怎么创建队列?
(1)调度器默认就1个default队列,不能满足生产要求。
(2)按照框架:hive /spark/ flink 每个框架的任务放入指定的队列(企业用的不是特别多)
(3)按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2

5)创建多队列的好处?
(1)因为担心员工不小心,写递归死循环代码,把所有资源全部耗尽。
(2)实现任务的降级使用,特殊时期保证重要的任务队列资源充足。
业务部门1(重要)=》业务部门2(比较重要)=》下单(一般)=》购物车(一般)=》登录注册(次要)

在这里插入图片描述
在这里插入图片描述

公平调度器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.8 项目经验之基准测试

搭建完Hadoop集群后需要对HDFS读写性能和MR计算能力测试。测试jar包在hadoop的share文件夹下。

1) 测试HDFS写性能
1) 测试HDFS写性能
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB

2)测试HDFS读性能
在这里插入图片描述
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB

3)使用Sort程序评测MapReduce
在这里插入图片描述

1.2.9 Hadoop宕机

1)如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)
2)如果写入文件过快造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。例如,可以调整Flume每批次拉取数据量的大小参数batchsize。

1.2.10 Hadoop解决数据倾斜方法

1)提前在map进行combine,减少传输的数据量
在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。
如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了。

2)导致数据倾斜的key 大量分布在不同的mapper
(1)局部聚合加全局聚合。
第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。
第二次mapreduce,去掉key的随机前缀,进行全局聚合。
思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。
这个方法进行两次mapreduce,性能稍差。
(2)增加Reducer,提升并行度
JobConf.setNumReduceTasks(int)
(3)实现自定义分区
根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer

1.2.11 集群资源分配参数(项目中遇到的问题)

集群有30台机器,跑MR任务的时候发现5个map任务全都分配到了同一台机器上,这个可能是由于什么原因导致的吗?
解决方案:yarn.scheduler.fair.assignmultiple 这个参数,默认是开的。
https://blog.csdn.net/leone911/article/details/51605172

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值