JobTracker 和 TaskTracker 概述

概述

Hadoop MapReduce 采用 Master/Slave 结构。

  • Master:整个集群的全局管理者,功能包括:作业管理、状态监控和任务调度等,即 MapReduce 中的 JobTracker。
  • Slave:负责任务的执行和任务状态的回报,即 MapReduce 中的 TaskTracker。

JobTracker 剖析

  1. 概述:JobTracker 是一个后台服务进程,启动之后,会一直监听并接受来自各个 TaskTracker 发送的心跳信息,包括资源使用情况和任务运行情况等信息。
  2. 功能:
  • 作业控制:在 hadoop 中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker 的作业控制模块则负责作业的分解和状态监控。最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。
  • 资源管理

TaskTracker 剖析

  1. 概述:TaskTracker 是 JobTracker 和 Task 之间的桥梁,一方面,从 JobTracker 接受并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给 JobTracker。TaskTracker与JobTracker和Task之间采用RPC协议进行通信。
  2. 功能:
  • 汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:
    a. 机器级别信息:节点健康情况、资源使用情况等
    b. 任务级别信息:任务执行进度、任务运行状态等
  • 执行命令:JobTracker 会给 TaskTracker 下达各种命令,主要包括:启动任务、提交任务、杀死任务、杀死作业和重新初始化。

浅谈 JobTracker 和 TaskTracker

JobTracker 对应于 NameNode。TaskTracker 对应于 DataNode。
DataNode 和 NameNode 是针对数据存放而言的,JobTracker 和 TaskTracker 是对于 MapReduce 执行而言的。

MapReduce 中有几个主要概念:JobClient、JobTracker和TaskTracker。MapReduce 整体上可以分为这么几条执行线索:

  1. JobClient 会在用户端通过 JobClient 类将应用已经配置参数打包成 jar 文件存储到 HDFS,并把路径提交到 JobTracker,然后由 JobTracker 创建每一个 Task(即MapTask和ReduceTask),并将他们分发到各个 TaskTracker 服务中去执行
  2. JobTracker 是一个 master 服务,软件启动之后 JobTracker 接受 Job,负责调度 Job 的每一个子任务 task 运行于 TaskTracker 上,并监控他们,如果发现有失败的 task 就重新运行它。一般情况下应该把 JobTracker 部署在单独的机器上。
  3. TaskTracker 是运行在多个节点上的 slaver 服务,TaskTracker 主动与 JobTracker 通信,接受作业,并负责执行每一个任务。TaskTracker 都需要运行在 HDFS 的 DataNode 上。

Hadoop MapReduce

MapReduce 是一种编程模型,用于大规模数据级(大于 1TB)的并行运算。概念“Map(映射)”和“Reduce(归约)”是它们的主要思想。谷歌在 2004 年发表了可以分析大量数据的 MapReduce 算法。每当你听到“大数据”这个词时,它指的是因为太大而让仅仅一台机器难以有效存储或分析的问题。MapReduce 通过把计算量分配给不同的计算机群,能够解决大部分和大数据有关的分析问题。Hadoop 提供了最受欢迎的利用 MapReduce 算法来管理大数据的开源方式。

所以通常来说,每当听到“大数据”,那也许意味着 Hadoop 被用来存储数据,也通常意味着数据的抽取和检索是用的 MapReduce。

拆分 MapReduce 算法

MapReduce 合并了两种经典函数:

映射(Mapping):对集合里的每个目标应用同一个操作。即,如果你相把表单里的每个单元格乘以二,那么把这个函数单独的应用到每个单元格上的操作就属于 mapping。
化简(Reducing):遍历结合中的元素来返回一个综合的结果。即,“输出表单里的一列数字的和”这个任务属于reducing。

MapReduce 算法例子

你想数一摞牌中有多少张黑桃,直观的方式是一张一张检查并且输出有多少张黑桃。MapReduce 方法则是:

  1. 给在座的所有玩家分配这摞牌
  2. 让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你
  3. 你把所有玩家告诉你的数字加起来,得到最后的结果

这不是一个严谨的例子,在这个例子中,人代表计算机,因为他们同时工作,所以他们是一个集群。在大多数实际应用中,我们假设数据已经在每台计算机上了-也就是说把牌分发并不是 MapReduce 的第一步。(事实上,在计算机集群中如何存储文件是 Hadoop 的真正核心。)
通过把牌分给多个玩家并且让他们各自数数,你就在并行执行运算,因为每个玩家都在同时计算。这同时把这项工作变成了分布式,因为多个不同的人在解决同一个问题的过程中并不需要知道他们的邻居在干什么。
通过告诉每个人数数,你对一项检查每张牌的任务进行了映射。你不会让他们把黑桃牌递给你,而是让他们把你想要的东西化简为一个数字。
如果有足够的人的话,问一些更有趣的问题就相当简单了-比如“一摞牌的平均值是什么”。你可以通过合并“所有牌的值的和是什么”及“我们有多少张牌”这两个问题来得到答案。用这个和除以牌的张数就得到了平均值。

主要功能

MapReduce 通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性;每个节点会周期性的返回它所完成的工作和最新的状态。如果一个节点保持沉默超过一个预设的时间间隔,主节点记录下这个节点状态为死亡,并把分配给这个节点的数据发到别的节点。

MapReduce 提供了以下的主要功能:

  1. 数据划分和任务调度:

系统自动将一个作业(Job)待处理的大数据划分为很多数据块,每个数据块对应于一个计算任务(Task),并自动调去计算节点来处理相应的数据块。作业和任务调度功能主要负责分配和调度计算节点(Map节点或Reduce节点),同时负责监控这些节点的执行状态,并负责Map节点指定的同步控制。

  1. 数据/代码互定位:

为了减少数据通信,一个节本原则是本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向数据的迁移;当无法进行这种本地化处理数据处理时,再寻找其它可用节点并将数据从网络上送到该节点(数据向代码迁移),但尽可能从数据所在的本地机架上寻找可用节点以减少通信延迟。

  1. 系统优化

为了减少数据通信开销,中间结果数据进入 Reduce 节点前会进行一定的合并处理;一个 Reduce 节点所处理的数据可能会来自多个 Map 节点,为了避免 Reduce 计算阶段发生数据相关性,Map 节点输出的中间结果需要使用一定的策略进行适当的划分处理,保证相关性数据发送到同一个 Reduce 节点;此外,系统还进行一些计算性能优化处理,如对最慢的计算任务采用多备份执行、选最快完成者作为结果。

  1. 出错检测和恢复

以低端商用服务器构成的大规模MapReduce 计算集群中,节点硬件(主机、磁盘、内存等)出错和软件出错是常态,因此 MapReduce 需要能检测并隔离出错点,并调度分配新的节点接管出错节点的计算任务。同时,系统还将维护数据存储的可靠性,用多备份冗余存储机制提高数据存储的可靠性,并能及时检测和恢复出错的数据。

Hadoop 启动、关闭

适用版本

1
2
3
4
5
6
7
[root@master hadoop]# hadoop version
Hadoop 3.0.0-alpha1
Source code repository https://git-wip-us.apache.org/repos/asf/hadoop.git -r a990d2ebcd6de5d7dc2d3684930759b0f0ea4dc3
Compiled by andrew on 2016-08-30T07:02Z
Compiled with protoc 2.5.0
From source with checksum f3a9644139eac17acbb91bfce7f68e2
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-3.0.0-alpha1.jar

参考地址

http://hadoop.apache.org/docs/r3.0.0-alpha1/hadoop-project-dist/hadoop-common/ClusterSetup.html#Slaves_File

Hadoop Startup

  1. 要启动 Hadooop cluster,需要同时启动 HDFS 和 YARN cluster.
    第一次打开 HDFS,它必须先格式化它。
1
$HADOOP_HOME/bin/hdfs namenode -format
  1. 如果 etc/hadoop/workers 与 ssh 信任已经配置好了,所有的 HDFS processes 可以使用单一的脚本来启动
1
$HADOOP_HOME/sbin/start-dfs.sh   #在NameNode 节点运行

也可以逐个节点来启动:

1
2
$HADOOP_HOME/bin/hdfs --daemon start namenode   #Start HDFS NameNode
$HADOOP_HOME/bin/hdfs --daemon start datanode #Start HDFS DataNode
  1. 如果 etc/hadoop/workers 与 SSH 信任已经配置好了,所有的 YARN processes 可以使用单一的脚本来启动

YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。运行于 MapReduce 之上,提供了高可用性、高扩展性。

1
$HADOOP_HOME/sbin/start-yarn.sh

也可以逐个节点来启动:

1
2
3
$HADOOP_HOME/bin/yarn --daemon start resourcemanager    #使用如下命令运行指定的资源管理程序
$HADOOP_HOME/bin/yarn --daemon start nodemanager #在每个yarn节点启动NodeManager
$HADOOP_HOME/bin/yarn --daemon start proxyserver
  1. 在指定的服务器运行如下命令启动 MapReduce JobHistory Server

开启历史服务器,才能在 Web 中查看任务运行(注意,这里是查看,默认是全部会记录,只有开启后才能查看)。

1
$HADOOP_HOME/bin/mapred --daemon start historyserver

Hadoop ShutDown

  1. 如果 etc/hadoop/workers 与 SSH 信任已经配置好了,使用如下命令停止所有的 HDFS processes
1
$HADOOP_HOME/sbin/stop-dfs.sh    #在 NameNode 节点运行

同启动的时候一样,也可以逐个节点停止:

1
2
$HADOOP_HOME/bin/hdfs --daemon stop namenode    # 在 NameNode 节点运行
$HADOOP_HOME/bin/hdfs --daemon stop datanode # 在 DataNode 节点运行
  1. 如果 etc/hadoop/workers 与 SSH 信任已经配置好可,使用如下命令停止所有 YARN processes
1
$HADOOP_HOME/sbin/stop-yarn.sh

也可以逐个节点停止:

1
2
3
$HADOOP_HOME/bin/yarn --daemon stop resourcemanager
$HADOOP_HOME/bin/yarn --daemon stop nodemanager
$HADOOP_HOME/bin/yarn --daemon stop proxyserver
  1. 停止 MapReduce JobHistory Server
1
$HADOOP_HOME/bin/mapred --daemon stop historyserver

SSH 无密码登录节点

在配置 Hadoop 的过程中一个必要的步骤是配置 Mster 节点可以无密码 SSH 登录到各个 Slave 节点上。

如下说明配置步骤:

  1. 生成 Master 节点的公匙(在 Master 节点的终端中执行)
1
2
3
cd ~/.ssh		#如果没有该目录,先执行一次 ssh localhost
rm -rf ./id_rsa* #删除之前生成的公钥(如果有)
ssh-keygen -t rsa #一直按回车就可以
  1. 配置 Master 节点可以无密码 SSH 本机(在 Master 节点的终端中执行)
1
cat ./id_rsa.pub >>./authorized_keys

完成后可执行 ssh Master 验证一下(可能需要输入 yes,成功后执行 exit 返回原来的终端)。

  1. 在 Master 节点将公钥传送到各个 Slave 节点
1
scp ~/.ssh/id_rsa.pub root@slave1:/root/
  1. 在 Slave 节点上,将 Master SSH 公匙加入授权
1
2
3
mkdir ~/.ssh		#如果不存在该文件夹需要先创建,若存在则忽略
cat ~/id_rsa.pub >>~/.ssh/authorized_keys
rm ~/id_rsa.pub #用完就可以删除了

如果有其它 slave 节点,也要执行将 Master 公匙传送到其它 Slave 节点并授权的步骤。


至此,在 Master 节点上就可以无密码 SSH 到各个 Slave 节点了。可以在 Master 节点上执行如下命令进行检验:

1
ssh slave1

查找通过Yum安装的Java的安装路径

很多需要 Javac 的程序依赖于 JAVA_HOME 环境变量。
如果是手工下载源码安装的JDK,很容易知道 JAVA_HOME 的目录,那么 YUM 安装的 JDK,不需要配置 PATH,因为已经使用软链接做好了。

1
2
3
4
[root@bogon hadoop]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@bogon hadoop]# javac -version
javac 1.8.0_111
  1. YUM 安装 JDK
1
yum install -y java*
  1. 查找 JAVA_HOME
1
2
3
4
5
6
7
8
9
10
11
12
[root@bogon hadoop]# whereis javac
javac: /usr/bin/javac /usr/share/man/man1/javac.1.gz
[root@bogon hadoop]# ls -l /usr/bin/javac
lrwxrwxrwx. 1 root root 23 11月 23 12:11 /usr/bin/javac -> /etc/alternatives/javac
[root@bogon hadoop]# ls -l /etc/alternatives/javac
lrwxrwxrwx. 1 root root 70 11月 23 12:11 /etc/alternatives/javac -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-1.b15.el7_2.x86_64/bin/javac
[root@bogon hadoop]# whereis java
java: /usr/bin/java /usr/lib/java /etc/java /usr/share/java /usr/share/man/man1/java.1.gz
[root@bogon hadoop]# ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 22 11月 23 12:07 /usr/bin/java -> /etc/alternatives/java
[root@bogon hadoop]# ls -l /etc/alternatives/java
lrwxrwxrwx. 1 root root 73 11月 23 12:07 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-1.b15.el7_2.x86_64/jre/bin/java

数据库镜像-主备切换

  1. 高性能状态-主备切换(主机服务停止)

主机服务停止,镜像(备机)上执行下列命令后备机状态会变为:主机 挂起/正在还原…

1
ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;

此时如原主机再启动服务,会显示挂起状态。执行下列命令后状态会变为:镜像 已同步/正在还原…

1
ALTER DATABASE <DatabaseName> SET PARTNER RESUME;

如果要从原镜像机(即现在的主机)手动切换回镜像状态,需执行:

1
ALTER DATABASE <DatabaseName> SET PARTNER SAFETY FULL;

即将运行模式改为高安全,这时状态就会变回最初的状态(即原始的主机和备机)

  1. 高性能状态下-主备切换(主机网络断开)
    在原始的主机、备机状态下,将主机网络断开,在备机(镜像)上执行下列命令同样可以实现主备切换:
    1
    ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;

但是此时的备机(镜像)虽然成为了主机,其运行模式为高安全模式,需要手动切换到高性能模式下。然后将主机联网后,在主机上执行:

1
ALTER DATABASE <DatabaseName> SET PARTNER RESUME;

此时主机变为镜像机(镜像,已同步/正在还原…)

高安全模式下,将原主机服务停止,镜像机自动转为主机,但运行模式为高安全模式,此时镜像(相对于现在为主机)是不能调整运行模式的。即不能从高安全调整为高性能模式。只有当原主机网络连通或服务开始运行后在镜像(相对于现在为主机)才可以调整运行模式,同时这时也不允许强制执行。

CentOS 系统时间与现在时间相差8小时解决方法

今天安装了一台 CentOS 7 系统,安装好之后发现时间与现在时间相差 8 小时,具体表现如下:

1
2
3
4
[root@localhost 0900]# date
2016年 11月 10日 星期四 17:24:18 CST
[root@localhost 0900]# date -u
2016年 11月 10日 星期四 09:24:22 UTC

这是由于我们在安装系统的时候时区是上海,而 CentOS 默认 bios 时间是 UTC 时间,所以相差 8 小时。这个时候 bios 时间和系统时间不一致,一个代表 UTC 时间,一个代表 CST (+8时区),即上海时间。

下面是同步时间的解决方法:

1
2
3
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # Linux 时区设置为上海
ntpdate asia.pool.ntp.org # 对准时间,需要先安装ntp服务器,yum install ntp
/sbin/hwclock --systohc # 设置硬件时间和系统时间一致并校准

至此,linux 系统时间和计算机硬件时间都是都是 cst 时区了,并且为上海时区。

1
2
3
4
[root@localhost 0900]# date -u
2016年 11月 10日 星期四 01:25:25 UTC
[root@localhost 0900]# date
2016年 11月 10日 星期四 09:25:27 CST

CREATE INDEX

CREATE INDEX

为给定表或视图创建索引。
只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图视窗索引。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[ WITH < index_option > [ ,...n] ]
[ ON filegroup ]

< index_option > ::=
{ PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE |
SORT_IN_TEMPDB
}

参数

UNIQUE

为表或视图创建唯一索引(不允许存在索引值相同的两行)。视图上的聚簇索引必须是 UNIQUE 索引。
在创建索引时,如果数据已存在,SQL Server 会检查是否有重复值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行这种检查。
如果存在重复的键值,将取消 CREATE INDEX 语句,并返回错误信息,给出第一个重复值。
如果存在唯一索引,那么会产生重复键值的 UPDATE 或 INSERT 语句将回滚,SQL Server 将显示错误信息。即使 UPDATE 或 INSERT 语句更改了很多行但只产生一个重复值,也会出现这种情况。
如果在有唯一索引并指定了 IGNORE_DUP_KEY 子句情况下输入数据,则只有违反 UNIQUE 索引才会失败。在处理 UPDATE 语句时,IGNORE_DUP_KEY 不起作用。
SQL Server 不允许为已经包含重复值的列创建唯一索引,无论是否设置了 IGNORE_DUP_KEY。如果尝试这样做,SQL Server 会显示错误信息;重复值必须先删除,才能为这些列创建唯一索引。

CLUSTERED

创建一个对象,其中行的物理排序与索引排序相同,并且聚簇索引的最低一级(页级)包含实际的数据行。一个表或视图只允许同时有一个聚簇索引。具有聚簇索引的视图称为索引视图。必须先为视图创建唯一聚簇索引,然后才能为该视图定义其它索引。

因为按照定义,聚簇索引的页级与其数据页相同,所以创建聚簇索引时使用 ON filegroup 子句实际上会将表从创建该表所用的文件移到新的文件组中。在特定的文件组上创建表或索引之前,应确认哪些文件组可用并且有足够的空间供索引使用。文件组的大小必须至少是整个表所需空间的 1.2 倍,这一点很重要。

NONCLUSTERED

创建一个指定表的逻辑排序的对象。对于非聚簇索引,行的物理排序独立于索引排序。非聚簇所应的页级包含索引行。每个索引行均包含非聚簇键值和一个或多个行定位器(指向包含该值的行)。如果表没有聚簇索引行,行定位器就是行的磁盘地址。如果表有聚簇索引,行定位器就是该行的聚簇索引键。