Hadoop重要知识盘点

1. Hadoop介绍

官网hadoop.apache.org

广义: 以Apache hadoop软件为主的生态圈,包含 hive sqoop hbase kafka spark flink等。
狭义: Apache hadoop软件,包括HDFS、MapReduce、Yarn三大组件。

关于版本
APACHE版本有 2.x 和 3.x,但是生产上很少用apache版本的hadoop,其缺点不做赘述。
生产上至今企业还是以 CDH 5.x 为主 (cloudera公司),如:hadoop-2.6.0-cdh5.16.2.tar.gz
其版本号是以 hadoop2.6.0 为基础,通过不断打补丁,改名为 hadoop-2.6.0-cdh5.16.2,其hadoop的相关特性不输于Apache hadoop的 2.7、2.8……

2. HDFS安装、配置的注意点

2.1 JDK

注意JDK的版本:(严格按照官网推荐)
Apache:
https://cwiki.apache.org/confluence/display/HADOOP2/HadoopJavaVersions
CDH:
https://docs.cloudera.com/documentation/enterprise/release-notes/topics/rn_consolidated_pcm.html#pcm_jdk

2.2 hadoop解压和软连接

解压不多说,主要看软连接。
软连接的作用

  1. 便于版本切换
    如:ln -s /home/hadoop/app/hadoop-2.6.0-cdh5.15.2 /home/hadoop/app/hadoop
    此时,若要版本升级到hadoop-2.6.0-cdh5.16.2,只需要删除之前的软连接,重新创建新的软连接即可。代码脚本中还是使用hadoop,不必关心版本多少。

  2. 小盘换大盘
    如:某个磁盘空间不足了,可以将磁盘内容mv到大的磁盘,然后在原磁盘的位置创建一个软连接,这样,每次访问这个路径时linux会自动跳转到新磁盘中去。

2.3 hadoop的3种模式

Local (Standalone) Mode 本地模式
Pseudo-Distributed Mode 伪分布式模式
Fully-Distributed Mode 分布式模式,集群

注意:学习使用中伪分布式完全够用,一般不会用到本地模式。

2.4 HDFS配置文件(伪分布式)

NameNode启动以master名称启动
etc/hadoop/core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/tmp/</value> //一定要改,默认在/tmp目录下,会30天自动删除。
    </property>
</configuration>

SecondNameNode启动以master名称启动
etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>  //配置数据副本数,伪分布式设为1
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master:9868</value>
    </property>

    <property>
        <name>dfs.namenode.secondary.https-address</name>
        <value>master:9869</value>
    </property>
</configuration>

DataNode启动以master名称启动

[hadoop@master hadoop]$ vi slaves 
master
2.4 HDFS格式化

注意:格式化自己的编码存储格式,只需第一次格式化即可。后面启动HDFS都无需格式化,除非想抹杀所有HDFS数据,重建集群。

[hadoop@master hadoop]$ bin/hdfs namenode -format
2.5 HDFS启动

jps查看会有3个重要进程。

[hadoop@master hadoop]$ bin/start-dfs.sh
[hadoop@master hadoop]$ jps
21712 DataNode   
21585 NameNode   
21871 SecondaryNameNode 
21999 Jps

并可以登录web UI查看HDFS状态,端口:50070

3. Yarn配置(伪分布式)

etc/hadoop/mapred-site.xml:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

etc/hadoop/yarn-site.xml:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:28088</value> //最好不默认端口(8088),容易被入侵 
    </property>
</configuration>
3.1 Yarn启动
[hadoop@master hadoop]$ bin/start-dfs.sh
[hadoop@master hadoop]$ jps
21712 DataNode
21585 NameNode
23989 ResourceManager
29877 Jps
24094 NodeManager
21871 SecondaryNameNode

启动后登录web UI查看Yarn状态,端口:28088
如:http://192.168.136.100:28088/cluster

4. jps的使用

linux的ps命令查看进程号,同理,jps主要是查看java进程的命令工具。
常用的jps命令有:

jps -l:输出完全的包名,应用主类名,jar的完全路径名
jps -m:输出传入 main 方法的参数
4.1 位置

[hadoop@master hadoop]$ which jps
/usr/java/jdk1.8.0_181/bin/jps

4.2 用户对应的进程标识文件存储在哪

当前用户的所有进程都会存在这个路径下:
/tmp/hsperfdata_hadoop

4.3 注意点

当jps出现:-- process information unavailable
不能代表进程是存在 或者 不存在,可能是用户没切换等多种原因
要用 ps -ef | grep xxx 命令才是查看进程的真正手段!!!

5. hadoop的pid文件

5.1 存储位置

前文已说了hadoop.tmp.dir的目录默认在/tmp目录下,这个目录就是存储hadoop的pid文件路径。

[root@master tmp]# ll
total 20
-rw-rw-r-- 1 hadoop hadoop   4 May  9 22:16 hadoop-hadoop-datanode.pid
-rw-rw-r-- 1 hadoop hadoop   4 May  9 22:16 hadoop-hadoop-namenode.pid
-rw-rw-r-- 1 hadoop hadoop   5 May  9 22:16 hadoop-hadoop-secondarynamenode.pid
5.2 维护进程的pid是写死的

打开这些pid文件,里面全是pid号。

[root@master tmp]# cat hadoop-hadoop-namenode.pid
792
5.3 若pid文件被删除,影响进程的重启!!

进程启动,pid文件写入进程的pid数字。
进程关闭时,从pid文件读出pid数字,然后kill -9 pid。

5.4 生产上pid文件真的可以放心的丢在/tmp维护吗?

Linux的/tmp 会有30天的默认删除机制,所以用户配置时需要另外指定路径。
修改 bin/hadoop-env.sh 脚本中的 hadoop.tmp.dir 参数即可。

总结:pid文件生产不要丢在/tmp目录
要知道是影响进程的启动停止

6. hadoop的小文件问题

危害:HDFS的文件都需要NameNode维护,小文件过多,会增大NameNode压力,小文件超过一定范围会大幅降低HDFS的响应能力,所以生产上需要谨慎处理小文件问题。
处理方法

  1. 在小文件接入到HDFS之前,尽量合并小文件。
  2. 小文件已经在HDFS上,这时候可以将过期的离线冷数据做合并操作,可以按天按月处理等。

7. HDFS架构

HDFS采用的是主从架构

namenode

  1. 管理文件系统的命名空间 ,其实就是维护文件系统树的文件和文件夹
  2. 这些形式是以两种文件来永久的保存在本地磁盘的
  3. 镜像文件 fsimage
  4. 编辑日志文件 editlogs

secondary namenode
fsimage editlog定期拿过来合并、备份、推送.
说明:虽然能够减轻单点故障带来的丢失风险,但是在生产上还是不允许使用snn,因为是定时备份,一旦namenode宕机总会丢失部分数据。

datanode
存储数据块和数据块的校验和。

重要参数:

dfs.heartbeat.interval  3s  //每隔3s发送心跳给nn,告诉 我还活着
dfs.blockreport.intervalMsec   21600000ms=6小时   //每隔一定的时间发生一次blockreport
dfs.datanode.directoryscan.interval  21600s=6小时

8. HDFS读写流程

8.1 写流程

对用户操作是无感知的
1.HDFS Client调用FileSystem.create(filePath)方法,去和NN进行【RPC】通信!
NN 会去check这个路径的文件是否已经存在,是否有权限能够创建这个文件!
假如都ok,就去创建一个新的文件,但是这时还没写数据,是不关联任何的block。
nn根据上传的文件大小,根据块大小+副本数参数,
计算要上传多少块和块存储在DN的位置。最终将这些信息返回给客户端,
2.Client调用【FSDataOutputStream】对象的write方法,
将第一个块的第一个副本数写第一个DN节点,
写完去第二个副本写DN2;写完去第三个副本写DN3。
当第三个副本写完,就返回一个ack packet确定包给DN2节点,
当DN2节点收到这个ack packet确定包加上自己也是写完了,就返回一个ack packet确定包给
第一个DN1节点,当DN1节点收到这个ack packet确定包加上自己也是写完了,
将ack packet确定包返回给【FSDataOutputStream】对象,就标识第一个块的三个副本写完。,
其他块以此类推!
3.当所有的块全部写完, client调用 【FSDataOutputStream】对象的close方法,
关闭输出流。再次调用FileSystem.complete方法,告诉nn文件写成功!

8.2 读流程

对用户操作是无感知的
1.Client调用FileSystem的open(filePath),
与NN进行RPC通信,返回该文件的部分或者全部的block列表
也就是返回【FSDataInputStream】对象。
2.Client调用【FSDataInputStream】对象的read方法,
去与第一个块的最近的DN进行读取,读取完成后,会check,假如ok,就关闭与DN通信。
假如读取失败,会记录DN+block信息,下次就不会从这个节点读取。那么就从第二个节点读取。
然后去与第二个块的最近的DN进行读取,以此类推。
假如当block列表全部读取完成,文件还没读取结束,就调用FileSystem从nn获取下一批次的block列表。
3.Client调用【FSDataInputStream】对象close方法,关闭输入流。

9. HDFS命令

HDFS命令同Linux命令有很大相似之处,基本用法一致。下面只列出几个常用且重要的命令:

9.1 查看ls

hadoop fs -ls / 与 hdfs dfs -ls /
这两个命令都是查看指定目录内容,作用一样,因为底层都是调用的同一个类:CLASS=org.apache.hadoop.fs.FsShell

9.2 上传下载

-get 与 -copyToLocal 作用相同,下载
-put 与 -copyFromLocal 作用相同,上传

9.3 删除
-rm [-f] [-r|-R] [-skipTrash] <src> ...]
<property>
      <name>fs.trash.interval</name>
      <value>10080</value>   //7天,单位分钟
</property>

注意生产上:
1.开启回收站!回收站的有效期至少7天!!
2.删除时慎用-skipTrash,一般不要加!!!
3.回收站只针对命令行删除有效,对于代码开发中的删除不适用,会直接删除,除非加入回收站代码。

9.4 检查是否支持压缩
[hadoop@master hadoop]$ hadoop checknative
20/05/12 21:53:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop:  false 
zlib:    false 
snappy:  false 
lz4:     false 
bzip2:   false 
openssl: false 
20/05/12 21:53:26 INFO util.ExitUtil: Exiting with status 1

可以看出,默认所有压缩格式都不支持,需要下载源码,自己编译后就支持了。

9.5 HDFS安全模式

HDFS进入安全模式后数据是可读不可写!

hdfs dfsadmin [-safemode <enter | leave | get | wait>]
hdfs dfsadmin -safemode enter
hdfs dfsadmin -safemode leave
9.6 HDFS的数据平衡

9.6.1 这里的数据平衡主要指datanode之间的数据平衡

[hadoop@master sbin]$ ./start-balancer.sh
默认是10  threshold = 10.0

[hadoop@master sbin]$ ./start-balancer.sh -threshold 10.0

注意生产上:
1.尽量每天定时去做数据均衡,不要到最后去做。
2.调整数据平衡时的网络带宽:
hdfs-site.xml文件
dfs.datanode.balance.bandwidthPerSec 10m–>50m

9.6.2 单个DN的多块磁盘的数据均衡
如在配置datanode数据目录时,配置了多块磁盘,(思考:为什么要配置多块磁盘?)

<property>
      <name>dfs.datanode.data.dir</name>
      <value>/data01,/data02,/data03</value>
</property>

因为多个磁盘之间的 IO 关系是叠加的,这样HDFS写入和读取的速度瓶颈得到极大提升。
若要启动多磁盘数据之间的自动均衡,需要启动一个参数:dfs.disk.balancer.enabled
hadoop-2.6.0-cdh5.16.2 中此参数是false,需要手动开启
apache hadoop 3.x 中此参数是true
apache hadoop 2.10 找不到此参数

<property>
      <name>dfs.disk.balancer.enabled</name>
      <value>true</value>
</property>

单节点的磁盘平衡的使用步骤:

1.hdfs diskbalancer -plan master   //生成 master.plan.json 文件
2.hdfs diskbalancer -execute master.plan.json  //执行
3.hdfs diskbalancer -query master
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值