MapReduce工作原理

MapReduce工作原理
MapReduce工作原理

Annotated Hadoop: 第一节Hadoop是什么

Hadoop是什么

Hadoop原来是Apache Lucene下的一个子项目,它最初是从Nutch项目中分离出来的专门负责分布式存储以及分布式运算的项目。简单地说来,Hadoop是一个可以更容易开发和运行处理大规模数据的软件平台。下面列举hadoop主要的一些特点:

1 扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。

2 成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

3 高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。

4 可靠性(Reliable):hadoop能自动地维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。

Hadoop还实现了MapReduce分布式计算模型。MapReduce将应用程序的工作分解成很多小的工作小块(small blocks of work)。HDFS为了做到可靠性(reliability)创建了多份数据块(data blocks)的复制(replicas),并将它们放置在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。

如下图所示:

Hadoop API被分成(divide into)如下几种主要的包(package)

org.apache.hadoop.conf定义了系统参数的配置文件处理API。

org.apache.hadoop.fs定义了抽象的文件系统API。

org.apache.hadoop.dfs Hadoop分布式文件系统(HDFS)模块的实现。

org.apache.hadoop.io定义了通用的I/O API,用于针对网络,数据库,文件等数据对象做读写操作。

org.apache.hadoop.ipc用于网络服务端和客户端的工具,封装了网络异步I/O的基础模块。

org.apache.hadoop.mapred Hadoop分布式计算系统(MapReduce)模块的实现,包括任务的分发调度等。

org.apache.hadoop.metrics定义了用于性能统计信息的API,主要用于mapred和dfs模块。

org.apache.hadoop.record定义了针对记录的I/O API类以及一个记录描述语言翻译器,用于简化将记录序列化成语言中性的格式(language-neutral manner)。

org.apache.hadoop.tools定义了一些通用的工具。

org.apache.hadoop.util定义了一些公用的API。

下面逐个从源代码中剖析这几个主要模块的框架以及运作原理

Annotated Hadoop: 第二节MapReduce框架结构

2 MapReduce框架结构

Map/Reduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的,Google已经将它完整的MapReduce论文公开发布了。其中对它的定义是,Map/Reduce是一个编程模型(programming model),是一个用于处理和生成大规模数据集(processing and generating large data sets)的相关的实现。用户定义一个map函数来处理一个key/value对以生成一批中间的key/value对,再定义一个reduce函数将所有这些中间的有着相同key的values合并起来。很多现实世界中的任务都可用这个模型来表达。

Hadoop的Map/Reduce框架也是基于这个原理实现的,下面简要介绍一下Map/Reduce框架主要组成及相互的关系。

2.1 总体结构

2.1.1 Mapper和Reducer

运行于Hadoop的MapReduce应用程序最基本的组成部分包括一个Mapper和一个Reducer类,以及一个创建JobConf的执行程序,在一些应用中还可以包括一个Combiner类,它实际也是Reducer的实现。

2.1.2 JobTracker和TaskTracker

它们都是由一个master服务JobTracker和多个运行于多个节点的slaver服务TaskTracker两个类提供的服务调度的。master负责调度job的每一个子任务task运行于slave上,并监控它们,如果发现有失败的task就重新运行它,slave则负责直接执行每一个task。TaskTracker都需要运行在HDFS的DataNode 上,而JobTracker则不需要,一般情况应该把JobTracker部署在单独的机器上。

2.1.3 JobClient

每一个job都会在用户端通过JobClient类将应用程序以及配置参数Configuration打包成jar文件存储在HDFS,并把路径提交到JobTracker的master服务,然后由master创建每一个Task(即MapTask和ReduceTask)将它们分发到各个TaskTracker服务中去执行。

2.1.4 JobInProgress

JobClient提交job后,JobTracker会创建一个JobInProgress来跟踪和调度这个job,并把它添加到job 队列里。JobInProgress会根据提交的job jar中定义的输入数据集(已分解成FileSplit)创建对应的一批TaskInProgress用于监控和调度MapTask,同时在创建指定数目的TaskInProgress用于监控和调度ReduceTask,缺省为1个ReduceTask。

2.1.5 TaskInProgress

JobTracker启动任务时通过每一个TaskInProgress来launchTask,这时会把Task对象(即MapTask和ReduceTask)序列化写入相应的TaskTracker服务中,TaskTracker收到后会创建对应的TaskInProgress (此TaskInProgress实现非JobTracker中使用的TaskInProgress,作用类似)用于监控和调度该Task。启动具体的Task进程是通过TaskInProgress管理的TaskRunner对象来运行的。TaskRunner会自动装载job jar,并设置好环境变量后启动一个独立的java child进程来执行Task,即MapTask或者ReduceTask,但它们不一定运行在同一个TaskTracker中。

2.1.6 MapTask和ReduceTask

一个完整的job会自动依次执行Mapper、Combiner(在JobConf指定了Combiner时执行)和Reducer,其中Mapper和Combiner是由MapTask调用执行,Reducer则由ReduceTask调用,Combiner实际也是Reducer接口类的实现。Mapper会根据job jar中定义的输入数据集按对读入,处理完成生成临时的对,如果定义了Combiner,MapTask会在Mapper完成调用该Combiner将相同key的值做合并处理,以减少输出结果集。MapTask的任务全完成即交给ReduceTask进程调用Reducer处理,生成最终结果对。这个过程在下一部分再详细介绍。

下图描述了Map/Reduce框架中主要组成和它们之间的关系:

2.2.1 JobClient.runJob() 开始运行job并分解输入数据集

一个MapReduce的Job会通过JobClient类根据用户在JobConf类中定义的InputFormat实现类来将输入的数据集分解成一批小的数据集,每一个小数据集会对应创建一个MapTask来处理。JobClient会使用缺省的FileInputFormat类调用FileInputFormat.getSplits()方法生成小数据集,如果判断数据文件是isSplitable()的话,会将大的文件分解成小的FileSplit,当然只是记录文件在HDFS里的路径及偏移量和Split大小。这些信息会统一打包到jobFile的jar中并存储在HDFS中,再将jobFile路径提交给JobTracker 去调度和执行。

2.2.2 JobClient.submitJob() 提交job到JobTracker

jobFile的提交过程是通过RPC模块(有单独一章来详细介绍)来实现的。大致过程是,JobClient类中通过RPC实现的Proxy接口调用JobTracker的submitJob()方法,而JobTracker必须实现JobSubmissionProtocol接口。JobTracker则根据获得的jobFile路径创建与job有关的一系列对象(即JobInProgress和TaskInProgress等)来调度并执行job。

JobTracker创建job成功后会给JobClient传回一个JobStatus对象用于记录job的状态信息,如执行时间、Map和Reduce任务完成的比例等。JobClient会根据这个JobStatus对象创建一个NetworkedJob的RunningJob对象,用于定时从JobTracker获得执行过程的统计数据来监控并打印到用户的控制台。

与创建Job过程相关的类和方法如下图所示

上面已经提到,job是统一由JobTracker来调度的,具体的Task分发给各个TaskTracker节点来执行。下面通过源码来详细解析执行过程,首先先从JobTracker收到JobClient的提交请求开始。

2.3.1 JobTracker初始化Job和Task队列过程

2.3.1.1 JobTracker.submitJob() 收到请求

当JobTracker接收到新的job请求(即submitJob()函数被调用)后,会创建一个JobInProgress对象并通过它来管理和调度任务。JobInProgress在创建的时候会初始化一系列与任务有关的参数,如job jar的位置(会把它从HDFS复制本地的文件系统中的临时目录里),Map和Reduce的数据,job的优先级别,以及记录统计报告的对象等。

2.3.1.2 JobTracker.resortPriority() 加入队列并按优先级排序

JobInProgress创建后,首先将它加入到jobs队列里,分别用一个map成员变量jobs用来管理所有jobs 对象,一个list成员变量jobsByPriority用来维护jobs的执行优先级别。之后JobTracker会调用resortPriority()函数,将jobs先按优先级别排序,再按提交时间排序,这样保证最高优先并且先提交的job 会先执行。

2.3.1.3 JobTracker.JobInitThread 通知初始化线程

然后JobTracker会把此job加入到一个管理需要初始化的队列里,即一个list成员变量jobInitQueue里。通过此成员变量调用notifyAll()函数,会唤起一个用于初始化job的线程JobInitThread来处理(JobTracker 会有几个内部的线程来维护jobs队列,它们的实现都在JobTracker代码里,稍候再详细介绍)。JobInitThread收到信号后即取出最靠前的job,即优先级别最高的job,调用JobInProgress的initTasks()函数执行真正的初始化工作。

2.3.1.4 JobInProgress.initTasks() 初始化TaskInProgress

Task的初始化过程稍复杂些,首先步骤JobInProgress会创建Map的监控对象。在initTasks()函数里通过调用JobClient的readSplitFile()获得已分解的输入数据的RawSplit列表,然后根据这个列表创建对应数目的Map执行管理对象TaskInProgress。在这个过程中,还会记录该RawSplit块对应的所有在HDFS里的blocks所在的DataNode节点的host,这个会在RawSplit创建时通过FileSplit的getLocations()函数获取,该函数会调用DistributedFileSystem的getFileCacheHints()获得(这个细节会在HDFS模块中讲解)。当然如果是存储在本地文件系统中,即使用LocalFileSystem时当然只有一个location即“localhost”了。

其次JobInProgress会创建Reduce的监控对象,这个比较简单,根据JobConf里指定的Reduce数目创建,缺省只创建1个Reduce任务。监控和调度Reduce任务的也是TaskInProgress类,不过构造方法有所不同,TaskInProgress会根据不同参数分别创建具体的MapTask或者ReduceTask。

JobInProgress创建完TaskInProgress后,最后构造JobStatus并记录job正在执行中,然后再调用JobHistory.JobInfo.logStarted()记录job的执行日志。到这里JobTracker里初始化job的过程全部结束,执行则是通过另一异步的方式处理的,下面接着介绍它。

与初始化Job过程相关的类和方法如下图所示

2.3.2 TaskTracker执行Task的过程

Task的执行实际是由TaskTracker发起的,TaskTracker会定期(缺省为10秒钟,参见MRConstants类中定义的HEARTBEAT_INTERVAL变量)与JobTracker进行一次通信,报告自己Task的执行状态,接收JobTracker的指令等。如果发现有自己需要执行的新任务也会在这时启动,即是在TaskTracker调用JobTracker的heartbeat()方法时进行,此调用底层是通过IPC层调用Proxy接口(在IPC章节详细介绍)实现。这个过程实际比较复杂,下面一一简单介绍下每个步骤。

2.3.2.1 TaskTracker.run() 连接JobTracker

TaskTracker的启动过程会初始化一系列参数和服务(另有单独的一节介绍),然后尝试连接JobTracker 服务(即必须实现InterTrackerProtocol接口),如果连接断开,则会循环尝试连接JobTracker,并重新初始化所有成员和参数,此过程参见run()方法。

2.3.2.2 TaskTracker.offerService() 主循环

如果连接JobTracker服务成功,TaskTracker就会调用offerService()函数进入主执行循环中。这个循环会每隔10秒与JobTracker通讯一次,调用transmitHeartBeat()获得HeartbeatResponse信息。然后调用HeartbeatResponse的getActions()函数获得JobTracker传过来的所有指令即一个TaskTrackerAction数组。再遍历这个数组,如果是一个新任务指令即LaunchTaskAction则调用startNewTask()函数执行新任务,否则加入到tasksToCleanup队列,交给一个taskCleanupThread线程来处理,如执行KillJobAction 或者KillTaskAction等。

2.3.2.3 TaskTracker.transmitHeartBeat() 获取JobTracker指令

在transmitHeartBeat()函数处理中,TaskTracker会创建一个新的TaskTrackerStatus对象记录目前任务的执行状况,然后通过IPC接口调用JobTracker的heartbeat()方法发送过去,并接受新的指令,即返回值TaskTrackerAction数组。在这个调用之前,TaskTracker会先检查目前执行的Task数目以及本地磁盘的空间使用情况等,如果可以接收新的Task则设置heartbeat()的askForNewTask参数为true。操作成功后再更新相关的统计信息等。

2.3.2.4 TaskTracker.startNewTask() 启动新任务

此函数的主要任务就是创建TaskTracker$TaskInProgress对象来调度和监控任务,并把它加入到runningTasks队列中。完成后则调用localizeJob()真正初始化Task并开始执行。

2.3.2.5 TaskTracker.localizeJob() 初始化job目录等

此函数主要任务是初始化工作目录workDir,再将job jar包从HDFS复制到本地文件系统中,调用RunJar.unJar()将包解压到工作目录。然后创建一个RunningJob并调用addTaskToJob()函数将它添加到runningJobs监控队列中。完成后即调用launchTaskForJob()开始执行Task。

2.3.2.6 https://www.360docs.net/doc/91290101.html,unchTaskForJob() 执行任务

启动Task的工作实际是调用TaskTracker$TaskInProgress的launchTask()函数来执行的。

2.3.2.7 TaskTracker$https://www.360docs.net/doc/91290101.html,unchTask() 执行任务

执行任务前先调用localizeTask()更新一下jobConf文件并写入到本地目录中。然后通过调用Task的createRunner()方法创建TaskRunner对象并调用其start()方法最后启动Task独立的java执行子进程。

2.3.2.8 Task.createRunner() 创建启动Runner对象

Task有两个实现版本,即MapTask和ReduceTask,它们分别用于创建Map和Reduce任务。MapTask 会创建MapTaskRunner来启动Task子进程,而ReduceTask则创建ReduceTaskRunner来启动。2.3.2.9 TaskRunner.start() 启动子进程真正执行Task

这里是真正启动子进程并执行Task的地方。它会调用run()函数来处理。执行的过程比较复杂,主要的工作就是初始化启动java子进程的一系列环境变量,包括设定工作目录workDir,设置CLASSPATH环境变量等(需要将TaskTracker的环境变量以及job jar的路径合并起来)。然后装载job jar包,调用runChild()方法启动子进程,即通过ProcessBuilder来创建,同时子进程的stdout/stdin/syslog的输出定向到该Task 指定的输出日志目录中,具体的输出通过TaskLog类来实现。这里有个小问题,Task子进程只能输出INFO 级别日志,而且该级别是在run()函数中直接指定,不过改进也不复杂。

与Job执行过程相关的类和方法如下图所示

2.4 JobTracker和TaskTracker

如上面所述,JobTracker和TaskTracker是MapReduce框架最基本的两个服务,其他所有处理均由它们调度执行,下面简单介绍它们内部提供的服务及创建的线程,详细过程下回分解J

2.4.1 JobTracker的服务和线程

JobTracker是MapReduce框架中最主要的类之一,所有job的执行都由它来调度,而且Hadoop系统中只配置一个JobTracker应用。启动JobTracker后它会初始化若干个服务以及若干个内部线程用来维护job 的执行过程和结果。下面简单介绍一下它们。

首先,JobTracker会启动一个interTrackerServer,端口配置在Configuration中的"mapred.job.tracker"参数,缺省是绑定8012端口。它有两个用途,一是用于接收和处理TaskTracker的heartbeat等请求,即必须实现InterTrackerProtocol接口及协议。二是用于接收和处理JobClient的请求,如submitJob,killJob 等,即必须实现JobSubmissionProtocol接口及协议。

其次,它会启动一个infoServer,运行StatusHttpServer,缺省监听50030端口。是一个web服务,用于给用户提供web界面查询job执行状况的服务。

JobTracker还会启动多个线程,ExpireLaunchingTasks线程用于停止那些未在超时时间内报告进度的Tasks。ExpireTrackers线程用于停止那些可能已经当掉的TaskTracker,即长时间未报告的TaskTracker 将不会再分配新的Task。RetireJobs线程用于清除那些已经完成很长时间还存在队列里的jobs。JobInitThread线程用于初始化job,这在前面章节已经介绍。TaskCommitQueue线程用于调度Task的那些所有与FileSystem操作相关的处理,并记录Task的状态等信息。

2.4.2 TaskTracker的服务和线程

TaskTracker也是MapReduce框架中最主要的类之一,它运行于每一台DataNode节点上,用于调度Task 的实际运行工作。它内部也会启动一些服务和线程。

TaskTracker也会启动一个StatusHttpServer服务来提供web界面的查询Task执行状态的工具。

其次,它还会启动一个taskReportServer服务,这个用于提供给它的子进程即TaskRunner启动的MapTask 或者ReduceTask向它报告状况,子进程的启动命令实现在TaskTracker$Child类中,由TaskRunner.run()通过命令行参数传入该服务地址和端口,即调用TaskTracker的getTaskTrackerReportAddress(),这个地址会在taskReportServer服务创建时获得。

TaskTracker也会启动一个MapEventsFetcherThread线程用于获取Map任务的输出数据信息。

2.5 Job状态监控

未完待

Annotated Hadoop: 第三节MapReduce工作原理

MapReduce工作原理

Map-Reduce框架的运作完全基于对,即数据的输入是一批对,生成的结果也是一批对,只是有时候它们的类型不一样而已。Key和value的类由于需要支持被序列化(serialize)操作,所以它们必须要实现Writable接口,而且key的类还必须实现WritableComparable接口,使得可以让框架对数据集的执行排序操作。

一个Map-Reduce任务的执行过程以及数据输入输出的类型如下所示:

(input) -> map -> -> combine -> -> reduce -> (output)

下面通过一个的例子并结合源代码来详细说明这个过程

3.1 WordCount示例

这也是Hadoop自带的一个例子,目标是统计文本文件中单词的个数。

假设有如下的两个文本文件来运行WorkCount程序:

Hello World Bye World

Hello Hadoop GoodBye Hadoop

3.2 map数据输入

Hadoop针对文本文件缺省使用LineRecordReader类来实现读取,一行一个key/value对,key取偏移量,value为行内容。

如下是map1的输入数据:

如下是map2的输入数据:

3.3 map输出/combine输入

如下是map1的输出结果

如下是map2的输出结果

3.4 combine输出

Combiner类实现将相同key的值合并起来,它也是一个Reducer的实现。

如下是combine1的输出

如下是combine2的输出

3.5 reduce输出

Reducer类实现将相同key的值合并起来。

如下是reduce的输出

即实现了WordCount的处理。

Hadoop安装部署

写的很好,对于第一次部署可以省去很多时间。

以下为原文内容:

本文主要是以安装和使用hadoop-0.12.0为例,指出在部署Hadoop的时候容易遇到的问题以及如何解决。

硬件环境

共有3台机器,均使用的FC5系统,Java使用的是jdk1.6.0。IP配置如下:

dbrg-1:202.197.18.72

dbrg-2:202.197.18.73

dbrg-3:202.197.18.74

这里有一点需要强调的就是,务必要确保每台机器的主机名和IP地址之间能正确解析。

一个很简单的测试办法就是ping一下主机名,比如在dbrg-1上ping dbrg-2,如果能ping通就OK!若不

能正确解析,可以修改/etc/hosts文件,如果该台机器作Namenode用,则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名;如果该台机器作Datanode用,则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。

以本文为例,dbrg-1中的/etc/hosts文件看起来就应该是这样的:

127.0.0.0 localhost localhost

202.197.18.72 dbrg-1 dbrg-1

202.197.18.73 dbrg-2 dbrg-2

202.197.18.74 dbrg-3 dbrg-3

dbrg-2中的/etc/hosts文件看起来就应该是这样的:

127.0.0.0 localhost localhost

202.197.18.72 dbrg-1 dbrg-1

202.197.18.73 dbrg-2 dbrg-2

在上一篇学习笔记中提到过,对于Hadoop来说,在HDFS看来,节点分为Namenode 和Datanode,其中Namenode只有一个,Datanode可以是很多;在MapReduce看来,节点又分为Jobtracker和Tasktracker,其中Jobtracker只有一个,Tasktracker可以是很多。

我是将namenode和jobtracker部署在dbrg-1上,dbrg-2,dbrg-3作为datanode和tasktracker。当然你也可以将namenode,datanode,jobtracker,tasktracker全部部署在一台机器上

目录结构

由于Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐户。

我的三台机器上是这样的:都有一个dbrg的帐户,主目录是/home/dbrg

Hadoop部署目录结构如下:/home/dbrg/HadoopInstall,所有的hadoop版本放在这个目录中。

将hadoop0.12.0压缩包解压至HadoopInstall中,为了方便以后升级,建议建立一个链接指向要使用的hadoop版本,不妨设为hadoop

[dbrg@dbrg-1:HadoopInstall]$ln -s hadoop0.12.0 hadoop

这样一来,所有的配置文件都在/hadoop/conf/目录中,所有执行程序都在/hadoop/bin目录中。

但是由于上述目录中hadoop的配置文件和hadoop的安装目录是放在一起的,这样一旦日后升级hadoop 版本的时候所有的配置文件都会被覆盖,因此建议将配置文件与安装目录分离,一种比较好的方法就是建立一个存放配置文件的目录,/home/dbrg/HadoopInstall/hadoop-config/,然后将/hadoop/conf/目录中的hadoop_site.xml,slaves,hadoop_env.sh三个文件拷贝到hadoop- config/目录中(这个问题很奇怪,在官网上的Getting Started With Hadoop中说是只需要拷贝这个三个文件到自己创建的目录就可以了,但我在实际配置的时候发现还必须把masters这个文件也拷贝到hadoop-conf/目录中才行,不然启动Hadoop 的时候就会报错说找不到masters这个文件),并指定环境变量$HADOOP_CONF_DIR指向该目录。环境变量在/home/dbrg/.bashrc和/etc/profile中设定。

综上所述,为了方便以后升级版本,我们需要做到配置文件与安装目录分离,并通过设定一个指向我们要使用的版本的hadoop的链接,这样可以减少我们对配置文件的维护。在下面的部分,你就会体会到这样分离以及链接的好处了。

SSH设置

在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。

首先要保证每台机器上都装了SSH服务器,且都正常启动。实际中我们用的都是OpenSSH,这是SSH 协议的一个免费开源实现。FC5中默认安装的OpenSSH版本是OpenSSH4.3P2。

以本文中的三台机器为例,现在dbrg-1是主节点,它需要主动发起SSH连接到dbrg-2和dbrg-3,对于SSH服务来说,dbrg-1就是SSH 客户端,而dbrg-2、dbrg-3则是SSH服务端,因此在dbrg-2,dbrg-3上需要确定sshd服务已经启动。简单的说,在dbrg-1上需要生成一个密钥对,即一个私钥,一个公钥。将公钥拷贝到dbrg-2,dbrg-3上,这样,比如当dbrg-1向dbrg-2发起ssh连接的时候,dbrg-2上就会生成一个随机数并用dbrg-1的公钥对这个随机数进行加密,并发送给dbrg-1;dbrg-1收到这个加密的数以后用私钥进行解密,并将解密后的数发送回dbrg-2,dbrg-2确认解密的数无误后就允许dbrg-1进行连接了。这就完成了一次公钥认证过程。

对于本文中的三台机器,首先在dbrg-1上生成密钥对:

[dbrg@dbrg-1:~]$ssh-keygen -t rsa

这个命令将为dbrg-1上的用户dbrg生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,

id_rsa.pub,默认存储在/home/dbrg/.ssh目录下。然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/dbrg/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接cp 或者scp就好了,下面的操作假设各个机器上都没有authorized_keys文件。

对于dbrg-1

[dbrg@dbrg-1:.ssh]$cp id_rsa.pub authorized_keys

对于dbrg-2(dbrg-3同dbrg-2的方法)

[dbrg@dbrg-2:~]$mkdir .ssh

[dbrg@dbrg-1:.ssh]$scp authorized_keys dbrg-2:/home/dbrg/.ssh/

此处的scp就是通过ssh进行远程copy,此处需要输入远程主机的密码,即dbrg-2机器上dbrg帐户的密码,当然,你也可以用其他方法将authorized_keys文件拷贝到其他机器上

[dbrg@dbrg-2:.ssh]$chmod 644 authorized_keys

这一步非常关键,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。我就曾经在配置SSH的时候郁闷了好久。

[dbrg@dbrg-2:.ssh]ls -la

drwx------ 2 dbrg dbrg .

drwx------ 3 dbrg dbrg ..

-rw-r--r-- 1 dbrg dbrg authorized_keys

注意每个机器上的.ssh目录的ls -la都应该和上面是一样的

接着,在三台机器上都需要对sshd服务进行配置(其实是可以不用配置的,完成了上面的那些操作了以后SSH就已经可以工作了),在三台机器上修改文件/etc/ssh/sshd_config

#去除密码认证

PasswordAuthentication no

AuthorizedKeyFile .ssh/authorized_keys

至此各个机器上的SSH配置已经完成,可以测试一下了,比如dbrg-1向dbrg-2发起ssh连接

[dbrg@dbrg-1:~]$ssh dbrg-2

如果ssh配置好了,就会出现以下提示信息

The authenticity of host [dbrg-2] can't be established.

Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.

Are you sure you want to continue connecting (yes/no)?

OpenSSH告诉你它不知道这台主机,但是你不用担心这个问题,因为你是第一次登录这台主机。键入“yes”。这将把这台主机的“识别标记”加到“~/.ssh/know_hosts”文件中。第二次访问这台主机的时候就不会再显示这条提示信息了。

然后你会发现不需要输入密码就可以建立ssh连接了,恭喜你,配置成功了

不过,别忘了测试本机ssh dbrg-1

Hadoop环境变量

在/home/dbrg/HadoopInstall/hadoop-conf目录下的hadoop_env.sh中设置Hadoop需要的环境变量,其中JAVA_HOME是必须设定的变量。HADOOP_HOME变量可以设定也可以不设定,如果不设定,HADOOP_HOME默认的是bin目录的父目录,即本文中的/home/dbrg/HadoopInstall/hadoop。我的是这样设置的

export HADOOP_HOME=/home/dbrg/HadoopInstall/hadoop

export JAVA_HOME=/usr/java/jdk1.6.0

从这个地方就可以看出前面所述的创建hadoop0.12.0的链接hadoop的优点了,当以后更新hadoop的版本的时候,就不需要在改配置文件,只需要更改链接就可以了。

Hadoop配置文件

如前所述,在hadoop-conf/目录下,打开slaves文件,该文件用来指定所有的从节点,一行指定一个主机名。即本文中的dbrg-2,dbrg-3,因此slaves文件看起来应该是这样的

dbrg-2

dbrg-3

在conf/ 目录中的hadoop-default.xml中包含了Hadoop的所有配置项,但是不允许直接修改!可以在hadoop-conf/目录下的hadoop-site.xml里面定义我们需要的项,其值会覆盖hadoop-default.xml中的默认值。可以根据自己的实际需要来进行定制。以下是我的配置档:

https://www.360docs.net/doc/91290101.html,

dbrg-1:9000

The name of the default file system. Either the literal string "local" or a host:port for DFS.

mapred.job.tracker

dbrg-1:9001

The host and port that the MapReduce job tracker runs at. If "local", then jobs are run

in-process as a single map and reduce task.

hadoop.tmp.dir

/home/dbrg/HadoopInstall/tmp

A base for other temporary directories.

https://www.360docs.net/doc/91290101.html,.dir

/home/dbrg/HadoopInstall/filesystem/name

Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy.

dfs.data.dir

/home/dbrg/HadoopInstall/filesystem/data

Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.

dfs.replication

1

Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.

部署Hadoop

前面讲的这么多Hadoop的环境变量和配置文件都是在dbrg-1这台机器上的,现在需要将hadoop部署到其他的机器上,保证目录结构一致。

[dbrg@dbrg-1:~]$scp -r /home/dbrg/HadoopInstall dbrg-2:/home/dbrg/

[dbrg@dbrg-1:~]$scp -r /home/dbrg/HadoopInstall dbrg-3:/home/dbrg/

至此,可以说,Hadoop已经在各个机器上部署完毕了下面就让我们开始启动Hadoop吧

启动Hadoop

启动之前,我们先要格式化namenode,先进入~/HadoopInstall/hadoop目录,执行下面的命令

[dbrg@dbrg-1:hadoop]$bin/hadoop namenode -format

不出意外,应该会提示格式化成功。如果不成功,就去hadoop/logs/目录下去查看日志文件

下面就该正式启动hadoop啦,在bin/下面有很多启动脚本,可以根据自己的需要来启动。

* start-all.sh 启动所有的Hadoop守护。包括namenode, datanode, jobtracker, tasktrack

* stop-all.sh 停止所有的Hadoop

* start-mapred.sh 启动Map/Reduce守护。包括Jobtracker和Tasktrack

* stop-mapred.sh 停止Map/Reduce守护

* start-dfs.sh 启动Hadoop DFS守护.Namenode和Datanode

* stop-dfs.sh 停止DFS守护

在这里,简单启动所有守护

[dbrg@dbrg-1:hadoop]$bin/start-all.sh

同样,如果要停止hadoop,则

[dbrg@dbrg-1:hadoop]$bin/stop-all.sh

HDFS操作

运行bin/目录的hadoop命令,可以查看Haoop所有支持的操作及其用法,这里以几个简单的操作为例。

建立目录

[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -mkdir testdir

在HDFS中建立一个名为testdir的目录

复制文件

[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -put /home/dbrg/large.zip testfile.zip

把本地文件large.zip拷贝到HDFS的根目录/user/dbrg/下,文件名为testfile.zip

查看现有文件

[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -ls

各类突发事件流程图

仓储分公司突发事件处理流程 说明: 1、急救事件的处理过程由当班值班员负有直接责任,当班主管负有管理责任。

电梯困人处理流程 说明: 1、电梯困人事件的处理过程由当班值班员负有直接责任,当班主管负有管理责任。说明:

1、水浸事件的处理过程由当班值班员负有直接责任,当班主管负有管理责任。 接报治安案件应急处理标准 说明: 1、突发事件的处理过程由当班值班员负有直接责任,当班主管负有管理责任。 说明:(监控中心或发现者)报警后,监控中心立即通知值班员现场查看、确认,如确认属火警,灾

情轻则消防员自救,如灾情严重时,立即通知部门主管、经理和管理处经理,确认是否报“119” (特大火灾时直接报“119”),及时通知保安部、客服部、工程部、保洁部、绿化部等,召集人员配合消防队进行救火。火警、火灾事件的发生由消防专员负有直接责任,消防主管负有管理责任。 水浸应急处理流程 1、当发生案件时,发现者及时通知当班值班员到场确认情况,按C级情况处理,若情况严重者,及 时通知部门主管、经理及管理处经理,到现场采取果断措施。及时制止事态,处理后做好记录存档在案。

2、治安事件的处理过程由当班值班员负有直接责任,当班主管负有管理责任。 火警、火灾应急处理流程 说明: 1、发生异常情况时,确认异常出入何处,发现者立即通知监控中心及各门岗,监视好各公共区域, 加强防范,通知治安巡逻员前去现场确认情况,属可以现象,设法抓获嫌疑目标带到办公室处理,调查事件的经过,根据其情节给予相应处分,必要情况送派出所处理,并做好记录。

(续) 说明: 1、确认事件后,就其情况进行处理,如责权能够处理的,及时处理,责权范围处理不了的问题,及 时上报上级领导,同时联系相关部门,共同进行处理。 2、事件处理后,做好记录存档在案。

事故应急管理制度

治安突发事件应急处理流程 1.0处理基本程序 1.1秩序员接到报警或在巡逻过程发现治安案件的,应立即报告当班班长、服务中心/案场秩序部主管、经理,并由秩序主管视案件情况确定是否通知紧急集合。 1.2服务中心/案场秩序部经理应尽快向公安机关报案(辖区派出所电话或110 报警电话)。 1.3 当班秩序员应根据具体情况,采取适当方法保护现场,禁止无关人员进入,以免破坏现场,影响证据的收集。 1.4 必要时经服务中心/案场经理同意可将一部电梯设置为手控状态,其余电梯迫降关闭,控制进出人员,组织秩序员逐层查找可疑对象。 1.5 抓紧时间向发现人员或周围群众了解案件和事件发生、发现的经过,收集群众的反馈信息,了解更多的情况并认真做好记录及证据收集。 1.6 向到达现场的公安人员认真汇报案件发生情况,协助配合破案。 1.7 秩序主管应做好记录、存档。 2.0 打架斗殴事件处理流程 2.1对单个业主间或业主与其他人在小区打架、斗殴时 2.1.1当班秩序员迅速报告班长和就近巡逻秩序员,并通知秩序主管立即到达现场。 2.1.2秩序主管、当班班长、秩序员应立即劝告打斗双方离开现场。 2.1.3 服务中心/案场经理与其他人员继续做好劝导工作,分离打斗

双方,分开调解、缓和矛盾。 2.1.4 疏散围观群众离开现场。 2.2对于在小区范围内有聚众斗殴时 2.2.1 巡逻秩序员立即通知当班班长和服务中心/案场秩序部主管、经理,由秩序主管通知其他非当班的秩序员紧急集合。 2.2.2 服务中心/案场主管安排人员将在场围观的人员隔离或劝离现场,维护现场的道路交通秩序,保护好现场。 2.2.3 服务中心/案场经理迅速组织人员控制现场,防止事态扩大,如属于违反治安管理条例行为,应及时向公安机关报警(辖区派出所电话或110报警电话)。 2.2.4 在有效处理聚众斗殴的同时,应加强小区的安全维护工作,防止不法分子乘机进行破坏、偷窃行为。 2.2.5 在维持现场秩序时,应注意保护事发现场,收集证据,同时尽可能将聚众斗殴者暂时留在办公室内,等候公安人员到达后进行人员及资料移交。 2.2.6 如有人员伤亡,做好救护工作,通知急救中心(电话:120)到现场抢救。 2.2.7 秩序部主管应做好相应记录(文字、录音、录像)、存档。 3.0可疑物件及危险物品处理流程 3.1 秩序员发现可疑物品或接到相关信息时,要立即向服务中心/案场秩序主管及经理汇报,并留守现场,防止他人接触可疑危险品。3.2 服务中心/案场秩序主管立即组织人员赶至现场,向有关人员了解

当前公安机关作风建设的成效、问题及解决路径

浅议公安机关作风建设 在当前公安机关作风建设工作中,**分局始终坚持以邓小平理论和“三个代表”重要思想为指导,牢固树立和落实科学发展观,建立正确的政绩观和为民群众观,以全市的“作风转变年”活动为载体,全力推进公安机关作风建设。对照市局“作风转变年”活动要求,我们在思想观念、工作方式、为民服务等方面还存在一些不足,与当前面对的新任务、新要求还有一些差距。对此我们不回避,并深入剖析存在问题的原因,增强工作的针对性和有效性,认真加以解决,促进分局机关作风建设深入开展。 一、取得的成效 1、转变作风服务群众的理念深入人心。**分局通过在门口院内、通道及主要路口摆放展板、悬挂横幅、制作各队室工作职责公示栏、内部网络开辟专栏等多种方式积极营造作风转变氛围。同时结合**市“作风转变年”活动方案和市公安局“作风转变年”活动安排,全体民警结合自身实际边学边改,使转变工作作风服务人民大众的意识入脑入心,广大干警的服务意识进一步增强。 2、坚持开门接访。**分局坚持每天安排一名分局领导接访,给来访群众答难释疑,面对面与上访群众沟通交流,积极化解矛盾调解纠纷,并协调推动有关事项落实,让群众看到问题得到解决的信心和公安机关的诚意,群众对**分局的工作满意度不断提升。

3、警民关系更加融洽。**分局结合“警民恳谈”活动和“三访三评”深化大走访活动,深入了解辖区群众对公安工作的新要求和新期盼,并以此作为转变作风和改进工作方法的契机,用真心和真情换取群众们对公安工作的理解和支持,进一步密切警民关系,融合警民情谊,推进和谐警民关系建设和公安工作和队伍建设水平的提高,取得了良好效果。 4、优化工作流程,不断推出便民利民措施。先后制定推出了五条便民措施,优化工作流程,强化为民服务意识,受到辖区群众的好评:1、为户口室添臵供群众使用的桌椅、纸张、笔墨、老花镜、打气筒、饮水机等服务设施。2、户口室设立意见簿,免费为群众提供办事指南;依法公开窗口单位的工作职责、执法依据、办事程序、法定时限、收费标准、监督方式以及其他相关内容,主动接受群众的监督和评议。3、实行AB角工作制,确保户口室至少一名民警在岗在位,为群众提供优质服务,群众办理业务手续齐全的,当场办理,不让群众跑第二趟。4、办理户口实行预约服务,工作时间社区警务室保证民警在岗在位,及时为群众办理户口业务;民警外出工作的,先由协警及时为群众登记,办理预约,第二个工作日内,社区民警主动与群众联系,为群众节约办事时间,简化程序。 5、为特殊人群提供上门服务,便民措施向群众公布,最大限度地将有关服务措施延伸到社区及警务室。 5、社会治安环境持续稳定,群众安全感指数稳步提升。迎盛会,保平安”严打整治百日会战开展以来,**分局持续保持对违

物业保安突发事件处理流程30计

物业保安突发事件处理流程 一、匪警处理流程 1、保安人员在执勤中遇有(或接报)公开使用暴力或其她手段(如打、砸、抢、偷等)损害或威胁单位或群众生命财产安全时,要切实履行保安员职责,迅速制止犯罪。 2、当发生突发案件时,要保持镇静,设法制服罪犯,同时立即通过通信设备呼叫救援。并及时向上级领导汇报。 3、保安人员在听到求救信号后,要立即赶到现场。 4、若犯罪嫌疑人逃跑,一时又追不上时,要瞧清人数、衣着、相貌、身体特征、所用交通工具及特征等。 5、有案发现场得(包括偷盗、抢劫现场)要保护现场,在警察到来之前,任何人不得擅自移动任何东西,包括罪犯留下得一切手痕、脚印、烟头等,不得让外人进入现场;在警察未勘察现场或现场勘察完毕之前,保安员不得离开。 6、记录用户提供得所有情况,记录被抢(盗)物品及其价值,询问住户就是否有任何线索等情况。 7、若就是运行过程作案,没固定场地,对犯罪嫌疑人遗留下得各种物品、作案工具等,要妥善保存交公安机关处理,切不可将保安人员或其她人员得指纹等痕迹留在物品上。 8、如有人员受伤,要立即设法送医院抢救并报告上级单位。 9、保安班长做好现场记录,并写出书面报告报有关部门。 二、斗殴事件处理流程

1、执勤中(或业主投诉)或监控中心通知,发现有人争吵、斗殴得现象时,要及时制止。提醒:制止争吵、斗殴得原则为: (1)劝阻双方住手、住口。 (2)对争吵或斗殴得双方或一方业主劝其离开现场。 (3)持有器械斗殴,应先制止持械一方。 (4)有伤员先送伤员去医院医治。 2、迅速报告上级领导,由上级单位出面调解,如个人力量单薄,应请求增援。 3、在制止争吵、斗殴双方时,切忌动粗,不允许恶言相向。 三、酗酒闹事或精神病人处理流程 1、醉酒者或精神病人失去正常得理智,处于不能自控得状态下,易对自身或其她人员造成伤害,保安员应及时对其采取控制与监督措施。 2、及时通知醉酒者或精神病人得家属,让她们派人领回。 3、醉酒者或精神病人有危害社会公共秩序或侵害她人得行为,应及时上报上级领导。 四、爆炸等危险物品处理流程 1、保安人员发现或接到有可疑物品时,要立即向主管领导及有关部门报告,并留守现场,阻止任何人再接触可疑物。 2、主管领导立即组织人员赶到现场,向有关人员了解情况,如初步确认可疑物品为危险物品时,立即对附近区域得人员进行疏散,并设置临时警戒线,任何人不得擅自入内。 3、立即向公安机关报案,并向公司领导通报。

治安案件办案程序有三种

公安机关办理行政案件授课教案 1.教学目的与要求:通过学习,让学生了解并熟练掌握公安机关办理行政案件的办案程序,包括简易程序、普通程序、调解程序、执行程序及救济程序等。同时注重培养学生办案的程序意识和依法行政理念;强化学生运用法律解释理解现实案例的能力。 2.教学重点与难点:让学生熟练掌握公安机关在办理行政案件过程中对办案程序基本理论知识的正确应用,如管辖制度、回避制度、期间与送达制度;案件调查的主要措施及查处的普通程序;适用简易程序和调解程序的条件及步骤;法律救济制度等。 3.教学内容与方法: 第一环节(5分钟) 采取任务驱动法总体介绍:治安案件办案程序的种类: (1)普通程序 (2)简易程序—当场处罚程序 (3)调解程序—治安调解 分别附图: (1)一般程序总流程图 (2)简易程序流程图 (3)治安调解流程图流程图 第二环节(30分钟) 采用案例评析进行引导 案例介绍: 2006年4月23日上午8时许,武汉某大学女生吴小艳急速走出汉口火车站出站口,快步跑到正在车站广场执勤的巡警严汉武面前,说:“火车上有个小偷,可能马上要出站,他的背上写有“小偷”两字。” 话音刚落,出站口处便传来喊声:“抓小偷!抓小偷!”同时,一名男子突然窜出,撒腿狂奔。原来,当小吴出车报警时,失主李强发现自己钱包被盗,看到小偷背后的“小偷”两字,便一把将其扭住,但被小偷挣脱逃下车。巡警武汉严见势一路 猛追,追至512专线公交车始发站,一名行人突然伸个“绊马腿”将此人绊倒,武汉严抓住他一看,其背后果真贴着一张纸条,上面写着“小偷”,随接从“小偷”身上搜出失主钱包一个(有1800元人民币)和弹簧刀一把。当民警从小偷(徐某、男、23岁、武汉市吴家山人)身上撕下纸条时,这小偷恼怒地说:“今天算是脸面丢尽。” 小吴介绍,刚才她看见该小偷偷走一名乘客的钱包,便悄悄拿出笔在随身携带的双面胶上写上“小偷”两字,然后靠近,借下车人多拥挤之机,把双面胶贴在小偷背上,小偷浑然不觉。 引导学生详细比较三大程序特点与区别 1.普通程序的适用条件:

治安案件处理流程图.docx

治安案件流程图 报案、控告、举报、群众扭送、主动投案 工作中发现其他行政主管部门、司法机关移交 不属于公安机关、内保组织管辖, 工作记录不属于违反治告知报案人、控告人、举报告知向有管辖权的机关报案或移 安管理行为人、投案人、并说明理由 送(接处警登记) 属于违反治安管理行为 通知并移属于公安机关但不受案登记 送案件属于本单位管辖的 有违法事实需要追究行政责任 且属于自己管辖的 对涉及的国家秘密、商业秘密、 受理个人隐私,应当予以保密 经办案部门负责人批准,由公 安机关使用传唤证传唤 当场发现的违反治安管理行为 传调查人经出示工作证件可口头传 唤,必须在笔录中告知被传唤唤 人传唤的原因和依据收集证据 拒不接受传唤的可以强制传唤 及时将传唤的原因和处所 通知被传唤人家属 不得超过 8 小时;情况复杂, 询问 由公安机关依照治安管理处 被传 罚法规定可能适用行政拘留 唤人 处罚的,不得超过 24 小时 因民间纠纷引起的打架斗殴或者损毁他人 财物等违反治安管理行为,情节较轻的 办案民警及值班人员是本案当事人或者当事人 的近亲属的;本人或者其近亲属与本案有利 害关系的;与本案当事人有其他关系,可能影 响案件公正处理的,应当回避。 到所在单位或住处也可通知 其到公安机关或保卫部门询问在公安机关之外询 被侵问应出示工作证件 害人、 了解其身份以及与双 证人 方当事人之间的关系 告知其如实提供证据 被询问人不满 16 周岁 的,通知其父母或其他 监护人到场 制作询问笔录;被询问 人也可自行提供书面 材料;必要时也可以要 求被询问人自行书写 构成治安案件的移交属地派出所处理;构 成刑事案件的及时通知刑侦部门处理,并 调解 及时保护现场、控制涉案嫌疑人,协助公一般性案件 安机关收集证据及其他相关工作

相关文档
最新文档