前言
学习大数据开发,不免要接触大数据生态圈中的各种组件,今天就让我们从基本的组件——HADOOP(apache旗下的一套开源软件平台)说起,来展开之后一系列的大数据相关组件的学习。
HADOOP组件介绍
HADOOP的核心组件有:
HDFS(分布式文件系统)
YARN(运算资源调度系统)
MAPREDUCE(分布式运算编程框架)
HADOOP集群搭建
从HADOOP的组件,我们可以看出,HADOOP集群应该是有两个集群的(hdfs集群,yarn集群),hdfs集群负责海量数据的存储,集群中的角色主要有 NameNode / DataNode;yarn集群是负责海量数据运算时资源的调度(集群中的角色主要有 ResourceManager /NodeManager)。
首先呢,要从官网下载Hadoop安装包HADOOP包,下载后解压:
tar -zxvf hadoop-2.6.5.tar.gz
然后修改配置文件,在 $HADOOP_HOME/etc/hadoop/目录下面修改 hadoop-env.sh,yarn-env.sh这两个文件(把自己的JDK路径加进去)
vi hadoop-env.sh ,vi yarn-env.sh
export JAVA_HOME=/usr/local/src/jdk1.8.0_152(自己JDK的路径)
vi slaves
slave1
slave2
vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name><!-- 默认的文件系统-->
<value>hdfs://master:9000</value><!--- master是主节点的主机名称,端口是9000-->
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/src/hadoop-2.8.2/tmp/</value><!--临时文件存放目录,tmp文件夹需要自己创建(在$HADOOP_HOME目录下面)-->
</property>
</configuration>
vi hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value><!-- HDFS文件系统NameNode所在的位置-->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/src/hadoop-2.8.2/dfs/name</value><!---NameNode的工作目录,$HADOOP_HOME/dfs/name需要创建-->
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/src/hadoop-2.8.2/dfs/data</value><!---DataNode的工作目录,$HADOOP_HOME/dfs/data需要创建-->
</property>
<property>
<name>dfs.replication</name><!--副本数量-->
<value>2</value>
</property>
</configuration>
vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name><!--MapReduce计算框架所运行的地方 yarn上-->
<value>yarn</value>
</property>
</configuration>
vi yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value><!--启用的资源调度器主类-->
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value><!--ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等-->
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value><!--ResourceManager 对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等-->
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8035</value><!--ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等。-->
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value><!--ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等。--->
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value><!--ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。-->
</property>
<!-- 关闭虚拟内存检查-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
配置环境变量(在主从节点上都操作哦)
vi ~/.bashrc
export HADOOP_HOME=/usr/local/src/hadoop-2.6.5(HADOOP路径)
export PATH=$PATH:$HADOOP_HOME/bin
刷新环境变量(每个节点)
source ~/.bashrc
拷贝安装包(在master上执行,)
scp -r /usr/local/src/hadoop-2.6.5 root@slave1:/usr/local/src/hadoop-2.6.5(路径改成自己的即可)
scp -r /usr/local/src/hadoop-2.6.5 root@slave2:/usr/local/src/hadoop-2.6.5
启动集群
在master上
hadoop namenode -format
./sbin/start-all.sh
然后用jps查看进程状态
master上:NameNode、ResourceManager SecondaryNameNode
slave上:NodeManager、ResourceManager
对HDFS文件系统的操作
-help
功能:输出这个命令参数手册
-ls
功能:显示目录信息
示例: hadoop fs -ls hdfs://hadoop-server01:9000/
备注:这些参数中,所有的hdfs路径都可以简写
-->hadoop fs -ls / 等同于上一条命令的效果
-mkdir
功能:在hdfs上创建目录
示例:hadoop fs -mkdir -p /aaa/bbb/cc/dd
-moveFromLocal
功能:从本地剪切粘贴到hdfs
示例:hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd
-moveToLocal
功能:从hdfs剪切粘贴到本地
示例:hadoop fs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt
--appendToFile
功能:追加一个文件到已经存在的文件末尾
示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt
可以简写为:
Hadoop fs -appendToFile ./hello.txt /hello.txt
-cat
功能:显示文件内容
示例:hadoop fs -cat /hello.txt
-tail
功能:显示一个文件的末尾
示例:hadoop fs -tail /weblog/access_log.1
-text
功能:以字符形式打印一个文件的内容
示例:hadoop fs -text /weblog/access_log.1
-chgrp
-chmod
-chown
功能:linux文件系统中的用法一样,对文件所属权限
示例:
hadoop fs -chmod 666 /hello.txt
hadoop fs -chown someuser:somegrp /hello.txt
-copyFromLocal
功能:从本地文件系统中拷贝文件到hdfs路径去
示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
-copyToLocal
功能:从hdfs拷贝到本地
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
-cp
功能:从hdfs的一个路径拷贝hdfs的另一个路径
示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-mv
功能:在hdfs目录中移动文件
示例: hadoop fs -mv /aaa/jdk.tar.gz /
-get
功能:等同于copyToLocal,就是从hdfs下载文件到本地
示例:hadoop fs -get /aaa/jdk.tar.gz
-getmerge
功能:合并下载多个文件
示例:比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
hadoop fs -getmerge /aaa/log.* ./log.sum
-put
功能:等同于copyFromLocal
示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-rm
功能:删除文件或文件夹
示例:hadoop fs -rm -r /aaa/bbb/
-rmdir
功能:删除空目录
示例:hadoop fs -rmdir /aaa/bbb/ccc
-df
功能:统计文件系统的可用空间信息
示例:hadoop fs -df -h /
-du
功能:统计文件夹的大小信息
示例:
hadoop fs -du -s -h /aaa/*
-count
功能:统计一个指定目录下的文件节点数量
示例:hadoop fs -count /aaa/
-setrep
功能:设置hdfs中文件的副本数量
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
<这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量>
HDFS原理及工作机制
- HDFS集群分为两大角色:NameNode、DataNode
- NameNode负责管理整个文件系统的元数据( 内存元数据(NameSystem) 、磁盘元数据镜像文件、数据操作日志文件)
- DataNode 负责管理用户的文件数据块(真正的文件)
- 文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上
- 每一个文件块可以有多个副本,并存放在不同的datanode上
- Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
- HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行
HDFS写数据流程
1、客户端要向hdfs写数据,首先要与namenode通信以确认是否可以写入;
2、得到可以上传的响应后,再次向NameNode请求DataNode来存放数据;
3、得到响应后,client端再次发起rpc请求,请求与DataNode们之间建立通道(channel)
4、通道建立完成,对client做出应答后,此时客户端就可以源源不断的传输数据了
详细流程见下图:
HDFS读数据流程
1、跟namenode通信查询元数据,找到文件块所在的datanode服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件
元数据存储机制
A、内存中有一份完整的元数据(内存meta data)
B、磁盘有一个“准完整”的元数据镜像(fsimage)文件(在namenode的工作目录中)
C、用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志(edits文件)
注:当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存meta.data中