前言

学习大数据开发,不免要接触大数据生态圈中的各种组件,今天就让我们从基本的组件——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原理及工作机制

  1. HDFS集群分为两大角色:NameNode、DataNode
  2. NameNode负责管理整个文件系统的元数据( 内存元数据(NameSystem) 、磁盘元数据镜像文件、数据操作日志文件)
  3. DataNode 负责管理用户的文件数据块(真正的文件)
  4. 文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上
  5. 每一个文件块可以有多个副本,并存放在不同的datanode上
  6. Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
  7. HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行

HDFS写数据流程

1、客户端要向hdfs写数据,首先要与namenode通信以确认是否可以写入;

2、得到可以上传的响应后,再次向NameNode请求DataNode来存放数据;

3、得到响应后,client端再次发起rpc请求,请求与DataNode们之间建立通道(channel)

4、通道建立完成,对client做出应答后,此时客户端就可以源源不断的传输数据了

详细流程见下图:

hadoop 启动数据节点 hadoop集群的进程_hdfs

 

 HDFS读数据流程

hadoop 启动数据节点 hadoop集群的进程_元数据_02

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中