概要
在上一节我们介绍了操作系统的IO操作,详细描述了网络IO的5种模式。每种模式主都有2个角色,分别是系统内核和用户程序,而上节主要是以系统内核的角度来定义描述这5种模式。本章将从用户程序的角度再来说说IO交互模式。这里我们选择的用户程序是我们熟知的JVM虚拟机,着重介绍JAVA是如何运用操作系统提供的IO模型实现自己的BIO,NIO,AIO操作的。
由于涉及知识太多且作者能力有限,所以本文主要写作方式是以点盖面,列出作者认为主要的知识点,在整体逻辑上可能会比较碎。
加强彼此联系,努力实现盖娅星系!
作为程序猿经常会听到阻塞非阻塞,同步异步的概念,前辈也经常告诫我们这些概念是经常会使用到的,面试经常会问。网上的经典解释是以一个烧开水的例子说明的,内容如下:
老张烧水,水壶放到炉子上,然后专心等待水烧开——同步阻塞
老张烧水,水壶放到炉子上,然后去客厅看电视,时不时去看看水有没有烧开——同步非阻塞
老张烧水,使用响水壶,水放到炉子上后等待水壶响——异步阻塞
老张烧水,使用响水壶,水放到炉子上后就去客厅看电视,等待水壶响后提壶——异步非阻塞
但我觉得解释的十分别扭,因此自己做了些研究并有了些心得,在这里与大家分享一下。
本文首先提出这四个词是形容词,理解必须包含上下文。它们多用来形容网络I/O模型。然后对linux 5种网络I/O模型进行了介绍从中抽象概念。作者认为阻塞和非阻塞主要是形容流程的,同步异步是形容交互模式的。请求方的流程因为数据请求而被阻塞则这种交互模式是同步的,反之没有因为数据请求而阻塞流程的交互模式是异步的。最后作者阐述了对使用烧开水来解释这四个词的看法。
本文主要介绍如何开发ES解析器插件。在文章中会介绍一个自定义解析插件的主要过程。该插件的核心功能是可以将词”abcd”分为[“abcd”,”bcd”,”cd”,”d”]。源码地址在此。由于本次开发的是解析器插件,因此本文会顺带介绍ES解析器的基本原理,核心功能chartFilter,Tokenzier,TokenFilter
如何实现。
在开始前还需要说明的是,根据高人指点,上篇文章中提四种分词方案即将”abcd”分词为[“abcd”,”bcd”,”cd”,”d”],其实使用ES自带的edge_ngram
tokenizer加reverse
token filter就可实现相似的功能。即将”abcd”分词为[“a”,”ba”,”cba”,”dcba”],搜索时借助prefix
查询就可以完成字符串包涵的搜索需求。这里还有一个需要注意的点是,使用prefix
查询时需要自行将查询词逆序。当然也可以使用match_phrase_prefix
使用analyzer
配置只带reverse
token filter的解析器对查询词进行反转。使用match_phrase_prefix
还有个好出会自行根据出现频率排序。
Spark Launcher的主要有两个功能:1、通过JAVA程序启动Spark任务。2、监控Spark任务的运行情况,可以根据任务状态等的变法设置不同的执行逻辑同时提供主动停止Application的功能。
通常发布spark任务是通过shell运行spark-submit命令。但是在实际生产活动中存在业务直接启动Spark任务的情况。对于这种情况目前的做法是Java使用Runtime.getRuntime().exec(cmd)的方式运行spark-submit。这种方式虽然可以正常启动spark任务,收集spark-submit产生的日志,但是容错率低,不容易使用程序监控spark任务的状态,主动停止任务。对于这种情况可以使用Spark官方封装的任务启动器——Spark Launcher。虽然其底层也是通过JAVA启动子进程发布Spark任务,但是程序启动了监听spark application的线程,可以在任务状态或信息发生变化时触发相应的listenter。
本文首先用一个例子展示了如何用JAVA启动一个Spark任务,监控其运行状态以及如何主动停止任务。然后着重分析了启动任务的SparkLauncher、监控任务的ChildProcAppHandle、接收任务信息的LauncherServer、发送任务信息的LauncherBackend的代码逻辑。