`

第七章:小朱笔记hadoop之源码分析-hdfs分析 第二节:fs抽象文件系统实现

 
阅读更多

第七章:小朱笔记hadoop之源码分析-hdfs分析

第二节:fs抽象文件系统实现

        在Hadoop框架源代码org.apache.hadoop.fs包中,都是关于Hadoop文件系统实现的相关类,主要包括文件系统模型的建立,及其在该文件系统定义、实现基本的文件操作。例如给出文件系统抽象,对文件系统上存储的文件执行基本操作进行抽象。
       FileSystem类:
     (1)实现了文件系统的抽象类,继承自org.apache.hadoop.conf.Configured,并实现Closeable接口,可以适用于多种 文件系统,如本地文件系统file://,ftp,hdfs等。如果要自己实现一个系统可以通过继承这个类(hadoop中 DistributeFileSystem就是这样的),做相应的配置,并实现相应的抽象方法。

     (2)抽象类定义了文件系统所具有的基本特征和基本操作。首先从该抽象类的属性定义来看,这些属性描述了文件系统的静态特性。该类中定义了如下属性:

 

 /****************************************************************
 * An abstract base class for a fairly generic filesystem.  It
 * may be implemented as a distributed filesystem, or as a "local"
 * one that reflects the locally-connected disk.  The local version
 * exists for small Hadoop instances and for testing.
 *
 * <p>
 *
 * All user code that may potentially use the Hadoop Distributed
 * File System should be written to use a FileSystem object.  The
 * Hadoop DFS is a multi-machine system that appears as a single
 * disk.  It's useful because of its fault tolerance and potentially
 * very large capacity.
 * 
 * <p>
 * The local implementation is {@link LocalFileSystem} and distributed
 * implementation is DistributedFileSystem.
 * 
 * 
 * FileSystem抽象类继承自org.apache.hadoop.conf.Configured配置基类,实现了java.io.Closeable接口,通过这一点,可以了解到,
 * FileSystem抽象类作为一个文件系统的抽象定义,它是可配置的,也就是说可以通过指定的配置文件中的一些配置项来描述一个文件系统,
 * 实际上,最重要的配置类是org.apache.hadoop.conf.Configuration,org.apache.hadoop.conf.Configured中定义的方法就是对
 * org.apache.hadoop.conf.Configuration配置类进行设置或获取,满足一个基于org.apache.hadoop.conf.Configuration配置类的其它类的需要。
 * FileSystem抽象类定义了文件系统所具有的基本特征和基本操作
 * 
 * 
 *****************************************************************/
  public abstract class FileSystem extends Configured implements Closeable {
  public static final String FS_DEFAULT_NAME_KEY = "fs.default.name";

  public static final Log LOG = LogFactory.getLog(FileSystem.class);

  /** FileSystem cache *//** 文件系统缓存 */  
  private static final Cache CACHE = new Cache();

  /** The key this instance is stored under in the cache.   该文件系统(this)在缓存中的键实例 */  
  private Cache.Key key;

  /** Recording statistics per a FileSystem class 记录文件系统类的统计信息的Map 
   * 
   * 上面statisticsTable是一个IdentityHashMap<Class<? extends FileSystem>, Statistics>,键是继承自FileSystem的Class,值是统计信息Statistics类。
   * 为了在一个并行计算环境中进行安全的计算,Statistics类使用了java.util.concurrent.atomic包中的原子变量属性,保证线程安全的原子读写操作的同时,提高并行性能
   * 
   * */
  private static final Map<Class<? extends FileSystem>, Statistics>  statisticsTable = new IdentityHashMap<Class<? extends FileSystem>, Statistics>();
  
  /**
   * The statistics for this file system.该文件系统(this)的统计信息的实例
   * 是对当前(this)的FileSystem的统计信息实例。该属性是在该文件系统(this)的实例被构造完成之后被初始化的,通过调用initialize方法实现统计信息初始化
   */
  protected Statistics statistics;

  /**
   * A cache of files that should be deleted when filsystem is closed
   * or the JVM is exited.当文件系统关闭或者JVM退出以后,需要将缓存中的文件清空。该Set<Path>中的内容是,对缓存中文件的Path,并且是排好序的
   */
  private Set<Path> deleteOnExit = new TreeSet<Path>();

......

}

 

2.1 cache机制

       在FileSystem中有一个静态cache类,内含一个 final Map<Key, FileSystem> map(为了能够快速获取FileSystem,这个map采用的是HashMap),用于存储和管理由{scheme,authority,username}作为Key,而以FileSystem引用作为值的键值对。当给定uri调用get获取指定的 FileSystem时,最终还是调用cache.get。cache.get会查找相应的键值对,不存在时调用createFileSystem新建一 个FileSystem并将其插入map中。当本FS关闭时,要将CACHE中对应的键值对删除。由于同一时刻可能要多个client请求访问map,所以需要对访问map的操作进行同步    synchronized(这些都要保证是thread-safe)。
      当关闭FS的时候(用户手动关闭或JVM在程序运行结束,ClientFinalizer对文件系统进行关闭),首先会调用cache的closeAll 方法,对map进行清空(先清空cache中其他FS的键值对,再清空本FS的键值对);然后再调用FS的processDeleteOnExit方法对 一些temp目录进行清空。
       Cache类
       用来缓存文件系统对象。也就是可能存在多个文件系统对象,从而可知,每个文件系统除了管理基于其上的内容之外,还可能要管理缓存的一组文件系统实例,这要看具体的文件系统是如何实现的。当然,也可能是在分布式环境中,一个文件系统管理远程的和本地的文件系统实例。
        为了能够快速获取到一个存在于缓存中的文件系统对象,Hadoop采用了Hash算法,将文件系统对象以键值对的方式存储到HashMap中,也就org.apache.hadoop.fs.FileSystem.Cache缓存类定义的map属性
       

Map<Key, FileSystem> map = new HashMap<Key, FileSystem>();

       Key是通过一个合法的URI信息与用户名快速获取到缓存中存在的一个文件系统的对象,从而能够获取到指定文件系统中文件信息。
      该缓存类提供了3个基本的操作,如下所示:

//根据URI与Configuration,从缓存中取出一个FileSystem实例,要求同步缓存操作
FileSystem get(URI uri, Configuration conf) throws IOException
//根据指定的缓存Key实例,从缓存中删除该Key对应的FileSystem实例,要求同步缓存操作。
synchronized void remove(Key key, FileSystem fs)
//迭代缓存Map,删除缓存中的缓存的全部文件系统实例,要求同步缓存操作。
synchronized void closeAll() throws IOException

 

2.2 statisticsTable统计信息管理映射表

        statisticsTable是一个IdentityHashMap<Class<? extends FileSystem>, Statistics>,用于保存并管理每个文件系统对应的统计信息Statistics

        Statistics类使用了java.util.concurrent.atomic包中的原子变量属性,保证线程安全的原子读写操作的同时,提高并行性能。如下所示:

        

    private final String scheme;
    private AtomicLong bytesRead = new AtomicLong();
    private AtomicLong bytesWritten = new AtomicLong();
    private AtomicInteger readOps = new AtomicInteger();
    private AtomicInteger largeReadOps = new AtomicInteger();
    private AtomicInteger writeOps = new AtomicInteger();

        其中,bytesRead是从统计数据中读取指定数量的字节,加到当前读取字节数上。同理,bytesRead是基于原子写操作的。

 

2.3 deleteOnExit临时文件集合

        FileSystemdeleteOnExit用于保存所有需要在本FS关闭时或JVM退出时需要删掉的文件集合,通过调用processDeleteOnExit将这些路径进行清空。

  /**
   * A cache of files that should be deleted when filsystem is closed
   * or the JVM is exited.当文件系统关闭或者JVM退出以后,需要将缓存中的文件清空。该Set<Path>中的内容是,对缓存中文件的Path,并且是排好序的
   */
  private Set<Path> deleteOnExit = new TreeSet<Path>();

 

for (Iterator<Path> iter = deleteOnExit.iterator(); iter.hasNext();) {

   Path path = iter.next();

   delete(path, true);

   iter.remove();

}

 

 

2.4 文件系统抽象

   从FileSystem抽象类“抽象”的切面横向了解一个FileSystem定义了哪些基于文件系统的操作,使我们能够知道如果实现一个基于文件系统,需要实现哪些基本操作。如下所示:

   

        /**获取能够唯一标识一个FileSystem的URI**/
  	public abstract URI getUri();
	/**根据给定的Path f,打开一个文件的FSDataInputStream输入流.f 待打开的文件,bufferSize缓冲区大小**/ 
  	public abstract FSDataInputStream open(Path f, int bufferSize)
	/** 
   	* 为写入进程打开一个FSDataOutputStream。 
   	* @param f 待写入的文件 
   	* @param permission 权限 
  	* @param overwrite 是否重写 
   	* @param bufferSize 缓冲区大小 
   	* @param replication 文件的块副本数量 
   	* @param blockSize 块大小 
   	* @param progress 用于报告Hadoop框架工作状况的进程 
   	* @throws IOException 
   	*/  
  	public abstract FSDataOutputStream create(Path f,FsPermission permission,boolean overwrite,int bufferSize,short replication,long blockSize,Progressable progress) throws IOException;

  	/** 
  	 * 向一个已经存在的文件中执行追加操作 
   	* @param f 存在的文件 
   	* @param bufferSize 缓冲区大小 
   	* @param progress 报告进程 
   	* @throws IOException 
   	*/  
  	public abstract FSDataOutputStream append(Path f, int bufferSize, Progressable progress) throws IOException;
  
 	/** 
   	 * 重命名文件src为dst 
   	*/  
 	public abstract boolean rename(Path src, Path dst) throws IOException;

  	/** 
   	* 删除文件 
   	*/  
  	public abstract boolean delete(Path f, boolean recursive) throws IOException;

        /** 
        * 如果f是一个目录,列出该目录中的文件 
        */  
  	public abstract FileStatus[] listStatus(Path f) throws IOException;

  	/** 
   	* 为给定的文件系统设置当前工作目录 
   	*/ 
  	public abstract void setWorkingDirectory(Path new_dir);

  	/** 
   	* 获取文件系统的当前工作目录 
   	*/  
  	public abstract Path getWorkingDirectory();

	/**
   	* 创建一个目录 
   	*/  
  	public abstract boolean mkdirs(Path f, FsPermission permission) throws IOException;

 

2.5 文件操作

       主要包括文件的创建、读写、重命名、拷贝、删除这几个基本操作:

        (1)目录创建

          

 //本地文件系统  默认权限
 public boolean mkdirs(Path f) throws IOException {
   		 return mkdirs(f, FsPermission.getDefault());
  }
		
 //分布式文件系统 需指定权限
  public static boolean mkdirs(FileSystem fs, Path dir, FsPermission 		 permission) throws IOException { 
    			boolean result = fs.mkdirs(dir);
    			fs.setPermission(dir, permission);
    			return result;
  }

 

 

        (2)文件创建

          文件的创建,主要是为了读或写操作而打开一个文件,返回文件的流对象,可以进行流式读写与追加。

          

public static FSDataOutputStream create(FileSystem fs,
      	Path file, FsPermission permission) throws IOException {
    			// create the file with default permission
   			 FSDataOutputStream out = fs.create(file);
    			// set its permission to the supplied one
    			fs.setPermission(file, permission);
    			return out;
}

        所有重载 create的方法均最终调用了publicabstract FSDataOutputStream create其中提供了多个create的重载函数。值得注意的是这个函数返回的是一个输出流 FSDataOutputStream(用于将本地的输出到FS(FileSystem,下同)(FileSystem) ),这个流继承自DataOutputStream,可以对文件进行写入。同时其内部还包含了一个静态类 PositionCache(用于保存一个文件的已写入数据的统计类和写入的位置)

 

        (3)读取文件

        

public FSDataInputStream open(Path f) throws IOException {
    			return open(f, getConf().getInt("io.file.buffer.size", 4096));
}

        FileSystemopen方法返回一个FSDataInputStream,实现了 SeekablePositionedReadable这两个接口,支持随机访问读取文件,可以通过指定开始读取的位置。

 

         (4)文件的复制、移动

          FileSystem中有两种复制:copyFromLocalFilecopyToLocalFile文件的移动可以看成是文件的复制再将源文件删除。故FileSystem中存在两种相应的文件移动操作moveFromLocalFilemoveToLocalFile。

(a)copyFromLocalFile
(b)copyToLocalFile
(c)moveFromLocalFile
(d)moveToLocalFile
 最终调用:

/** Copy files between FileSystems. */
 public static boolean copy(FileSystem srcFS, Path src, 
                             FileSystem dstFS, Path dst, 
                             boolean deleteSource,
                             Configuration conf) throws IOException {
    			return copy(srcFS, src, dstFS, dst, deleteSource, true, conf);
}

           FileUtil类 将会在下面的专题中详细讲解。

 

(5)获取块信息对于块,块是组成文件的基本单位,那么给定一个文件,它就应该具有一个块的列表,可以通过getFileBlockLocations方法获取到一个文件对应的块所在主机的列表、所在文件中的偏移位置等信息,返回一个BlockLocation[],它包含了主机名列表、偏移位置、文件大小的信息。

public BlockLocation[] getFileBlockLocations(FileStatus file, long start, long len) throws IOException {
		…..............
    		if (file.getLen() < start) {
      		return new BlockLocation[0];

    		}
    		String[] name = { "renrenzhuhui:50010" };
    		String[] host = { "renrenzhuhui" };
    		return new BlockLocation[] { new BlockLocation(name, host, 0,file.getLen()) };
  }

 

 

2.6 重要数据结构

 (1)BlockLocation

         private String[] hosts; // hostnames of datanodes
  	 private String[] names; // hostname:portNumber of datanodes
  	 private String[] topologyPaths; // full path name in network topology
 	 private long offset; // offset of the of the block in the file 
  	 private long length;

       一个BlockLocation包含了一个文件的一个块的详细信息,包括这个块对应的全部副本(包含它本身) ,比如上述定义的有:所在主机、所在主机及其端口号、在网络拓扑结构中的全路径名称、块在文件中的偏移位置、块长度。显然,这些块副本长度和在文件中的偏移位置都是相同的,可以共享(分别对应lengthoffset属性),其他三个属性的信息就不相同了(可能存在某两个相同的情况)。

       Hadoop文件系统中,一个文件对应多个块(Block),每个块默认大小设置为64M。那么,对于由多个块组成的文件来说,如果想要获取到该文件的全部块及其块副本的信息,就需要通过文件系统中文件的统计信息FileStatus来获取到一个BlockLocation[],该数组中对应的全部快就能够构成完整的该文件。

 

   下面通过形式化语言来表达一下上面的含义:

   假设一个文件Fn个块组成,则分别为: B(1)B(2),……,B(n)

   假设默认块的大小为BS,那么B(1)~B(n-1)一定是大小相同的块,大小都等于BS,而B(i)<=BS,这是显而易见的。

   文件F的每个块B(i)都被存储在指定主机的文件系统中,假设存储到了主机H(i)上。为了快速计算,需要快速定位到文件FBi块上,也就是需要进行流式读取获取到,那么F的块B(i)需要有一个记录其详细信息的结构,也就是Hadoop定义的BlockLocation。  

   假设Bi对应的描述信息对象为BL(i),那么BL(i)就包含了与块B(i)相关的全部块副本的信息,当然每个块副本同样包含与BL(i),相同的描述信息的属性,只是属性值不同而已。

   假设文件F对应的块B(i)一共具有m个副本:

   BR1(i)BR2(i),……,BRm(i)

   这些块副本分别存储在对应如下的主机上:

   H1(i)H2(i),……,Hm(i)

   这些块副本分别对应指定主机的端口号分别如下:

   H1(i):P1(i)H2(i):P2(i),……,Hm(i):Pm(i)

   这些块副本对应的拓扑网络中的完整路径分别为:

   U1(i)U2(i),……,Um(i)

   假设块Bi的长度为LENGTH(i),偏移位置为OFFSET(i),那么,通过该文件的FileStatus获取的BlockLocation[i]的内容,形式化的可以描述为:

 

	new BlockLocation[]{  
		  new  String[m]{H1(i), H2(i), ……, Hm(i)},  
 		  new  String[m]{H1(i):P1(i), H2(i):P2(i), ……, Hm(i):Pm(i)},  
 		  new  String[m]{U1(i), U2(i), ……, Um(i)},  
 		  LENGTH(i),  
  		 OFFSET(i)  
	 } 

 

(2)ContentSummary

          对文件、目录统计的实体,记录文件或是目录的元信息。

 

(3)FileChecksum

     对文件进行校验和,实现类MD5MD5CRC32FileChecksum

         

       /** Return true if both the algorithms and the values are the same. */
  	public boolean equals(Object other) {
	…...........
    	return this.getAlgorithmName().equals(that.getAlgorithmName())
      && Arrays.equals(this.getBytes(), that.getBytes());
 	 }

 

 

(4)FileStatus

     系统文件信息实体:

private Path path; // 文件路径  
private long length; // 文件长度  
private boolean isdir; // 是否是目录  
private short block_replication; // 块副本因子  
private long blocksize; // 块大小  
private long modification_time; // 修改时间  
private long access_time; // 访问时间  
private FsPermission permission; //在指定文件系统中的操作权限  
private String owner; // 文件属主  
private String group; // 所属组

 

(5)PositionedReadable
  PositionedReadable提高了从某个位置开始读的方法(一个read方法和两个readFully方法)


(6)Seekable

  Seekable提供了可以在流中定位的能力(seek,getPos和seekToNewSource)

 

(7)FSDataInputStream、FSDataOutputStream

         FSDataInputStream类:实现了Seekable与PositionedReadable接口,赋予了Hadoop文件系统中的文件输入流分别能够进行流式搜索与定位流式读取的语义。

         FSDataOutputStream:创建一个FSDataOutputStream.PositionCache缓冲流对象以后,可以向该文件输出缓冲流中写入相关的数据,作为缓冲使用,其中相关数据包括:文件系统(FileSystem)统计信息 FileSystem.Statistics、当前待写入流的位置。每当需要向文件系统中写入数据,都会从 PositionCache缓冲流中获取到一个写入位置(也就是,要从流中的该位置开始写入)。 FSDataOutputStream输出流类的通过一个PositionCache缓冲流来构造一个 FSDataOutputStream输出流对象.

 

(8)FSInputChecker、FSInputStream

FSInputCheckerFSInputStream的基础上,加入了HDFS中需要的校验功能。校验在readChecksumChunk中实现,并在内部的read1方法中调用。所有的read调用,最终都是使用read1读数据并做校验。如果校验出错,抛出异常ChecksumException它将接口seekablePositionedReadable混插到类中。seekable提供了可以在流中定位的能力(seekgetPosseekToNewSource),而PositionedReadable提高了从某个位置开始读的方法(一个read方法和两个readFully方法)。

 

(9)Trash

回收站,提供moveToTrash(Path path),并通过内部Emptier线程实时清理

 

 

 

分享到:
评论

相关推荐

    停车场管理系统c语言.docx

    问题描述: 停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入; 当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 1.基本要求 (1)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 (2)每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。 (3)栈以顺序结构实现,队列以链表实现。 2.重点难点 重点:针对停车场问题的特点,利

    精选毕设项目-人民好公仆小程序(生活+便民+政务).zip

    精选毕设项目-人民好公仆小程序(生活+便民+政务)

    精选毕设项目-相册;处理用户信息.zip

    精选毕设项目-相册;处理用户信息

    精选毕设项目-喵喵小说.zip

    精选毕设项目-喵喵小说

    精选毕设项目-图片预览带后端.zip

    精选毕设项目-图片预览带后端

    精选项目-爱靓女带后台.zip

    精选项目-爱靓女带后台

    法院综合安全监管平台解决方案PPT(53页).pptx

    在科技与司法的交响曲中,智慧法院应运而生,成为新时代司法服务的新篇章。它不仅仅是一个概念,更是对法院传统工作模式的一次深刻变革。智慧法院通过移动信息化技术,为法院系统注入了强大的生命力,有效缓解了案多人少的矛盾,让司法服务更加高效、便捷。 立案、调解、审判,每一个阶段都融入了科技的智慧。在立案阶段,智慧法院利用区块链技术实现可信存证,确保了电子合同的合法性和安全性,让交易双方的身份真实性、交易安全性得到了有力见证。这不仅极大地缩短了立案时间,还为后续审判工作奠定了坚实的基础。在调解阶段,多元调解服务平台借助人工智能、自然语言处理等前沿技术,实现了矛盾纠纷的快速化解。无论是矛盾类型的多元化,还是化解主体的多元化,智慧法院都能提供一站式、全方位的服务,让纠纷解决更加高效、和谐。而在审判阶段,智能立案、智能送达、智能庭审、智能判决等一系列智能化手段的应用,更是让审判活动变得更加智能化、集约化。这不仅提高了审判效率,还确保了审判质量的稳步提升。 更为引人注目的是,智慧法院还构建了一套完善的执行体系。移动执行指挥云平台的建设,让执行工作变得更加精准、高效。执行指挥中心和信息管理中心的一体化应用,实现了信息的实时传输和交换,为执行工作提供了强有力的支撑。而执行指挥车的配备,更是让执行现场通讯信号得到了有力保障,应急通讯能力得到了显著提升。这一系列创新举措的实施,不仅让执行难问题得到了有效解决,还为构建诚信社会、保障金融法治化营商环境提供了有力支撑。智慧法院的出现,让司法服务更加贴近民心,让公平正义的阳光更加温暖人心。

    西门子1200与3台台达DTK温控器通讯程序 功能:实现西门子1200 PLC对3台台达DTK温控器进行485通讯控制,在触摸屏上设定温度,读取温度 器件:西门子12

    西门子1200与3台台达DTK温控器通讯程序 功能:实现西门子1200 PLC对3台台达DTK温控器进行485通讯控制,在触摸屏上设定温度,读取温度 器件:西门子1200 1214DC DC DC.昆仑通态TPC7062Ti ,西门子KTP700 Basic PN,台达DTK 4848V12温控器。 说明:的是程序,带详细注释程序,西门子触摸屏程序,PLC设置和温控器设置,接线说明书。 #SIEMENS 西门子

    机械设计电阻绕线焊线一体机sw18全套技术资料100%好用.zip

    机械设计电阻绕线焊线一体机sw18全套技术资料100%好用.zip

    VB6编写的上位机采集2路温度 并形成曲线图 还可查看历史数据

    VB6编写的上位机源码,可实时显示曲线图,带有数据库,可以进行历史数据的保存 及 查看历史采集数据。

    精选毕设项目-新浪读书.zip

    精选毕设项目-新浪读书

    jQuery+Slick插件实现游戏人物轮播展示切换特效源码.zip

    jQuery+Slick插件实现游戏人物轮播展示切换特效源码是一款通过背景图片的切换来显示不同的人物效果,轮播效果通过slick幻灯片插件来制作。效果非常棒,有需要的朋友可以直接下载使用,适应各大网站

    精选毕设项目-地图查找附件.zip

    精选毕设项目-地图查找附件

    (蛐蛐voc数据)农作物病虫害识别目标检测数据集,VOC格式,蛐蛐数据集,纯手动标注,用来进行目标检测代码训练的数据

    (蛐蛐voc数据)农作物病虫害识别目标检测数据集,VOC格式,蛐蛐数据集,纯手动标注,用来进行目标检测代码训练的数据。

    MATLAB Simulink仿真模型 双馈风机并网频率控制仿真模型,利用下垂控制与惯性控制结合的综合惯性控制,实现电力系统的频率稳定,两台同步发电机组,具体参数可自行调节,频率波形比较可利用matl

    MATLAB Simulink仿真模型 双馈风机并网频率控制仿真模型,利用下垂控制与惯性控制结合的综合惯性控制,实现电力系统的频率稳定,两台同步发电机组,具体参数可自行调节,频率波形比较可利用matlab工作区画出。

    科研项目结题报告的撰写指南:结构、内容与注意事项

    一、结题报告的类型及主要结构 结题报告是一种专门用于科研课题结题验收的实用性报告类文体,也叫研究报告。它是研究者在课题研究结束后对科研课题研究过程和研究成果进行客观、全面、实事求是的描述,是课题研究所有材料中最主要的材料,也是科研课题结题验收的主要依据。   一篇规范、合格的结题报告,需要回答好3个问题:一是“为什么要选择这项课题进行研究?”二是“这项课题是怎样进行研究的?”三是“课题研究取得哪些研究成果?”  基本结构大致包括以下部分: 第一个问题 “为什么要选择这项课题进行研究?”  1.课题提出的背景;2.课题研究的意义(包括理论意义和现实意义,这个部分也可以合并归入“课题提出的背景”部分);第二个问题“这项课题是怎样进行研究的?”3.文献综述;4.课题研究的理论依据;5.课题研究的目标;6.课题研究的主要内容;7.课题研究的对象;8.课题研究的方法;9. 课题研究的主要过程(研究的步骤);   除了第9部分外,从第1到第8部分在填报课题立项申报表、在制定课题研究方案、在开题报告中,都有要求,内容基本相同。到了撰写结题报告时,只须稍作适当修改就可以了。而第9部分,则需要通过对

    1+X网络安全应急响应之应急准备:构建高效安全的应急响应体系

    内容概要:本文档重点讲述了网络安全应急响应的各项准备工作,涵盖了‘1+X’网络安全应急响应的职业技能等级证书概述、应急响应的基础知识、应急响应组织的建立、风险评估与改进、应急响应预案的制定以及详细的应急响应计划处置样例。文中详细介绍了各级职业技能的要求和任务,尤其关注如何未雨绸缪,制定完善的应急预案以应对潜在的网络安全风险;同时也探讨了如何在网络安全事件发生时,采取及时有效的应急处置措施。 适合人群:从事或有兴趣进入网络安全领域的从业人员,尤其是准备考取‘1+X’网络安全应急响应职业技能等级证书的相关人员。 使用场景及目标:帮助读者了解网络安全应急响应的基本概念及其在整个国家安全框架中的重要地位;指导读者学会如何建立健全高效的应急响应组织结构,如何进行全面的风险评估以及如何编制切实可行的应急预案;通过实例剖析,增强读者应对突发网络安全事件的能力。文档的目标在于提升读者在不同层面的专业技能,包括但不限于系统备份、日志分析、安全漏洞修复等方面的能力。 阅读建议:此文档结构清晰,内容详尽,非常适合有一定基础的技术从业者参考学习。建议读者逐章节深入了解,特别是关注自身岗位对应的技能细分类别。此外,结合实例深入理解和练习如何进行应急处置是非常有价值的,有助于提升自身的实战能力。

    电动汽车动力系统匹配计算模型:输入整车参数及性能要求,一键生成驱动系统的扭矩功率峰值转速等参数 2、整车动力经济性计算模型:包含NEDC WLTC CLTC工况,输入整车参数可生成工况电耗、百公里电

    电动汽车动力系统匹配计算模型:输入整车参数及性能要求,一键生成驱动系统的扭矩功率峰值转速等参数。 2、整车动力经济性计算模型:包含NEDC WLTC CLTC工况,输入整车参数可生成工况电耗、百公里电耗、匀速工况续航、百公里电耗等信息。 实际项目中使用的计算仿真模型. 两个模型打包

    chromedriver-linux64_122.0.6254.0.zip

    chromedriver-linux64_122.0.6254.0

    SRS构型七自由度冗余机械臂运动学建模全套matlab代码 代码主要功能: 1. 基于臂角参数化方法求解机械臂在给定末端位姿和臂角下的关节角度; 2. 求解机械臂在给定末端位姿下的有效臂角范围

    SRS构型七自由度冗余机械臂运动学建模全套matlab代码 代码主要功能: [1]. 基于臂角参数化方法求解机械臂在给定末端位姿和臂角下的关节角度; [2]. 求解机械臂在给定末端位姿下的有效臂角范围,有效即在该区间内机械臂关节角度不会超出关节限位; [3]. 以避关节限位为目标在有效臂角区间内进行最优臂角的选取,进而获取机械臂在给定末端位姿下的最优关节角度。 购前须知: 1. 代码均为个人手写,主要包含运动学建模全套代码; 2. 代码已经包含必要的注释; 包含原理推导文档,不包含绘图脚本以及urdf;

Global site tag (gtag.js) - Google Analytics