标签: hadoop

Hadoop 新 MapReduce 框架 Yarn 详解

原 Hadoop MapReduce 框架的问题

对于业界的大数据存储及分布式处理系统来说,Hadoop 是耳熟能详的卓越开源分布式文件存储及处理框架,对于 Hadoop 框架的介绍在此不再累述,读者可参考 Hadoop 官方简介。使用和学习过老 Hadoop 框架(0.20.0 及之前版本)的同仁应该很熟悉如下的原 MapReduce 框架图:

图 1.Hadoop 原 MapReduce 架构

图 1.Hadoop 原 MapReduce 架构

从上图中可以清楚的看出原 MapReduce 程序的流程及设计思路:

  1. 首先用户程序 (JobClient) 提交了一个 job,job 的信息会发送到 Job Tracker 中,Job Tracker 是 Map-reduce 框架的中心,他需要与集群中的机器定时通信 (heartbeat), 需要管理哪些程序应该跑在哪些机器上,需要管理所有 job 失败、重启等操作。
  2. TaskTracker 是 Map-reduce 集群中每台机器都有的一个部分,他做的事情主要是监视自己所在机器的资源情况。
  3. TaskTracker 同时监视当前机器的 tasks 运行状况。TaskTracker 需要把这些信息通过 heartbeat 发送给 JobTracker,JobTracker 会搜集这些信息以给新提交的 job 分配运行在哪些机器上。上图虚线箭头就是表示消息的发送 – 接收的过程。

可以看得出原来的 map-reduce 架构是简单明了的,在*初推出的几年,也得到了众多的成功案例,获得业界广泛的支持和肯定,但随着分布式系统集群的规模和其工作负荷的增长,原框架的问题逐渐浮出水面,主要的问题集中如下:

  1. JobTracker 是 Map-reduce 的集中处理点,存在单点故障。
  2. JobTracker 完成了太多的任务,造成了过多的资源消耗,当 map-reduce job 非常多的时候,会造成很大的内存开销,潜在来说,也增加了 JobTracker fail 的风险,这也是业界普遍总结出老 Hadoop 的 Map-Reduce 只能支持 4000 节点主机的上限。
  3. 在 TaskTracker 端,以 map/reduce task 的数目作为资源的表示过于简单,没有考虑到 cpu/ 内存的占用情况,如果两个大内存消耗的 task 被调度到了一块,很容易出现 OOM。
  4. 在 TaskTracker 端,把资源强制划分为 map task slot 和 reduce task slot, 如果当系统中只有 map task 或者只有 reduce task 的时候,会造成资源的浪费,也就是前面提过的集群资源利用的问题。
  5. 源代码层面分析的时候,会发现代码非常的难读,常常因为一个 class 做了太多的事情,代码量达 3000 多行,,造成 class 的任务不清晰,增加 bug 修复和版本维护的难度。
  6. 从操作的角度来看,现在的 Hadoop MapReduce 框架在有任何重要的或者不重要的变化 ( 例如 bug 修复,性能提升和特性化 ) 时,都会强制进行系统级别的升级更新。更糟的是,它不管用户的喜好,强制让分布式集群系统的每一个用户端同时更新。这些更新会让用户为了验证他们之前的应用程序是不是适用新的 Hadoop 版本而浪费大量时间。

新 Hadoop Yarn 框架原理及运作机制

从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce 的 JobTracker/TaskTracker 机制需要大规模的调整来修复它在可扩展性,内存消耗,线程模型,可靠性和性能上的缺陷。在过去的几年中,hadoop 开发团队做了一些 bug 的修复,但是*近这些修复的成本越来越高,这表明对原框架做出改变的难度越来越大。

为从根本上解决旧 MapReduce 框架的性能瓶颈,促进 Hadoop 框架的更长远发展,从 0.23.0 版本开始,Hadoop 的 MapReduce 框架完全重构,发生了根本的变化。新的 Hadoop MapReduce 框架命名为 MapReduceV2 或者叫 Yarn,其架构图如下图所示:

图 2. 新的 Hadoop MapReduce 框架(Yarn)架构

图 2. 新的 Hadoop MapReduce 框架(Yarn)架构

重构根本的思想是将 JobTracker 两个主要的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控。新的资源管理器全局管理所有应用程序计算资源的分配,每一个应用的 ApplicationMaster 负责相应的调度和协调。一个应用程序无非是一个单独的传统的 MapReduce 任务或者是一个 DAG( 有向无环图 ) 任务。ResourceManager 和每一台机器的节点管理服务器能够管理用户在那台机器上的进程并能对计算进行组织。

事实上,每一个应用的 ApplicationMaster 是一个详细的框架库,它结合从 ResourceManager 获得的资源和 NodeManager 协同工作来运行和监控任务。

上图中 ResourceManager 支持分层级的应用队列,这些队列享有集群一定比例的资源。从某种意义上讲它就是一个纯粹的调度器,它在执行过程中不对应用进行监控和状态跟踪。同样,它也不能重启因应用失败或者硬件错误而运行失败的任务。

ResourceManager 是基于应用程序对资源的需求进行调度的 ; 每一个应用程序需要不同类型的资源因此就需要不同的容器。资源包括:内存,CPU,磁盘,网络等等。可以看出,这同现 Mapreduce 固定类型的资源使用模型有显著区别,它给集群的使用带来负面的影响。资源管理器提供一个调度策略的插件,它负责将集群资源分配给多个队列和应用程序。调度插件可以基于现有的能力调度和公平调度模型。

上图中 NodeManager 是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用情况 (CPU,内存,硬盘,网络 ) 并且向调度器汇报。

每一个应用的 ApplicationMaster 的职责有:向调度器索要适当的资源容器,运行任务,跟踪应用程序的状态和监控它们的进程,处理任务的失败原因

新旧 Hadoop MapReduce 框架比对

让我们来对新旧 MapReduce 框架做详细的分析和对比,可以看到有以下几点显著变化:

首先客户端不变,其调用 API 及接口大部分保持兼容,这也是为了对开发使用者透明化,使其不必对原有代码做大的改变 ( 详见 2.3 Demo 代码开发及详解),但是原框架中核心的 JobTracker 和 TaskTracker 不见了,取而代之的是 ResourceManager, ApplicationMaster 与 NodeManager 三个部分。

我们来详细解释这三个部分,首先 ResourceManager 是一个中心的服务,它做的事情是调度、启动每一个 Job 所属的 ApplicationMaster、另外监控 ApplicationMaster 的存在情况。细心的读者会发现:Job 里面所在的 task 的监控、重启等等内容不见了。这就是 AppMst 存在的原因。ResourceManager 负责作业与资源的调度。接收 JobSubmitter 提交的作业,按照作业的上下文 (Context) 信息,以及从 NodeManager 收集来的状态信息,启动调度过程,分配一个 Container 作为 App Mstr

NodeManager 功能比较专一,就是负责 Container 状态的维护,并向 RM 保持心跳。

ApplicationMaster 负责一个 Job 生命周期内的所有工作,类似老的框架中 JobTracker。但注意每一个 Job(不是每一种)都有一个 ApplicationMaster,它可以运行在 ResourceManager 以外的机器上。

Yarn 框架相对于老的 MapReduce 框架什么优势呢?我们可以看到:

  1. 这个设计大大减小了 JobTracker(也就是现在的 ResourceManager)的资源消耗,并且让监测每一个 Job 子任务 (tasks) 状态的程序分布式化了,更安全、更优美。
  2. 在新的 Yarn 中,ApplicationMaster 是一个可变更的部分,用户可以对不同的编程模型写自己的 AppMst,让更多类型的编程模型能够跑在 Hadoop 集群中,可以参考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。
  3. 对于资源的表示以内存为单位 ( 在目前版本的 Yarn 中,没有考虑 cpu 的占用 ),比之前以剩余 slot 数目更合理。
  4. 老的框架中,JobTracker 一个很大的负担就是监控 job 下的 tasks 的运行状况,现在,这个部分就扔给 ApplicationMaster 做了,而 ResourceManager 中有一个模块叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是监测 ApplicationMaster 的运行状况,如果出问题,会将其在其他机器上重启。
  5. Container 是 Yarn 为了将来作资源隔离而提出的一个框架。这一点应该借鉴了 Mesos 的工作,目前是一个框架,仅仅提供 java 虚拟机内存的隔离 ,hadoop 团队的设计思路应该后续能支持更多的资源调度和控制 , 既然资源表示成内存量,那就没有了之前的 map slot/reduce slot 分开造成集群资源闲置的尴尬情况。

新的 Yarn 框架相对旧 MapRduce 框架而言,其配置文件 , 启停脚本及全局变量等也发生了一些变化,主要的改变如下:

表 1. 新旧 Hadoop 脚本 / 变量 / 位置变化表

由于新的 Yarn 框架与原 Hadoop MapReduce 框架相比变化较大,核心的配置文件中很多项在新框架中已经废弃,而新框架中新增了很多其他配置项,看下表所示会更加清晰:

表 2. 新旧 Hadoop 框架配置项变化表

Hadoop Yarn 框架 Demo 示例

Demo 场景介绍:Weblogic 应用服务器日志分析

了解了 hadoop 新的 Yarn 框架的架构和思路后,我们用一个 Demo 示例来检验新 Yarn 框架下 Map-Reduce 程序的开发部署。

我们考虑如下应用场景:用户的生产系统由多台 Weblogic 应用服务器组成,每天需要每台对应用服务器的日志内容进行检查,统计其日志级别和日志模块的总数。

WebLogic 的日志范例如下图所示:

图 3.Weblogic 日志示例

图 3.Weblogic 日志示例

如上图所示,<Info> 为 weblogic 的日志级别,<Security>,<Management> 为 Weblogic 的日志模块,我们主要分析 loglevel 和 logmodule 这两个维度分别在 WebLogic 日志中出现的次数,每天需要统计出 loglevel 和 logmodule 分别出现的次数总数。

Demo 测试环境 Yarn 框架搭建

由于 Weblogic 应用服务器分布于不同的主机,且日志数据量巨大,我们采用 hadoop 框架将 WebLogic 各个应用服务器主机上建立分布式目录,每天将 WebLogic 日志装载进 hadoop 分布式文件系统,并且编写基于 Yarn 框架的 MapReduce 程序对日志进行处理,分别统计出 LogLevel 和 Logmodule 在日志中出现的次数并计算总量,然后输出到分布式文件系统中,输出目录命名精确到小时为后缀以便区分每次 Demo 程序运行的处理结果。

我们搭建一个 Demo 测试环境以验证 Yarn 框架下分布式程序处理该案例的功能,以两台虚拟机作为该 Demo 的运行平台,两机均为 Linux 操作系统,机器 hostname 为 OEL 和 Stephen,OEL 作为 NameNode 和 ResouceManager 节点主机,64 位,Stephen 作为 DataNode 和 NodeManager 节点主机,32 位(Hadoop 支持异构性), 具体如下:

表 3.Demo 测试环境表

我们把 hadoop 安装在两台测试机的 /hadoop 文件系统目录下,安装后的 hadoop 根目录为:/hadoop/hadoop-0.23.0,规划分布式文件系统存放于 /hadoop/dfs 的本地目录,对应分布式系统中的目录为 /user/oracle/dfs

我们根据 Yarn 框架要求,分别在 core-site.xml 中配置分布式文件系统的 URL,详细如下:

清单 1.core-site.xml 配置
1
2
3
4
5
6
< configuration >
   < property >
   < name >fs.defaultFS</ name >
   < value >hdfs://192.168.137.8:9100</ value >
   </ property >
</ configuration >

在 hdfs-site.xml 中配置 nameNode,dataNode 的本地目录信息,详细如下:

清单 2.hdfs-site.xml 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
< configuration >
< property >
  < name >dfs.namenode.name.dir</ name >
  < value >/hadoop/dfs/name</ value >
  < description >  </ description >
</ property >
< property >
  < name >dfs.datanode.data.dir</ name >
  < value >/hadoop/dfs/data</ value >
  < description > </ description >
</ property >
< property >
   < name >dfs.replication</ name >
   < value >2</ value >
</ property >
</ configuration >

在 mapred-site.xml 中配置其使用 Yarn 框架执行 map-reduce 处理程序,详细如下:

清单 3.mapred-site.xml 配置
1
2
3
4
5
6
< configuration >
  < property >
  < name >mapreduce.framework.name</ name >
  < value >Yarn</ value >
  </ property >
</ configuration >

*后在 Yarn-site.xml 中配置 ResourceManager,NodeManager 的通信端口,web 监控端口等,详细如下:

清单 4.Yarn-site.xml 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<? xml version = "1.0" ?>
< configuration >
<!-- Site specific YARN configuration properties -->
  < property >
  < name >Yarn.nodemanager.aux-services</ name >
  < value >mapreduce.shuffle</ value >
  </ property >
  < property >
  < description >The address of the applications manager interface in the RM.</ description >
  < name >Yarn.resourcemanager.address</ name >
  < value >192.168.137.8:18040</ value >
  </ property >
  < property >
  < description >The address of the scheduler interface.</ description >
  < name >Yarn.resourcemanager.scheduler.address</ name >
  < value >192.168.137.8:18030</ value >
  </ property >
  < property >
  < description >The address of the RM web application.</ description >
  < name >Yarn.resourcemanager.webapp.address</ name >
  < value >192.168.137.8:18088</ value >
  </ property >
 
  < property >
  < description >The address of the resource tracker interface.</ description >
  < name >Yarn.resourcemanager.resource-tracker.address</ name >
  < value >192.168.137.8:8025</ value >
  </ property >
</ configuration >

具体配置项的含义,在 hadoop 官方网站有详细的说明,读者可以参见 hadoop 0.23.0 官方配置模板

Demo 代码开发及详解

以下我们详细介绍一下新的 Yarn 框架下针对该应用场景的 Demo 代码的开发, 在 Demo 程序的每个类都有详细的注释和说明,Yarn 开发为了兼容老版本,API 变化不大,可以参考 官方 Hadoop Yarn 框架 API

在 Map 程序中,我们以行号为 key,行文本为 value 读取每一行 WebLogic 日志输入,将 loglevel 和 logmodule 的值读出作为 Map 处理后的新的 key 值,由于一行中 loglevel 和 logmodule 的出现次数应该唯一,所以经 Map 程序处理后的新的 record 记录的 value 应该都为 1:

清单 5. Map 业务逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static class MapClass extends Mapper< Object , Text, Text, IntWritable> 
  {
  private Text record = new Text(); 
  private static final IntWritable recbytes = new IntWritable(1); 
  public void map(Object key, Text value,Context context) 
    throws IOException,InterruptedException {  
  String line = value.toString(); 
// 没有配置 RecordReader,所以默认采用 line 的实现,
//key 就是行号,value 就是行内容,
// 按行 key-value 存放每行 loglevel 和 logmodule 内容
  if (line == null || line.equals("")) 
    return;
  String[] words = line.split("> <"); 
  if (words == null || words.length < 2) 
    return;
  String logLevel = words[1]; 
  String moduleName = words[2]; 
 
  record.clear();
  record.set(new StringBuffer("logLevel::").append(logLevel).toString()); 
  context.write(record, recbytes); 
  // 输出日志级别统计结果,通过 logLevel:: 作为前缀来标示。
 
  record.clear();
   record.set(new StringBuffer("moduleName::").append(moduleName).toString()); 
  context.write(record, recbytes); 
   // 输出模块名的统计结果,通过 moduleName:: 作为前缀来标示
 
  }

由于有 loglevel 和 logmodule 两部分的分析工作,我们设定两个 Reduce 来分别处理这两部分,loglevel 的交给 reduce1,logmodule 交给 reduce2。因此我们编写 Patitioner 类,根据 Map 传过来的 Key 中包含的 logLevel 和 moduleName 的前缀,来分配到不同的 Reduce:

清单 6.Partition 业务逻辑

public static class PartitionerClass extends Partitioner<Text, IntWritable>
{
public int getPartition(Text key, IntWritable value, int numPartitions)
{
if (numPartitions >= 2)//Reduce 个数,判断 loglevel 还是 logmodule 的统计,分配到不同的 Reduce
if (key.toString().startsWith(“logLevel::”))
return 0;
else if(key.toString().startsWith(“moduleName::”))
return 1;
else return 0;
else
return 0;
}

}

在 Reduce 程序中,累加并合并 loglevel 和 logmodule 的出现次数

清单 7. Reduce 业务逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static class ReduceClass extends  Reducer< Text , IntWritable,Text, IntWritable> 
        {
            private IntWritable result = new IntWritable(); 
            public void reduce(Text key, Iterable< IntWritable > values, 
                    Context context)throws IOException, 
                                                     InterruptedException { 
               
                int tmp = 0; 
                for (IntWritable val : values) { 
                    tmp = tmp + val.get();                                     
                }
                result.set(tmp);
                context.write(key, result);// 输出*后的汇总结果
            }   
        }

以上完成了 MapReduce 的主要处理逻辑,对于程序入口,我们使用 Hadoop 提供的 Tools 工具包方便的进行 May-Reduce 程序的启动和 Map/Reduce 对应处理 class 的配置。

清单 8. Main 执行类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Iterator; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Partitioner; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 
public class LogAnalysiser extends Configured implements Tool { 
   public static void main(String[] args) 
  {
    try
  {
  int res; 
  res = ToolRunner.run(new Configuration(),new LogAnalysiser(), args); 
  System.exit(res);
  } catch (Exception e) 
  {
  e.printStackTrace();
  }
  }
  public int run(String[] args) throws Exception 
  {
  if (args == null || args.length < 2 )
  {
  System.out.println("need inputpath and outputpath"); 
  return 1; 
  }
  String inputpath args [0];
  String outputpath args [1];
  String shortin args [0];
  String shortout args [1];
  if (shortin.indexOf(File.separator) >= 0) 
  shortin = shortin.substring(shortin.lastIndexOf(File.separator)); 
  if (shortout.indexOf(File.separator) >= 0) 
  shortout = shortout.substring(shortout.lastIndexOf(File.separator)); 
  SimpleDateFormat formater = new SimpleDateFormat("yyyy.MM.dd.HH.mm"); 
  shortout = new StringBuffer(shortout).append("-") 
  .append(formater.format(new Date())).toString(); 
 
 
  if (!shortin.startsWith("/")) 
  shortin = "/" + shortin; 
  if (!shortout.startsWith("/")) 
  shortout = "/" + shortout; 
  shortin = "/user/oracle/dfs/" + shortin; 
  shortout = "/user/oracle/dfs/" + shortout;   
  File inputdir = new File(inputpath); 
  File outputdir = new File(outputpath); 
 
  if (!inputdir.exists() || !inputdir.isDirectory()) 
  {
  System.out.println("inputpath not exist or isn't dir!"); 
  return 0; 
  }
  if (!outputdir.exists()) 
  {
  new File(outputpath).mkdirs(); 
  }
// 以下注释的是 hadoop 0.20.X 老版本的 Job 代码,在 hadoop0.23.X 新框架中已经大大简化
//   Configuration conf = getConf(); 
//   JobConf job = new JobConf(conf, LogAnalysiser.class);   
//    JobConf conf = new JobConf(getConf(),LogAnalysiser.class);// 构建 Config 
//    conf.setJarByClass(MapClass.class); 
//    conf.setJarByClass(ReduceClass.class); 
//    conf.setJarByClass(PartitionerClass.class); 
//    conf.setJar("hadoopTest.jar"); 
//    job.setJar("hadoopTest.jar"); 
// 以下是新的 hadoop 0.23.X Yarn 的 Job 代码
job job = new Job(new Configuration()); 
    job.setJarByClass(LogAnalysiser.class);
    job.setJobName("analysisjob");
    job.setOutputKeyClass(Text.class);// 输出的 key 类型,在 OutputFormat 会检查
    job.setOutputValueClass(IntWritable.class); // 输出的 value 类型,在 OutputFormat 会检查
    job.setJarByClass(LogAnalysiser.class);
    job.setMapperClass(MapClass.class);
    job.setCombinerClass(ReduceClass.class);
    job.setReducerClass(ReduceClass.class);
    job.setPartitionerClass(PartitionerClass.class);
    job.setNumReduceTasks(2);// 强制需要有两个 Reduce 来分别处理流量和次数的统计
    FileInputFormat.setInputPaths(job, new Path(shortin));//hdfs 中的输入路径
    FileOutputFormat.setOutputPath(job,new Path(shortout));//hdfs 中输出路径
   
    Date startTime = new Date(); 
    System.out.println("Job started: " + startTime); 
    job.waitForCompletion(true);   
    Date end_time = new Date(); 
    System.out.println("Job ended: " + end_time); 
    System.out.println("The job took " + 
    (end_time.getTime() - startTime.getTime()) /1000 + " seconds."); 
    // 删除输入和输出的临时文件
//    fileSys.copyToLocalFile(new Path(shortout),new Path(outputpath)); 
//    fileSys.delete(new Path(shortin),true); 
//    fileSys.delete(new Path(shortout),true); 
    return 0; 
  }
}

Demo 部署及运行

Demo 输入输出的控制

本 demo 中我们将从 Weblogic 日志目录中拷贝原始待处理日志文件作为 Yarn 程序的输入,使用 hadoop dfs 命令将其放入分布式目录的 input 目录,处理完后将生成以时间戳为文件目录后缀的输出目录

Weblogic 日志存放的原始目录位于:/u01/app/Oracle/Middleware/user_projects/domains/test_domain/AdminServer/logs

分布式文件系统中的输入目录:/user/oracle/dfs/input

分布式文件系统中的输出目录:/user/oracle/dfs/output_%YYYY-MM-DD-hh-mm%

Demo 打包和部署

可以使用 JDeveloper 或者 Eclipse 等 IDE 工具将开发的 Hadoop Demo 代码打包为 jar,并指定 Main 类为 LoyAnalyze,本文中我们采用 JDeveloper 打包 Demo 代码,如下图示例:

图 4.Yarn Demo 程序打包示例

图 4.Yarn Demo 程序打包示例

Demo 执行与跟踪

我们在 OEL 主机(NameNode&ResourceManager 主机,192.168.137.8)上启动 dfs 分布式文件系统:

图 5. 启动 Demo dfs 文件系统

图 5. 启动 Demo dfs 文件系统

从上图可以看出 dfs 分布式文件系统已经在 OEL 和 Stephen 主机上成功启动,我们通过默认的分布式文件系统 Web 监控 端口 http://192.168.137.8:50070(也可以在上文中 core-site.xml 中配置 dfs.namenode.http-address 项指定其他端口 ) 来验证其文件系统情况:

图 6.hadoop 文件系统 web 监控页面

图 6.hadoop 文件系统 web 监控页面

从上图中我们可以看到 /user/oracle/dfs 分布式文件系统已成功建立。

接下来我们在 NameNode 主机(OEL,192.168.137.8)上启动 Yarn 框架:

图 7. 启动 Demo Yarn 框架

图 7. 启动 Demo Yarn 框架

从上图我们可以看到 ResouceManager 在 OEL 主机上成功启动,NodeManager 进程在 Stephen 节点主机上也已经启动,至此整个新的 Hadoop Yarn 框架已经成功启动。

我们将打好的 testHadoop.jar 包上传至 NameNode 主机(OEL)的 /hadoop/hadoop-0.23.0/ 根目录下,我们使用 Hadoop 自带的 hadoop 命令行工具执行 Demo 的 jar 包,具体步骤为,先使用 hadoop dfs 命令将输入文件(weblogic 原始日志)拷贝至 dfs 分布式目录的 input 输入目录,清理 dfs 分布式目录下的 output 输出子目录。然后使用 hadoop jar 命令执行 testHadoop 的 jar 包。

执行 Demo 的 shell 脚本示例如下:

1
2
3
4
5
6
./bin/hadoop dfs -rmr /user/oracle/dfs/output* 
./bin/hadoop dfs -rmr /user/oracle/dfs/input 
./bin/hadoop dfs -mkdir /user/oracle/dfs/input 
./bin/hadoop dfs -copyFromLocal ./input/*.log /user/oracle/dfs/input/ 
./bin/hadoop jar ./hadoopTest.jar /hadoop/hadoop-0.23.0/input 
                 /hadoop/hadoop-0.23.0/output

清单 9.Demo 执行脚本

然后我们使用上文中的脚本启动 demo 并执行:

图 8.Demo 程序运行

图 8.Demo 程序运行

查看大图

从上图的 console 输出中我们可以看到 Demo 程序的结果和各项统计信息输出,下面我们通过 Web 监控界面详细中观察程序执行的执行流程和步骤细节。

Job 启动后我们可以通过 ResourceManager 的 Web 端口(在上文中 Yarn-site.xml 配置文件中 Yarn.resourcemanager.webapp.address 配置项) http://192.168.137.8:18088 来监控其 job 的资源调度。

图 9. 接收请求和生成 job application

图 9. 接收请求和生成 job application

查看大图

上图中我们可以看到 Yarn 框架接受到客户端请求 , 如上图所示 ID 为 application_1346564668712_0003 的 job 已经是 accepted 状态

我们点击该 ID 的链接进入到该 application 的 Map-Reduce 处理监控页面,该界面中有动态分配的 ApplicationMaster 的 Web 跟踪端口可以监视 MapReduce 程序的步骤细节

图 10.hadoop MapReduce Application Web 监控页面 (1)

图 10.hadoop MapReduce Application Web 监控页面 (1)

点击上图中 ApplicationMaster 的 URL 可以进入该 ApplicationMaster 负责管理的 Job 的具体 Map-Reduce 运行状态:

图 11.hadoop MasterApplication Web 监控页面(2)

图 11.hadoop MasterApplication Web 监控页面(2)

上图中我们可以看到 ID 为 application_1346564668712_0003 的 Job 正在执行,有 2 个 Map 进程,已经处理完毕,有 2 个 Reduce 正在处理,这跟我们程序设计预期的是一样的。

当状态变为 successful 后,进入 dfs 文件系统可以看到,输出的 dfs 文件系统已经生成,位置位于 /user/oracle/dfs 下,目录名为 output-2012.09.02.13.52,可以看到格式和命名方式与 Demo 设计是一致的,如下图所示:

图 12.Demo 输出目录(1)

图 12.Demo 输出目录(1)

我们进入具体的输出目录,可以清楚的看到程序处理的输出结果,正如我们 Demo 中设计的,两个 Reduce 分别生成了两个输出文件,分别是 part-r-00000 和 part-r-00001,对应 Module 和 Log Level 的处理输出信息:

图 13.Demo 输出目录(2)

图 13.Demo 输出目录(2)

点击 part-r-00000 的输出文件链接,可以看到程序处理后的 log level 的统计信息:

图 14.Demo 输出结果(1)

图 14.Demo 输出结果(1)

点击 part-r-00001 的输出文件链接,可以看到程序处理后 Module 的统计信息:

图 15.Demo 输出结果(2)

图 15.Demo 输出结果(2)

至此我们基于新的 Yarn 框架的 Demo 完全成功运行,实现功能与预期设计完全一致,运行状态和 NameNode/DataNode 部署,Job/MapReduece 程序的调度均和设计一致。读者可参考该 Demo 的配置及代码进行修改,做为实际生产环境部署和实施的基础。

转载自:https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/

Hadoop入门之HDFS操作

启动HDFS

首先,格式化配置HDFS文件系统,打开NameNode(HDFS服务器),然后执行以下命令。

$ hadoop namenode -format 

格式化HDFS后,启动分布式文件系统。以下命令将启动名称节点和数据节点的集群。

$ start-dfs.sh 

HDFS的文件列表

加载服务器信息后,使用’ls’ 可以找出文件列表中的目录,文件状态。下面给出的是ls,可以传递一个目录或文件名作为参数的语法。

$ $HADOOP_HOME/bin/hadoop fs -ls <args>

将数据插入到HDFS

假设在本地系统,这是所谓的file.txt文件中的数据,应当保存在HDFS文件系统。按照下面给出插入在Hadoop的文件系统所需要的文件的步骤。

第1步

必须创建一个输入目录。

$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input 

第2步

传输并使用本地系统put命令,Hadoop文件系统中存储的数据文件。

$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input 

第3步

可以使用ls命令验证文件。

$ $HADOOP_HOME/bin/hadoop fs -ls /user/input 

从HDFS中检索数据

假设在HDFS文件名为outfile。下面给出的是一个简单的演示用于检索从Hadoop文件系统所需的文件。

第1步

*初,使用cat命令来查看来自HDFS的数据。

$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile 

第2步

使用get命令从HDFS下载文件到本地文件系统。

$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/
注:/home/hadoop_tp/ 为本地文件路径

关闭HDFS

可以使用下面的命令关闭HDFS。

$ stop-dfs.sh
转载自:http://www.yiibai.com/hadoop/hadoop_hdfs_operations.html

Hadoop实战实例

     Hadoop 是Google  MapReduce的一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行。就如同java程序员可以不考虑内存泄露一样, MapReduce的run-time系统会解决输入数据的分布细节,跨越机器集群的程序执行调度,处理机器的失效,并且管理机器之间的通讯请求。这样的模式允许程序员可以不需要有什么并发处理或者分布式系统的经验,就可以处理超大的分布式系统得资源。

一、概论

    作为Hadoop程序员,他要做的事情就是:
1、定义Mapper,处理输入的Key-Value对,输出中间结果。
2、定义Reducer,可选,对中间结果进行规约,输出*终结果。
3、定义InputFormat 和OutputFormat,可选,InputFormat将每行输入文件的内容转换为Java类供Mapper函数使用,不定义时默认为String。
4、定义main函数,在里面定义一个Job并运行它。

    然后的事情就交给系统了。
1.基本概念:Hadoop的HDFS实现了google的GFS文件系统,NameNode作为文件系统的负责调度运行在master,DataNode运行在每个机器上。同时Hadoop实现了Google的MapReduce,JobTracker作为MapReduce的总调度运行在master,TaskTracker则运行在每个机器上执行Task。

2.main()函数,创建JobConf,定义Mapper,Reducer,Input/OutputFormat 和输入输出文件目录,*后把Job提交給JobTracker,等待Job结束。

3.JobTracker,创建一个InputFormat的实例,调用它的getSplits()方法,把输入目录的文件拆分成FileSplist作为Mapper task 的输入,生成Mapper task加入Queue。

4.TaskTracker 向 JobTracker索求下一个Map/Reduce。

Mapper Task先从InputFormat创建RecordReader,循环读入FileSplits的内容生成Key与Value,传给Mapper函数,处理完后中间结果写成SequenceFile.
Reducer Task 从运行Mapper的TaskTracker的Jetty上使用http协议获取所需的中间内容(33%),Sort/Merge后(66%),执行Reducer函数,*后按照OutputFormat写入结果目录。

      TaskTracker 每10秒向JobTracker报告一次运行情况,每完成一个Task10秒后,就会向JobTracker索求下一个Task。

      Nutch项目的全部数据处理都构建在Hadoop之上,详见Scalable Computing with Hadoop


二、程序员编写的代码

 (可以查看hadoop-examples-0.20.203.0.jar,里面也有一个类grep)

    我们做一个简单的分布式的Grep,简单对输入文件进行逐行的正则匹配,如果符合就将该行打印到输出文件。因为是简单的全部输出,所以我们只要写Mapper函数,不用写Reducer函数,也不用定义Input/Output Format。

  1. package  demo.hadoop
  2. public   class  HadoopGrep {
  3.      public   static   class  RegMapper  extends  MapReduceBase  implements  Mapper {
  4.                private  Pattern pattern;
  5.                public   void  configure(JobConf job) {
  6.                          pattern  =  Pattern.compile(job.get( ” mapred.mapper.regex “ ));
  7.               }
  8.               public   void  map(WritableComparable key, Writable value, OutputCollector output, Reporter reporter)
  9.                      throws  IOException {
  10.                          String text  =  ((Text) value).toString();
  11.                          Matcher matcher  =  pattern.matcher(text);
  12.                        if  (matcher.find()) {
  13.                         output.collect(key, value);
  14.              }
  15.     }
  16.  }
  17.   private  HadoopGrep () {
  18.  }  //  singleton 
  19. public   static   void  main(String[] args)  throws  Exception {
  20.   JobConf grepJob  =   new  JobConf(HadoopGrep. class );
  21.   grepJob.setJobName( ” grep-search “ );
  22.   grepJob.set( ” mapred.mapper.regex “ , args[ 2 ]);
  23.   grepJob.setInputPath( new  Path(args[ 0 ]));
  24.   grepJob.setOutputPath( new  Path(args[ 1 ]));
  25.   grepJob.setMapperClass(RegMapper. class );
  26.   grepJob.setReducerClass(IdentityReducer. class );
  27.   JobClient.runJob(grepJob);
  28.  }
  29. }

          RegMapper类的configure()函数接受由main函数传入的查找字符串,map() 函数进行正则匹配,key是行数,value是文件行的内容,符合的文件行放入中间结果。
main()函数定义由命令行参数传入的输入输出目录和匹配字符串,Mapper函数为RegMapper类,Reduce函数是什么都不做,直接把中间结果输出到*终结果的的IdentityReducer类,运行Job。

整个代码非常简单,丝毫没有分布式编程的任何细节。

三.运行Hadoop程序

        Hadoop这方面的文档写得不全面,综合参考GettingStartedWithHadoop 与Nutch Hadoop Tutorial 两篇后,再碰了很多钉子才终于完整的跑起来了,记录如下:
3.1 local运行模式
完全不进行任何分布式计算,不动用任何namenode,datanode的做法,适合一开始做调试代码。
解压hadoop,其中conf目录是配置目录,hadoop的配置文件在hadoop-default.xml,如果要修改配置,不是直接修改该文件,而是修改hadoop-site.xml,将该属性在hadoop-site.xml里重新赋值。
hadoop-default.xml的默认配置已经是local运行,不用任何修改,配置目录里唯一必须修改的是hadoop-env.sh 里JAVA_HOME的位置。
将编译好的HadoopGrep与RegMapper.class 放入hadoop/build/classes/demo/hadoop/目录

        或者编译成jar包HadoopGrep.jar放入hadoop/build/classes/demo/hadoop/目录

        找一个比较大的xx.log文件放,然后运行

        bin/hadoop demo.hadoop.HadoopGrep  input   /tmp/out  “[a-b]”
(jar包运行:bin/hadoop jar HadoopGrep.jar  HadoopGrep  input   /tmp/output  “[a-b]” )
说明:
input  为xx.log文件所在目录
/tmp/output为输出目录
“[a-b]”   grep的字符串

        查看输出目录的结果,查看hadoop/logs/里的运行日志。
在重新运行前,先删掉输出目录。

  3.2 集群运行模式

    (查看集群配置:http://blog.csdn.net/hguisu/article/details/7237395)

      1 )执行bin/hadoop dfs 可以看到它所支持的文件操作指令。

      2) 创建目录输入inpu:
$ bin/hadoop dfs -mkdir input

      3)上传文件xx.log到指定目录 input :
$ bin/hadoop dfs -put xx.log input

       4 )  执行 bin/hadoop demo.hadoop.HadoopGrep input  output
(jar包运行:bin/hadoop jar HadoopGrep.jar  HadoopGrep  input   /tmp/output  “[a-b]” )

       5 ) 查看输出文件:

           将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output
$ cat output/*

            或者
在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*

            重新执行前,运行hadoop/bin/hadoop dfs -rm output删除output目录

7.运行hadoop/bin/stop-all.sh 结束。

四、效率

    经测试,Hadoop并不是万用灵丹,很取决于文件的大小和数量,处理的复杂度以及群集机器的数量,相连的带宽,当以上四者并不大时,hadoop优势并不明显。
比如,不用hadoop用java写的简单grep函数处理100M的log文件只要4秒,用了hadoop local的方式运行是14秒,用了hadoop单机集群的方式是30秒,用双机集群10M网口的话更慢,慢到不好意思说出来的地步。

hadoop三个配置文件的参数含义说明

1       获取默认配置

配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知道这些配置文件有哪些配置可以生效,上网找的配置可能因为各个hadoop版本不同,导致无法生效。浏览更多的配置,有两个方法:

1.选择相应版本的hadoop,下载解压后,搜索*.xml,找到core-default.xml,hdfs-default.xml,mapred-default.xml,这些就是默认配置,可以参考这些配置的说明和key,配置hadoop集群。

2.浏览apache官网,三个配置文件链接如下:

http://hadoop.apache.org/common/docs/current/core-default.html

http://hadoop.apache.org/common/docs/current/hdfs-default.html

http://hadoop.apache.org/common/docs/current/mapred-default.html

这里是浏览hadoop当前版本号的默认配置文件,其他版本号,要另外去官网找。其中*个方法找到默认的配置是*好的,因为每个属性都有说明,可以直接使用。另外,core-site.xml是全局配置,hdfs-site.xml和mapred-site.xml分别是hdfs和mapred的局部配置。

2       常用的端口配置

2.1  HDFS端口

 

参数 描述 默认 配置文件 例子值
fs.default.name namenode namenode RPC交互端口 8020 core-site.xml hdfs://master:8020/
dfs.http.address NameNode web管理端口 50070 hdfs- site.xml 0.0.0.0:50070
dfs.datanode.address datanode 控制端口 50010 hdfs -site.xml 0.0.0.0:50010
dfs.datanode.ipc.address datanode的RPC服务器地址和端口 50020 hdfs-site.xml 0.0.0.0:50020
dfs.datanode.http.address datanode的HTTP服务器和端口 50075 hdfs-site.xml 0.0.0.0:50075

 

2.2  MR端口

参数 描述 默认 配置文件 例子值
mapred.job.tracker job-tracker交互端口 8021 mapred-site.xml hdfs://master:8021/
job tracker的web管理端口 50030 mapred-site.xml 0.0.0.0:50030
mapred.task.tracker.http.address task-tracker的HTTP端口 50060 mapred-site.xml 0.0.0.0:50060

 

 

2.3  其它端口

参数 描述 默认 配置文件 例子值
dfs.secondary.http.address secondary NameNode web管理端口 50090 hdfs-site.xml 0.0.0.0:50090
         
         

 

3       三个缺省配置参考文件说明

3.1  core-default.html

序号 参数名 参数值 参数说明
1 hadoop.tmp.dir /tmp/hadoop-${user.name} 临时目录设定
2 hadoop.native.lib true 使用本地hadoop库标识。
3 hadoop.http.filter.initializers   http服务器过滤链设置
4 hadoop.security.group.mapping org.apache.hadoop.security.ShellBasedUnixGroupsMapping 组内用户的列表的类设定
5 hadoop.security.authorization false 服务端认证开启
6 hadoop.security.authentication simple 无认证或认证设置
7 hadoop.security.token.service.use_ip true 是否开启使用IP地址作为连接的开关
8 hadoop.logfile.size 10000000 日志文件*大为10M
9 hadoop.logfile.count 10 日志文件数量为10个
10 io.file.buffer.size 4096 流文件的缓冲区为4K
11 io.bytes.per.checksum 512 校验位数为512字节
12 io.skip.checksum.errors false 校验出错后是抛出异常还是略过标识。True则略过。
13 io.compression.codecs org.apache.hadoop.io.compress.DefaultCodec,

org.apache.hadoop.io.compress.GzipCodec,

org.apache.hadoop.io.compress.BZip2Codec,

org.apache.hadoop.io.compress.SnappyCodec

压缩和解压的方式设置
14 io.serializations org.apache.hadoop.io.serializer.WritableSerialization 序例化和反序列化的类设定
15 fs.default.name file:/// 缺省的文件URI标识设定。
16 fs.trash.interval 0 文件废弃标识设定,0为禁止此功能
17 fs.file.impl org.apache.hadoop.fs.LocalFileSystem 本地文件操作类设置
18 fs.hdfs.impl org.apache.hadoop.hdfs.DistributedFileSystem HDFS文件操作类设置
19 fs.s3.impl org.apache.hadoop.fs.s3.S3FileSystem S3文件操作类设置
20 fs.s3n.impl org.apache.hadoop.fs.s3native.NativeS3FileSystem S3文件本地操作类设置
21 fs.kfs.impl org.apache.hadoop.fs.kfs.KosmosFileSystem KFS文件操作类设置.
22 fs.hftp.impl org.apache.hadoop.hdfs.HftpFileSystem HTTP方式操作文件设置
23 fs.hsftp.impl org.apache.hadoop.hdfs.HsftpFileSystem HTTPS方式操作文件设置
24 fs.webhdfs.impl org.apache.hadoop.hdfs.web.WebHdfsFileSystem WEB方式操作文件类设置
25 fs.ftp.impl org.apache.hadoop.fs.ftp.FTPFileSystem FTP文件操作类设置
26 fs.ramfs.impl org.apache.hadoop.fs.InMemoryFileSystem 内存文件操作类设置
27 fs.har.impl org.apache.hadoop.fs.HarFileSystem 压缩文件操作类设置.
28 fs.har.impl.disable.cache true 是否缓存har文件的标识设定
29 fs.checkpoint.dir ${hadoop.tmp.dir}/dfs/namesecondary 备份名称节点的存放目前录设置
30 fs.checkpoint.edits.dir ${fs.checkpoint.dir} 备份名称节点日志文件的存放目前录设置
31 fs.checkpoint.period 3600 动态检查的间隔时间设置
32 fs.checkpoint.size 67108864 日志文件大小为64M
33 fs.s3.block.size 67108864 写S3文件系统的块的大小为64M
34 fs.s3.buffer.dir ${hadoop.tmp.dir}/s3 S3文件数据的本地存放目录
35 fs.s3.maxRetries 4 S3文件数据的偿试读写次数
36 fs.s3.sleepTimeSeconds 10 S3文件偿试的间隔
37 local.cache.size 10737418240 缓存大小设置为10GB
38 io.seqfile.compress.blocksize 1000000 压缩流式文件中的*小块数为100万
39 io.seqfile.lazydecompress true 块是否需要压缩标识设定
40 io.seqfile.sorter.recordlimit 1000000 内存中排序记录块类*小为100万
41 io.mapfile.bloom.size 1048576 BloomMapFiler过滤量为1M
42 io.mapfile.bloom.error.rate 0.005  
43 hadoop.util.hash.type murmur 缺少hash方法为murmur
44 ipc.client.idlethreshold 4000 连接数据*小阀值为4000
45 ipc.client.kill.max 10 一个客户端连接数*大值为10
46 ipc.client.connection.maxidletime 10000 断开与服务器连接的时间*大为10秒
47 ipc.client.connect.max.retries 10 建立与服务器连接的重试次数为10次
48 ipc.server.listen.queue.size 128 接收客户连接的监听队例的长度为128
49 ipc.server.tcpnodelay false 开启或关闭服务器端TCP连接算法
50 ipc.client.tcpnodelay false 开启或关闭客户端TCP连接算法
51 webinterface.private.actions false Web交互的行为设定

 

52 hadoop.rpc.socket.factory.class.default org.apache.hadoop.net.StandardSocketFactory 缺省的socket工厂类设置
53 hadoop.rpc.socket.factory.class.ClientProtocol   与dfs连接时的缺省socket工厂类
54 hadoop.socks.server   服务端的工厂类缺省设置为SocksSocketFactory.
55 topology.node.switch.mapping.impl org.apache.hadoop.net.ScriptBasedMapping  
56 topology.script.file.name    
57 topology.script.number.args 100 参数数量*多为100
58 hadoop.security.uid.cache.secs 14400  

 

 

 

 

 

3.2  hdfs-default.html

 

序号 参数名 参数值 参数说明
1 dfs.namenode.logging.level info 输出日志类型
2 dfs.secondary.http.address 0.0.0.0:50090 备份名称节点的http协议访问地址与端口
3 dfs.datanode.address 0.0.0.0:50010 数据节点的TCP管理服务地址和端口
4 dfs.datanode.http.address 0.0.0.0:50075 数据节点的HTTP协议访问地址和端口
5 dfs.datanode.ipc.address 0.0.0.0:50020 数据节点的IPC服务访问地址和端口
6 dfs.datanode.handler.count 3 数据节点的服务连接处理线程数
7 dfs.http.address 0.0.0.0:50070 名称节点的http协议访问地址与端口
8 dfs.https.enable false 支持https访问方式标识
9 dfs.https.need.client.auth false 客户端指定https访问标识
10 dfs.https.server.keystore.resource ssl-server.xml Ssl密钥服务端的配置文件
11 dfs.https.client.keystore.resource ssl-client.xml Ssl密钥客户端的配置文件
12 dfs.datanode.https.address 0.0.0.0:50475 数据节点的HTTPS协议访问地址和端口
13 dfs.https.address 0.0.0.0:50470 名称节点的HTTPS协议访问地址和端口
14 dfs.datanode.dns.interface default 数据节点采用IP地址标识
15 dfs.datanode.dns.nameserver default 指定DNS的IP地址
16 dfs.replication.considerLoad true 加载目标或不加载的标识
17 dfs.default.chunk.view.size 32768 浏览时的文件块大小设置为32K
18 dfs.datanode.du.reserved 0 每个卷预留的空闲空间数量
19 dfs.name.dir ${hadoop.tmp.dir}/dfs/name 存贮在本地的名字节点数据镜象的目录,作为名字节点的冗余备份
20 dfs.name.edits.dir ${dfs.name.dir} 存贮文件操作过程信息的存贮目录
21 dfs.web.ugi webuser,webgroup Web接口访问的用户名和组的帐户设定
22 dfs.permissions true 文件操作时的权限检查标识。
23 dfs.permissions.supergroup supergroup 超级用户的组名定义
24 dfs.block.access.token.enable false 数据节点访问令牌标识
25 dfs.block.access.key.update.interval 600 升级访问钥时的间隔时间
26 dfs.block.access.token.lifetime 600 访问令牌的有效时间
27 dfs.data.dir ${hadoop.tmp.dir}/dfs/data 数据节点的块本地存放目录
28 dfs.datanode.data.dir.perm 755 数据节点的存贮块的目录访问权限设置
29 dfs.replication 3 缺省的块复制数量
30 dfs.replication.max 512 块复制的*大数量
31 dfs.replication.min 1 块复制的*小数量
32 dfs.block.size 67108864 缺省的文件块大小为64M
33 dfs.df.interval 60000 磁盘空间统计间隔为6秒
34 dfs.client.block.write.retries 3 块写入出错时的重试次数
35 dfs.blockreport.intervalMsec 3600000 块的报告间隔时为1小时
36 dfs.blockreport.initialDelay 0 块顺序报告的间隔时间
37 dfs.heartbeat.interval 3 数据节点的心跳检测间隔时间
38 dfs.namenode.handler.count 10 名称节点的连接处理的线程数量
39 dfs.safemode.threshold.pct 0.999f 启动安全模式的阀值设定

 

40 dfs.safemode.extension 30000 当阀值达到量值后扩展的时限
41 dfs.balance.bandwidthPerSec 1048576 启动负载均衡的数据节点可利用带宽*大值为1M
42 dfs.hosts   可与名称节点连接的主机地址文件指定。
43 dfs.hosts.exclude   不充计与名称节点连接的主机地址文件设定
44 dfs.max.objects 0 文件数、目录数、块数的*大数量
45 dfs.namenode.decommission.interval 30 名称节点解除命令执行时的监测时间周期
46 dfs.namenode.decommission.nodes.per.interval 5 名称节点解除命令执行是否完检测次数
47 dfs.replication.interval 3 名称节点计算数据节点的复制工作的周期数.
48 dfs.access.time.precision 3600000 充许访问文件的时间精确到1小时
49 dfs.support.append false 是否充许链接文件指定
50 dfs.namenode.delegation.key.update-interval 86400000 名称节点上的代理令牌的主key的更新间隔时间为24小时
51 dfs.namenode.delegation.token.max-lifetime 604800000 代理令牌的有效时间*大值为7天
52 dfs.namenode.delegation.token.renew-interval 86400000 代理令牌的更新时间为24小时
53 dfs.datanode.failed.volumes.tolerated 0 决定停止数据节点提供服务充许卷的出错次数。0次则任何卷出错都要停止数据节点

 

 

3.3  mapred-default.html

序号 参数名 参数值 参数说明
1 hadoop.job.history.location   作业跟踪管理器的静态历史文件的存放目录。
2 hadoop.job.history.user.location   可以指定具体某个作业的跟踪管理器的历史文件存放目录
3 mapred.job.tracker.history.completed.location   已完成作业的历史文件的存放目录
4 io.sort.factor  10 排完序的文件的合并时的打开文件句柄数
5 io.sort.mb  100 排序文件的内存缓存大小为100M
6 io.sort.record.percent  0.05 排序线程阻塞的内存缓存剩余比率
7 io.sort.spill.percent  0.80 当缓冲占用量为该值时,线程需要将内容先备份到磁盘中。
8 io.map.index.skip  0 索引条目的间隔设定
9 mapred.job.tracker  local 作业跟踪管理器是否和MR任务在一个进程中
10 mapred.job.tracker.http.address 0.0.0.0:50030 作业跟踪管理器的HTTP服务器访问端口和地址
11 mapred.job.tracker.handler.count 10 作业跟踪管理器的管理线程数,线程数比例是任务管理跟踪器数量的0.04
12 mapred.task.tracker.report.address 127.0.0.1:0 任务管理跟踪器的主机地址和端口地址

 

13 mapred.local.dir ${hadoop.tmp.dir}/mapred/local MR的中介数据文件存放目录
14 mapred.system.dir ${hadoop.tmp.dir}/mapred/system MR的控制文件存放目录
15 mapreduce.jobtracker.staging.root.dir ${hadoop.tmp.dir}/mapred/staging 每个正在运行作业文件的存放区
16 mapred.temp.dir ${hadoop.tmp.dir}/mapred/temp MR临时共享文件存放区
17 mapred.local.dir.minspacestart 0 MR本地中介文件删除时,不充许有任务执行的数量值。
18 mapred.local.dir.minspacekill 0 MR本地中介文件删除时,除非所有任务都已完成的数量值。
19 mapred.tasktracker.expiry.interval 600000 任务管理跟踪器不发送心跳的累计时间间隔超过600秒,则任务管理跟踪器失效
20 mapred.tasktracker.resourcecalculatorplugin   指定的一个用户访问资源信息的类实例
21 mapred.tasktracker.taskmemorymanager.monitoring-interval 5000 监控任务管理跟踪器任务内存使用率的时间间隔
22 mapred.tasktracker.tasks.sleeptime-before-sigkill 5000 发出进程终止后,间隔5秒后发出进程消亡信号

 

23 mapred.map.tasks 2 每个作业缺省的map任务数为2
24 mapred.reduce.tasks 1 每个作业缺省的reduce任务数为1
25 mapreduce.tasktracker.outofband.heartbeat false 让在任务结束后发出一个额外的心跳信号
26 mapreduce.tasktracker.outofband.heartbeat.damper 1000000 当额外心跳信号发出量太多时,则适当阻止

 

27 mapred.jobtracker.restart.recover false 充许任务管理器恢复时采用的方式
28 mapred.jobtracker.job.history.block.size 3145728 作业历史文件块的大小为3M
29 mapreduce.job.split.metainfo.maxsize 10000000 分隔元信息文件的*大值是10M以下

 

30 mapred.jobtracker.taskScheduler org.apache.hadoop.mapred.JobQueueTaskScheduler 设定任务的执行计划实现类
31 mapred.jobtracker.taskScheduler.maxRunningTasksPerJob   作业同时运行的任务数的*大值
32 mapred.map.max.attempts 4 Map任务的重试次数
33 mapred.reduce.max.attempts 4 Reduce任务的重试次数
34 mapred.reduce.parallel.copies 5 在复制阶段时reduce并行传送的值。
35 mapreduce.reduce.shuffle.maxfetchfailures 10 取map输出的*大重试次数
36 mapreduce.reduce.shuffle.connect.timeout 180000 REDUCE任务连接任务管理器获得map输出时的总耗时是3分钟

 

37 mapreduce.reduce.shuffle.read.timeout 180000 REDUCE任务等待map输出数据的总耗时是3分钟
38 mapred.task.timeout 600000 如果任务无读无写时的时间耗时为10分钟,将被终止
39 mapred.tasktracker.map.tasks.maximum 2 任管管理器可同时运行map任务数为2
40 mapred.tasktracker.reduce.tasks.maximum 2 任管管理器可同时运行reduce任务数为2
41 mapred.jobtracker.completeuserjobs.maximum 100 当用户的完成作业数达100个后,将其放入作业历史文件中
42 mapreduce.reduce.input.limit -1 Reduce输入量的限制。
43 mapred.job.tracker.retiredjobs.cache.size 1000 作业状态为已不在执行的保留在内存中的量为1000
44 mapred.job.tracker.jobhistory.lru.cache.size 5 作业历史文件装载到内存的数量
45 mapred.child.java.opts -Xmx200m 启动task管理的子进程时的内存设置
46 mapred.child.env   子进程的参数设置
47 mapred.child.ulimit   虚拟机所需内存的设定。
48 mapred.cluster.map.memory.mb -1  
49 mapred.cluster.reduce.memory.mb -1  
50 mapred.cluster.max.map.memory.mb -1  
51 mapred.cluster.max.reduce.memory.mb -1  
52 mapred.job.map.memory.mb -1  
53 mapred.job.reduce.memory.mb -1  
54 mapred.child.tmp /tmp Mr任务信息的存放目录
55 mapred.inmem.merge.threshold 1000 内存中的合并文件数设置
56 mapred.job.shuffle.merge.percent 0.66  
57 mapred.job.shuffle.input.buffer.percent 0.70  
58 mapred.job.reduce.input.buffer.percent 0.0  
59 mapred.map.tasks.speculative.execution true Map任务的多实例并行运行标识
60 mapred.reduce.tasks.speculative.execution true Reduce任务的多实例并行运行标识
61 mapred.job.reuse.jvm.num.tasks 1 每虚拟机运行的任务数
62 mapred.min.split.size 0 Map的输入数据被分解的块数设置
63 mapred.jobtracker.maxtasks.per.job -1 一个单独作业的任务数设置
64 mapred.submit.replication 10 提交作业文件的复制级别
65 mapred.tasktracker.dns.interface default 任务管理跟踪器是否报告IP地址名的开关
66 mapred.tasktracker.dns.nameserver default 作业和任务管理跟踪器之间通讯方式采用的DNS服务的主机名或IP地址
67 tasktracker.http.threads 40 http服务器的工作线程数量
68 mapred.task.tracker.http.address 0.0.0.0:50060 任务管理跟踪器的http服务器的地址和端口
69 keep.failed.task.files false 失败任务是否保存到文件中

 

70 mapred.output.compress false 作业的输出是否压缩
71 mapred.output.compression.type RECORD 作业输出采用NONE, RECORD or BLOCK三种方式中一种压缩的写入到流式文件
72 mapred.output.compression.codec org.apache.hadoop.io.compress.DefaultCodec 压缩类的设置
73 mapred.compress.map.output false Map的输出是否压缩
74 mapred.map.output.compression.codec org.apache.hadoop.io.compress.DefaultCodec Map的输出压缩的实现类指定
75 map.sort.class org.apache.hadoop.util.QuickSort 排序键的排序类指定
76 mapred.userlog.limit.kb 0 每个任务的用户日志文件大小
77 mapred.userlog.retain.hours 24 作业完成后的用户日志留存时间为24小时
78 mapred.user.jobconf.limit 5242880 Jobconf的大小为5M
79 mapred.hosts   可与作业管理跟踪器连接的主机名
80 mapred.hosts.exclude   不可与作业管理跟踪器连接的主机名
81 mapred.heartbeats.in.second 100 作业管理跟踪器的每秒中到达的心跳数量为100
82 mapred.max.tracker.blacklists 4 任务管理跟踪器的黑名单列表的数量
83 mapred.jobtracker.blacklist.fault-timeout-window 180 任务管理跟踪器超时180分钟则訪任务将被重启
84 mapred.jobtracker.blacklist.fault-bucket-width 15  
85 mapred.max.tracker.failures 4 任务管理跟踪器的失败任务数设定
86 jobclient.output.filter FAILED 控制任务的用户日志输出到作业端时的过滤方式
87 mapred.job.tracker.persist.jobstatus.active false 是否持久化作业管理跟踪器的信息
88 mapred.job.tracker.persist.jobstatus.hours 0 持久化作业管理跟踪器的信息的保存时间
89 mapred.job.tracker.persist.jobstatus.dir /jobtracker/jobsInfo 作业管理跟踪器的信息存放目录
90 mapreduce.job.complete.cancel.delegation.tokens true 恢复时是否变更领牌
91 mapred.task.profile false 任务分析信息是否建设标志
92 mapred.task.profile.maps 0-2 设置map任务的分析范围
93 mapred.task.profile.reduces 0-2 设置reduce任务的分析范围
94 mapred.line.input.format.linespermap 1 每次切分的行数设置
95 mapred.skip.attempts.to.start.skipping 2 在跳转模式未被设定的情况下任务的重试次数
96 mapred.skip.map.auto.incr.proc.count true MapRunner在调用map功能后的增量处理方式设置
97 mapred.skip.reduce.auto.incr.proc.count true 在调用reduce功能后的增量处理方式设置
98 mapred.skip.out.dir   跳过记录的输出目录
99 mapred.skip.map.max.skip.records 0  
100 mapred.skip.reduce.max.skip.groups 0  
101 job.end.retry.attempts 0 Hadoop偿试连接通知器的次数
102 job.end.retry.interval 30000 通知偿试回应的间隔操作为30秒
103 hadoop.rpc.socket.factory.class.JobSubmissionProtocol   指定与作业跟踪管理器的通讯方式,缺省是采用rpc方式
104 mapred.task.cache.levels 2 任务缓存级别设置
105 mapred.queue.names default 分隔作业队例的分隔符设定
106 mapred.acls.enabled false 指定ACL访问控制列表
107 mapred.queue.default.state RUNNING 定义队列的状态
108 mapred.job.queue.name default 已提交作业的队列设定
109 mapreduce.job.acl-modify-job   指定可修改作业的ACL列表
110 mapreduce.job.acl-view-job   指定可浏临作业的ACL列表
111 mapred.tasktracker.indexcache.mb 10 任务管理跟踪器的索引内存的*大容器
112 mapred.combine.recordsBeforeProgress 10000 在聚合处理时的记录块数

 

113 mapred.merge.recordsBeforeProgress 10000 在汇总处理时的记录块数
114 mapred.reduce.slowstart.completed.maps 0.05  
115 mapred.task.tracker.task-controller org.apache.hadoop.mapred.DefaultTaskController 任务管理器的设定
116 mapreduce.tasktracker.group   任务管理器的组成员设定
117 mapred.healthChecker.script.path   脚本的*对路径指定,这些脚本是心跳服务的
118 mapred.healthChecker.interval 60000 节点心跳信息的间隔
119 mapred.healthChecker.script.timeout 600000  
120 mapred.healthChecker.script.args   参数列表

 

121 mapreduce.job.counters.limit 120 作业计数器的*小值

org.apache.hadoop.io

1.下面是主要的类层次图

%title插图%num

2.Writable和WritableComparable的子类们基本大同小异

%title插图%num

3.RawComparator和WritableComparator

举例如下,以下以text类型的comparator每个字符从高到低位比较,对于数字类型的字符串也是比较适用的
/** A WritableComparator optimized for Text keys. */
public static class Comparator extends WritableComparator
{
    public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
    {
        int n1 = WritableUtils.decodeVIntSize(b1[s1]);
        int n2 = WritableUtils.decodeVIntSize(b2[s2]);
        return compareBytes(b1, s1 + n1, l1 - n1, b2, s2 + n2, l2 - n2);
    }
}

4.Text类应用广泛,值得仔细看下

5.*InputBuffer和*OutputBuffer

6.Hadoop 数据类型与文件结构 Sequence, Map, Set, Array, BloomMap Files

1.Hadoop’s SequenceFile

%title插图%num

SequenceFile 是 Hadoop 的一个重要数据文件类型,它提供key-value的存储,但与传统key-value存储(比如hash表,btree)不同的是,它是appendonly的,于是你不能对已存在的key进行写操作。每一个key-value记录如下图,不仅保存了key,value值,也保存了他们的长度。

%title插图%num

SequenceFile 有三种压缩态:

  1. Uncompressed – 未进行压缩的状态
  2. Record Compressed – 对每一条记录的value值进行了压缩(文件头中包含上使用哪种压缩算法的信息)
  3. Block-Compressed – 当数据量达到一定大小后,将停止写入进行整体压缩,整体压缩的方法是把所有的keylength,key,vlength,value 分别合在一起进行整体压缩

文件的压缩态标识在文件开头的header数据中。

在header数据之后是一个Metadata数据,他是简单的属性/值对,标识文件的一些其他信息。Metadata 在文件创建时就写好了,所以也是不能更改的。

%title插图%num

2.MapFile, SetFile, ArrayFile 及 BloomMapFile

SequenceFile 是Hadoop 的一个基础数据文件格式,后续讲的 MapFile, SetFile, ArrayFile 及 BloomMapFile 都是基于它来实现的。

  • MapFile – 一个key-value 对应的查找数据结构,由数据文件/data 和索引文件 /index 组成,数据文件中包含所有需要存储的key-value对,按key的顺序排列。索引文件包含一部分key值,用以指向数据文件的关键位置。
  • SetFile – 基于 MapFile 实现的,他只有key,value为不可变的数据。
  • ArrayFile – 也是基于 MapFile 实现,他就像我们使用的数组一样,key值为序列化的数字。
  • BloomMapFile – 他在 MapFile 的基础上增加了一个 /bloom 文件,包含的是二进制的过滤表,在每一次写操作完成时,会更新这个过滤表

7.值得提一下binary stream with zero-compressed encoding

  /**  
   * Serializes a long to a binary stream with zero-compressed encoding.  
   * For -112 <= i <= 127, only one byte is used with the actual value.  
   * For other values of i, the first byte value indicates whether the  
   * long is positive or negative, and the number of bytes that follow.  
   * If the first byte value v is between -113 and -120, the following long  
   * is positive, with number of bytes that follow are -(v+112).  
   * If the first byte value v is between -121 and -128, the following long  
   * is negative, with number of bytes that follow are -(v+120). Bytes are  
   * stored in the high-non-zero-byte-first order.  
   *   
   * @param stream Binary output stream  
   * @param i Long to be serialized  
   * @throws java.io.IOException   
   */  
  /*   
   * 将一个long类型的i,写入输出流DataOutput中  
   * 如果 -112 <= i <= 127,只使用一个byte表示i并写入输出流中  
   * *个字节表示i的正负和接下来表示i的字节数  
   * 如果*个字节-113 <= v <= -120,那么i是正数,并且接下来i占的字节数是-(v+112)(也就是1到8个字节之间)  
   * 如果*个字节-121 <= v <= -128,那么i是负数,并且接下来的i占的字节数是-(v+120)(也就是1到8个字节之间)  
   * 写入时先写i的高位,再写低位  
   *   
   */  
  public static void writeVLong(DataOutput stream, long i) throws IOException {   
    if (i >= -112 && i <= 127) {   
      stream.writeByte((byte)i);   
      return;   
    }   
         
    int len = -112;   
    if (i < 0) {   
      i ^= -1L; // take one's complement'   
      len = -120;   
    }   
         
    long tmp = i;   
    while (tmp != 0) {   
      tmp = tmp >> 8;   
      len--;   
    }   
         
    stream.writeByte((byte)len);   
         
    len = (len < -120) ? -(len + 120) : -(len + 112);   
         
    for (int idx = len; idx != 0; idx--) {   
      int shiftbits = (idx - 1) * 8;   
      long mask = 0xFFL << shiftbits;   
      stream.writeByte((byte)((i & mask) >> shiftbits));   
    }   
  }
这种编码方式的有点是照顾了*大多数能够使用一个byte编码的数字,*大的缺点是,两个byte所能编码的数字少了很多,并且两个byte以上长度的编码效率都下降了。

8.参考url

能否利用Hadoop搭建完整的云计算平台

Hadoop并不完全代表云计算,所以,要用Hadoop搭建完整的云计算平台,答案是不够。我们常说云计算,实际上还是通过计算机的大规模或者 说海量处理来为生活中各式各样的人和各行各业服务——所以,核心在“服务”。关于服务,展开来就是常用的那3种(也是事实上的标 准):SaaS,PaaS,IaaS。对云计算来说,公有和私有,虚拟和存储,这其实是相对讨论的核心。

回头说Hadoop。在Google三大论文的直接刺激下,Hadoop社区兴起,而在众多的开源实现中,Hadoop(主项目)可以说是所有已知云计算方面开源项目的一个Top项目。

云计算中有哪些构件?发展到目前的技术与规模,并没有一个确切的定论,今天的说的话明天可能就不一样了。但对Hadoop来说,实现了的部分,就是大部分企业在不断发展中所遇到的大部分问题。直接上图:
%title插图%num

从整体生态系统的角度,从底层存储,到中间的计算模型和框架,再到上层的逻辑处理和流、显示,都有相应开源的实现。这就是你说的构件了。

包括我们看到的Hadoop2.0中,引入的新的处理框架,Spark,Storm,YARN(取代MR),都是Hadoop生态系统的完善与实现。

Hadoop实现的是在简易硬件的基础上进行尽量高可用性海量计算与处理的中上层模型。Hadoop处理了存储(也只是一部分),虚拟化是没有涉 及的,而底层硬件Hadoop也是不涉及的,不管是Hadoop还是其他的项目,只是在软件的层面想通过纵向或者横向的拓展解决所有的问题是不现实的。 Hadoop在硬件这方面,只是在实现中预留或者接入硬件特性,也就是在虚拟化这方面Hadoop只是个“APP”,不是“始作俑者”(用词不当了)。

那么,完整的云计算平台呢?

按照企业级来说,是要看具体的企业方向和企业类型的,包括IBM和VMware都有提供不同的解决方案。大致上一定是由单点–>集群 –>多层(准分布式)–>硬件–>分布式(地域分布)来解决的。具体到Hadoop体系的技术,直接去对应上图就好了。

从云计算这个概念出现到今天,资料可以说“浩如烟海”了,但很多资料只是互相复制黏贴,并没有说到云计算的核心。我想提出的一个观点是,完整的云计算平台,依赖的是业务,提供的是存储与支持。

没有业务需求而是照搬网上的资料或者自认为“活用”了某些技术,都可能只是“娱人娱己”。我们看一下互联网负载均衡技术是如何发展的就就更容易理解云计算:

客户端缓存–>CDN缓存–>Apache&Nginx静态页面缓存–>PHP和Java动态内存 –>Memcache&Other Nosql–>Mysql&Oracle–>HDFS&Other Big Table

从技术的角度看,所有问题解决起来都是层次化的(大家肯定都有写Demo吧),都是根据不同的需求引入不同的技术,在单层单点乃至集群都无法解决 问题的时候,新的计算框架,云计算与网格计算乃至动画需要的大规模渲染都在需要的时候顺理成章的引入。总之,完整的云计算平台,对于不同的公司业务都是不 同的,拿腾讯来说,平台的组件多如牛毛,“平台”只是提供*基础的服务:存储与支持,其他的都需要业务根据自身的特点在其上进行构建(相信大公司都是有自 己的完整方案的,这里我就不能再说了……),至于提高什么样级别的这种“服务”,就要看公司的业务规模,需要支撑的体系,乃至公司的决策战略了等等

原文链接:
http://www.open-open.com/solution/view/1426725577820

探索网络虚拟世界的“藏宝图”!网络空间地图技术与市场分析

随着全球信息化的发展,网络已经覆盖人类生产和生活的诸多领域。特别是近年来,5G网络、大数据、人工智能(AI)、物联网等新兴信息技术迅速普及和推广,进一步推动物理空间的信息化和网络化。网络空间(Cyberspace)逐渐成为物理空间的全息映射,成为继“陆海空天”后的第五大疆域。2016年12月发布的《国家网络空间安全战略》指出,网络空间由互联网、通信网、计算机系统、自动化控制系统、数字设备及其承载的应用、服务和数据等组成。网络空间所承载的分布广阔、数量庞大的信息资产,蕴藏着无数“瑰宝”,正不断激发人类的探索欲望。

没有网络安全就没有国家安全。2016年4月19日,*总书记在“网络安全和信息化工作座谈会上的讲话”中强调,“感知网络安全态势是*基本、*基础的工作。要全面加强网络安全检查,摸清家底,认清风险,找出漏洞,通报结果,督促整改”。由于网络空间包含的信息量巨大,结构复杂,探索网络空间迫切需要一个与百度地图、高德地图类似的工具,将网络世界中的“一草一木”有效标识出来。基于网络空间地图提供的方向标,人们便可按图索骥,快速寻觅到“宝藏”。

%title插图%num

网络空间地图的概念和特点

网络空间地图是一种基于系列测绘技术, 反映网络空间中各种信息实体的地理位置、逻辑关系、通联结构及变化状态的可视化地图。狭义的网络空间地图主要基于IP地址或物理节点展示网络对象与地理坐标的对应关系,强调其物理空间的归属性;而广义上的网络空间地图则更加立体,具有多层次、多维度特点,可以将传输网、IP网、设备组成、系统服务、业务通联、安全动态乃至社交热点等跨越物理域、逻辑域、认知域的信息进行有机组织、分层叠加投射至地图之上。

那么,对于用户来说,什么是网络空间地图应该具备的优秀特质呢?类似物理空间地图效果,网络空间地图也应具备准确、高清的特点,能够准确标识出信息资产的地理属性、网络属性、应用属性乃至社会属性,拥有良好的人机接口,面向不同用户呈现信息资产的多维画像。此外,由于网络空间瞬息万变,信息资产*易受到外部条件的触发而发生改变。静态信息无法反映出信息资产的多变状态,有时甚至会造成对信息资产客观情况的扭曲,所以优秀的网络空间地图还应具物理空间地图所不具备的时效性和动态性,及时、客观地反映出信息资产的*新特征。

%title插图%num

网络空间地图依托的实现技术

人们主要通过网络空间测绘手段来得到网络空间地图。网络空间测绘的概念*初源自物理空间的地理测绘学,专门指对地理环境中实体对象的空间结构特征进行概括和抽象,并对其空间位置进行测量和绘制。网络空间测绘是地理测绘在网络空间的拓展,主要指的是对网络空间中各种信息资产的地理位置信息和网络信息进行主动或被动方式的探测、采集与分析,并以此来建立设备的相互关系索引,描绘网络逻辑连接关系,从而帮助用户掌握网络空间中各种信息资产的实时动态。

网络空间测绘使用到的技术通常包括网络探测扫描技术、协议分析技术、IP定位技术、拓扑测量技术、大数据分析与存储技术、网络可视化技术和漏洞扫描验证技术等。

(一)网络测量和协议分析技术

网络空间有约40亿IPv4地址空间和几乎无限多的IPv6地址空间,这些地址分布于全球各地,是网络通联和信息服务的基础,与IPv4/IPv6地址相对应的是域名地址,全球已注册域名超过3亿,并以每年超1千万的数量增长。如此庞大的IP地址空间和域名空间是网络空间组成节点的“门牌号”,需要大量探针基于这些“门牌号”去访问、识别和记录海量节点的信息要素。

网络探测和协议分析是探针的关键技术,其工作过程通常分为三个阶段:

一是利用已知地址集或通过地址推测算法,基于TCP/IP协议快速探测目标IP和端口服务的存活性;

二是基于协议特征或应用服务特征(指纹库),与目标端口服务进行尝试交互,识别服务类型和基本属性(例如,设备型号、操作系统类型、应用软件版本等);

三是基于协议深度交互,获取目标深层信息(例如,组件结构、漏洞信息、归属信息等)。

因此,网络探测和协议分析是获取网络空间信息资产的主要手段,其能力直接影响网络空间地图的全面性和准确性。

(二)漏洞扫描和验证技术

漏洞扫描和验证是基于漏洞特征或机理,主动开展信息采集和协议交互的漏洞识别技术,是发现威胁进而及时处置威胁的重要技术。对于新爆发的漏洞,传统漏洞扫描主要在更新规则策略后对指定资产开展一次全新的漏洞检查,这对于局域网或小范围的网络较为有效,但对国家范围或互联网范围的节点进行漏洞排查则过于缓慢。

网络空间地图对漏洞的检查充分利用了大数据能力,通过提前获取系统特征,在新漏洞爆发时先对历史数据进行快速比对,然后利用大量分布式节点对筛选出的可疑目标进行快速漏洞验证,可以确保在1-Day内大范围摸清漏洞的分布与影响。

(三)拓扑测量技术

网络拓扑即网络互联结构,如同地球上四通八达的交通图,需全面监测和有效掌握。全球互联网由一个个自治系统(Autonomous System,简称AS)连接而成,每个自治系统在全球有一个唯一编号(ASN),对应某个管理机构控制下的路由器和网络群组,即分支众多的路由节点和数量庞大的IP地址。这些AS自治域、路由节点、IP地址组成了全球互联Internet网络拓扑。

全球目前共分配17.6万多个AS自治系统号,遍布240个国家和地区。其中,中国所分配的AS自治系统号码数超过2800个。

网络空间拓扑测量主要基于Ping、Traceroute、SNMP、ARP、DNS和NETCONF等探测技术,以及公开信息采集和开源情报辅助等手段,对全球及指定国家、区域、网段进行拓扑探测和绘制,构建包括AS级、POP级、路由器级、IP接口级的网络拓扑,支撑实现对网络拓扑的分层、分区域显示。拓扑测量需要一定规模的分布式节点群对全球互联网开展持续监测,其中算法复杂,数据存储与运算量大,还有不少技术需不断深化。

(四)IP定位技术

世界各国的IP地址空间由全球互联网名称与数字地址分配机构(ICANN)进行分配,目前IPv4空间已于2011年分配完毕,而IPv6地址空间足够各国长期使用。受制于路由器部署位置、路由表的信息量和更新频率,*大多数情况下,各国的IP地址分配会与地理区域相关。

因此,采集IP地址与地理位置对应关系后,可基于IP地址查询其所对应位置,或基于地理区域查询包含的IP地址集合。IP定位库将网络空间地址与地理空间地址建立了关联,对统计、监管甚至网络犯罪侦查等应用领域非常重要,也是网络空间地图所依赖的重要资源库。

国内外有专门的厂商基于路由探测、情报分析等手段采集IP定位信息,并以数据服务方式提供用户使用。出于隐私考虑,这些IP定位信息精度相对较粗,很难达到街道级别,但可以适应大部分应用情况,例如,网络客户地理位置统计、城市内IP资产统计等。

更高精度的IP定位,需要基于主被动采集、WiFi热点采集、GPS关联、多点定位等多手段融合获得精准数据,应在法律允许范围内开展相关业务。

(五)知识图谱分析

多源网络空间资产数据的语义模型构建、语义数据采集和存储,在此基础上建立网络空间核心资产的知识图谱,形成基于知识图谱的网络空间资产指纹库;同时构建异构多源的网络空间资产数据上下文的标准化描述、语义建模及上下文语义查询和推理引擎,实现基于上下文语义的精确资产数据源搜索,定位和网络资产数据源的动态绑定机制。

核心在于对多模、多源异构数据和多维复杂关系的高效处理与可视化展示,将测绘数据和社会数据进行深度挖掘,通过数据融合分析,用数学模型直接表示的关联属性,融合成一张以关系为纽带的数据网络。通过对关系的挖掘与分析,能够找到隐藏在行为之下的关联,并进行直观的展示。

(六)大数据存储与分析技术

网络空间由海量节点组成,其信息量和处理模式是典型的大数据特点,网络空间地图对网络与节点的深层挖掘、关联分析、漏洞发现等都需要大数据加持。在存储方面,由于每日需存储数千万条探测数据,同时开展内容检索、深度挖掘与综合分析等复杂任务,这对数据的存储和管理构成较大挑战,为满足大容量、准实时、高吞吐等性能要求,需要在分布式存储、分布式检索等方面持续优化。

在大数据分析方面,为了找寻数据间的关联,需要对不同类型的数据内容进行检索、深度挖掘和综合分析。建模是大数据分析技术的核心工作,主要是选择和应用各种数学模型,同时对模型参数和输入变量进行校准调优,在生成*终的数据集后,用构建好的模型进行聚类分析。在对数据作进一步归类和统计的基础上,*终建立资源画像和资源间的关联关系,形成指纹信息库、地理信息库、威胁情报库和漏洞库等知识库。

(七)网络可视化技术

网络可视化技术可基于网络探测和大数据分析的结果,综合运用信息处理与图形图像展示手段,将网络空间中抽象化的信息资产和逻辑关系映射为网络空间的全息地图,在归类、统计、分层等基础上通过丰富的图形化手段直观展示网络空间的物理链路、逻辑拓扑、资产画像、流量内容、安全态势等多维度信息,为摸清资产分布、掌握漏洞信息、感知趋势变化、支撑指挥决策等提供重要手段。

%title插图%num

网络空间地图的应用场景

网络空间地图的使用比较广泛,大可以覆盖整个互联网,作为网络空间的“地形图”,服务于国家安全和相关监管部门,为互联网资产监测提供支撑;小可以深入企业内网,充当“建筑结构图”,以SaaS方式服务于广大有资产管理需求的企业组织,为IT资产的有效管理提供支持。具体来说,网络空间地图的应用场景包括以下多方面:

(一)网络战中的沙盘推演

在传统军事作战中,作战地图是分析地形地貌、判断敌我态势、实施兵力部署和辅助指挥作战的重要工具。当下,网络空间已成为新的军事竞技场,地图在网络空间作战中赋予了新的使命和意义。网络跨越国界联接世界各地,信息光速可达,网络攻击转瞬完成。

而要在网络空间形成一招制胜的攻击能力或构筑坚如铜墙铁壁的防御能力,则需要有全局的洞察能力和深层信息的刺探能力。网络空间地图是国家之间、组织之间开展网络攻防的态势底图,是构建陆海空天联合的立体作战视图的基础。网络中的信息中枢、关键设施、防御要隘、可用资源等都可通过网络空间地图系统深度感知和有效标识,为沙盘推演、排兵布阵、态势掌控、指挥作战提供重要支撑。

(二)互联网安全监管中的“挂图作战”

“挂图作战”是通过直观的图表形式来将计划的实施方案、工作流程和执行进度等内容呈现出来,用于指导计划具体实施过程的工作方式,是一种类似作战的快速响应行动方式。由于其具备直观性和客观性,方便任务进展跟踪,一些重大项目(例如,灾害防治、环保监测等)纷纷借鉴了这种工作方式,在趋势研判和指挥调度中成效显著。

近年来,随着信息化、网络化全面推广,网络监管和安全保障越来越重要,各地相关部门纷纷开始筹建用于互联网安全监管的“挂图作战”指挥平台。网络空间地图对全局资产的信息采集及对网络安全态势的展现效果与“挂图作战”思路不谋而合,这为其在互联网安全监管业务中的应用提供了广阔的舞台。

通过网络空间地图,资产标识、漏洞分布、安全影响一目了然,一旦爆发安全漏洞或攻击,监管方便能及时收到预警,看到相关目标和坐标,并据此迅速开展应急响应办法。

(三)关键基础设施保护与IT资产管理

IT资产是指计算设备、信息系统、网络、软件、虚拟计算平台以及相关硬件等。IT资产管理的核心是要跟踪、审计和监控IT资产全生命周期状态。不同于静态的物理资产,信息资产在整个生命周期中的状态通常在不断变化,仅依靠人工统计,显然跟不上信息资产的变化速度。

对于IT资产规模庞大且部署分散的组织,IT资产管理难度很大,特别是对国家关键基础设施的监管更是一个大的工程挑战。*优化利用和分配现有IT资产,方可*大限度地保护信息技术上的投资,而这种决策离不开高价值的战略情报。基于网络空间地图勾勒出的信息资产“全息”样貌,决策者就可以从全局视角把握资产属性、运行状态和发展趋势,减少资产管理决策活动的不确定性。

同时,网络空间地图还可以与相关安全系统做深度整合,在典型的IT资产生命周期中,充分发挥其对动态信息资产的跟踪效能,及时捕捉信息资产在全生命周期任一阶段出现的异常情况,辅助开展IT资产的脆弱性管理和风险控制,并*终实现IT资产的安全运营。

(四)物联网资产监控管理

物联网技术爆发已让万物互联成为现实。智能摄像头、车联网、充电桩、智能电表/水表开始遍布世界的各个角落。物联网资产监控管理首先要解决的是安全问题。物联网的部署特点和低功耗要求,使其安全较为薄弱,例如,连接内网的室外摄像头、地处偏僻位置的ATM机、客源稀少的自动贩卖机等,都可能成为黑客入侵整个系统的着力点,增大了信息被窃取的机会,甚至有业务瘫痪的风险。为此,运营者需要通过网络空间地图探测并持续更新所有物联网资产的准确清单,在此基础上,识别和解决与资产的安全漏洞。

此外,网络空间地图展现的物联网资产全网分布情况,也能给厂商制定市场竞争策略提供高价值的战略情报,从而有重点地选择市场投放区域。

(五)数字孪生及智慧城市感知与运营

作为一种实现信息化与城镇化深度融合的城市信息化高级形态,智慧城市基于城市的精细化和动态管理,*大提升了城市运营效率,改善了市民生活质量。智慧城市是由数据驱动的,其建设与运营依托通信网、IPv6网、物联网、云计算、大数据等新一代IT技术实现的泛在互联和全面感知。

网络空间地图可以成为智慧城市感知和运营的基础,其作用主要体现如下:

*,保证信息资产的能见度。智慧城市中不断增加的托管资产和物联网设备是管理难题,网络空间地图可以帮助识别环境中的所有资产,深入感知信息资产所处的IT环境状况,了解它们当前所处的生命周期阶段以及如何影响业务,管控风险,提升安全。

第二,有助于制定资产管理计划。网络空间地图可以提高智慧城市的运营效率,便于跟踪和展示IT资产,并为漏洞发现、威胁感知、事件响应、故障排除等问题提供解决方案支撑,管理者可以基于网络空间地图获取相关状态信息来推进资产管理计划。

第三,有助于保证合规性。网络空间地图可以监视网络中的硬件和软件组件,检查是否安装了未经授权的软件或硬件,帮助管理者为审核做好准备,从而有效降低法律风险。

第四,有助于控制IT成本。网络空间地图提供的资产数据有助于资产利用率分析和预算规划,帮助智慧城市*大限度地提高现有资产利用率,优化资产使用并控制IT资产采购支出。

%title插图%num

网络空间地图的市场应用前景

网络空间地图是构建数字世界的必备的基础技术能力,随着其被广泛应用到多种领域,未来将继续探索更多的可能性。那么,网络空间地图的市场空间究竟是怎样的?其成长潜力有多大?这实际上取决于智慧城市、IT管理、物联网以及网络安全等相关产业的投资规模和发展前景。

由于国内政策红利已得到释放,市场资金大量涌入智慧城市、IT运维管理、物联网和网络安全等新兴产业。有数据显示,2019年我国智慧城市市场规模估计已突破10万亿元,我国网络安全市场规模同期约为478亿元;2020年IT运维管理市场规模将达到2690亿元左右,物联网市场规模同期也将突破2万亿元。考虑到市场重叠因素,保守估计,目前新兴市场总体规模已超过10万亿元。

这些产业蕴含着巨大的IT资产管理和网络空间地图的市场机会,当前保守估计,网络空间地图至少已经存在3到5亿元的市场需求量。未来几年随着相关产业的全面崛起,网络空间地图市场将快速走向成熟,有望进一步被放大到数十亿元的规模。作为连接网络虚拟空间和物理空间的桥梁,网络空间地图的未来可期,潜力无限!

Hadoop分布式和伪分布式下NameNode和DataNode的分布

今天布置了有关hadoop分布式与伪分布式的作业,经过资料的查询,了解了很多概念,以下为整理的相关信息。

概念的理解:
(1)分布式
利用分而治之的思想:
随着数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统(HDFS)。

(2)伪分布式
Hadoop的伪分布式:
伪分布式就是假分布式,假就假在只有一台机器而不是多台机器来完成一个任务,但是模拟了分布式的这个过程,所以伪分布式下Hadoop也就是虽然在一个机器上配置了hadoop的所有节点,但伪分布式完成了所有分布式所必须的事件。伪分布式Hadoop和单机版*大区别就在于需要配置HDFS。

Hadoop伪分布式模式是指在一台机器上同时启动NameNode,DataNode, JobTracker, TaskTracker等进程(一般都是1个),并没有真正分布到集群内的不同机器上,所以这种模式叫伪分布式模式。

NameNode的组成:
Namenode整个内存结构大致可以分成四大部分:Namespace、BlockManger、NerworkTopology及其他;Namespace是维护整个文件系统的目录树结构及目录树上的状态变化;BlockManger维护整个文件系统中与数据块相关的信息及数据块的状态变化;NetworkTopology维护机架拓扑及Datanode信息,机架感知的基础;其他部分包括用以实现读写互斥同步的LeaseManger、支持集中式缓存管理的CacheManager、用于数据备份,回滚的SnapshotManager、管理HDFS安全访问的DelegationTokenSecretManager等。

如图:即为NameNode的有关组成部分:
————————————————
%title插图%num

NameNode的介绍:
(1)是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
(2)文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存*近一次checkpoint的时间
(3)以上这些文件是保存在linux的文件系统中。

(4)、NameNode是主节点,存储文件的元数据,如文件名,文件目录结构,文件属性(生成事件,副本数,文件权限),以及每个文件的块列表和块所在的DataNode信息等等。

(5)、Namenode是一个中心服务器,单一节点,负责管理文件系统的名字空间,以及客户端对文件的访问。文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过NameNode,只会询问它跟那个DataNode联系,否则NameNode会成为系统的瓶颈。副本存放在那些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时候NameNode尽量让用户先读取*近的副本,降低带块消耗和读取延时。NameNode全权管理数据块的复制。它周期性的从集群中每个DataNode接受心跳信号和块状态报告(Blocreport)。接受到心跳信号意味着该DataNode节点正常工作。块状态报告包含一个该DataNode上所有数据块的列表。
NameNode工作特点:
(1)Namenode始终在内存中保存metedata,用于处理“读请求”
(2)到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
(3)Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

DataNode的介绍:
DataNode是以块的形式存储数据,默认为128M。

(1)提供真实文件数据的存储服务。
(2)文件块(block):*基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
dfs.block.size
(3)不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
(4)Replication。多复本。默认是三个。hdfs-site.xml的dfs.replication属性。

(5)、DataNode在本地文件系统存储文件块数据,以及块数据的校验和。

(6)、DataNode,一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。DataNode启动后NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或者删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。集群运行中可以安全加入和退出一些机器。

以下为我的一些整理:
一、Hadoop分布式下Namenode和Datanode的分布
Namenode整个内存结构大致可以分成四大部分:Namespace、BlockManger、NerworkTopology及其他;Namespace是维护整个文件系统的目录树结构及目录树上的状态变化;BlockManger维护整个文件系统中与数据块相关的信息及数据块的状态变化;NetworkTopology维护机架拓扑及Datanode信息,机架感知的基础;其他部分包括用以实现读写互斥同步的LeaseManger、支持集中式缓存管理的CacheManager、用于数据备份,回滚的SnapshotManager、管理HDFS安全访问的DelegationTokenSecretManager等;Namenode常驻内存,主要被Namespase和BlockManager使用,其他部分内存开销较小且相对固定。
Datanode以块的形式存储数据,一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,另一个是元数据(包括数据块的长度,块数据的校验和,时间戳);
Namenode周期性的从集群中的每个datanode接受心跳信号和块状态报告。而datanode会周期性的向namenode上报所有的块信息。
Namenode和Datanode以管理结点-工作结点模式运行,一个namenode结点和多个datanode结点,其中客户端(client)用户通过与namenode和datanode交互来访问整个文件系统,客户端提供了一些列的文件系统接口。
其中NameNode和secondary namemode、jobtracker运行在Master节点上,而DataNode和TaskTracker在Slave节点上。

二、Hadoop伪分布式下Namenode和Datanode的分布:
伪分布式就是一个机器既当namenode又当datanode;
Namenode、Datanode和JobTracker、TaskTracker等进程在一台机器上同时启动,并没有真正分布到集群内的不同机器上。
————————————————

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速