1. Hadoop介绍
广义: 以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解压和软连接
解压不多说,主要看软连接。
软连接的作用:
-
便于版本切换
如:ln -s /home/hadoop/app/hadoop-2.6.0-cdh5.15.2 /home/hadoop/app/hadoop
此时,若要版本升级到hadoop-2.6.0-cdh5.16.2,只需要删除之前的软连接,重新创建新的软连接即可。代码脚本中还是使用hadoop,不必关心版本多少。 -
小盘换大盘
如:某个磁盘空间不足了,可以将磁盘内容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的响应能力,所以生产上需要谨慎处理小文件问题。
处理方法:
- 在小文件接入到HDFS之前,尽量合并小文件。
- 小文件已经在HDFS上,这时候可以将过期的离线冷数据做合并操作,可以按天按月处理等。
7. HDFS架构
HDFS采用的是主从架构。
namenode:
- 管理文件系统的命名空间 ,其实就是维护文件系统树的文件和文件夹
- 这些形式是以两种文件来永久的保存在本地磁盘的
- 镜像文件 fsimage
- 编辑日志文件 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