Spark SQL是用于处理结构化数据的模块。与Spark RDD不同的是,Spark SQL提供数据的结构信息(源数据)和性能更好,可以通过SQL和DataSet API与Spark SQL进行交互。
event 的类型和功能Nginx 是以 event(事件)处理模型为基础的模块。它为了支持跨平台,抽象出了 event 模块。它支持的 event 处理类型有:AIO(异步IO),/dev/poll(Solaris 和 Unix 特有),epoll(Linux 特有),eventport(Solaris 10 特有),kqueue(BSD 特有),poll,rtsig(实时信号),select 等。
Nginx 的启动模块启动模块从启动 Nginx 进程开始,做了一系列的初始化工作,源代码位于src/core/nginx.c,从 main 函数开始:时间、正则、错误日志、ssl 等初始化读入命令行参数OS 相关初始化读入并解析配置核心模块初始化创建各种暂时文件和目录创建共享内存打开 listen 的端口所有模块初始化启动 worker 进程
负载均衡模块用于从upstream指令定义的后端主机列表中选取一台主机。Nginx 先使用负载均衡模块找到一台主机,再使用 upstream 模块实现与这台主机的交互。为了方便介绍负载均衡模块,做到言之有物,以下选取 Nginx 内置的 ip hash 模块作为实际例子进行分析。配置要了解负载均衡模块的开发方法,首先需要了解负载均衡模块的使用方法。
Nginx 模块一般被分成三大类:handler、filter 和 upstream。前面的章节中,读者已经了解了 handler、filter。利用这两类模块,可以使 Nginx 轻松完成任何单机工作。而本章介绍的 upstream 模块,将使 Nginx 跨越单机的限制,完成网络数据的接收、处理和转发。
相关结构体ngx_chain_t 结构非常简单,是一个单向链表: typedef struct ngx_chain_s ngx_chain_t; struct ngx_chain_s { ngx_buf_t *buf; ngx_chain_t *next; };在过滤模块中,所有输出的内容都是通过一条单向链表所组成。这种单向链表的设计,正好应和了 Nginx 流式的输出模式。
执行时间和内容过滤(filter)模块是过滤响应头和内容的模块,可以对回复的头和内容进行处理。它的处理时间在获取回复内容之后,向用户发送响应之前。它的处理过程分为两个阶段,过滤 HTTP 回复的头部和主体,在这两个阶段可以分别对头部和主体进行修改。在代码中有类似的函数:ngx_http_top_header_filter(r);ngx_http_top_body_filter(r, in);
好,到了这里,让我们稍微整理一下思路,回顾一下实现一个 handler 的步骤:编写模块基本结构。包括模块的定义,模块上下文结构,模块的配置结构等。实现 handler 的挂载函数。根据模块的需求选择正确的挂载方式。编写 handler 处理函数。模块的功能主要通过这个函数来完成。看起来不是那么难,对吧?还是那句老话,世上无难事,只怕有心人!
handler 模块真正的处理函数通过两种方式挂载到处理过程中,一种方式就是按处理阶段挂载;另外一种挂载方式就是按需挂载。按处理阶段挂载为了更精细地控制对于客户端请求的处理过程,Nginx 把这个处理过程划分成了 11 个阶段。
在这一节我们将会对通常的模块开发过程中,每个模块所包含的一些常用的部分进行说明。这些部分有些是必须的,有些不是必须的。同时这里所列出的这些东西对于其他类型的模块,例如 filter 模块等也都是相同的。模块配置结构基本上每个模块都会提供一些配置指令,以便于用户可以通过配置来控制该模块的行为。那么这些配置信息怎么存储呢?
相信大家在看了前一章的模块概述以后,都对 Nginx 的模块有了一个基本的认识。基本上作为第三方开发者最可能开发的就是三种类型的模块,即 handler,filter 和 load-balancer。Handler 模块就是接受来自客户端的请求并产生输出的模块。有些地方说 upstream 模块实际上也是一种 handler 模块,只不过它产生的内容来自于从后端服务器获取的,而非在本机产生的。
Nginx 的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。为了便于描述,下文中我们将使用 Nginx core 来称呼 Nginx 的核心功能部分。Nginx 提供了 Web 服务器的基础功能,同时提供了 Web 服务反向代理,Email 服务反向代理功能。
Nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于Nginx 安装目录下的 conf 目录下。配置文件中以#开始的行,或者是前面有若干空格或者 TAB,然后再跟#的行,都被认为是注释,也就是只对编辑查看文件的用户有意义,程序在读取这些注释行的时候,其实际的内容是被忽略的。由于除主配置文件 nginx.
Nginx 的作者为追求极致的高效,自己实现了很多颇具特色的 Nginx 风格的数据结构以及公共函数。比如,Nginx 提供了带长度的字符串,根据编译器选项优化过的字符串拷贝函数 ngx_copy 等。所以,在我们写 Nginx 模块时,应该尽量调用 Nginx 提供的 api,尽管有些 api 只是对 glibc 的宏定义。
connection在 Nginx 中 connection 就是对 tcp 连接的封装,其中包括连接的 socket,读事件,写事件。利用 Nginx 封装的 connection,我们可以很方便的使用 Nginx 来处理与连接相关的事情,比如,建立连接,发送与接受数据等。而 Nginx 中的 http 请求的处理就是建立在 connection之上的,所以 Nginx 不仅可以作为一个web服务器,也可以作为邮件服务器。
众所周知,Nginx 性能高,而 Nginx 的高性能与其架构是分不开的。那么 Nginx 究竟是怎么样的呢?这一节我们先来初识一下 Nginx 框架吧。Nginx 在启动后,在 unix 系统中会以 daemon 的方式在后台运行,后台进程包含一个 master 进程和多个 worker 进程。
如果用户在分布式环境下工作,那么用户就需要与远程用户通信,用户也需要远程方式访问 UNIX 主机。 如下是一些 UNIX 操作系统中的实用工具,这些工具专用于分布式环境下的用户间的网络通信。ping 工具ping 指令会发送一个应答请求到网络中某个主机。该指令主要用于检测远端主机是否可以正常通信。 ping 指令可以用于如下用途: 追踪并区分硬件或软件的问题。
信号是发送给程序的软件中断,表明已发生的重要事件。这些事件的范围可以是从用户请求到非法内存访问错误。这些信号,如中断信号,表明用户要求程序做一些非一般流程控制下的事情。
在 UNIX 系统中,有三种类型的账户:root 帐户:这也被称为超级用户,这类用户对系统拥有完整的和不受约束的控制权。超级用户可以运行任何命令,而不受任何限制。这类用户应该承担作为一个系统管理员的任务。系统账户:系统账户是为操作系统特定组件的需要提供的,例如邮件账户和 sshd 账户。
文件系统是一个分区或磁盘上的文件的逻辑集合。一个分区是一个信息的容器,如果需要可以跨整个硬盘。你的硬盘可以有不同的分区,但通常只包含一个文件系统,如一个文件系统涵盖 /file 系统,另一个包含 /home 文件系统。一个文件系统分区允许不同文件系统的逻辑维护和管理。UNIX 中一切都被认为是一个文件,包括物理设备,如 DVD-ROMs、USB 设备、软盘驱动器等等。
关注时代Java