Hadoop详细的流程

Hive是基于Hadoop平台的,它提供了类似SQL一样的查询语言HQL。有了Hive,如果使用过SQL语言,并且不理解Hadoop MapReduce运行原理,也就无法通过编程来实现MR,但是你仍然可以很容易地编写出特定查询分析的HQL语句,通过使用类似SQL的语法,将HQL查询语句提交Hive系统执行查询分析,最终Hive会帮你转换成底层Hadoop能够理解的MR Job
对于最基本的HQL查询我们不再累述,这里主要说明Hive中进行统计分析时使用到的JOIN操作。在说明Hive JOIN之前,我们先简单说明一下,Hadoop执行MR Job的基本过程(运行机制),能更好的帮助我们理解HQL转换到底层的MR Job后是如何执行的。我们重点说明MapReduce执行过程中,从Map端到Reduce端这个过程(Shuffle)的执行情况,如图所示(来自《Hadoop: TheDefinitive Guide》):

基本执行过程,描述如下:

1.  一个InputSplit输入到map,会运行我们实现的Mapper的处理逻辑,对数据进行映射操作。

2.  map输出时,会首先将输出中间结果写入到map自带的bufferbuffer默认大小为100M,可以通过io.sort.mb配置)。

3.   map自带的buffer使用容量达到一定门限(默认0.8080%,可以通过io.sort.spill.percent配置),一个后台线程会准备buffer中的数据写入到磁盘。

4.  这个后台线程在buffer中数据写入磁盘之前,会首先将buffer中的数据进行partition(分区,partition数为Reducer的个数),对于每个的数据会基于Key进行一个in-memory排序

5.   排序后,会检查是否配置Combiner,如果配置了则直接作用到已排序的每个partition的数据上,对map输出进行化简压缩(这样写入磁盘的数据量就会减少,降低I/O操作开销)。

6.  现在可以将经过处理的buffer中的数据写入磁盘,生成一个文件(每次buffer容量达到设置的门限,都会对应着一个写入到磁盘的文件)。

7.  map任务结束之前,会对输出的多个文件进行合并操作,合并成一个文件(若map输出至少3个文件,在多个文件合并后写入之前,如果配置了Combiner,则会运行来化简压缩输出的数据,文件个数可以通过min.num.splits.for.combine配置;如果指定了压缩map输出,这里会根据配置对数据进行压缩写入磁盘),这个文件仍然保持partition和排序的状态。

8.  reduce阶段,每个reduce任务开始从多个map上拷贝属于自己partitionmap阶段已经做好partition,而且每个reduce任务知道应该拷贝哪个partition;拷贝过程是在不同节点之间,Reducer上拷贝线程基于HTTP来通过网络传输数据)。

9.  每个reduce任务拷贝的map任务结果的指定partition,也是先将数据放入到自带的一个buffer中(buffer默认大小为Heap内存的70%,可以通过mapred.job.shuffle.input.buffer.percent配置),如果配置了map结果进行压缩,则这时要先将数据解压缩后放入buffer中。

10.   reduce自带的buffer使用容量达到一定门限(默认0.6666%,可以通过mapred.job.shuffle.merge.percent配置),或者buffer中存放的map的输出的数量达到一定门限(默认1000,可以通过mapred.inmem.merge.threshold配置),buffer中的数据将会被写入到磁盘中。

11.   在将buffer中多个map输出合并写入磁盘之前,如果设置了Combiner,则会化简压缩合并的map输出。

12.   当属于该reducermap输出全部拷贝完成,则会在reducer上生成多个文件,这时开始执行合并操作,并保持每个map输出数据中Key的有序性,将多个文件合并成一个文件(在reduce端可能存在buffer和磁盘上都有数据的情况,这样在buffer中的数据可以减少一定量的I/O写入操作开销)。

13.   最后,执行reduce阶段,运行我们实现的Reducer中化简逻辑,最终将结果直接输出到HDFS中(因为Reducer运行在DataNode上,输出结果的第一个replica直接在存储在本地节点上)。

通过上面的描述我们看到,在MR执行过程中,存在Shuffle过程的MR需要在网络中的节点之间(Mapper节点和Reducer节点)拷贝数据,如果传输的数据量很大会造成一定的网络开销。而且,Map端和Reduce端都会通过一个特定的buffer来在内存中临时缓存数据,如果无法根据实际应用场景中数据的规模来使用Hive,尤其是执行表的JOIN操作,有可能很浪费资源,降低了系统处理任务的效率,还可能因为内存不足造成OOME问题,导致计算任务失败。

### Hadoop 搭建详细步骤及配置教程 #### 一、准备工作 确保每台机器已经安装好Java环境并设置好JAVA_HOME变量。准备好Hadoop软件包,并解压至指定位置。 #### 二、修改`core-site.xml`配置文件 编辑位于`$HADOOP_HOME/etc/hadoop/core-site.xml`的配置文件,添加如下内容以定义namenode地址和临时目录: ```xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/app/hadoop-2.4.1/data</value> </property> </configuration> ``` #### 三、清理旧数据 找到每天机器上配置的`hadoop.tmp.dir`路径下的data文件夹,将其删除。这里假设路径为`/home/hadoop/app/hadoop-2.4.1/data`[^1]。 #### 四、配置workers文件 编辑`$HADOOP_HOME/etc/hadoop/workers`文件,在其中加入所有slave节点主机名或者IP地址,并将此文件同步到其他两台机器[^2]。 #### 五、格式化Namenode 切换到Hadoop的sbin文件目录中,执行命令`hadoop namenode -format`来进行名称节点初始化操作[^3]。 #### 六、启动集群服务 进入Hadoop sbin目录下,分别运行以下两条指令来开启HDFS与YARN服务: ```bash ./start-dfs.sh ./start-yarn.sh ``` 如果要启用MapReduce历史记录服务器,则还需单独启动该组件。 #### 七、验证部署情况 通过命令`jps`检查各个节点上的守护进程是否正常工作;也可以尝试访问Web界面(如http://Master_IP:9870),确认UI页面能够正确显示集群状态信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值