多路复用I/O模型的理解

什么是I/O:

不管是文件还是管道、套接字都可以被看作标准的文件描述符或者流,我们针对文件描述符的读和写操作(输入输出)就是I/O (input/ouput)。

多路复用:

指多个文件描述符的I/O的操作可以在同一个线程内顺序交替完成,复用的是同一个线程。

I/O的阻塞:

说起阻塞和非阻塞,就要提一下同步和异步,同步和异步是在一个进程或者线程的角度(或者更宏观的调用周期)看待请求和结果的时间问题,一次请求直到同一线程将需要的数据返回就是同步,否则就是请求后立马返回部分结果,最终结果被其它线程处理,通知的方式告知想要的结果。异步的进程间通信的方式有很多种,比如管道,队列,套接字,信号,共享内存等。

阻塞, 指线程在处理一个流时,需要等待一个新的I/O事件的发生而处于一种挂起状态,该状态下的线程无法继续工作,直到内核对该流产生一个新的I/O事件。阻塞模型下要想处理更多的任务,就需要创建新的进程或者线程,不过这种方式非常的低效。

非阻塞,在一个线程中,可以打开多个文件描述符,而且一旦一个流需要等待I/O事件时,不会导致整个线程的挂起,这些流被放到一个队列中,会被不断的轮询,每次轮询找出有新的I/O事件产生的流。

非阻塞轮询:

上面讲到的非阻塞模型中,内核会不断的轮询所有的流,即使任何流都没有I/O事件发生也会轮询一遍,这个样子就会非常浪费资源。为了更高效的处理非阻塞的情况,引入了更好的处理方式select和epoll

select:

该模型的产生让非阻塞有了一个比较理性的轮询方式,线程中所有的流如果没有I/O事件都会被select接管,有任何的流产生I/O事件的时候,select都会知道再去轮询,不用再去空轮询了。不过select这个时候并不知道具体哪个流上产生事件了,所以需要针对所有的流都轮询一次。时间复杂度O(n),也就是说随着要处理的流的增加,处理时间变长,效率降低。select一个线程中能打开的文件描述符的个数通常限制为1024(系统参数,可配置)

epoll:

针对select无差别轮询的问题,epoll有了更好的处理方式,epoll在所有的流上都注册有回调函数,一旦有I/O事件的产生就会触发回调,接下来就只需要处理这些已知发生I/O事件的流就可以了。而且epoll没有文件描述符打开的数量限制。

 

参考:

https://www.cnblogs.com/ajianbeyourself/p/5859989.html

 

 

KVM配置vnc连接虚拟机

如果虚拟机无法直接连接, 有以下2中方式可以尝试

1 console

但是会遇到console后卡在登录的地方, 搜了很多资料说是需要配置虚拟机的一些东西, 但是虚拟机压根登录不进去, 于是可以尝试第二种方式

2 vnc

vnc 是一款远程控制工具软件, 通过IP+端口的方式可以直接连接到目标机器

接下来需要对kvm的每台虚拟机配置vnc, 使得每台虚拟机都绑定到宿主机器的一个端口上, 这样就可以通过宿主的IP+端口访问到虚拟机, 修改配置可以通过:

也可以直接去修改xml文件

<graphics type=’vnc’ port=’5100′ autoport=’no’ listen=’0.0.0.0′>

<listen type=’address’ address=’0.0.0.0’/>

</graphics>

修改后保存, 然后重新定义一下:

注意:  端口的指定需要是系统空闲且有效的, 如果设置冲突或者无效, 将导致无法正常启动虚拟机

    error: Failed to start domain test

error: Unable to read from monitor: Connection reset by peer

vnc viewer, 是连接需要用到的工具, 可以在官网下载

https://www.realvnc.com/download/viewer/

在使用过程中如果出现闪退的情况, 需要按照一下步骤更改一下配置:

Option–>Advanced–>Expert找到ColourLevel,默认值是pal8,修改为rgb222或full

此方案参考:

VNC Viewer 连接成功后闪退的解决方法

KVM修改虚拟机CPU和内存

KVM虚拟机的CPU和内存是可以动态分配的, 这个可分配的范围需要在停机状态时提前配置好.

配置最大的CPU和内存

启动虚拟机并动态配置

 

KVM重命名虚拟机

1 、关闭虚拟机

# 查看所有的虚拟机列表

Id    名称                         状态
—————————————————-
8     dev1                        running
–     dev2                           关闭
–     dev3                           关闭
–     dev4                           关闭
–     dev5                           关闭

# 如果正常关闭不掉, 可以尝试destroy

2 、导出xml配置到目标虚拟机文件

# 进入xml配置文件目录

#  导出xml

3 、修改xml

# 修改<name> 节点的值为 dev1_new:

# <name>dev1_new</name>

4 、删除虚拟机定义并重新定义新的xml

5、 启动

Id    名称                         状态
—————————————————-
8     dev1_new                    关闭
–     dev2                           关闭
–     dev3                           关闭
–     dev4                           关闭
–     dev5                           关闭

 

CDH离线安装

集群服务器命名

    HOSTNAME=hdp-master

SSH 免密登录设置

    生成私钥/公钥, 执行后在~/.ssh 目录下会生成2个文件id_rsa(私钥)和id_rsa.pub(公钥),

    将公钥追加到认证文件中

    为了安全可以将authorized_keys文件的权限设置成600

    修改以下值

    RSAAuthentication yes

    PubkeyAuthentication yes

    AuthorizedKeysFile      .ssh/authorized_keys

    保存退出文件, 重启服务

    重启后可以’ssh {本机IP}’ 验证, 同样的道理, 只要将生成的公钥copy到远程服务器追加到 authorized_keys文件中,

    重复以上步骤即可

关闭集群机器防火墙

    将值设置为disabled

时间同步服务

    设置时间同步的目标机器, 可以将内部的一台机器(A)设置为ntp服务器, ntp.conf同步网络时间,

    其它内部机器同步A的时间, 下面的是同步网络时间的配置

    server 202.120.2.101 prefer(prefer优先服务器)

    server 202.102.29.82

JDK安装  

    jdk安装的目录一定要注意, 否则即使设置了linux的环境变量, cloudera也照样无法找到, 因为cloudera不认系统的JAVA_HOME, 而是遍历自己的一套目录, 这是个大坑

    上面部分代码, 是出自cm-5.3.3/share/cmf/bin/cmf-server, 在安装jdk时, 注意选择对应上面目录就好了!

 

以上的环境每个集群节点都需要做, ssh免密登录只需要clouder server能登录其它集群节点即可

—————

在server服务器上安装MySQL

    Hive, monitor等服务需要连接数据库

    登录mysql, 设置好root密码, 并授权节点服务器登录

安装cloudera manager

    为每个节点机器创建用户

    将cloudera-manager的安装包解压到指定目录/home/hadoop

    该步骤是初始化cm的数据库, 只需要在server节点初始化, 查看该文件可获得参数的含义

    将cm-5.3.3目录复制到集群的其它节点, 并修改agent配置文件

    注意修改下面的配置

    server_host=hdp-cms  # server就是集群主节点, 具体是你设置的机器的名字

    parcel_dir=/home/hadoop/cloudera/parcels

准备CDH离线安装包

    创建/opt/cloudera/parcel-repo/目录 , 当然这个目录是可以指定为其它目录的, CM配置时选择那个目录即可

    将CDH离线包加压到该目录下,

    CDH-5.1.3-1.cdh5.1.3.p0.12-el6.parcel

    CDH-5.1.3-1.cdh5.1.3.p0.12-el6.parcel.sha1  # 该文件的内容可以在manifest.json中找到, parcelName是上面那个文件名的对应的hash值

    manifest.json

启动安装server和agent

        在主节点启动以上服务, 要确认一下是否启动成功, 如果有问题在log中查看具体的报错原因

        该命令在其它节点上执行, 错误请查看log

CM安装步骤

    跟着提示一步步走吧

 

Linux7使用中的问题汇总

systemctl

在Linux7中使用systemctl代替service,chkconfig来管理服务,以mysqld服务为例:

ifconfig

Linux7默认不会安装ifconfig, 可以用其它命令代替, 也可以yum安装

libiconv

在安装php时, 需要安装libiconv库为编码转换提供支持,但是在Linux7中安装时出现了如下的错误:

解决方案是需要修改当前编译目录下的文件 srclib/stdio.in.h